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
diff --git a/src/mc/explo/udpor/EventSet_test.cpp b/src/mc/explo/udpor/EventSet_test.cpp
new file mode 100644 (file)
index 0000000..f5e363d
--- /dev/null
@@ -0,0 +1,192 @@
+/* Copyright (c) 2017-2023. The SimGrid Team. All rights reserved.               */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "src/3rd-party/catch.hpp"
+#include "src/mc/explo/udpor/EventSet.hpp"
+#include "src/mc/explo/udpor/UnfoldingEvent.hpp"
+
+using namespace simgrid::mc::udpor;
+
+TEST_CASE("simgrid::mc::udpor::EventSet: Initial conditions when creating sets")
+{
+  SECTION("Initialization with no elements")
+  {
+    SECTION("Default initializer")
+    {
+      EventSet event_set;
+      REQUIRE(event_set.size() == 0);
+      REQUIRE(event_set.empty());
+    }
+
+    SECTION("Set initializer")
+    {
+      EventSet event_set({});
+      REQUIRE(event_set.size() == 0);
+      REQUIRE(event_set.empty());
+    }
+
+    SECTION("List initialization")
+    {
+      EventSet event_set{};
+      REQUIRE(event_set.size() == 0);
+      REQUIRE(event_set.empty());
+    }
+  }
+
+  SECTION("Initialization with one or more elements")
+  {
+    UnfoldingEvent e1, e2, e3;
+
+    SECTION("Set initializer")
+    {
+      EventSet event_set({&e1, &e2, &e3});
+      REQUIRE(event_set.size() == 3);
+      REQUIRE(event_set.contains(&e1));
+      REQUIRE(event_set.contains(&e2));
+      REQUIRE(event_set.contains(&e3));
+      REQUIRE_FALSE(event_set.empty());
+    }
+
+    SECTION("List initialization")
+    {
+      UnfoldingEvent e1, e2, e3;
+      EventSet event_set{&e1, &e2, &e3};
+      REQUIRE(event_set.size() == 3);
+      REQUIRE(event_set.contains(&e1));
+      REQUIRE(event_set.contains(&e2));
+      REQUIRE(event_set.contains(&e3));
+      REQUIRE_FALSE(event_set.empty());
+    }
+  }
+}
+
+TEST_CASE("simgrid::mc::udpor::EventSet: Insertions")
+{
+  EventSet event_set;
+  UnfoldingEvent e1, e2, e3;
+
+  SECTION("Inserting unique elements")
+  {
+    event_set.insert(&e1);
+    REQUIRE(event_set.size() == 1);
+    REQUIRE(event_set.contains(&e1));
+    REQUIRE_FALSE(event_set.empty());
+
+    event_set.insert(&e2);
+    REQUIRE(event_set.size() == 2);
+    REQUIRE(event_set.contains(&e2));
+    REQUIRE_FALSE(event_set.empty());
+
+    SECTION("Check contains inserted elements")
+    {
+      REQUIRE(event_set.contains(&e1));
+      REQUIRE(event_set.contains(&e2));
+      REQUIRE_FALSE(event_set.contains(&e3));
+    }
+  }
+
+  SECTION("Inserting duplicate elements")
+  {
+    event_set.insert(&e1);
+    REQUIRE(event_set.size() == 1);
+    REQUIRE(event_set.contains(&e1));
+    REQUIRE_FALSE(event_set.empty());
+
+    event_set.insert(&e1);
+    REQUIRE(event_set.size() == 1);
+    REQUIRE(event_set.contains(&e1));
+    REQUIRE_FALSE(event_set.empty());
+
+    SECTION("Check contains inserted elements")
+    {
+      REQUIRE(event_set.contains(&e1));
+      REQUIRE_FALSE(event_set.contains(&e2));
+      REQUIRE_FALSE(event_set.contains(&e3));
+    }
+  }
+}
+
+TEST_CASE("simgrid::mc::udpor::EventSet: Deletions")
+{
+  UnfoldingEvent e1, e2, e3, e4;
+  EventSet event_set({&e1, &e2, &e3});
+
+  SECTION("Remove an element already present")
+  {
+    REQUIRE(event_set.contains(&e1));
+
+    // event_set = {e2, e3}
+    event_set.remove(&e1);
+
+    // Check that
+    // 1. the size decreases by exactly 1
+    // 2. the set remains unempty
+    // 3. the other elements are still contained in the set
+    REQUIRE(event_set.size() == 2);
+    REQUIRE_FALSE(event_set.contains(&e1));
+    REQUIRE(event_set.contains(&e2));
+    REQUIRE(event_set.contains(&e3));
+    REQUIRE_FALSE(event_set.empty());
+
+    SECTION("Remove a single element more than once")
+    {
+      // event_set = {e2, e3}
+      event_set.remove(&e1);
+      REQUIRE(event_set.size() == 2);
+      REQUIRE_FALSE(event_set.contains(&e1));
+      REQUIRE(event_set.contains(&e2));
+      REQUIRE(event_set.contains(&e3));
+      REQUIRE_FALSE(event_set.empty());
+    }
+
+    SECTION("Remove more than one element")
+    {
+      // event_set = {e3}
+      event_set.remove(&e2);
+
+      REQUIRE(event_set.size() == 1);
+      REQUIRE_FALSE(event_set.contains(&e1));
+      REQUIRE_FALSE(event_set.contains(&e2));
+      REQUIRE(event_set.contains(&e3));
+      REQUIRE_FALSE(event_set.empty());
+
+      // event_set = {}
+      event_set.remove(&e3);
+
+      REQUIRE(event_set.size() == 0);
+      REQUIRE_FALSE(event_set.contains(&e1));
+      REQUIRE_FALSE(event_set.contains(&e2));
+      REQUIRE_FALSE(event_set.contains(&e3));
+      REQUIRE(event_set.empty());
+    }
+  }
+
+  SECTION("Remove an element absent from the set")
+  {
+    REQUIRE_FALSE(event_set.contains(&e4));
+
+    // event_set = {e1, e2, e3}
+    event_set.remove(&e4);
+    REQUIRE(event_set.size() == 3);
+    REQUIRE(event_set.contains(&e1));
+    REQUIRE(event_set.contains(&e2));
+    REQUIRE(event_set.contains(&e3));
+
+    // Ensure e4 isn't somehow added
+    REQUIRE_FALSE(event_set.contains(&e4));
+    REQUIRE_FALSE(event_set.empty());
+  }
+}
+
+TEST_CASE("simgrid::mc::udpor::EventSet: Set Equality") {}
+
+TEST_CASE("simgrid::mc::udpor::EventSet: Unions and Set Difference")
+{
+  UnfoldingEvent e1, e2, e3, e4;
+
+  EventSet A{&e1, &e2, &e3}, B{&e2, &e3, &e4}, C{&e2, &e3, &e4};
+
+  SECTION("Self-union (A union A)") {}
+}
\ No newline at end of file