85 lines
2.0 KiB
C++
85 lines
2.0 KiB
C++
#include <iostream>
|
|
|
|
#include "daggy/DAG.hpp"
|
|
|
|
#include <catch2/catch.hpp>
|
|
|
|
TEST_CASE("DAG Construction Tests", "[dag]") {
|
|
daggy::DAG dag;
|
|
|
|
REQUIRE(dag.size() == 0);
|
|
REQUIRE(dag.empty());
|
|
|
|
REQUIRE_NOTHROW(dag.addVertex());
|
|
for (int i = 1; i < 10; ++i) {
|
|
dag.addVertex();
|
|
dag.addEdge(i - 1, i);
|
|
}
|
|
|
|
REQUIRE(dag.size() == 10);
|
|
REQUIRE(!dag.empty());
|
|
|
|
// Cannot add an edge that would result in a cycle
|
|
REQUIRE_THROWS(dag.addEdge(9, 5));
|
|
|
|
// Bounds checking
|
|
SECTION("addEdge Bounds Checking") {
|
|
REQUIRE_THROWS(dag.addEdge(20, 0));
|
|
REQUIRE_THROWS(dag.addEdge(0, 20));
|
|
}SECTION("dropEdge Bounds Checking") {
|
|
REQUIRE_THROWS(dag.dropEdge(20, 0));
|
|
REQUIRE_THROWS(dag.dropEdge(0, 20));
|
|
}SECTION("hasPath Bounds Checking") {
|
|
REQUIRE_THROWS(dag.hasPath(20, 0));
|
|
REQUIRE_THROWS(dag.hasPath(0, 20));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("DAG Traversal Tests", "[dag]") {
|
|
daggy::DAG dag;
|
|
|
|
const int N_VERTICES = 10;
|
|
|
|
for (int i = 0; i < N_VERTICES; ++i) { dag.addVertex(); }
|
|
|
|
/*
|
|
0 ---------------------\
|
|
1 ---------- \ \ /-----> 8
|
|
2 ---- 3 ---- > 5 -------> 6 -----> 7
|
|
4 -------------------------------/ \-----> 9
|
|
*/
|
|
|
|
std::vector<std::pair<int, int>> edges{
|
|
{0, 6},
|
|
{1, 5},
|
|
{5, 6},
|
|
{6, 7},
|
|
{2, 3},
|
|
{3, 5},
|
|
{4, 7},
|
|
{7, 8},
|
|
{7, 9}
|
|
};
|
|
|
|
for (auto const[from, to] : edges) {
|
|
dag.addEdge(from, to);
|
|
}
|
|
|
|
SECTION("Baisc Traversal") {
|
|
dag.reset();
|
|
std::vector<int> visitOrder(N_VERTICES);
|
|
size_t i = 0;
|
|
while (!dag.allVisited()) {
|
|
const auto &v = dag.visitNext().value();
|
|
dag.completeVisit(v);
|
|
visitOrder[v] = i;
|
|
++i;
|
|
}
|
|
|
|
// Ensure visit order is preserved
|
|
for (auto const[from, to] : edges) {
|
|
REQUIRE(visitOrder[from] <= visitOrder[to]);
|
|
}
|
|
}
|
|
}
|