1 // Copyright (c) 2015-2016 The Khronos Group Inc.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 #include "unit_spirv.h"
19 using libspirv::AssemblyContext;
20 using spvtest::AutoText;
24 #define BACKSLASH R"(\)"
27 TEST(TextWordGet, NullTerminator) {
29 spv_position_t endPosition = {};
32 AssemblyContext(AutoText("Word"), nullptr).getWord(&word, &endPosition));
33 ASSERT_EQ(4u, endPosition.column);
34 ASSERT_EQ(0u, endPosition.line);
35 ASSERT_EQ(4u, endPosition.index);
36 ASSERT_STREQ("Word", word.c_str());
39 TEST(TextWordGet, TabTerminator) {
41 spv_position_t endPosition = {};
42 ASSERT_EQ(SPV_SUCCESS, AssemblyContext(AutoText("Word\t"), nullptr)
43 .getWord(&word, &endPosition));
44 ASSERT_EQ(4u, endPosition.column);
45 ASSERT_EQ(0u, endPosition.line);
46 ASSERT_EQ(4u, endPosition.index);
47 ASSERT_STREQ("Word", word.c_str());
50 TEST(TextWordGet, SpaceTerminator) {
52 spv_position_t endPosition = {};
55 AssemblyContext(AutoText("Word "), nullptr).getWord(&word, &endPosition));
56 ASSERT_EQ(4u, endPosition.column);
57 ASSERT_EQ(0u, endPosition.line);
58 ASSERT_EQ(4u, endPosition.index);
59 ASSERT_STREQ("Word", word.c_str());
62 TEST(TextWordGet, SemicolonTerminator) {
64 spv_position_t endPosition = {};
67 AssemblyContext(AutoText("Wo;rd"), nullptr).getWord(&word, &endPosition));
68 ASSERT_EQ(2u, endPosition.column);
69 ASSERT_EQ(0u, endPosition.line);
70 ASSERT_EQ(2u, endPosition.index);
71 ASSERT_STREQ("Wo", word.c_str());
74 TEST(TextWordGet, NoTerminator) {
75 const std::string full_text = "abcdefghijklmn";
76 for (size_t len = 1; len <= full_text.size(); ++len) {
78 spv_text_t text = {full_text.data(), len};
79 spv_position_t endPosition = {};
80 ASSERT_EQ(SPV_SUCCESS,
81 AssemblyContext(&text, nullptr).getWord(&word, &endPosition));
82 ASSERT_EQ(0u, endPosition.line);
83 ASSERT_EQ(len, endPosition.column);
84 ASSERT_EQ(len, endPosition.index);
85 ASSERT_EQ(full_text.substr(0, len), word);
89 TEST(TextWordGet, MultipleWords) {
90 AutoText input("Words in a sentence");
91 AssemblyContext data(input, nullptr);
93 spv_position_t endPosition = {};
94 const char* words[] = {"Words", "in", "a", "sentence"};
97 for (uint32_t wordIndex = 0; wordIndex < 4; ++wordIndex) {
98 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &endPosition));
99 ASSERT_EQ(strlen(words[wordIndex]),
100 endPosition.column - data.position().column);
101 ASSERT_EQ(0u, endPosition.line);
102 ASSERT_EQ(strlen(words[wordIndex]),
103 endPosition.index - data.position().index);
104 ASSERT_STREQ(words[wordIndex], word.c_str());
106 data.setPosition(endPosition);
107 if (3 != wordIndex) {
108 ASSERT_EQ(SPV_SUCCESS, data.advance());
110 ASSERT_EQ(SPV_END_OF_STREAM, data.advance());
115 TEST(TextWordGet, QuotesAreKept) {
116 AutoText input(R"("quotes" "around words")");
117 const char* expected[] = {R"("quotes")", R"("around words")"};
118 AssemblyContext data(input, nullptr);
121 spv_position_t endPosition = {};
122 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &endPosition));
123 EXPECT_EQ(8u, endPosition.column);
124 EXPECT_EQ(0u, endPosition.line);
125 EXPECT_EQ(8u, endPosition.index);
126 EXPECT_STREQ(expected[0], word.c_str());
128 // Move to the next word.
129 data.setPosition(endPosition);
132 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &endPosition));
133 EXPECT_EQ(23u, endPosition.column);
134 EXPECT_EQ(0u, endPosition.line);
135 EXPECT_EQ(23u, endPosition.index);
136 EXPECT_STREQ(expected[1], word.c_str());
139 TEST(TextWordGet, QuotesBetweenWordsActLikeGlue) {
140 AutoText input(R"(quotes" "between words)");
141 const char* expected[] = {R"(quotes" "between)", "words"};
142 AssemblyContext data(input, nullptr);
145 spv_position_t endPosition = {};
146 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &endPosition));
147 EXPECT_EQ(16u, endPosition.column);
148 EXPECT_EQ(0u, endPosition.line);
149 EXPECT_EQ(16u, endPosition.index);
150 EXPECT_STREQ(expected[0], word.c_str());
152 // Move to the next word.
153 data.setPosition(endPosition);
156 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &endPosition));
157 EXPECT_EQ(22u, endPosition.column);
158 EXPECT_EQ(0u, endPosition.line);
159 EXPECT_EQ(22u, endPosition.index);
160 EXPECT_STREQ(expected[1], word.c_str());
163 TEST(TextWordGet, QuotingWhitespace) {
164 AutoText input(QUOTE "white " NEWLINE TAB " space" QUOTE);
165 // Whitespace surrounded by quotes acts like glue.
167 spv_position_t endPosition = {};
168 ASSERT_EQ(SPV_SUCCESS,
169 AssemblyContext(input, nullptr).getWord(&word, &endPosition));
170 EXPECT_EQ(input.str.length(), endPosition.column);
171 EXPECT_EQ(0u, endPosition.line);
172 EXPECT_EQ(input.str.length(), endPosition.index);
173 EXPECT_EQ(input.str, word);
176 TEST(TextWordGet, QuoteAlone) {
177 AutoText input(QUOTE);
179 spv_position_t endPosition = {};
180 ASSERT_EQ(SPV_SUCCESS,
181 AssemblyContext(input, nullptr).getWord(&word, &endPosition));
182 ASSERT_EQ(1u, endPosition.column);
183 ASSERT_EQ(0u, endPosition.line);
184 ASSERT_EQ(1u, endPosition.index);
185 ASSERT_STREQ(QUOTE, word.c_str());
188 TEST(TextWordGet, EscapeAlone) {
189 AutoText input(BACKSLASH);
191 spv_position_t endPosition = {};
192 ASSERT_EQ(SPV_SUCCESS,
193 AssemblyContext(input, nullptr).getWord(&word, &endPosition));
194 ASSERT_EQ(1u, endPosition.column);
195 ASSERT_EQ(0u, endPosition.line);
196 ASSERT_EQ(1u, endPosition.index);
197 ASSERT_STREQ(BACKSLASH, word.c_str());
200 TEST(TextWordGet, EscapeAtEndOfInput) {
201 AutoText input("word" BACKSLASH);
203 spv_position_t endPosition = {};
204 ASSERT_EQ(SPV_SUCCESS,
205 AssemblyContext(input, nullptr).getWord(&word, &endPosition));
206 ASSERT_EQ(5u, endPosition.column);
207 ASSERT_EQ(0u, endPosition.line);
208 ASSERT_EQ(5u, endPosition.index);
209 ASSERT_STREQ("word" BACKSLASH, word.c_str());
212 TEST(TextWordGet, Escaping) {
213 AutoText input("w" BACKSLASH QUOTE "o" BACKSLASH NEWLINE "r" BACKSLASH ";d");
215 spv_position_t endPosition = {};
216 ASSERT_EQ(SPV_SUCCESS,
217 AssemblyContext(input, nullptr).getWord(&word, &endPosition));
218 ASSERT_EQ(10u, endPosition.column);
219 ASSERT_EQ(0u, endPosition.line);
220 ASSERT_EQ(10u, endPosition.index);
221 ASSERT_EQ(input.str, word);
224 TEST(TextWordGet, EscapingEscape) {
225 AutoText input("word" BACKSLASH BACKSLASH " abc");
227 spv_position_t endPosition = {};
228 ASSERT_EQ(SPV_SUCCESS,
229 AssemblyContext(input, nullptr).getWord(&word, &endPosition));
230 ASSERT_EQ(6u, endPosition.column);
231 ASSERT_EQ(0u, endPosition.line);
232 ASSERT_EQ(6u, endPosition.index);
233 ASSERT_STREQ("word" BACKSLASH BACKSLASH, word.c_str());
236 TEST(TextWordGet, CRLF) {
237 AutoText input("abc\r\nd");
238 AssemblyContext data(input, nullptr);
240 spv_position_t pos = {};
241 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &pos));
242 EXPECT_EQ(3u, pos.column);
243 EXPECT_STREQ("abc", word.c_str());
244 data.setPosition(pos);
246 ASSERT_EQ(SPV_SUCCESS, data.getWord(&word, &pos));
247 EXPECT_EQ(1u, pos.column);
248 EXPECT_STREQ("d", word.c_str());
251 } // anonymous namespace