@@ -135,7 +135,7 @@ TEST_METHOD(TestParse_DeclarationsMultipleSynonyms) {
135
135
Assert::IsTrue (actualResult == expectedDeclarations);
136
136
} // namespace UnitTesting
137
137
138
- TEST_METHOD (TestParse_Select ) {
138
+ TEST_METHOD (TestParse_SimpleSelect ) {
139
139
const std::vector<PqlToken> input = {
140
140
{TokenType::STMT}, {TokenType::SYNONYM, " p" },
141
141
{TokenType::SEMICOLON}, {TokenType::STMT},
@@ -148,8 +148,46 @@ TEST_METHOD(TestParse_Select) {
148
148
};
149
149
150
150
const auto actualResult = Pql::parse (input).results ;
151
- const std::vector<std::string> expectedDeclarations = {" p" };
152
- Assert::IsTrue (actualResult == expectedDeclarations);
151
+ const std::vector<std::string> expectedResults = {" p" };
152
+ Assert::IsTrue (actualResult == expectedResults);
153
+ } // namespace UnitTesting
154
+
155
+ TEST_METHOD (TestParse_SimpleSelectAttrRef) {
156
+ const std::vector<PqlToken> input = {
157
+ {TokenType::STMT}, {TokenType::SYNONYM, " p" },
158
+ {TokenType::SEMICOLON}, {TokenType::STMT},
159
+ {TokenType::SYNONYM, " q" }, {TokenType::SEMICOLON},
160
+ {TokenType::SELECT}, {TokenType::SYNONYM, " p" },
161
+ {TokenType::DOT}, {TokenType::STATEMENT_NUM},
162
+ {TokenType::SUCH}, {TokenType::THAT},
163
+ {TokenType::FOLLOWS}, {TokenType::OPEN_PARENTHESIS},
164
+ {TokenType::SYNONYM, " p" }, {TokenType::COMMA},
165
+ {TokenType::SYNONYM, " q" }, {TokenType::CLOSED_PARENTHESIS},
166
+ };
167
+
168
+ const auto actualResult = Pql::parse (input).results ;
169
+ const std::vector<std::string> expectedResults = {" p" };
170
+ Assert::IsTrue (actualResult == expectedResults);
171
+ } // namespace UnitTesting
172
+
173
+ TEST_METHOD (TestParse_MultipleSelect) {
174
+ const std::vector<PqlToken> input = {
175
+ {TokenType::STMT}, {TokenType::SYNONYM, " p" },
176
+ {TokenType::SEMICOLON}, {TokenType::STMT},
177
+ {TokenType::SYNONYM, " q" }, {TokenType::SEMICOLON},
178
+ {TokenType::SELECT}, {TokenType::OPEN_ANGLED_BRACKET},
179
+ {TokenType::SYNONYM, " p" }, {TokenType::DOT},
180
+ {TokenType::STATEMENT_NUM}, {TokenType::COMMA},
181
+ {TokenType::SYNONYM, " q" }, {TokenType::CLOSED_ANGLED_BRACKET},
182
+ {TokenType::SUCH}, {TokenType::THAT},
183
+ {TokenType::FOLLOWS}, {TokenType::OPEN_PARENTHESIS},
184
+ {TokenType::SYNONYM, " p" }, {TokenType::COMMA},
185
+ {TokenType::SYNONYM, " q" }, {TokenType::CLOSED_PARENTHESIS},
186
+ };
187
+
188
+ const auto actualResult = Pql::parse (input).results ;
189
+ const std::vector<std::string> expectedResults = {" p" , " q" };
190
+ Assert::IsTrue (actualResult == expectedResults);
153
191
} // namespace UnitTesting
154
192
155
193
TEST_METHOD (TestParse_FollowsRelationshipTwoSynonyms) {
@@ -288,7 +326,133 @@ TEST_METHOD(TestParse_LHSPatternSynonymButNotVariable_ThrowsException) {
288
326
{TokenType::UNDERSCORE}, {TokenType::CLOSED_PARENTHESIS}};
289
327
Assert::ExpectException<const char *>([input] { Pql::parse (input); });
290
328
} // namespace UnitTesting
329
+ TEST_METHOD (TestParse_MultiplePatternsWithAnd) {
330
+ const std::vector<PqlToken> input = {{TokenType::ASSIGN},
331
+ {TokenType::SYNONYM, " a" },
332
+ {TokenType::SEMICOLON},
333
+ {TokenType::VARIABLE},
334
+ {TokenType::SYNONYM, " v" },
335
+ {TokenType::SEMICOLON},
336
+ {TokenType::SELECT},
337
+ {TokenType::SYNONYM, " a" },
338
+ {TokenType::PATTERN},
339
+ {TokenType::SYNONYM, " a" },
340
+ {TokenType::OPEN_PARENTHESIS},
341
+ {TokenType::SYNONYM, " v" },
342
+ {TokenType::COMMA},
343
+ {TokenType::UNDERSCORE},
344
+ {TokenType::CLOSED_PARENTHESIS},
345
+ {TokenType::AND},
346
+ {TokenType::SYNONYM, " a" },
347
+ {TokenType::OPEN_PARENTHESIS},
348
+ {TokenType::SYNONYM, " v" },
349
+ {TokenType::COMMA},
350
+ {TokenType::UNDERSCORE},
351
+ {TokenType::CLOSED_PARENTHESIS},
352
+ {TokenType::AND},
353
+ {TokenType::SYNONYM, " a" },
354
+ {TokenType::OPEN_PARENTHESIS},
355
+ {TokenType::SYNONYM, " v" },
356
+ {TokenType::COMMA},
357
+ {TokenType::UNDERSCORE},
358
+ {TokenType::CLOSED_PARENTHESIS}};
359
+ const auto actualResult = Pql::parse (input).patterns ;
360
+ const std::vector<ParsedPattern> expectedPatterns{
361
+ ParsedPattern{{TokenType::ASSIGN, " a" },
362
+ {TokenType::VARIABLE, " v" },
363
+ PatternSpec{PatternMatchType::Any}},
364
+ ParsedPattern{{TokenType::ASSIGN, " a" },
365
+ {TokenType::VARIABLE, " v" },
366
+ PatternSpec{PatternMatchType::Any}},
367
+ ParsedPattern{{TokenType::ASSIGN, " a" },
368
+ {TokenType::VARIABLE, " v" },
369
+ PatternSpec{PatternMatchType::Any}}};
370
+ Assert::IsTrue (actualResult == expectedPatterns);
371
+ }
372
+ TEST_METHOD (TestParse_MultipleRelationshipsWithAnd) {
373
+ const std::vector<PqlToken> input = {
374
+ {TokenType::STMT},
375
+ {TokenType::SYNONYM, " s" },
376
+ {TokenType::SEMICOLON},
377
+ {TokenType::SELECT},
378
+ {TokenType::SYNONYM, " s" },
379
+ {TokenType::SUCH},
380
+ {TokenType::THAT},
381
+ {TokenType::MODIFIES},
382
+ {TokenType::OPEN_PARENTHESIS},
383
+ {TokenType::SYNONYM, " s" },
384
+ {TokenType::COMMA},
385
+ {TokenType::STRING, " x" },
386
+ {TokenType::CLOSED_PARENTHESIS},
387
+ {TokenType::AND},
388
+ {TokenType::USES},
389
+ {TokenType::OPEN_PARENTHESIS},
390
+ {TokenType::SYNONYM, " s" },
391
+ {TokenType::COMMA},
392
+ {TokenType::STRING, " x" },
393
+ {TokenType::CLOSED_PARENTHESIS},
394
+ };
395
+ const auto actualResult = Pql::parse (input).relationships ;
396
+ const std::vector<ParsedRelationship> expectedRelationships = {
397
+ ParsedRelationship{TokenType::MODIFIES,
398
+ {TokenType::STMT, " s" },
399
+ {TokenType::STRING, " x" }},
400
+ ParsedRelationship{
401
+ TokenType::USES, {TokenType::STMT, " s" }, {TokenType::STRING, " x" }}};
402
+ Assert::IsTrue (actualResult == expectedRelationships);
403
+ }
404
+ TEST_METHOD (TestParse_WhilePatternStatement) {
405
+ const std::vector<PqlToken> input = {
406
+ {TokenType::WHILE},
407
+ {TokenType::SYNONYM, " w" },
408
+ {TokenType::SEMICOLON},
409
+ {TokenType::VARIABLE},
410
+ {TokenType::SYNONYM, " v" },
411
+ {TokenType::SEMICOLON},
412
+ {TokenType::SELECT},
413
+ {TokenType::SYNONYM, " w" },
414
+ {TokenType::PATTERN},
415
+ {TokenType::SYNONYM, " w" },
416
+ {TokenType::OPEN_PARENTHESIS},
417
+ {TokenType::SYNONYM, " v" },
418
+ {TokenType::COMMA},
419
+ {TokenType::UNDERSCORE},
420
+ {TokenType::CLOSED_PARENTHESIS},
421
+ };
422
+ const auto actualResult = Pql::parse (input).patterns ;
423
+ const std::vector<ParsedPattern> expectedPatterns{
424
+ ParsedPattern{{TokenType::WHILE, " w" },
425
+ {TokenType::VARIABLE, " v" },
426
+ PatternSpec{PatternMatchType::Any}}};
427
+ Assert::IsTrue (actualResult == expectedPatterns);
428
+ }
429
+ TEST_METHOD (TestParse_IfPatternStatement) {
430
+ const std::vector<PqlToken> input = {
431
+ {TokenType::IF},
432
+ {TokenType::SYNONYM, " i" },
433
+ {TokenType::SEMICOLON},
434
+ {TokenType::VARIABLE},
435
+ {TokenType::SYNONYM, " v" },
436
+ {TokenType::SEMICOLON},
437
+ {TokenType::SELECT},
438
+ {TokenType::SYNONYM, " v" },
439
+ {TokenType::PATTERN},
440
+ {TokenType::SYNONYM, " i" },
441
+ {TokenType::OPEN_PARENTHESIS},
442
+ {TokenType::SYNONYM, " v" },
443
+ {TokenType::COMMA},
444
+ {TokenType::UNDERSCORE},
445
+ {TokenType::COMMA},
446
+ {TokenType::UNDERSCORE},
447
+ {TokenType::CLOSED_PARENTHESIS},
448
+ };
449
+ const auto actualResult = Pql::parse (input).patterns ;
450
+ const std::vector<ParsedPattern> expectedPatterns{
451
+ ParsedPattern{{TokenType::IF, " i" },
452
+ {TokenType::VARIABLE, " v" },
453
+ PatternSpec{PatternMatchType::Any}}};
454
+ Assert::IsTrue (actualResult == expectedPatterns);
455
+ }
291
456
}
292
457
;
293
458
}
294
- ; // namespace UnitTesting
0 commit comments