| 
11 | 11 | #include "src/wchar/wcstok.h"  | 
12 | 12 | #include "test/UnitTest/Test.h"  | 
13 | 13 | 
 
  | 
14 |  | -TEST(LlvmLibcStrTokTest, NoTokenFound) {  | 
15 |  | -  wchar_t empty[] = L"";  | 
16 |  | -  wchar_t *buf;  | 
17 |  | -  ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"", &buf), nullptr);  | 
18 |  | -  ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"_", &buf), nullptr);  | 
19 |  | - | 
20 |  | -  wchar_t single[] = L"_";  | 
21 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(single, L"", &buf);  | 
22 |  | -  ASSERT_TRUE(token[0] == L'_');  | 
23 |  | -  ASSERT_TRUE(token[1] == L'\0');  | 
24 |  | - | 
25 |  | -  wchar_t multiple[] = L"1,2";  | 
26 |  | -  token = LIBC_NAMESPACE::wcstok(multiple, L":", &buf);  | 
27 |  | -  ASSERT_TRUE(multiple[0] == L'1');  | 
28 |  | -  ASSERT_TRUE(multiple[1] == L',');  | 
29 |  | -  ASSERT_TRUE(multiple[2] == L'2');  | 
30 |  | -  ASSERT_TRUE(multiple[3] == L'\0');  | 
 | 14 | +TEST(LlvmLibcWCSTokReentrantTest, NoTokenFound) {  | 
 | 15 | +  { // Empty source and delimiter string.  | 
 | 16 | +    wchar_t empty[] = L"";  | 
 | 17 | +    wchar_t *reserve = nullptr;  | 
 | 18 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"", &reserve), nullptr);  | 
 | 19 | +    // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 20 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"", &reserve), nullptr);  | 
 | 21 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"", &reserve), nullptr);  | 
 | 22 | +  }  | 
 | 23 | +  { // Empty source and single character delimiter string.  | 
 | 24 | +    wchar_t empty[] = L"";  | 
 | 25 | +    wchar_t *reserve = nullptr;  | 
 | 26 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"_", &reserve), nullptr);  | 
 | 27 | +    // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 28 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(empty, L"_", &reserve), nullptr);  | 
 | 29 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"_", &reserve), nullptr);  | 
 | 30 | +  }  | 
 | 31 | +  { // Same wchar_tacter source and delimiter string.  | 
 | 32 | +    wchar_t single[] = L"_";  | 
 | 33 | +    wchar_t *reserve = nullptr;  | 
 | 34 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(single, L"_", &reserve), nullptr);  | 
 | 35 | +    // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 36 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(single, L"_", &reserve), nullptr);  | 
 | 37 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L"_", &reserve), nullptr);  | 
 | 38 | +  }  | 
 | 39 | +  { // Multiple wchar_tacter source and single wchar_tacter delimiter string.  | 
 | 40 | +    wchar_t multiple[] = L"1,2";  | 
 | 41 | +    wchar_t *reserve = nullptr;  | 
 | 42 | +    wchar_t *tok = LIBC_NAMESPACE::wcstok(multiple, L":", &reserve);  | 
 | 43 | +    ASSERT_TRUE(tok[0] == L'1');  | 
 | 44 | +    ASSERT_TRUE(tok[1] == L',');  | 
 | 45 | +    ASSERT_TRUE(tok[2] == L'2');  | 
 | 46 | +    ASSERT_TRUE(tok[3] == L'\0');  | 
 | 47 | +    // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 48 | +    tok = LIBC_NAMESPACE::wcstok(multiple, L":", &reserve);  | 
 | 49 | +    ASSERT_TRUE(tok[0] == L'1');  | 
 | 50 | +    ASSERT_TRUE(tok[1] == L',');  | 
 | 51 | +    ASSERT_TRUE(tok[2] == L'2');  | 
 | 52 | +    ASSERT_TRUE(tok[3] == L'\0');  | 
 | 53 | +    ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L":", &reserve), nullptr);  | 
 | 54 | +  }  | 
31 | 55 | }  | 
32 | 56 | 
 
  | 
33 |  | -TEST(LlvmLibcStrTokTest, DelimiterAsFirstCharacterShouldBeIgnored) {  | 
34 |  | -  wchar_t *buf;  | 
 | 57 | +TEST(LlvmLibcWCSTokReentrantTest, DelimiterAsFirstCharacterShouldBeIgnored) {  | 
35 | 58 |   wchar_t src[] = L".123";  | 
36 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L".", &buf);  | 
37 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
38 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
39 |  | -  ASSERT_TRUE(token[2] == L'3');  | 
40 |  | -  ASSERT_TRUE(token[3] == L'\0');  | 
 | 59 | +  wchar_t *reserve = nullptr;  | 
 | 60 | +  wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L".", &reserve);  | 
 | 61 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 62 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 63 | +  ASSERT_TRUE(tok[2] == L'3');  | 
 | 64 | +  ASSERT_TRUE(tok[3] == L'\0');  | 
 | 65 | +  // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 66 | +  tok = LIBC_NAMESPACE::wcstok(src, L".", &reserve);  | 
 | 67 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 68 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 69 | +  ASSERT_TRUE(tok[2] == L'3');  | 
 | 70 | +  ASSERT_TRUE(tok[3] == L'\0');  | 
 | 71 | +  ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L".", &reserve), nullptr);  | 
41 | 72 | }  | 
42 | 73 | 
 
  | 
43 |  | -TEST(LlvmLibcStrTokTest, DelimiterIsMiddleCharacter) {  | 
 | 74 | +TEST(LlvmLibcWCSTokReentrantTest, DelimiterIsMiddleCharacter) {  | 
44 | 75 |   wchar_t src[] = L"12,34";  | 
45 |  | -  wchar_t *buf;  | 
46 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L",", &buf);  | 
47 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
48 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
49 |  | -  ASSERT_TRUE(token[2] == L'\0');  | 
 | 76 | +  wchar_t *reserve = nullptr;  | 
 | 77 | +  wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);  | 
 | 78 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 79 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 80 | +  ASSERT_TRUE(tok[2] == L'\0');  | 
 | 81 | +  // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 82 | +  tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);  | 
 | 83 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 84 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 85 | +  ASSERT_TRUE(tok[2] == L'\0');  | 
 | 86 | +  ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L",", &reserve), nullptr);  | 
50 | 87 | }  | 
51 | 88 | 
 
  | 
52 |  | -TEST(LlvmLibcStrTokTest, DelimiterAsLastCharacterShouldBeIgnored) {  | 
 | 89 | +TEST(LlvmLibcWCSTokReentrantTest, DelimiterAsLastCharacterShouldBeIgnored) {  | 
53 | 90 |   wchar_t src[] = L"1234:";  | 
54 |  | -  wchar_t *buf;  | 
55 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L":", &buf);  | 
56 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
57 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
58 |  | -  ASSERT_TRUE(token[2] == L'3');  | 
59 |  | -  ASSERT_TRUE(token[3] == L'4');  | 
60 |  | -  ASSERT_TRUE(token[4] == L'\0');  | 
 | 91 | +  wchar_t *reserve = nullptr;  | 
 | 92 | +  wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L":", &reserve);  | 
 | 93 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 94 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 95 | +  ASSERT_TRUE(tok[2] == L'3');  | 
 | 96 | +  ASSERT_TRUE(tok[3] == L'4');  | 
 | 97 | +  ASSERT_TRUE(tok[4] == L'\0');  | 
 | 98 | +  // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 99 | +  tok = LIBC_NAMESPACE::wcstok(src, L":", &reserve);  | 
 | 100 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 101 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 102 | +  ASSERT_TRUE(tok[2] == L'3');  | 
 | 103 | +  ASSERT_TRUE(tok[3] == L'4');  | 
 | 104 | +  ASSERT_TRUE(tok[4] == L'\0');  | 
 | 105 | +  ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L":", &reserve), nullptr);  | 
61 | 106 | }  | 
62 | 107 | 
 
  | 
63 |  | -TEST(LlvmLibcStrTokTest, MultipleDelimiters) {  | 
64 |  | -  wchar_t src[] = L"12,.34";  | 
65 |  | -  wchar_t *buf;  | 
66 |  | -  wchar_t *token;  | 
67 |  | - | 
68 |  | -  token = LIBC_NAMESPACE::wcstok(src, L".", &buf);  | 
69 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
70 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
71 |  | -  ASSERT_TRUE(token[2] == L',');  | 
72 |  | -  ASSERT_TRUE(token[3] == L'\0');  | 
73 |  | - | 
74 |  | -  token = LIBC_NAMESPACE::wcstok(src, L".,", &buf);  | 
75 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
76 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
77 |  | -  ASSERT_TRUE(token[2] == L'\0');  | 
78 |  | - | 
79 |  | -  token = LIBC_NAMESPACE::wcstok(src, L",.", &buf);  | 
80 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
81 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
82 |  | -  ASSERT_TRUE(token[2] == L'\0');  | 
83 |  | - | 
84 |  | -  token = LIBC_NAMESPACE::wcstok(src, L":,.", &buf);  | 
85 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
86 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
87 |  | -  ASSERT_TRUE(token[2] == L'\0');  | 
 | 108 | +TEST(LlvmLibcWCSTokReentrantTest, ShouldNotGoPastNullTerminator) {  | 
 | 109 | +  wchar_t src[] = {L'1', L'2', L'\0', L',', L'3'};  | 
 | 110 | +  wchar_t *reserve = nullptr;  | 
 | 111 | +  wchar_t *tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);  | 
 | 112 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 113 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 114 | +  ASSERT_TRUE(tok[2] == L'\0');  | 
 | 115 | +  // Another call to ensure that 'reserve' is not in a bad state.  | 
 | 116 | +  tok = LIBC_NAMESPACE::wcstok(src, L",", &reserve);  | 
 | 117 | +  ASSERT_TRUE(tok[0] == L'1');  | 
 | 118 | +  ASSERT_TRUE(tok[1] == L'2');  | 
 | 119 | +  ASSERT_TRUE(tok[2] == L'\0');  | 
 | 120 | +  ASSERT_EQ(LIBC_NAMESPACE::wcstok(nullptr, L",", &reserve), nullptr);  | 
88 | 121 | }  | 
89 | 122 | 
 
  | 
90 |  | -TEST(LlvmLibcStrTokTest, ShouldNotGoPastNullTerminator) {  | 
91 |  | -  wchar_t src[] = {L'1', L'2', L'\0', L',', L'3'};  | 
92 |  | -  wchar_t *buf;  | 
93 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L",", &buf);  | 
94 |  | -  ASSERT_TRUE(token[0] == L'1');  | 
95 |  | -  ASSERT_TRUE(token[1] == L'2');  | 
96 |  | -  ASSERT_TRUE(token[2] == L'\0');  | 
 | 123 | +TEST(LlvmLibcWCSTokReentrantTest,  | 
 | 124 | +     ShouldReturnNullptrWhenBothSrcAndSaveptrAreNull) {  | 
 | 125 | +  wchar_t *src = nullptr;  | 
 | 126 | +  wchar_t *reserve = nullptr;  | 
 | 127 | +  // Ensure that instead of crashing if src and reserve are null, nullptr is  | 
 | 128 | +  // returned  | 
 | 129 | +  ASSERT_EQ(LIBC_NAMESPACE::wcstok(src, L",", &reserve), nullptr);  | 
 | 130 | +  // And that neither src nor reserve are changed when that happens  | 
 | 131 | +  ASSERT_EQ(src, nullptr);  | 
 | 132 | +  ASSERT_EQ(reserve, nullptr);  | 
97 | 133 | }  | 
98 | 134 | 
 
  | 
99 |  | -TEST(LlvmLibcStrTokTest, SubsequentCallsShouldFindFollowingDelimiters) {  | 
 | 135 | +TEST(LlvmLibcWCSTokReentrantTest,  | 
 | 136 | +     SubsequentCallsShouldFindFollowingDelimiters) {  | 
100 | 137 |   wchar_t src[] = L"12,34.56";  | 
101 |  | -  wchar_t *buf;  | 
102 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L",.", &buf);  | 
 | 138 | +  wchar_t *reserve = nullptr;  | 
 | 139 | +  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L",.", &reserve);  | 
103 | 140 |   ASSERT_TRUE(token[0] == L'1');  | 
104 | 141 |   ASSERT_TRUE(token[1] == L'2');  | 
105 | 142 |   ASSERT_TRUE(token[2] == L'\0');  | 
106 | 143 | 
 
  | 
107 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L",.", &buf);  | 
 | 144 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L",.", &reserve);  | 
108 | 145 |   ASSERT_TRUE(token[0] == L'3');  | 
109 | 146 |   ASSERT_TRUE(token[1] == L'4');  | 
110 | 147 |   ASSERT_TRUE(token[2] == L'\0');  | 
111 | 148 | 
 
  | 
112 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L",.", &buf);  | 
 | 149 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L",.", &reserve);  | 
113 | 150 |   ASSERT_TRUE(token[0] == L'5');  | 
114 | 151 |   ASSERT_TRUE(token[1] == L'6');  | 
115 | 152 |   ASSERT_TRUE(token[2] == L'\0');  | 
116 |  | - | 
117 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &buf);  | 
 | 153 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &reserve);  | 
118 | 154 |   ASSERT_EQ(token, nullptr);  | 
119 | 155 |   // Subsequent calls after hitting the end of the string should also return  | 
120 | 156 |   // nullptr.  | 
121 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &buf);  | 
 | 157 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &reserve);  | 
122 | 158 |   ASSERT_EQ(token, nullptr);  | 
123 | 159 | }  | 
124 | 160 | 
 
  | 
125 |  | -TEST(LlvmLibcStrTokTest, DelimitersShouldNotBeIncludedInToken) {  | 
126 |  | -  wchar_t *buf;  | 
 | 161 | +TEST(LlvmLibcWCSTokReentrantTest, DelimitersShouldNotBeIncludedInToken) {  | 
127 | 162 |   wchar_t src[] = L"__ab__:_cd__:__ef__:__";  | 
128 |  | -  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L"_:", &buf);  | 
 | 163 | +  wchar_t *reserve = nullptr;  | 
 | 164 | +  wchar_t *token = LIBC_NAMESPACE::wcstok(src, L"_:", &reserve);  | 
129 | 165 |   ASSERT_TRUE(token[0] == L'a');  | 
130 | 166 |   ASSERT_TRUE(token[1] == L'b');  | 
131 | 167 |   ASSERT_TRUE(token[2] == L'\0');  | 
132 | 168 | 
 
  | 
133 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L":_", &buf);  | 
 | 169 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L":_", &reserve);  | 
134 | 170 |   ASSERT_TRUE(token[0] == L'c');  | 
135 | 171 |   ASSERT_TRUE(token[1] == L'd');  | 
136 | 172 |   ASSERT_TRUE(token[2] == L'\0');  | 
137 | 173 | 
 
  | 
138 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,", &buf);  | 
 | 174 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,", &reserve);  | 
139 | 175 |   ASSERT_TRUE(token[0] == L'e');  | 
140 | 176 |   ASSERT_TRUE(token[1] == L'f');  | 
141 | 177 |   ASSERT_TRUE(token[2] == L'\0');  | 
142 | 178 | 
 
  | 
143 |  | -  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &buf);  | 
 | 179 | +  token = LIBC_NAMESPACE::wcstok(nullptr, L"_:,_", &reserve);  | 
144 | 180 |   ASSERT_EQ(token, nullptr);  | 
145 | 181 | }  | 
0 commit comments