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 UnfoldingEvent e1, e2, e3;
55 EventSet event_set{&e1, &e2, &e3};
56 REQUIRE(event_set.size() == 3);
57 REQUIRE(event_set.contains(&e1));
58 REQUIRE(event_set.contains(&e2));
59 REQUIRE(event_set.contains(&e3));
60 REQUIRE_FALSE(event_set.empty());
65 TEST_CASE("simgrid::mc::udpor::EventSet: Insertions")
68 UnfoldingEvent e1, e2, e3;
70 SECTION("Inserting unique elements")
72 event_set.insert(&e1);
73 REQUIRE(event_set.size() == 1);
74 REQUIRE(event_set.contains(&e1));
75 REQUIRE_FALSE(event_set.empty());
77 event_set.insert(&e2);
78 REQUIRE(event_set.size() == 2);
79 REQUIRE(event_set.contains(&e2));
80 REQUIRE_FALSE(event_set.empty());
82 SECTION("Check contains inserted elements")
84 REQUIRE(event_set.contains(&e1));
85 REQUIRE(event_set.contains(&e2));
86 REQUIRE_FALSE(event_set.contains(&e3));
90 SECTION("Inserting duplicate elements")
92 event_set.insert(&e1);
93 REQUIRE(event_set.size() == 1);
94 REQUIRE(event_set.contains(&e1));
95 REQUIRE_FALSE(event_set.empty());
97 event_set.insert(&e1);
98 REQUIRE(event_set.size() == 1);
99 REQUIRE(event_set.contains(&e1));
100 REQUIRE_FALSE(event_set.empty());
102 SECTION("Check contains inserted elements")
104 REQUIRE(event_set.contains(&e1));
105 REQUIRE_FALSE(event_set.contains(&e2));
106 REQUIRE_FALSE(event_set.contains(&e3));
111 TEST_CASE("simgrid::mc::udpor::EventSet: Deletions")
113 UnfoldingEvent e1, e2, e3, e4;
114 EventSet event_set({&e1, &e2, &e3});
116 SECTION("Remove an element already present")
118 REQUIRE(event_set.contains(&e1));
120 // event_set = {e2, e3}
121 event_set.remove(&e1);
124 // 1. the size decreases by exactly 1
125 // 2. the set remains unempty
126 // 3. the other elements are still contained in the set
127 REQUIRE(event_set.size() == 2);
128 REQUIRE_FALSE(event_set.contains(&e1));
129 REQUIRE(event_set.contains(&e2));
130 REQUIRE(event_set.contains(&e3));
131 REQUIRE_FALSE(event_set.empty());
133 SECTION("Remove a single element more than once")
135 // event_set = {e2, e3}
136 event_set.remove(&e1);
137 REQUIRE(event_set.size() == 2);
138 REQUIRE_FALSE(event_set.contains(&e1));
139 REQUIRE(event_set.contains(&e2));
140 REQUIRE(event_set.contains(&e3));
141 REQUIRE_FALSE(event_set.empty());
144 SECTION("Remove more than one element")
147 event_set.remove(&e2);
149 REQUIRE(event_set.size() == 1);
150 REQUIRE_FALSE(event_set.contains(&e1));
151 REQUIRE_FALSE(event_set.contains(&e2));
152 REQUIRE(event_set.contains(&e3));
153 REQUIRE_FALSE(event_set.empty());
156 event_set.remove(&e3);
158 REQUIRE(event_set.size() == 0);
159 REQUIRE_FALSE(event_set.contains(&e1));
160 REQUIRE_FALSE(event_set.contains(&e2));
161 REQUIRE_FALSE(event_set.contains(&e3));
162 REQUIRE(event_set.empty());
166 SECTION("Remove an element absent from the set")
168 REQUIRE_FALSE(event_set.contains(&e4));
170 // event_set = {e1, e2, e3}
171 event_set.remove(&e4);
172 REQUIRE(event_set.size() == 3);
173 REQUIRE(event_set.contains(&e1));
174 REQUIRE(event_set.contains(&e2));
175 REQUIRE(event_set.contains(&e3));
177 // Ensure e4 isn't somehow added
178 REQUIRE_FALSE(event_set.contains(&e4));
179 REQUIRE_FALSE(event_set.empty());
183 TEST_CASE("simgrid::mc::udpor::EventSet: Set Equality") {}
185 TEST_CASE("simgrid::mc::udpor::EventSet: Unions and Set Difference")
187 UnfoldingEvent e1, e2, e3, e4;
189 EventSet A{&e1, &e2, &e3}, B{&e2, &e3, &e4}, C{&e2, &e3, &e4};
191 SECTION("Self-union (A union A)") {}