summaryrefslogtreecommitdiffstats
path: root/tools/slang-unit-test/unit-test-string-escape.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-05-27 17:28:05 -0400
committerGitHub <noreply@github.com>2022-05-27 17:28:05 -0400
commit2d3392f22c894957d17dd13486e0565c4ecea89c (patch)
treece4dadbd85a59e52725fa6f92613553cd5b29859 /tools/slang-unit-test/unit-test-string-escape.cpp
parentabb89b3e460e11e8f9a134199c2d559190bfc47e (diff)
Added NativeStringType (#2252)
* #include an absolute path didn't work - because paths were taken to always be relative. * Use TerminatedUnownedStringSlice for literals in output C++. * Remove Escape/Unescape functions used in slang-token-reader.cpp Add target type of 'host-cpp' etc to map to the target types. * Fix some corner cases around string encoding. * Added unit test for string escaping. Fixed some assorted escaping bugs. * Updated test output. * Added decode test. * Stop using hex output, to get around 'greedy' aspect. Use octal instead.
Diffstat (limited to 'tools/slang-unit-test/unit-test-string-escape.cpp')
-rw-r--r--tools/slang-unit-test/unit-test-string-escape.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/tools/slang-unit-test/unit-test-string-escape.cpp b/tools/slang-unit-test/unit-test-string-escape.cpp
new file mode 100644
index 000000000..337573081
--- /dev/null
+++ b/tools/slang-unit-test/unit-test-string-escape.cpp
@@ -0,0 +1,79 @@
+// unit-test-string-escape.cpp
+
+#include "../../source/core/slang-string-escape-util.h"
+
+#include "tools/unit-test/slang-unit-test.h"
+
+using namespace Slang;
+
+static bool _checkConversion(StringEscapeHandler* handler, const UnownedStringSlice& check)
+{
+ StringBuilder buf;
+ handler->appendEscaped(check, buf);
+
+ StringBuilder decode;
+ handler->appendUnescaped(buf.getUnownedSlice(), decode);
+
+ return decode == check;
+}
+
+static bool _checkDecode(const UnownedStringSlice& encoded, const UnownedStringSlice& decoded)
+{
+ auto handler = StringEscapeUtil::getHandler(StringEscapeUtil::Style::Cpp);
+
+ StringBuilder buf;
+ StringEscapeUtil::appendUnquoted(handler, encoded, buf);
+ return buf == decoded;
+}
+
+#define SLANG_ENCODED_DECODED(x) \
+ const auto encoded = toSlice(#x); \
+ const auto decoded = toSlice(x);
+
+SLANG_UNIT_TEST(StringEscape)
+{
+ // Check greedy hex digits
+ {
+ // \x can have any number of hex digits
+ const char text[] = "\x000001";
+ SLANG_ASSERT(SLANG_COUNT_OF(text) == 2 && text[0] == 1);
+ }
+
+ // Check octal greedy
+ {
+ //\ + up to 3 octal digits
+ const char text[] = "\0011";
+ SLANG_ASSERT(SLANG_COUNT_OF(text) == 3 && text[0] == 1 && text[1] == '1');
+
+ const char text2[] = "\78";
+ SLANG_ASSERT(SLANG_COUNT_OF(text2) == 3 && text2[0] == 7 && text2[1] == '8');
+ }
+
+ {
+ auto handler = StringEscapeUtil::getHandler(StringEscapeUtil::Style::Cpp);
+
+ SLANG_CHECK(_checkConversion(handler, toSlice("\0\1\2""2")));
+ }
+
+ {
+ auto handler = StringEscapeUtil::getHandler(StringEscapeUtil::Style::Cpp);
+
+ // We can't just use '\uxxxx', because it has to be translatable into an output character in MSVC (not into utf8)
+ // Can make work perhaps with something like
+ // #pragma execution_character_set("utf-8")
+ // But for now we don't worry
+ //
+ // Visual Studio does not appear to support '\U' by default, presumably because wchar_t is 16 bits
+
+ {
+ SLANG_ENCODED_DECODED("\a\b\0hey~\u0023\n\0");
+ SLANG_CHECK(_checkDecode(encoded, decoded));
+ }
+
+ {
+ SLANG_ENCODED_DECODED("\n\v\b\t\1\02\003\x5z\x00007f\0");
+ SLANG_CHECK(_checkDecode(encoded, decoded));
+ }
+ }
+}
+