Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add first batch of tests for UDPOR
[simgrid.git] / src / mc / explo / udpor / EventSet_test.cpp
1 /* Copyright (c) 2017-2023. The SimGrid Team. All rights reserved.               */
2
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. */
5
6 #include "src/3rd-party/catch.hpp"
7 #include "src/mc/explo/udpor/EventSet.hpp"
8 #include "src/mc/explo/udpor/UnfoldingEvent.hpp"
9
10 using namespace simgrid::mc::udpor;
11
12 TEST_CASE("simgrid::mc::udpor::EventSet: Initial conditions when creating sets")
13 {
14   SECTION("Initialization with no elements")
15   {
16     SECTION("Default initializer")
17     {
18       EventSet event_set;
19       REQUIRE(event_set.size() == 0);
20       REQUIRE(event_set.empty());
21     }
22
23     SECTION("Set initializer")
24     {
25       EventSet event_set({});
26       REQUIRE(event_set.size() == 0);
27       REQUIRE(event_set.empty());
28     }
29
30     SECTION("List initialization")
31     {
32       EventSet event_set{};
33       REQUIRE(event_set.size() == 0);
34       REQUIRE(event_set.empty());
35     }
36   }
37
38   SECTION("Initialization with one or more elements")
39   {
40     UnfoldingEvent e1, e2, e3;
41
42     SECTION("Set initializer")
43     {
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());
50     }
51
52     SECTION("List initialization")
53     {
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());
61     }
62   }
63 }
64
65 TEST_CASE("simgrid::mc::udpor::EventSet: Insertions")
66 {
67   EventSet event_set;
68   UnfoldingEvent e1, e2, e3;
69
70   SECTION("Inserting unique elements")
71   {
72     event_set.insert(&e1);
73     REQUIRE(event_set.size() == 1);
74     REQUIRE(event_set.contains(&e1));
75     REQUIRE_FALSE(event_set.empty());
76
77     event_set.insert(&e2);
78     REQUIRE(event_set.size() == 2);
79     REQUIRE(event_set.contains(&e2));
80     REQUIRE_FALSE(event_set.empty());
81
82     SECTION("Check contains inserted elements")
83     {
84       REQUIRE(event_set.contains(&e1));
85       REQUIRE(event_set.contains(&e2));
86       REQUIRE_FALSE(event_set.contains(&e3));
87     }
88   }
89
90   SECTION("Inserting duplicate elements")
91   {
92     event_set.insert(&e1);
93     REQUIRE(event_set.size() == 1);
94     REQUIRE(event_set.contains(&e1));
95     REQUIRE_FALSE(event_set.empty());
96
97     event_set.insert(&e1);
98     REQUIRE(event_set.size() == 1);
99     REQUIRE(event_set.contains(&e1));
100     REQUIRE_FALSE(event_set.empty());
101
102     SECTION("Check contains inserted elements")
103     {
104       REQUIRE(event_set.contains(&e1));
105       REQUIRE_FALSE(event_set.contains(&e2));
106       REQUIRE_FALSE(event_set.contains(&e3));
107     }
108   }
109 }
110
111 TEST_CASE("simgrid::mc::udpor::EventSet: Deletions")
112 {
113   UnfoldingEvent e1, e2, e3, e4;
114   EventSet event_set({&e1, &e2, &e3});
115
116   SECTION("Remove an element already present")
117   {
118     REQUIRE(event_set.contains(&e1));
119
120     // event_set = {e2, e3}
121     event_set.remove(&e1);
122
123     // Check that
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());
132
133     SECTION("Remove a single element more than once")
134     {
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());
142     }
143
144     SECTION("Remove more than one element")
145     {
146       // event_set = {e3}
147       event_set.remove(&e2);
148
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());
154
155       // event_set = {}
156       event_set.remove(&e3);
157
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());
163     }
164   }
165
166   SECTION("Remove an element absent from the set")
167   {
168     REQUIRE_FALSE(event_set.contains(&e4));
169
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));
176
177     // Ensure e4 isn't somehow added
178     REQUIRE_FALSE(event_set.contains(&e4));
179     REQUIRE_FALSE(event_set.empty());
180   }
181 }
182
183 TEST_CASE("simgrid::mc::udpor::EventSet: Set Equality") {}
184
185 TEST_CASE("simgrid::mc::udpor::EventSet: Unions and Set Difference")
186 {
187   UnfoldingEvent e1, e2, e3, e4;
188
189   EventSet A{&e1, &e2, &e3}, B{&e2, &e3, &e4}, C{&e2, &e3, &e4};
190
191   SECTION("Self-union (A union A)") {}
192 }