From 7c9298d8b10b5f4e69e24e3eb933e93e0d92fc37 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Tue, 18 Jun 2019 19:49:34 -0400 Subject: StringUtil::extractLine (#989) * Added extractLine line parsing to StringUtil. Use for matching lines instead of calcLines. calcLines uses extractLine to extract lines. Fixed problems found in output of some tests- due to how a how final line is handled. Now a final line has a \r or \n\r combination, but nothing else after it, it is considered the last line (not the line after it). * Use StringUtil::extractLine in slang-generate. * Improved comment on extractLine * Remove test code from StringUtil::extractLine * Made StringUtil::extractLine act as if line terminators are 'separators'. Added unit-test-string.cpp - to check behavior. * Adding LineParser - not entirely necessary, but slightly easier to use. * Improved LineParser::Iterator end testing. Added improved tests for LineParser. * Move line comparson after termination case - to fix problem with gcc release build. * Make UnownedStringSlice handle comparison when begin is nullptr - as it uses memcmp and passing nullptr to memcmp is undefined, leading to optimizer being able to do some unfortunate optimizations on gcc. --- tools/slang-test/unit-test-string.cpp | 92 +++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 tools/slang-test/unit-test-string.cpp (limited to 'tools/slang-test/unit-test-string.cpp') diff --git a/tools/slang-test/unit-test-string.cpp b/tools/slang-test/unit-test-string.cpp new file mode 100644 index 000000000..6110ca55e --- /dev/null +++ b/tools/slang-test/unit-test-string.cpp @@ -0,0 +1,92 @@ +// unit-test-path.cpp + +#include "../../source/core/slang-string-util.h" + +#include "test-context.h" + +using namespace Slang; + +static bool _areEqual(const List& lines, const UnownedStringSlice* checkLines, Int checkLinesCount) +{ + if (checkLinesCount != lines.getCount()) + { + return false; + } + + for (Int i = 0; i < checkLinesCount; ++i) + { + if (lines[i] != checkLines[i]) + { + return false; + } + } + return true; +} + +static bool _checkLines(const UnownedStringSlice& input, const UnownedStringSlice* checkLines, Int checkLinesCount) +{ + List lines; + UnownedStringSlice text(input); + while (true) + { + UnownedStringSlice line = StringUtil::extractLine(text); + if (line.begin() == nullptr) + { + return _areEqual(lines, checkLines, checkLinesCount); + } + lines.add(line); + } +} + +static bool _checkLineParser(const UnownedStringSlice& input) +{ + UnownedStringSlice remaining(input); + for (const auto line : LineParser(input)) + { + UnownedStringSlice extractLine = StringUtil::extractLine(remaining); + if (line != extractLine) + { + return false; + } + // Handle hitting the end + if (line.begin() == nullptr || extractLine.begin() == nullptr) + { + return line.begin() == extractLine.begin(); + } + } + + return remaining.begin() == nullptr; +} + +static void stringUnitTest() +{ + { + UnownedStringSlice checkLines[] = { UnownedStringSlice::fromLiteral("") }; + SLANG_CHECK(_checkLines(UnownedStringSlice::fromLiteral(""), checkLines, SLANG_COUNT_OF(checkLines))); + } + { + // Will emit no lines + SLANG_CHECK(_checkLines(UnownedStringSlice(nullptr, nullptr), nullptr, 0)); + } + { + // Two lines - both empty + UnownedStringSlice checkLines[] = { UnownedStringSlice(), UnownedStringSlice()}; + SLANG_CHECK(_checkLines(UnownedStringSlice::fromLiteral("\n"), checkLines, SLANG_COUNT_OF(checkLines))); + } + { + UnownedStringSlice checkLines[] = { UnownedStringSlice::fromLiteral("Hello"), UnownedStringSlice::fromLiteral("World!") }; + SLANG_CHECK(_checkLines(UnownedStringSlice::fromLiteral("Hello\nWorld!"), checkLines, SLANG_COUNT_OF(checkLines))); + } + { + UnownedStringSlice checkLines[] = { UnownedStringSlice::fromLiteral("Hello"), UnownedStringSlice::fromLiteral("World!"), UnownedStringSlice() }; + SLANG_CHECK(_checkLines(UnownedStringSlice::fromLiteral("Hello\n\rWorld!\n"), checkLines, SLANG_COUNT_OF(checkLines))); + } + + { + SLANG_CHECK(_checkLineParser(UnownedStringSlice::fromLiteral("Hello\n\rWorld!\n"))); + SLANG_CHECK(_checkLineParser(UnownedStringSlice::fromLiteral("\n"))); + SLANG_CHECK(_checkLineParser(UnownedStringSlice::fromLiteral(""))); + } +} + +SLANG_UNIT_TEST("String", stringUnitTest); -- cgit v1.2.3