blob: 676847290fbd9ce34b56b14b47dbce7cd1ebab39 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
// unit-test-string-escape.cpp
#include "../../source/core/slang-string-escape-util.h"
#include "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));
}
}
}
|