diff --git a/libc/test/src/string/memory_utils/CMakeLists.txt b/libc/test/src/string/memory_utils/CMakeLists.txt --- a/libc/test/src/string/memory_utils/CMakeLists.txt +++ b/libc/test/src/string/memory_utils/CMakeLists.txt @@ -4,7 +4,7 @@ libc_string_unittests SRCS address_test.cpp - # algorithm_test.cpp + algorithm_test.cpp backend_test.cpp elements_test.cpp memory_access_test.cpp @@ -12,7 +12,6 @@ COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} -ffreestanding - -pthread DEPENDS libc.src.string.memory_utils.memory_utils libc.src.__support.CPP.array diff --git a/libc/test/src/string/memory_utils/algorithm_test.cpp b/libc/test/src/string/memory_utils/algorithm_test.cpp --- a/libc/test/src/string/memory_utils/algorithm_test.cpp +++ b/libc/test/src/string/memory_utils/algorithm_test.cpp @@ -6,7 +6,9 @@ #include #include -#include +#include +#include +#include namespace __llvm_libc { @@ -23,7 +25,26 @@ static Buffer buffer1; static Buffer buffer2; -static std::ostringstream LOG; +struct Logger { + Logger &operator<<(const char *str) { + Buffer.append(str); + return *this; + } + Logger &operator<<(char c) { + Buffer.push_back(c); + return *this; + } + template + std::enable_if_t::value, Logger &> + operator<<(Scalar number) { + Buffer.append(std::to_string(number)); + return *this; + } + const std::string &str() const { return Buffer; } + +private: + std::string Buffer; +} LOG; struct TestBackend { static constexpr bool IS_BACKEND_TYPE = true; @@ -72,7 +93,7 @@ struct LlvmLibcAlgorithm : public testing::Test { void SetUp() override { - LOG = std::ostringstream(); + LOG = Logger(); LOG << '\n'; } @@ -91,11 +112,20 @@ return trace_.c_str(); } - const char *stripComments(const char *expected) { + const char *stripComments(std::string expected) { expected_.clear(); - std::stringstream ss(expected); - std::string line; - while (std::getline(ss, line, '\n')) { + // split expected by lines + std::vector lines; + lines.emplace_back(); + for (const char c : expected) { + if (c == '\n') { + lines.emplace_back(); + } else { + lines.back().push_back(c); + } + } + // strip comment for each lines + for (const std::string &line : lines) { const auto pos = line.find('#'); if (pos == std::string::npos) { expected_ += line; @@ -105,7 +135,8 @@ log.pop_back(); expected_ += log; } - expected_ += '\n'; + if (expected_.back() != '\n') + expected_.push_back('\n'); } return expected_.c_str(); }