10#include "gtest/gtest.h"
20TEST(kmp_wildcard_trait_test, MatchesAnyDevice) {
23 EXPECT_TRUE(trait->
match(0));
24 EXPECT_TRUE(trait->
match(1));
25 EXPECT_TRUE(trait->
match(100));
26 EXPECT_TRUE(trait->
match(-1));
31TEST(kmp_wildcard_trait_test, Equality) {
35 EXPECT_TRUE(*t1 == *t2);
45TEST(kmp_literal_trait_test, MatchesExactDevice) {
48 EXPECT_TRUE(trait->
match(5));
49 EXPECT_FALSE(trait->
match(0));
50 EXPECT_FALSE(trait->
match(4));
51 EXPECT_FALSE(trait->
match(6));
56TEST(kmp_literal_trait_test, MatchesZero) {
59 EXPECT_TRUE(trait->
match(0));
60 EXPECT_FALSE(trait->
match(1));
66TEST(kmp_literal_trait_test, MatchesNegative) {
71TEST(kmp_literal_trait_test, EqualitySameValue) {
75 EXPECT_TRUE(*t1 == *t2);
81TEST(kmp_literal_trait_test, EqualityDifferentValue) {
85 EXPECT_FALSE(*t1 == *t2);
95TEST(kmp_uid_trait_test, Construction) {
102TEST(kmp_uid_trait_test, MatchWithMock) {
106 EXPECT_TRUE(trait->
match(0));
107 EXPECT_FALSE(trait->
match(1));
108 EXPECT_FALSE(trait->
match(2));
113TEST(kmp_uid_trait_test, MatchWithCustomMock) {
118 return device == 2 ?
"custom-uid" :
"other";
121 EXPECT_FALSE(trait->
match(0));
122 EXPECT_FALSE(trait->
match(1));
123 EXPECT_TRUE(trait->
match(2));
124 EXPECT_FALSE(trait->
match(3));
129TEST(kmp_uid_trait_test, EqualitySameUID) {
133 EXPECT_TRUE(*t1 == *t2);
139TEST(kmp_uid_trait_test, EqualityDifferentUID) {
143 EXPECT_FALSE(*t1 == *t2);
153TEST(kmp_trait_expr_single_test, CreateAndDestroy) {
155 EXPECT_NE(expr,
nullptr);
159TEST(kmp_trait_expr_single_test, CreateWithTrait) {
166 EXPECT_TRUE(expr->
match(2));
167 EXPECT_FALSE(expr->
match(0));
168 EXPECT_FALSE(expr->
match(1));
169 EXPECT_FALSE(expr->
match(5));
174TEST(kmp_trait_expr_single_test, SetTrait) {
181 EXPECT_TRUE(expr->
match(3));
182 EXPECT_FALSE(expr->
match(0));
187TEST(kmp_trait_expr_single_test, DefaultNotNegated) {
195TEST(kmp_trait_expr_single_test, SetNegated) {
207TEST(kmp_trait_expr_single_test, MatchNegated) {
217 EXPECT_FALSE(expr->
match(2));
218 EXPECT_TRUE(expr->
match(0));
219 EXPECT_TRUE(expr->
match(1));
220 EXPECT_TRUE(expr->
match(3));
222 EXPECT_FALSE(expr->
match(5));
227TEST(kmp_trait_expr_single_test, MatchWildcard) {
235 EXPECT_TRUE(expr->
match(0));
236 EXPECT_TRUE(expr->
match(3));
238 EXPECT_FALSE(expr->
match(100));
243TEST(kmp_trait_expr_single_test, Equality) {
249 EXPECT_TRUE(*e1 == *e2);
255TEST(kmp_trait_expr_single_test, EqualityDifferentTrait) {
261 EXPECT_FALSE(*e1 == *e2);
267TEST(kmp_trait_expr_single_test, EqualityDifferentNegation) {
274 EXPECT_FALSE(*e1 == *e2);
284TEST(kmp_trait_expr_group_test, CreateAndDestroy) {
286 EXPECT_NE(group,
nullptr);
290TEST(kmp_trait_expr_group_test, DefaultTypeIsOR) {
298TEST(kmp_trait_expr_group_test, SetTypeAND) {
307TEST(kmp_trait_expr_group_test, DefaultNotNegated) {
315TEST(kmp_trait_expr_group_test, SetNegated) {
327TEST(kmp_trait_expr_group_test, AddTraitDirectly) {
336 EXPECT_TRUE(group->
match(0));
337 EXPECT_TRUE(group->
match(3));
339 EXPECT_FALSE(group->
match(100));
344TEST(kmp_trait_expr_group_test, AddExpr) {
352 EXPECT_TRUE(group->
match(2));
353 EXPECT_FALSE(group->
match(0));
354 EXPECT_FALSE(group->
match(5));
359TEST(kmp_trait_expr_group_test, MatchORSemantics) {
371 EXPECT_TRUE(group->
match(1));
372 EXPECT_TRUE(group->
match(2));
373 EXPECT_TRUE(group->
match(3));
374 EXPECT_FALSE(group->
match(0));
375 EXPECT_FALSE(group->
match(4));
380TEST(kmp_trait_expr_group_test, MatchANDSemantics) {
391 EXPECT_TRUE(group->
match(2));
392 EXPECT_FALSE(group->
match(0));
394 EXPECT_FALSE(group->
match(5));
399TEST(kmp_trait_expr_group_test, MatchANDWithWildcard) {
411 EXPECT_TRUE(group->
match(2));
412 EXPECT_FALSE(group->
match(0));
414 EXPECT_FALSE(group->
match(5));
419TEST(kmp_trait_expr_group_test, MatchNegated) {
430 EXPECT_FALSE(group->
match(2));
431 EXPECT_TRUE(group->
match(0));
432 EXPECT_TRUE(group->
match(1));
433 EXPECT_TRUE(group->
match(3));
435 EXPECT_FALSE(group->
match(5));
440TEST(kmp_trait_expr_group_test, MatchEmptyGroupOR) {
448 EXPECT_FALSE(group->
match(0));
449 EXPECT_FALSE(group->
match(1));
454TEST(kmp_trait_expr_group_test, MatchEmptyGroupAND) {
462 EXPECT_TRUE(group->
match(0));
463 EXPECT_TRUE(group->
match(1));
468TEST(kmp_trait_expr_group_test, Equality) {
475 EXPECT_TRUE(*g1 == *g2);
481TEST(kmp_trait_expr_group_test, EqualityDifferentNegation) {
489 EXPECT_FALSE(*g1 == *g2);
495TEST(kmp_trait_expr_group_test, EqualityDifferentGroupType) {
508 EXPECT_FALSE(*g1 == *g2);
514TEST(kmp_trait_expr_group_test, NestedGroups) {
531 EXPECT_TRUE(outer->
match(1));
532 EXPECT_TRUE(outer->
match(2));
533 EXPECT_FALSE(outer->
match(0));
534 EXPECT_FALSE(outer->
match(3));
543TEST(kmp_trait_clause_test, CreateAndDestroy) {
545 EXPECT_NE(clause,
nullptr);
549TEST(kmp_trait_clause_test, SetExprWithTrait) {
555 EXPECT_NE(expr,
nullptr);
560TEST(kmp_trait_clause_test, SetExprWithExpr) {
566 EXPECT_EQ(clause->
get_expr(), group);
571TEST(kmp_trait_clause_test, Equality) {
578 EXPECT_TRUE(*c1 == *c2);
584TEST(kmp_trait_clause_test, EqualityDifferentExprs) {
591 EXPECT_FALSE(*c1 == *c2);
601TEST(kmp_trait_context_test, CreateAndDestroy) {
603 EXPECT_NE(context,
nullptr);
607TEST(kmp_trait_context_test, AddClause) {
616 EXPECT_TRUE(context->
match(2));
617 EXPECT_FALSE(context->
match(0));
619 EXPECT_FALSE(context->
match(5));
624TEST(kmp_trait_context_test, MultipleClauses) {
643 EXPECT_TRUE(context->
match(1));
644 EXPECT_TRUE(context->
match(2));
645 EXPECT_TRUE(context->
match(3));
646 EXPECT_FALSE(context->
match(0));
647 EXPECT_FALSE(context->
match(4));
652TEST(kmp_trait_context_test, EmptyContextMatchesNothing) {
658 EXPECT_FALSE(context->
match(0));
659 EXPECT_FALSE(context->
match(1));
664TEST(kmp_trait_context_test, WildcardClause) {
674 EXPECT_TRUE(context->
match(0));
675 EXPECT_TRUE(context->
match(3));
677 EXPECT_FALSE(context->
match(100));
678 EXPECT_FALSE(context->
match(-1));
683TEST(kmp_trait_context_test, EvaluateWithMock) {
698 EXPECT_EQ(
result.size(), 2u);
699 EXPECT_TRUE(
result.contains(1));
700 EXPECT_TRUE(
result.contains(3));
701 EXPECT_FALSE(
result.contains(0));
702 EXPECT_FALSE(
result.contains(2));
703 EXPECT_FALSE(
result.contains(4));
708TEST(kmp_trait_context_test, Equality) {
720 EXPECT_TRUE(*ctx1 == *ctx2);
726TEST(kmp_trait_context_test, EqualityDifferentClauses) {
738 EXPECT_FALSE(*ctx1 == *ctx2);
748TEST(kmp_trait_context_test, IteratorRangeBasedFor) {
764 for (
int d : *context) {
768 EXPECT_EQ(collected.
size(), 2u);
775TEST(kmp_trait_context_test, IteratorAutoEvaluates) {
787 for (
const int *it = context->
begin(); it != context->
end(); ++it) {
798TEST(kmp_trait_context_test, IteratorEmptyContext) {
806 for (
int d : *context) {
812 EXPECT_EQ(context->begin(), context->end());
817TEST(kmp_trait_context_test, IteratorBeginEnd) {
828 const int *
b = context->
begin();
829 const int *e = context->
end();
837TEST(kmp_trait_context_test, IteratorMultipleDevices) {
841 for (
int i = 0;
i < 6;
i += 2) {
852 for (
int d : *context) {
856 EXPECT_EQ(collected.
size(), 3u);
864TEST(kmp_trait_context_test, IteratorConsistentWithEvaluate) {
883 for (
int d : *context) {
888 EXPECT_EQ(eval_result.
size(), iter_result.
size());
889 for (
size_t i = 0;
i < eval_result.
size();
i++) {
890 EXPECT_EQ(eval_result[
i], iter_result[
i]);
896TEST(kmp_trait_context_test, EvaluateReturnsByReference) {
910 EXPECT_EQ(&result1, &result2);
919TEST(kmp_trait_context_test, PropagationToClausesAddedAfterSetNumDevices) {
926 for (
int i = 0;
i < 6;
i += 2) {
934 for (
int d : *context) {
938 EXPECT_EQ(collected.
size(), 3u);
946TEST(kmp_trait_context_test, PropagationToClausesAddedBeforeSetNumDevices) {
950 for (
int i = 0;
i < 6;
i += 2) {
961 for (
int d : *context) {
965 EXPECT_EQ(collected.
size(), 3u);
973TEST(kmp_trait_expr_group_test, PropagationToExprsAddedAfterSetNumDevices) {
985 EXPECT_TRUE(group->
match(5));
986 EXPECT_TRUE(group->
match(6));
987 EXPECT_TRUE(group->
match(7));
988 EXPECT_FALSE(group->
match(4));
993TEST(kmp_trait_expr_group_test, PropagationToExprsAddedBeforeSetNumDevices) {
1005 EXPECT_TRUE(group->
match(5));
1006 EXPECT_TRUE(group->
match(6));
1007 EXPECT_TRUE(group->
match(7));
1008 EXPECT_FALSE(group->
match(4));
1013TEST(kmp_trait_expr_group_test, PropagationToNestedGroups) {
1033 EXPECT_TRUE(outer->
match(7));
1034 EXPECT_TRUE(outer->
match(8));
1035 EXPECT_TRUE(outer->
match(9));
1036 EXPECT_FALSE(outer->
match(10));
1041TEST(kmp_trait_expr_group_test, PropagationToDeeplyNestedGroups) {
1064 EXPECT_TRUE(outer->
match(8));
1065 EXPECT_TRUE(outer->
match(9));
1066 EXPECT_TRUE(outer->
match(10));
1067 EXPECT_TRUE(outer->
match(11));
1068 EXPECT_FALSE(outer->
match(12));
1073TEST(kmp_trait_context_test, PropagationToNestedGroupsInClauses) {
1100 for (
int d : *context) {
1104 EXPECT_EQ(collected.
size(), 3u);
1105 EXPECT_TRUE(collected.
contains(7));
1106 EXPECT_TRUE(collected.
contains(8));
1107 EXPECT_TRUE(collected.
contains(9));
1112TEST(kmp_trait_context_test, PropagationMixedOrder) {
1139 for (
int d : *context) {
1143 EXPECT_EQ(collected.
size(), 3u);
1144 EXPECT_TRUE(collected.
contains(5));
1145 EXPECT_TRUE(collected.
contains(6));
1146 EXPECT_TRUE(collected.
contains(7));
#define TEST(test_suite_name, test_name)
kmp_str_ref is a non-owning string class (similar to llvm::StringRef).
void set_num_devices(int(*num_devices)())
const kmp_vector< int > & evaluate()
void add_clause(kmp_trait_clause *clause)
Represents a specific device number.
bool match(int device) const override
void set_expr(kmp_trait *trait)
kmp_trait_expr * get_expr()
Represents a (possibly negated) collection of traits that are either ANDed or ORed together.
void set_num_devices(int(*num_devices)())
void set_group_type(group_type new_type)
void add_expr(kmp_trait *trait)
group_type get_group_type() const
Represents a single (possibly negated) trait.
void set_trait(kmp_trait *new_trait)
Abstract class representing either a single trait expression or a collection of trait expressions tha...
bool match(int device, int num_devices=-1) const
void set_num_devices(int(*num_devices)())
void set_negated(bool neg=true)
Represents a specific UID.
bool match(int device) const override
void set_uid_from_device(const char *(*uid_from_device)(int))
Represents a wildcard trait that matches any device.
bool match(int device) const override
kmp_vector is a vector class for managing small vectors.
void push_back(const T &value)
Add a new element to the end of the vector.
bool contains(const T &value, const Fn &comp=Fn{}) const
Check if the vector contains the given value.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t count