From 92a00a3526d6070a6b2c8f151fa7c947872a8b52 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 14 Apr 2022 10:57:43 +0200 Subject: [PATCH 1/2] test.cpp: also run tests with char buffer --- test.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test.cpp b/test.cpp index 9583468f..78057113 100644 --- a/test.cpp +++ b/test.cpp @@ -6,6 +6,7 @@ #include "simplecpp.h" #include +#include #include #include #include @@ -24,6 +25,13 @@ #define STRINGIZE(x) STRINGIZE_(x) static const std::string testSourceDir = SIMPLECPP_TEST_SOURCE_DIR; + +enum class Input : std::uint8_t { + Stringstream, + CharBuffer +}; + +static Input USE_INPUT = Input::Stringstream; static int numberOfFailedAssertions = 0; #define ASSERT_EQUALS(expected, actual) (assertEquals((expected), (actual), __LINE__)) @@ -40,11 +48,20 @@ static std::string pprint(const std::string &in) return ret; } +static const char* inputString(Input input) { + switch (input) { + case Input::Stringstream: + return "Stringstream"; + case Input::CharBuffer: + return "CharBuffer"; + } +} + static int assertEquals(const std::string &expected, const std::string &actual, int line) { if (expected != actual) { numberOfFailedAssertions++; - std::cerr << "------ assertion failed ---------" << std::endl; + std::cerr << "------ assertion failed (" << inputString(USE_INPUT) << ")---------" << std::endl; std::cerr << "line test.cpp:" << line << std::endl; std::cerr << "expected:" << pprint(expected) << std::endl; std::cerr << "actual:" << pprint(actual) << std::endl; @@ -81,8 +98,14 @@ static void testcase(const std::string &name, void (*f)(), int argc, char * cons static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) { - std::istringstream istr(std::string(code, size)); - return {istr,filenames,filename,outputList}; + switch (USE_INPUT) { + case Input::Stringstream: { + std::istringstream istr(std::string(code, size)); + return {istr,filenames,filename,outputList}; + } + case Input::CharBuffer: + return {{code, size}, filenames, filename, outputList}; + } } static simplecpp::TokenList makeTokenList(const char code[], std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) @@ -3518,8 +3541,10 @@ static void leak() } } -int main(int argc, char **argv) +static void runTests(int argc, char **argv, Input input) { + USE_INPUT = input; + TEST_CASE(backslash); TEST_CASE(builtin); @@ -3786,6 +3811,11 @@ int main(int argc, char **argv) TEST_CASE(fuzz_crash); TEST_CASE(leak); +} +int main(int argc, char **argv) +{ + runTests(argc, argv, Input::Stringstream); + runTests(argc, argv, Input::CharBuffer); return numberOfFailedAssertions > 0 ? EXIT_FAILURE : EXIT_SUCCESS; } From 62d73ff6e017dc33f0d36ac7dc7f3d69a51a3118 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 15 Jan 2026 11:23:29 +0100 Subject: [PATCH 2/2] test.cpp: fixed compiler warnings about missing returns after fully covered switch --- test.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test.cpp b/test.cpp index 78057113..5fd41b85 100644 --- a/test.cpp +++ b/test.cpp @@ -37,6 +37,32 @@ static int numberOfFailedAssertions = 0; #define ASSERT_EQUALS(expected, actual) (assertEquals((expected), (actual), __LINE__)) #define ASSERT_THROW_EQUALS(stmt, e, expected) do { try { stmt; assertThrowFailed(__LINE__); } catch (const e& ex) { assertEquals((expected), (ex.what()), __LINE__); } } while (false) +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(x) 0 +#endif + +#if __has_cpp_attribute (noreturn) \ + || (defined(__GNUC__) && (__GNUC__ >= 5)) \ + || defined(__clang__) \ + || defined(__CPPCHECK__) +# define NORETURN [[noreturn]] +#elif defined(__GNUC__) +# define NORETURN __attribute__((noreturn)) +#else +# define NORETURN +#endif + +NORETURN static void unreachable() +{ +#if defined(__GNUC__) + __builtin_unreachable(); +#elif defined(_MSC_VER) + __assume(false); +#else +# error "no unreachable implementation" +#endif +} + static std::string pprint(const std::string &in) { std::string ret; @@ -55,6 +81,8 @@ static const char* inputString(Input input) { case Input::CharBuffer: return "CharBuffer"; } + + unreachable(); } static int assertEquals(const std::string &expected, const std::string &actual, int line) @@ -106,6 +134,8 @@ static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, s case Input::CharBuffer: return {{code, size}, filenames, filename, outputList}; } + + unreachable(); } static simplecpp::TokenList makeTokenList(const char code[], std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr)