summaryrefslogtreecommitdiff
path: root/tools/slang-unit-test/unit-test-string-escape.cpp
blob: 337573081421269835ddc9907d5781bb57633244 (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
// 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));
		}
	}
}