10#include "gtest/gtest.h"
18class ParserTest :
public ::testing::Test {
20 kmp_trait_context *context =
nullptr;
22 void parse(
const char *spec,
const char *dbg_name =
nullptr) {
26 void TearDown()
override {
34template <
bool expected_result>
37 int expected_device_num) {
38 EXPECT_EQ(context->
match(expected_device_num), expected_result);
39 EXPECT_EQ(
result.contains(expected_device_num), expected_result);
42template <
bool expected_result,
int... device_nums>
45 (check_result_single<expected_result>(context,
result, device_nums), ...);
48template <
bool expected_result,
int... device_nums>
51 check_result<expected_result, device_nums...>(context,
result);
58TEST_F(ParserTest, SingleLiteral) {
61 ASSERT_NE(context,
nullptr);
65 check_result<false, 5, 0, 4, 6>(context);
68TEST_F(ParserTest, ZeroLiteral) {
71 ASSERT_NE(context,
nullptr);
74 EXPECT_EQ(
result.size(), 1u);
75 check_result<true, 0>(context,
result);
76 check_result<false, 1>(context,
result);
79TEST_F(ParserTest, MultipleLiterals) {
82 ASSERT_NE(context,
nullptr);
85 EXPECT_EQ(
result.size(), 3u);
86 check_result<true, 1, 2, 3>(context,
result);
87 check_result<false, 0, 4>(context,
result);
90TEST_F(ParserTest, LiteralsWithSpaces) {
93 ASSERT_NE(context,
nullptr);
96 EXPECT_EQ(
result.size(), 3u);
97 check_result<true, 1, 2, 3>(context,
result);
98 check_result<false, 0, 4>(context,
result);
101TEST_F(ParserTest, LiteralsWithLeadingSpaces) {
104 ASSERT_NE(context,
nullptr);
107 EXPECT_EQ(
result.size(), 3u);
108 check_result<true, 1, 2, 3>(context,
result);
109 check_result<false, 0, 4>(context,
result);
112TEST_F(ParserTest, LargeLiteral) {
115 ASSERT_NE(context,
nullptr);
119 EXPECT_EQ(
result.size(), 0u);
120 check_result<false, 12345, 0>(context,
result);
127TEST_F(ParserTest, Wildcard) {
130 ASSERT_NE(context,
nullptr);
134 EXPECT_EQ(
result.size(), 4u);
135 check_result<true, 0, 1, 2, 3>(context,
result);
136 check_result<false, 100>(context,
result);
139TEST_F(ParserTest, WildcardWithLiterals) {
142 ASSERT_NE(context,
nullptr);
146 EXPECT_EQ(
result.size(), 4u);
147 check_result<true, 0, 1, 2, 3>(context,
result);
148 check_result<false, 100>(context,
result);
155TEST_F(ParserTest, UIDTrait) {
156 parse(
"uid(device-0)");
158 ASSERT_NE(context,
nullptr);
162 EXPECT_EQ(
result.size(), 1u);
163 check_result<true, 0>(context,
result);
164 check_result<false, 1>(context,
result);
167TEST_F(ParserTest, UIDTraitWithUnderscore) {
168 parse(
"uid(my_device_123)");
170 ASSERT_NE(context,
nullptr);
174 EXPECT_EQ(
result.size(), 0u);
175 check_result<false, 0, 1>(context,
result);
178TEST_F(ParserTest, UIDTraitWithDash) {
179 parse(
"uid(device-2)");
181 ASSERT_NE(context,
nullptr);
185 EXPECT_EQ(
result.size(), 1u);
186 check_result<true, 2>(context,
result);
187 check_result<false, 0, 1, 3>(context,
result);
190TEST_F(ParserTest, MultipleUIDTraits) {
191 parse(
"uid(device-1), uid(device-3)");
193 ASSERT_NE(context,
nullptr);
196 EXPECT_EQ(
result.size(), 2u);
197 check_result<true, 1, 3>(context,
result);
198 check_result<false, 0, 2>(context,
result);
201TEST_F(ParserTest, MixedLiteralsAndUIDs) {
202 parse(
"0, uid(device-2), 1, uid(device-3)");
204 ASSERT_NE(context,
nullptr);
207 EXPECT_EQ(
result.size(), 4u);
208 check_result<true, 0, 1, 2, 3>(context,
result);
215TEST_F(ParserTest, NegatedUID) {
216 parse(
"!uid(device-0)");
218 ASSERT_NE(context,
nullptr);
222 EXPECT_EQ(
result.size(), 3u);
223 check_result<false, 0>(context,
result);
224 check_result<true, 1, 2, 3>(context,
result);
231TEST_F(ParserTest, SimpleGroup) {
232 parse(
"(uid(device-1))");
234 ASSERT_NE(context,
nullptr);
237 EXPECT_EQ(
result.size(), 1u);
238 check_result<false, 0>(context,
result);
239 check_result<true, 1>(context,
result);
242TEST_F(ParserTest, GroupWithOR) {
243 parse(
"(uid(device-0) || uid(device-2))");
245 ASSERT_NE(context,
nullptr);
248 EXPECT_EQ(
result.size(), 2u);
249 check_result<true, 0, 2>(context,
result);
250 check_result<false, 1, 3>(context,
result);
253TEST_F(ParserTest, GroupWithAND) {
254 parse(
"(uid(device-0) && uid(device-0))");
256 ASSERT_NE(context,
nullptr);
260 EXPECT_EQ(
result.size(), 1u);
261 check_result<true, 0>(context,
result);
262 check_result<false, 1>(context,
result);
265TEST_F(ParserTest, NegatedGroup) {
266 parse(
"!(uid(device-0) || uid(device-1))");
268 ASSERT_NE(context,
nullptr);
272 EXPECT_EQ(
result.size(), 2u);
273 check_result<false, 0, 1>(context,
result);
274 check_result<true, 2, 3>(context,
result);
281TEST_F(ParserTest, ComplexMixed) {
282 parse(
"0, 1, uid(device-2), *");
284 ASSERT_NE(context,
nullptr);
287 EXPECT_EQ(
result.size(), 4u);
288 check_result<true, 0, 1, 2, 3>(context,
result);
289 check_result<false, 100>(context,
result);
292TEST_F(ParserTest, MultipleORGroups) {
293 parse(
"(uid(device-0) || uid(device-1)), (uid(device-2) || uid(device-3))");
295 ASSERT_NE(context,
nullptr);
298 EXPECT_EQ(
result.size(), 4u);
299 check_result<true, 0, 1, 2, 3>(context,
result);
306TEST_F(ParserTest, ThreeWayOR) {
308 parse(
"(uid(device-0) || uid(device-1) || uid(device-2))");
310 ASSERT_NE(context,
nullptr);
313 EXPECT_EQ(
result.size(), 3u);
314 check_result<true, 0, 1, 2>(context,
result);
315 check_result<false, 3>(context,
result);
318TEST_F(ParserTest, FourWayOR) {
320 parse(
"(uid(device-0) || uid(device-1) || uid(device-2) || uid(device-3))");
322 ASSERT_NE(context,
nullptr);
325 EXPECT_EQ(
result.size(), 4u);
326 check_result<true, 0, 1, 2, 3>(context,
result);
329TEST_F(ParserTest, ThreeWayAND) {
331 parse(
"(uid(device-1) && uid(device-1) && uid(device-1))");
333 ASSERT_NE(context,
nullptr);
336 EXPECT_EQ(
result.size(), 1u);
337 check_result<true, 1>(context,
result);
338 check_result<false, 0, 2, 3>(context,
result);
341TEST_F(ParserTest, ANDWithDifferentUIDs) {
343 parse(
"(uid(device-0) && uid(device-1))");
345 ASSERT_NE(context,
nullptr);
348 EXPECT_EQ(
result.size(), 0u);
349 check_result<false, 0, 1, 2, 3>(context,
result);
352TEST_F(ParserTest, NegatedThreeWayOR) {
354 parse(
"!(uid(device-0) || uid(device-1) || uid(device-2))");
356 ASSERT_NE(context,
nullptr);
359 EXPECT_EQ(
result.size(), 1u);
360 check_result<false, 0, 1, 2>(context,
result);
361 check_result<true, 3>(context,
result);
364TEST_F(ParserTest, NegatedAND) {
366 parse(
"!(uid(device-0) && uid(device-1))");
368 ASSERT_NE(context,
nullptr);
371 EXPECT_EQ(
result.size(), 4u);
372 check_result<true, 0, 1, 2, 3>(context,
result);
375TEST_F(ParserTest, NegatedANDWithSameUID) {
377 parse(
"!(uid(device-0) && uid(device-0))");
379 ASSERT_NE(context,
nullptr);
382 EXPECT_EQ(
result.size(), 3u);
383 check_result<false, 0>(context,
result);
384 check_result<true, 1, 2, 3>(context,
result);
387TEST_F(ParserTest, NestedParensWithOR) {
389 parse(
"((uid(device-0) || uid(device-1)))");
391 ASSERT_NE(context,
nullptr);
394 EXPECT_EQ(
result.size(), 2u);
395 check_result<true, 0, 1>(context,
result);
396 check_result<false, 2, 3>(context,
result);
399TEST_F(ParserTest, NestedParensWithAND) {
401 parse(
"((uid(device-2) && uid(device-2)))");
403 ASSERT_NE(context,
nullptr);
406 EXPECT_EQ(
result.size(), 1u);
407 check_result<true, 2>(context,
result);
408 check_result<false, 0, 1, 3>(context,
result);
411TEST_F(ParserTest, DoubleNegation) {
413 parse(
"!(!uid(device-0))");
415 ASSERT_NE(context,
nullptr);
418 EXPECT_EQ(
result.size(), 1u);
419 check_result<true, 0>(context,
result);
420 check_result<false, 1, 2, 3>(context,
result);
423TEST_F(ParserTest, NegatedNestedOR) {
425 parse(
"!((uid(device-0) || uid(device-1)))");
427 ASSERT_NE(context,
nullptr);
430 EXPECT_EQ(
result.size(), 2u);
431 check_result<false, 0, 1>(context,
result);
432 check_result<true, 2, 3>(context,
result);
435TEST_F(ParserTest, MultipleNegatedExprs) {
437 parse(
"!uid(device-0), !uid(device-1)");
439 ASSERT_NE(context,
nullptr);
444 EXPECT_EQ(
result.size(), 4u);
445 check_result<true, 0, 1, 2, 3>(context,
result);
448TEST_F(ParserTest, MixedNegatedAndNonNegated) {
450 parse(
"uid(device-0), !uid(device-0)");
452 ASSERT_NE(context,
nullptr);
456 EXPECT_EQ(
result.size(), 4u);
457 check_result<true, 0, 1, 2, 3>(context,
result);
460TEST_F(ParserTest, ComplexORGroupsInSeparateExprs) {
462 parse(
"(uid(device-0) || uid(device-1)), (uid(device-2) || uid(device-3))");
464 ASSERT_NE(context,
nullptr);
468 EXPECT_EQ(
result.size(), 4u);
469 check_result<true, 0, 1, 2, 3>(context,
result);
472TEST_F(ParserTest, NegatedORGroupWithLiteral) {
474 parse(
"!(uid(device-0) || uid(device-1)), 0");
476 ASSERT_NE(context,
nullptr);
480 EXPECT_EQ(
result.size(), 3u);
481 check_result<true, 0, 2, 3>(context,
result);
482 check_result<false, 1>(context,
result);
485TEST_F(ParserTest, DeeplyNestedWithOperators) {
487 parse(
"(((uid(device-0) || uid(device-1))))");
489 ASSERT_NE(context,
nullptr);
492 EXPECT_EQ(
result.size(), 2u);
493 check_result<true, 0, 1>(context,
result);
494 check_result<false, 2, 3>(context,
result);
497TEST_F(ParserTest, ORWithSpacesAroundOperators) {
499 parse(
"( uid(device-0) || uid(device-2) || uid(device-3) )");
501 ASSERT_NE(context,
nullptr);
504 EXPECT_EQ(
result.size(), 3u);
505 check_result<true, 0, 2, 3>(context,
result);
506 check_result<false, 1>(context,
result);
509TEST_F(ParserTest, ANDWithSpacesAroundOperators) {
511 parse(
"( uid(device-1) && uid(device-1) )");
513 ASSERT_NE(context,
nullptr);
516 EXPECT_EQ(
result.size(), 1u);
517 check_result<true, 1>(context,
result);
518 check_result<false, 0, 2, 3>(context,
result);
525TEST_F(ParserTest, ORExprAndANDExpr) {
527 parse(
"(uid(device-0) || uid(device-1)), (uid(device-2) && uid(device-2))");
529 ASSERT_NE(context,
nullptr);
533 EXPECT_EQ(
result.size(), 3u);
534 check_result<true, 0, 1, 2>(context,
result);
535 check_result<false, 3>(context,
result);
538TEST_F(ParserTest, ANDExprAndORExpr) {
540 parse(
"(uid(device-0) && uid(device-0)), (uid(device-2) || uid(device-3))");
542 ASSERT_NE(context,
nullptr);
546 EXPECT_EQ(
result.size(), 3u);
547 check_result<true, 0, 2, 3>(context,
result);
548 check_result<false, 1>(context,
result);
551TEST_F(ParserTest, MultipleANDAndORExprs) {
553 parse(
"(uid(device-0) && uid(device-0)), (uid(device-1) || uid(device-2)), "
554 "(uid(device-3) && uid(device-3))");
556 ASSERT_NE(context,
nullptr);
560 EXPECT_EQ(
result.size(), 4u);
561 check_result<true, 0, 1, 2, 3>(context,
result);
564TEST_F(ParserTest, NegatedORWithAND) {
566 parse(
"!(uid(device-0) || uid(device-1)), (uid(device-0) && uid(device-0))");
568 ASSERT_NE(context,
nullptr);
572 EXPECT_EQ(
result.size(), 3u);
573 check_result<true, 0, 2, 3>(context,
result);
574 check_result<false, 1>(context,
result);
577TEST_F(ParserTest, NegatedANDWithOR) {
579 parse(
"!(uid(device-0) && uid(device-0)), (uid(device-0) || uid(device-1))");
581 ASSERT_NE(context,
nullptr);
585 EXPECT_EQ(
result.size(), 4u);
586 check_result<true, 0, 1, 2, 3>(context,
result);
589TEST_F(ParserTest, ComplexMixedOperators) {
591 parse(
"(uid(device-0) || uid(device-1)), (uid(device-2) && uid(device-2)), "
592 "!(uid(device-0) || uid(device-1) || uid(device-2)), 0");
594 ASSERT_NE(context,
nullptr);
599 EXPECT_EQ(
result.size(), 4u);
600 check_result<true, 0, 1, 2, 3>(context,
result);
603TEST_F(ParserTest, ANDNeverMatchesWithOR) {
605 parse(
"(uid(device-0) && uid(device-1)), (uid(device-2) || uid(device-3))");
607 ASSERT_NE(context,
nullptr);
611 EXPECT_EQ(
result.size(), 2u);
612 check_result<false, 0, 1>(context,
result);
613 check_result<true, 2, 3>(context,
result);
616TEST_F(ParserTest, ORNeverMatchesWithAND) {
618 parse(
"(uid(nonexistent-a) || uid(nonexistent-b)), (uid(device-0) && "
621 ASSERT_NE(context,
nullptr);
625 EXPECT_EQ(
result.size(), 1u);
626 check_result<true, 0>(context,
result);
627 check_result<false, 1, 2, 3>(context,
result);
630TEST_F(ParserTest, ThreeWayORAndThreeWayAND) {
632 parse(
"(uid(device-0) || uid(device-1) || uid(device-2)), (uid(device-3) && "
633 "uid(device-3) && uid(device-3))");
635 ASSERT_NE(context,
nullptr);
639 EXPECT_EQ(
result.size(), 4u);
640 check_result<true, 0, 1, 2, 3>(context,
result);
643TEST_F(ParserTest, NegatedMixedExprs) {
645 parse(
"!(uid(device-0) || uid(device-1)), !(uid(device-2) && uid(device-2))");
647 ASSERT_NE(context,
nullptr);
652 EXPECT_EQ(
result.size(), 4u);
653 check_result<true, 0, 1, 2, 3>(context,
result);
656TEST_F(ParserTest, LiteralsWithMixedOperatorExprs) {
658 parse(
"0, (uid(device-1) || uid(device-2)), 3, (uid(device-0) && "
661 ASSERT_NE(context,
nullptr);
666 EXPECT_EQ(
result.size(), 4u);
667 check_result<true, 0, 1, 2, 3>(context,
result);
674TEST_F(ParserTest, ORContainingANDGroup) {
677 parse(
"(uid(device-0) || (uid(device-1) && uid(device-1)))");
679 ASSERT_NE(context,
nullptr);
684 EXPECT_EQ(
result.size(), 2u);
685 check_result<true, 0, 1>(context,
result);
686 check_result<false, 2, 3>(context,
result);
689TEST_F(ParserTest, ANDContainingORGroup) {
694 parse(
"(uid(device-0) && (uid(device-0) || uid(device-1)))");
696 ASSERT_NE(context,
nullptr);
701 EXPECT_EQ(
result.size(), 1u);
702 check_result<true, 0>(context,
result);
703 check_result<false, 1, 2, 3>(context,
result);
706TEST_F(ParserTest, ORWithTwoANDGroups) {
709 "((uid(device-0) && uid(device-0)) || (uid(device-2) && uid(device-2)))");
711 ASSERT_NE(context,
nullptr);
715 EXPECT_EQ(
result.size(), 2u);
716 check_result<true, 0, 2>(context,
result);
717 check_result<false, 1, 3>(context,
result);
720TEST_F(ParserTest, ANDWithTwoORGroups) {
724 "((uid(device-0) || uid(device-1)) && (uid(device-0) || uid(device-2)))");
726 ASSERT_NE(context,
nullptr);
732 EXPECT_EQ(
result.size(), 1u);
733 check_result<true, 0>(context,
result);
734 check_result<false, 1, 2, 3>(context,
result);
737TEST_F(ParserTest, ORWithNestedANDContainingOR) {
740 "(uid(device-3) || (uid(device-0) && (uid(device-0) || uid(device-1))))");
742 ASSERT_NE(context,
nullptr);
749 EXPECT_EQ(
result.size(), 2u);
750 check_result<true, 0, 3>(context,
result);
751 check_result<false, 1, 2>(context,
result);
754TEST_F(ParserTest, ANDWithNestedORContainingAND) {
757 "(uid(device-0) && (uid(device-0) || (uid(device-1) && uid(device-1))))");
759 ASSERT_NE(context,
nullptr);
764 EXPECT_EQ(
result.size(), 1u);
765 check_result<true, 0>(context,
result);
766 check_result<false, 1, 2, 3>(context,
result);
769TEST_F(ParserTest, NegatedORContainingAND) {
771 parse(
"!(uid(device-0) || (uid(device-1) && uid(device-1)))");
773 ASSERT_NE(context,
nullptr);
778 EXPECT_EQ(
result.size(), 2u);
779 check_result<false, 0, 1>(context,
result);
780 check_result<true, 2, 3>(context,
result);
783TEST_F(ParserTest, NegatedANDContainingOR) {
785 parse(
"!(uid(device-0) && (uid(device-0) || uid(device-1)))");
787 ASSERT_NE(context,
nullptr);
792 EXPECT_EQ(
result.size(), 3u);
793 check_result<false, 0>(context,
result);
794 check_result<true, 1, 2, 3>(context,
result);
797TEST_F(ParserTest, ComplexNestedWithAllDevices) {
800 "((uid(device-0) || uid(device-1)) && (uid(device-1) || uid(device-2)))");
802 ASSERT_NE(context,
nullptr);
808 EXPECT_EQ(
result.size(), 1u);
809 check_result<true, 1>(context,
result);
810 check_result<false, 0, 2, 3>(context,
result);
813TEST_F(ParserTest, TripleNestedMixedOperators) {
816 "(((uid(device-0) || uid(device-1)) && uid(device-0)) || uid(device-3))");
818 ASSERT_NE(context,
nullptr);
824 EXPECT_EQ(
result.size(), 2u);
825 check_result<true, 0, 3>(context,
result);
826 check_result<false, 1, 2>(context,
result);
829TEST_F(ParserTest, ANDChainWithNestedOR) {
834 parse(
"(uid(device-0) && (uid(device-0) || uid(device-1)) && uid(device-0))");
836 ASSERT_NE(context,
nullptr);
841 EXPECT_EQ(
result.size(), 1u);
842 check_result<true, 0>(context,
result);
843 check_result<false, 1, 2, 3>(context,
result);
846TEST_F(ParserTest, ORChainWithNestedAND) {
848 parse(
"(uid(device-0) || (uid(device-1) && uid(device-1)) || uid(device-3))");
850 ASSERT_NE(context,
nullptr);
855 EXPECT_EQ(
result.size(), 3u);
856 check_result<true, 0, 1, 3>(context,
result);
857 check_result<false, 2>(context,
result);
860TEST_F(ParserTest, NestedMixedWithSpaces) {
862 parse(
"( uid(device-0) || ( uid(device-1) && uid(device-1) ) || "
865 ASSERT_NE(context,
nullptr);
868 EXPECT_EQ(
result.size(), 3u);
869 check_result<true, 0, 1, 2>(context,
result);
870 check_result<false, 3>(context,
result);
873TEST_F(ParserTest, DeepNestingWithinLimit) {
876 constexpr int depth = 20;
877 const char *inner =
"uid(device-0)";
880 for (
int i = 0;
i < depth; ++
i)
882 for (
const char *
s = inner; *
s; ++
s)
884 for (
int i = 0;
i < depth; ++
i)
887 parse(spec,
"deep_nesting_within_limit");
889 ASSERT_NE(context,
nullptr);
892 EXPECT_EQ(
result.size(), 1u);
893 check_result<true, 0>(context,
result);
894 check_result<false, 1, 2, 3>(context,
result);
901TEST_F(ParserTest, EmptyString) {
904 ASSERT_NE(context,
nullptr);
908 EXPECT_EQ(
result.size(), 0u);
909 check_result<false, 0, 1>(context,
result);
912TEST_F(ParserTest, OnlyWhitespace) {
915 ASSERT_NE(context,
nullptr);
918 EXPECT_EQ(
result.size(), 0u);
919 check_result<false, 0>(context,
result);
926TEST_F(ParserTest, OnlyComma) {
928 parse(
",",
"test_only_comma"),
929 "OMP: Error #[0-9]+: trait parser while parsing test_only_comma: "
930 "failed to parse trait specification \\(,\\)");
933TEST_F(ParserTest, OnlyCommaNullDbgName) {
934 ASSERT_DEATH(parse(
","),
935 "OMP: Error #[0-9]+: trait parser while parsing \\(null\\): "
936 "failed to parse trait specification \\(,\\)");
939TEST_F(ParserTest, MixedAndOrSameLevel) {
943 parse(
"uid(a) && uid(b) || uid(c)",
"mixed_and_or_same_level"),
944 "OMP: Error #[0-9]+: trait parser while parsing mixed_and_or_same_level: "
945 "failed to parse trait specification "
946 "\\(\\|\\| uid\\(c\\)\\)");
949TEST_F(ParserTest, MixedOrAndSameLevel) {
951 parse(
"uid(a) || uid(b) && uid(c)",
"mixed_or_and_same_level"),
952 "OMP: Error #[0-9]+: trait parser while parsing mixed_or_and_same_level: "
953 "failed to parse trait specification "
954 "\\(&& uid\\(c\\)\\)");
957TEST_F(ParserTest, InvalidUID) {
960 ASSERT_DEATH(parse(
"uid()",
"invalid_uid"),
961 "OMP: Error #[0-9]+: trait parser while parsing invalid_uid: "
962 "invalid value for trait 'uid' \\(\\)\\)");
965TEST_F(ParserTest, MissingOpenParenAfterTrait) {
967 ASSERT_DEATH(parse(
"uid",
"missing_open_paren"),
968 "OMP: Error #[0-9]+: trait parser while parsing "
969 "missing_open_paren: error: expected '\\(' after trait name");
972TEST_F(ParserTest, MissingCloseParenAfterTraitValue) {
974 ASSERT_DEATH(parse(
"uid(a",
"missing_close_paren"),
975 "OMP: Error #[0-9]+: trait parser while parsing "
976 "missing_close_paren: error: expected '\\)' after trait value");
979TEST_F(ParserTest, UnclosedParenthesis) {
983 parse(
"(uid(a)",
"unclosed_parenthesis"),
984 "OMP: Error #[0-9]+: trait parser while parsing unclosed_parenthesis: "
985 "error: expected '\\)' after trait expression group");
988TEST_F(ParserTest, UnmatchedClosingParenthesis) {
989 ASSERT_DEATH(parse(
"uid(a))",
"unmatched_closing_parenthesis"),
990 "OMP: Error #[0-9]+: trait parser while parsing "
991 "unmatched_closing_parenthesis: "
992 "failed to parse trait specification \\(\\)\\)");
995TEST_F(ParserTest, EmptyParentheses) {
998 parse(
"()",
"empty_parentheses"),
999 "OMP: Error #[0-9]+: trait parser while parsing empty_parentheses: "
1000 "error: expected trait expression after '\\('");
1003TEST_F(ParserTest, TrailingOperator) {
1007 parse(
"uid(a) &&",
"trailing_operator"),
1008 "OMP: Error #[0-9]+: trait parser while parsing trailing_operator: "
1009 "error: expected trait expression after operator");
1012TEST_F(ParserTest, NegationWithoutTrait) {
1016 parse(
"!",
"negation_without_trait"),
1017 "OMP: Error #[0-9]+: trait parser while parsing negation_without_trait: "
1018 "error: expected trait expression after '!'");
1021TEST_F(ParserTest, DeviceNumberOutOfRange) {
1024 ASSERT_DEATH(parse(
"99999999999",
"device_number_out_of_range"),
1025 "OMP: Error #[0-9]+: trait parser while parsing "
1026 "device_number_out_of_range: error: device number out of range");
1029TEST_F(ParserTest, NegativeDeviceNumber) {
1033 ASSERT_DEATH(parse(
"-5",
"negative_device_number"),
1034 "OMP: Error #[0-9]+: trait parser while parsing "
1035 "negative_device_number: error: device number out of range");
1038TEST_F(ParserTest, LeadingOperator) {
1040 parse(
"&& uid(a)",
"leading_operator"),
1041 "OMP: Error #[0-9]+: trait parser while parsing leading_operator: "
1042 "failed to parse trait specification \\(&& uid\\(a\\)\\)");
1045TEST_F(ParserTest, DoubleComma) {
1046 ASSERT_DEATH(parse(
"uid(a),,uid(b)",
"double_comma"),
1047 "OMP: Error #[0-9]+: trait parser while parsing double_comma: "
1048 "failed to parse trait specification \\(,,uid\\(b\\)\\)");
1051TEST_F(ParserTest, UnrecognizedTrait) {
1055 parse(
"foo",
"unrecognized_trait"),
1056 "OMP: Error #[0-9]+: trait parser while parsing unrecognized_trait: "
1057 "failed to parse trait specification \\(foo\\)");
1060TEST_F(ParserTest, MaxRecursionExceeded) {
1064 for (
int i = 0;
i < 100; ++
i)
1067 ASSERT_DEATH(parse(spec,
"max_recursion"),
1068 "OMP: Error #[0-9]+: trait parser while parsing max_recursion: "
1069 "max recursion depth \\(64\\) exceeded");
TEST_F(OmptSequencedAsserterTest, DefaultState)
const kmp_vector< int > & evaluate()
static kmp_trait_context * parse_from_spec(kmp_str_ref spec, const char *dbg_name=nullptr)
kmp_vector is a vector class for managing small vectors.
void const char const char int ITT_FORMAT __itt_group_sync s
void const char const char int ITT_FORMAT __itt_group_sync p