1 /* Copyright (c) 2017-2023. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "src/3rd-party/catch.hpp"
7 #include "src/mc/explo/udpor/EventSet.hpp"
8 #include "src/mc/explo/udpor/UnfoldingEvent.hpp"
10 using namespace simgrid::mc::udpor;
12 TEST_CASE("simgrid::mc::udpor::EventSet: Initial conditions when creating sets")
14 SECTION("Initialization with no elements")
16 SECTION("Default initializer")
19 REQUIRE(event_set.size() == 0);
20 REQUIRE(event_set.empty());
23 SECTION("Set initializer")
25 EventSet event_set({});
26 REQUIRE(event_set.size() == 0);
27 REQUIRE(event_set.empty());
30 SECTION("List initialization")
33 REQUIRE(event_set.size() == 0);
34 REQUIRE(event_set.empty());
38 SECTION("Initialization with one or more elements")
40 UnfoldingEvent e1, e2, e3;
42 SECTION("Set initializer")
44 EventSet event_set({&e1, &e2, &e3});
45 REQUIRE(event_set.size() == 3);
46 REQUIRE(event_set.contains(&e1));
47 REQUIRE(event_set.contains(&e2));
48 REQUIRE(event_set.contains(&e3));
49 REQUIRE_FALSE(event_set.empty());
52 SECTION("List initialization")
54 EventSet event_set{&e1, &e2, &e3};
55 REQUIRE(event_set.size() == 3);
56 REQUIRE(event_set.contains(&e1));
57 REQUIRE(event_set.contains(&e2));
58 REQUIRE(event_set.contains(&e3));
59 REQUIRE_FALSE(event_set.empty());
64 TEST_CASE("simgrid::mc::udpor::EventSet: Insertions")
67 UnfoldingEvent e1, e2, e3;
69 SECTION("Inserting unique elements")
71 event_set.insert(&e1);
72 REQUIRE(event_set.size() == 1);
73 REQUIRE(event_set.contains(&e1));
74 REQUIRE_FALSE(event_set.empty());
76 event_set.insert(&e2);
77 REQUIRE(event_set.size() == 2);
78 REQUIRE(event_set.contains(&e2));
79 REQUIRE_FALSE(event_set.empty());
81 SECTION("Check contains inserted elements")
83 REQUIRE(event_set.contains(&e1));
84 REQUIRE(event_set.contains(&e2));
85 REQUIRE_FALSE(event_set.contains(&e3));
89 SECTION("Inserting duplicate elements")
91 event_set.insert(&e1);
92 REQUIRE(event_set.size() == 1);
93 REQUIRE(event_set.contains(&e1));
94 REQUIRE_FALSE(event_set.empty());
96 event_set.insert(&e1);
97 REQUIRE(event_set.size() == 1);
98 REQUIRE(event_set.contains(&e1));
99 REQUIRE_FALSE(event_set.empty());
101 SECTION("Check contains inserted elements")
103 REQUIRE(event_set.contains(&e1));
104 REQUIRE_FALSE(event_set.contains(&e2));
105 REQUIRE_FALSE(event_set.contains(&e3));
110 TEST_CASE("simgrid::mc::udpor::EventSet: Deletions")
116 EventSet event_set({&e1, &e2, &e3});
118 SECTION("Remove an element already present")
120 REQUIRE(event_set.contains(&e1));
122 // Recall that event_set = {e2, e3}
123 event_set.remove(&e1);
126 // 1. the size decreases by exactly 1
127 // 2. the set remains unempty
128 // 3. the other elements are still contained in the set
129 REQUIRE(event_set.size() == 2);
130 REQUIRE_FALSE(event_set.contains(&e1));
131 REQUIRE(event_set.contains(&e2));
132 REQUIRE(event_set.contains(&e3));
133 REQUIRE_FALSE(event_set.empty());
135 SECTION("Remove a single element more than once")
137 // Recall that event_set = {e2, e3}
138 event_set.remove(&e1);
139 REQUIRE(event_set.size() == 2);
140 REQUIRE_FALSE(event_set.contains(&e1));
141 REQUIRE(event_set.contains(&e2));
142 REQUIRE(event_set.contains(&e3));
143 REQUIRE_FALSE(event_set.empty());
146 SECTION("Remove more than one element")
148 // Recall that event_set = {e3}
149 event_set.remove(&e2);
151 REQUIRE(event_set.size() == 1);
152 REQUIRE_FALSE(event_set.contains(&e1));
153 REQUIRE_FALSE(event_set.contains(&e2));
154 REQUIRE(event_set.contains(&e3));
155 REQUIRE_FALSE(event_set.empty());
157 // Recall that event_set = {}
158 event_set.remove(&e3);
160 REQUIRE(event_set.size() == 0);
161 REQUIRE_FALSE(event_set.contains(&e1));
162 REQUIRE_FALSE(event_set.contains(&e2));
163 REQUIRE_FALSE(event_set.contains(&e3));
164 REQUIRE(event_set.empty());
168 SECTION("Remove an element absent from the set")
170 REQUIRE_FALSE(event_set.contains(&e4));
172 // Recall that event_set = {e1, e2, e3}
173 event_set.remove(&e4);
174 REQUIRE(event_set.size() == 3);
175 REQUIRE(event_set.contains(&e1));
176 REQUIRE(event_set.contains(&e2));
177 REQUIRE(event_set.contains(&e3));
179 // Ensure e4 isn't somehow added
180 REQUIRE_FALSE(event_set.contains(&e4));
181 REQUIRE_FALSE(event_set.empty());
185 TEST_CASE("simgrid::mc::udpor::EventSet: Set Equality")
191 EventSet A{&e1, &e2, &e3}, B{&e1, &e2, &e3}, C{&e1, &e2, &e3};
193 SECTION("Equality implies containment")
197 for (const auto& e : A) {
198 REQUIRE(B.contains(e));
201 for (const auto& e : B) {
202 REQUIRE(A.contains(e));
206 SECTION("Containment implies equality")
208 for (const auto& e : A) {
209 REQUIRE(B.contains(e));
212 for (const auto& e : C) {
213 REQUIRE(C.contains(e));
219 SECTION("Equality is an equivalence relation")
240 SECTION("Equality after copy (assignment + constructor)")
245 REQUIRE(A == A_copy);
246 REQUIRE(A == A_copy2);
249 SECTION("Equality after move constructor")
252 EventSet A_move(std::move(A));
253 REQUIRE(A_move == A_copy);
256 SECTION("Equality after move-assignment")
259 EventSet A_move = std::move(A);
260 REQUIRE(A_move == A_copy);
264 TEST_CASE("simgrid::mc::udpor::EventSet: Set Union Tests")
266 UnfoldingEvent e1, e2, e3, e4;
269 EventSet A{&e1, &e2, &e3}, B{&e2, &e3, &e4}, C{&e1, &e2, &e3, &e4}, D{&e1, &e3};
271 SECTION("Unions with no effect")
275 SECTION("Self union")
278 EventSet A_union = A.make_union(A);
279 REQUIRE(A == A_copy);
282 REQUIRE(A == A_copy);
285 SECTION("Union with empty set")
287 // A = A union empty set
288 EventSet A_union = A.make_union(EventSet());
289 REQUIRE(A == A_union);
291 A.form_union(EventSet());
292 REQUIRE(A == A_copy);
295 SECTION("Union with an equivalent set")
297 // A = A union B if B == A
298 EventSet A_equiv{&e1, &e2, &e3};
299 REQUIRE(A == A_equiv);
301 EventSet A_union = A.make_union(A_equiv);
302 REQUIRE(A_union == A_copy);
304 A.form_union(A_equiv);
305 REQUIRE(A == A_copy);
308 SECTION("Union with a subset")
310 // A = A union D if D is a subset of A
311 EventSet A_union = A.make_union(D);
312 REQUIRE(A == A_union);
315 REQUIRE(A == A_copy);
319 SECTION("Unions with partial overlaps")
321 EventSet A_union_B = A.make_union(B);
322 REQUIRE(A_union_B == C);
327 EventSet B_union_D = B.make_union(D);
328 REQUIRE(B_union_D == C);
334 SECTION("Set union properties")
336 SECTION("Union operator is symmetric")
338 EventSet A_union_B = A.make_union(B);
339 EventSet B_union_A = B.make_union(A);
340 REQUIRE(A_union_B == B_union_A);
343 SECTION("Union operator commutes")
345 // The last SECTION tested pair-wise
346 // equivalence, so we only check
348 EventSet AD = A.make_union(D);
349 EventSet AC = A.make_union(C);
350 EventSet CD = D.make_union(C);
352 EventSet ADC = AD.make_union(C);
353 EventSet ACD = AC.make_union(D);
354 EventSet CDA = CD.make_union(A);
359 // Test `form_union()` in the same way
365 A.form_union(C_copy);
366 A.form_union(D_copy);
368 D.form_union(A_copy);
369 D.form_union(C_copy);
381 TEST_CASE("simgrid::mc::udpor::EventSet: Set Difference Tests")
383 UnfoldingEvent e1, e2, e3, e4;
386 // A is a subset of C
387 // B is a subset of C
388 // D is a subset of A and C
389 // E is a subset of B and C
390 // F is a subset of A, C, and D
391 EventSet A{&e1, &e2, &e3}, B{&e2, &e3, &e4}, C{&e1, &e2, &e3, &e4}, D{&e1, &e3}, E{&e4}, F{&e1};
393 SECTION("Difference with no effect")
395 SECTION("Difference with empty set")
397 EventSet A_copy = A.subtracting(EventSet());
398 REQUIRE(A == A_copy);
400 A.subtract(EventSet());
401 REQUIRE(A == A_copy);
404 SECTION("Difference with empty intersection")
406 // A intersection E = empty set
407 EventSet A_copy = A.subtracting(E);
408 REQUIRE(A == A_copy);
411 REQUIRE(A == A_copy);
413 EventSet D_copy = D.subtracting(E);
414 REQUIRE(D == D_copy);
417 REQUIRE(D == D_copy);
421 SECTION("Difference with some overlap")
424 EventSet A_minus_B = A.subtracting(B);
425 REQUIRE(A_minus_B == F);
427 // B - D = {&e2, &e4}
428 EventSet B_minus_D = B.subtracting(D);
429 REQUIRE(B_minus_D == EventSet({&e2, &e4}));
432 SECTION("Difference with complete overlap")
434 SECTION("Difference with same set gives empty set")
436 REQUIRE(A.subtracting(A) == EventSet());
437 REQUIRE(B.subtracting(B) == EventSet());
438 REQUIRE(C.subtracting(C) == EventSet());
439 REQUIRE(D.subtracting(D) == EventSet());
440 REQUIRE(E.subtracting(E) == EventSet());
441 REQUIRE(F.subtracting(F) == EventSet());
444 SECTION("Difference with superset gives empty set")
446 REQUIRE(A.subtracting(C) == EventSet());
447 REQUIRE(B.subtracting(C) == EventSet());
448 REQUIRE(D.subtracting(A) == EventSet());
449 REQUIRE(D.subtracting(C) == EventSet());
450 REQUIRE(E.subtracting(B) == EventSet());
451 REQUIRE(E.subtracting(C) == EventSet());
452 REQUIRE(F.subtracting(A) == EventSet());
453 REQUIRE(F.subtracting(C) == EventSet());
454 REQUIRE(F.subtracting(D) == EventSet());
459 TEST_CASE("simgrid::mc::udpor::EventSet: Subset Tests")
461 UnfoldingEvent e1, e2, e3, e4;
463 // A is a subset of C only
464 // B is a subset of C only
465 // D is a subset of C and A
466 // D is NOT a subset of B
467 // B is NOT a subset of D
469 EventSet A{&e1, &e2, &e3}, B{&e2, &e3, &e4}, C{&e1, &e2, &e3, &e4}, D{&e1, &e3}, E{&e2, &e3}, F{&e1, &e2, &e3};
471 SECTION("Subset operator properties")
473 SECTION("Subset operator is not commutative")
475 REQUIRE(A.is_subset_of(C));
476 REQUIRE_FALSE(C.is_subset_of(A));
478 SECTION("Commutativity implies equality and vice versa")
480 REQUIRE(A.is_subset_of(F));
481 REQUIRE(F.is_subset_of(A));
485 REQUIRE(A.is_subset_of(F));
486 REQUIRE(F.is_subset_of(A));
490 SECTION("Subset operator is transitive")
492 REQUIRE(D.is_subset_of(A));
493 REQUIRE(A.is_subset_of(C));
494 REQUIRE(D.is_subset_of(C));
495 REQUIRE(E.is_subset_of(B));
496 REQUIRE(B.is_subset_of(C));
497 REQUIRE(E.is_subset_of(C));
500 SECTION("Subset operator is reflexive")
502 REQUIRE(A.is_subset_of(A));
503 REQUIRE(B.is_subset_of(B));
504 REQUIRE(C.is_subset_of(C));
505 REQUIRE(D.is_subset_of(D));
506 REQUIRE(E.is_subset_of(E));
507 REQUIRE(F.is_subset_of(F));
512 TEST_CASE("simgrid::mc::udpor::EventSet: Testing Configurations")
514 // The following tests concern the given event structure:
520 // The tests enumerate all possible subsets of the events
521 // in the structure and test whether those subsets are
522 // maximal and/or valid configurations
524 UnfoldingEvent e2{&e1};
525 UnfoldingEvent e3{&e2};
526 UnfoldingEvent e4{&e2};
527 UnfoldingEvent e5{&e1};
528 UnfoldingEvent e6{&e5};
530 SECTION("Valid Configurations")
532 SECTION("The empty set is valid")
534 REQUIRE(EventSet().is_valid_configuration());
537 SECTION("The set with only the root event is valid")
539 REQUIRE(EventSet({&e1}).is_valid_configuration());
542 SECTION("All sets of maximal events are valid configurations")
544 REQUIRE(EventSet({&e1}).is_valid_configuration());
545 REQUIRE(EventSet({&e1, &e2}).is_valid_configuration());
546 REQUIRE(EventSet({&e1, &e2, &e3}).is_valid_configuration());
547 REQUIRE(EventSet({&e1, &e2, &e4}).is_valid_configuration());
548 REQUIRE(EventSet({&e1, &e5}).is_valid_configuration());
549 REQUIRE(EventSet({&e1, &e5, &e6}).is_valid_configuration());
550 REQUIRE(EventSet({&e1, &e2, &e5}).is_valid_configuration());
551 REQUIRE(EventSet({&e1, &e2, &e5, &e6}).is_valid_configuration());
552 REQUIRE(EventSet({&e1, &e2, &e3, &e4}).is_valid_configuration());
553 REQUIRE(EventSet({&e1, &e2, &e3, &e5}).is_valid_configuration());
554 REQUIRE(EventSet({&e1, &e2, &e4, &e5}).is_valid_configuration());
555 REQUIRE(EventSet({&e1, &e2, &e4, &e5, &e6}).is_valid_configuration());
556 REQUIRE(EventSet({&e1, &e2, &e3, &e4, &e5}).is_valid_configuration());
557 REQUIRE(EventSet({&e1, &e2, &e3, &e4, &e5, &e6}).is_valid_configuration());
561 SECTION("Configuration checks")
563 // 6 choose 0 = 1 test
564 REQUIRE(EventSet().is_valid_configuration());
566 // 6 choose 1 = 6 tests
567 REQUIRE(EventSet({&e1}).is_valid_configuration());
568 REQUIRE_FALSE(EventSet({&e2}).is_valid_configuration());
569 REQUIRE_FALSE(EventSet({&e3}).is_valid_configuration());
570 REQUIRE_FALSE(EventSet({&e4}).is_valid_configuration());
571 REQUIRE_FALSE(EventSet({&e5}).is_valid_configuration());
572 REQUIRE_FALSE(EventSet({&e6}).is_valid_configuration());
574 // 6 choose 2 = 15 tests
575 REQUIRE(EventSet({&e1, &e2}).is_valid_configuration());
576 REQUIRE_FALSE(EventSet({&e1, &e3}).is_valid_configuration());
577 REQUIRE_FALSE(EventSet({&e1, &e4}).is_valid_configuration());
578 REQUIRE(EventSet({&e1, &e5}).is_valid_configuration());
579 REQUIRE_FALSE(EventSet({&e1, &e6}).is_valid_configuration());
580 REQUIRE_FALSE(EventSet({&e2, &e3}).is_valid_configuration());
581 REQUIRE_FALSE(EventSet({&e2, &e4}).is_valid_configuration());
582 REQUIRE_FALSE(EventSet({&e2, &e5}).is_valid_configuration());
583 REQUIRE_FALSE(EventSet({&e2, &e6}).is_valid_configuration());
584 REQUIRE_FALSE(EventSet({&e3, &e4}).is_valid_configuration());
585 REQUIRE_FALSE(EventSet({&e3, &e5}).is_valid_configuration());
586 REQUIRE_FALSE(EventSet({&e3, &e6}).is_valid_configuration());
587 REQUIRE_FALSE(EventSet({&e4, &e5}).is_valid_configuration());
588 REQUIRE_FALSE(EventSet({&e4, &e6}).is_valid_configuration());
589 REQUIRE_FALSE(EventSet({&e5, &e6}).is_valid_configuration());
591 // 6 choose 3 = 20 tests
592 REQUIRE(EventSet({&e1, &e2, &e3}).is_valid_configuration());
593 REQUIRE(EventSet({&e1, &e2, &e4}).is_valid_configuration());
594 REQUIRE(EventSet({&e1, &e2, &e5}).is_valid_configuration());
595 REQUIRE_FALSE(EventSet({&e1, &e2, &e6}).is_valid_configuration());
596 REQUIRE_FALSE(EventSet({&e1, &e3, &e4}).is_valid_configuration());
597 REQUIRE_FALSE(EventSet({&e1, &e3, &e5}).is_valid_configuration());
598 REQUIRE_FALSE(EventSet({&e1, &e3, &e6}).is_valid_configuration());
599 REQUIRE_FALSE(EventSet({&e1, &e4, &e5}).is_valid_configuration());
600 REQUIRE_FALSE(EventSet({&e1, &e4, &e6}).is_valid_configuration());
601 REQUIRE(EventSet({&e1, &e5, &e6}).is_valid_configuration());
602 REQUIRE_FALSE(EventSet({&e2, &e3, &e4}).is_valid_configuration());
603 REQUIRE_FALSE(EventSet({&e2, &e3, &e5}).is_valid_configuration());
604 REQUIRE_FALSE(EventSet({&e2, &e3, &e6}).is_valid_configuration());
605 REQUIRE_FALSE(EventSet({&e2, &e4, &e5}).is_valid_configuration());
606 REQUIRE_FALSE(EventSet({&e2, &e4, &e6}).is_valid_configuration());
607 REQUIRE_FALSE(EventSet({&e2, &e5, &e6}).is_valid_configuration());
608 REQUIRE_FALSE(EventSet({&e3, &e4, &e5}).is_valid_configuration());
609 REQUIRE_FALSE(EventSet({&e3, &e4, &e6}).is_valid_configuration());
610 REQUIRE_FALSE(EventSet({&e3, &e5, &e6}).is_valid_configuration());
611 REQUIRE_FALSE(EventSet({&e4, &e5, &e6}).is_valid_configuration());
613 // 6 choose 4 = 15 tests
614 REQUIRE(EventSet({&e1, &e2, &e3, &e4}).is_valid_configuration());
615 REQUIRE(EventSet({&e1, &e2, &e3, &e5}).is_valid_configuration());
616 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e6}).is_valid_configuration());
617 REQUIRE(EventSet({&e1, &e2, &e4, &e5}).is_valid_configuration());
618 REQUIRE_FALSE(EventSet({&e1, &e2, &e4, &e6}).is_valid_configuration());
619 REQUIRE(EventSet({&e1, &e2, &e5, &e6}).is_valid_configuration());
620 REQUIRE_FALSE(EventSet({&e1, &e3, &e4, &e5}).is_valid_configuration());
621 REQUIRE_FALSE(EventSet({&e1, &e3, &e4, &e6}).is_valid_configuration());
622 REQUIRE_FALSE(EventSet({&e1, &e3, &e5, &e6}).is_valid_configuration());
623 REQUIRE_FALSE(EventSet({&e1, &e4, &e5, &e6}).is_valid_configuration());
624 REQUIRE_FALSE(EventSet({&e2, &e3, &e4, &e5}).is_valid_configuration());
625 REQUIRE_FALSE(EventSet({&e2, &e3, &e4, &e6}).is_valid_configuration());
626 REQUIRE_FALSE(EventSet({&e2, &e3, &e5, &e6}).is_valid_configuration());
627 REQUIRE_FALSE(EventSet({&e2, &e4, &e5, &e6}).is_valid_configuration());
628 REQUIRE_FALSE(EventSet({&e3, &e4, &e5, &e6}).is_valid_configuration());
630 // 6 choose 5 = 6 tests
631 REQUIRE(EventSet({&e1, &e2, &e3, &e4, &e5}).is_valid_configuration());
632 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e4, &e6}).is_valid_configuration());
633 REQUIRE(EventSet({&e1, &e2, &e3, &e5, &e6}).is_valid_configuration());
634 REQUIRE(EventSet({&e1, &e2, &e4, &e5, &e6}).is_valid_configuration());
635 REQUIRE_FALSE(EventSet({&e1, &e3, &e4, &e5, &e6}).is_valid_configuration());
636 REQUIRE_FALSE(EventSet({&e2, &e3, &e4, &e5, &e6}).is_valid_configuration());
638 // 6 choose 6 = 1 test
639 REQUIRE(EventSet({&e1, &e2, &e3, &e4, &e5, &e6}).is_valid_configuration());
642 SECTION("Maximal event sets")
644 // 6 choose 0 = 1 test
645 REQUIRE(EventSet().is_maximal_event_set());
647 // 6 choose 1 = 6 tests
648 REQUIRE(EventSet({&e1}).is_maximal_event_set());
649 REQUIRE(EventSet({&e2}).is_maximal_event_set());
650 REQUIRE(EventSet({&e3}).is_maximal_event_set());
651 REQUIRE(EventSet({&e4}).is_maximal_event_set());
652 REQUIRE(EventSet({&e5}).is_maximal_event_set());
653 REQUIRE(EventSet({&e6}).is_maximal_event_set());
655 // 6 choose 2 = 15 tests
656 REQUIRE_FALSE(EventSet({&e1, &e2}).is_maximal_event_set());
657 REQUIRE_FALSE(EventSet({&e1, &e3}).is_maximal_event_set());
658 REQUIRE_FALSE(EventSet({&e1, &e4}).is_maximal_event_set());
659 REQUIRE_FALSE(EventSet({&e1, &e5}).is_maximal_event_set());
660 REQUIRE_FALSE(EventSet({&e1, &e6}).is_maximal_event_set());
661 REQUIRE_FALSE(EventSet({&e2, &e3}).is_maximal_event_set());
662 REQUIRE_FALSE(EventSet({&e2, &e4}).is_maximal_event_set());
663 REQUIRE(EventSet({&e2, &e5}).is_maximal_event_set());
664 REQUIRE(EventSet({&e2, &e6}).is_maximal_event_set());
665 REQUIRE(EventSet({&e3, &e4}).is_maximal_event_set());
666 REQUIRE(EventSet({&e3, &e5}).is_maximal_event_set());
667 REQUIRE(EventSet({&e3, &e6}).is_maximal_event_set());
668 REQUIRE(EventSet({&e4, &e5}).is_maximal_event_set());
669 REQUIRE(EventSet({&e4, &e6}).is_maximal_event_set());
670 REQUIRE_FALSE(EventSet({&e5, &e6}).is_maximal_event_set());
672 // 6 choose 3 = 20 tests
673 REQUIRE_FALSE(EventSet({&e1, &e2, &e3}).is_maximal_event_set());
674 REQUIRE_FALSE(EventSet({&e1, &e2, &e4}).is_maximal_event_set());
675 REQUIRE_FALSE(EventSet({&e1, &e2, &e5}).is_maximal_event_set());
676 REQUIRE_FALSE(EventSet({&e1, &e2, &e6}).is_maximal_event_set());
677 REQUIRE_FALSE(EventSet({&e1, &e3, &e4}).is_maximal_event_set());
678 REQUIRE_FALSE(EventSet({&e1, &e3, &e5}).is_maximal_event_set());
679 REQUIRE_FALSE(EventSet({&e1, &e3, &e6}).is_maximal_event_set());
680 REQUIRE_FALSE(EventSet({&e1, &e4, &e5}).is_maximal_event_set());
681 REQUIRE_FALSE(EventSet({&e1, &e4, &e6}).is_maximal_event_set());
682 REQUIRE_FALSE(EventSet({&e1, &e5, &e6}).is_maximal_event_set());
683 REQUIRE_FALSE(EventSet({&e2, &e3, &e4}).is_maximal_event_set());
684 REQUIRE_FALSE(EventSet({&e2, &e3, &e5}).is_maximal_event_set());
685 REQUIRE_FALSE(EventSet({&e2, &e3, &e6}).is_maximal_event_set());
686 REQUIRE_FALSE(EventSet({&e2, &e4, &e5}).is_maximal_event_set());
687 REQUIRE_FALSE(EventSet({&e2, &e4, &e6}).is_maximal_event_set());
688 REQUIRE_FALSE(EventSet({&e2, &e5, &e6}).is_maximal_event_set());
689 REQUIRE(EventSet({&e3, &e4, &e5}).is_maximal_event_set());
690 REQUIRE(EventSet({&e3, &e4, &e6}).is_maximal_event_set());
691 REQUIRE_FALSE(EventSet({&e3, &e5, &e6}).is_maximal_event_set());
692 REQUIRE_FALSE(EventSet({&e4, &e5, &e6}).is_maximal_event_set());
694 // 6 choose 4 = 15 tests
695 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e4}).is_maximal_event_set());
696 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e5}).is_maximal_event_set());
697 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e6}).is_maximal_event_set());
698 REQUIRE_FALSE(EventSet({&e1, &e2, &e4, &e5}).is_maximal_event_set());
699 REQUIRE_FALSE(EventSet({&e1, &e2, &e4, &e6}).is_maximal_event_set());
700 REQUIRE_FALSE(EventSet({&e1, &e2, &e5, &e6}).is_maximal_event_set());
701 REQUIRE_FALSE(EventSet({&e1, &e3, &e4, &e5}).is_maximal_event_set());
702 REQUIRE_FALSE(EventSet({&e1, &e3, &e4, &e6}).is_maximal_event_set());
703 REQUIRE_FALSE(EventSet({&e1, &e3, &e5, &e6}).is_maximal_event_set());
704 REQUIRE_FALSE(EventSet({&e1, &e4, &e5, &e6}).is_maximal_event_set());
705 REQUIRE_FALSE(EventSet({&e2, &e3, &e4, &e5}).is_maximal_event_set());
706 REQUIRE_FALSE(EventSet({&e2, &e3, &e4, &e6}).is_maximal_event_set());
707 REQUIRE_FALSE(EventSet({&e2, &e3, &e5, &e6}).is_maximal_event_set());
708 REQUIRE_FALSE(EventSet({&e2, &e4, &e5, &e6}).is_maximal_event_set());
709 REQUIRE_FALSE(EventSet({&e3, &e4, &e5, &e6}).is_maximal_event_set());
711 // 6 choose 5 = 6 tests
712 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e4, &e5}).is_maximal_event_set());
713 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e4, &e6}).is_maximal_event_set());
714 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e5, &e6}).is_maximal_event_set());
715 REQUIRE_FALSE(EventSet({&e1, &e2, &e4, &e5, &e6}).is_maximal_event_set());
716 REQUIRE_FALSE(EventSet({&e1, &e3, &e4, &e5, &e6}).is_maximal_event_set());
717 REQUIRE_FALSE(EventSet({&e2, &e3, &e4, &e5, &e6}).is_maximal_event_set());
719 // 6 choose 6 = 1 test
720 REQUIRE_FALSE(EventSet({&e1, &e2, &e3, &e4, &e5, &e6}).is_maximal_event_set());