From 6cf9a74df73b87096603b0a01a7baf276c007edd Mon Sep 17 00:00:00 2001
From: David Rosca <roscadav@fit.cvut.cz>
Date: Wed, 4 Mar 2015 22:42:47 +0100
Subject: [PATCH] GraphTest: Modify to test all representations

Also edited to use ASSERT_EQUAL for better fail messages
---
 alib2data/test-src/graph/GraphTest.cpp | 365 ++++++++++++++-----------
 alib2data/test-src/graph/GraphTest.h   |  14 +
 2 files changed, 223 insertions(+), 156 deletions(-)

diff --git a/alib2data/test-src/graph/GraphTest.cpp b/alib2data/test-src/graph/GraphTest.cpp
index 3fe1087d1f..4a98a486f3 100644
--- a/alib2data/test-src/graph/GraphTest.cpp
+++ b/alib2data/test-src/graph/GraphTest.cpp
@@ -3,12 +3,11 @@
 #include "sax/SaxParseInterface.h"
 #include "sax/SaxComposeInterface.h"
 
-#include "graph/directed/DirectedGraph.h"
-#include "graph/undirected/UndirectedGraph.h"
-
 #include "factory/XmlDataFactory.hpp"
 #include "factory/StringDataFactory.hpp"
 
+#define CPPUNIT_ASSERT_EQUAL_INT(a, b) CPPUNIT_ASSERT_EQUAL(a, (int)b)
+
 CPPUNIT_TEST_SUITE_REGISTRATION(GraphTest);
 
 void GraphTest::setUp()
@@ -20,6 +19,60 @@ void GraphTest::tearDown()
 }
 
 void GraphTest::testCopyConstruct()
+{
+	testCopyConstruct_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testCopyConstruct_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testEqual()
+{
+	testEqual_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testEqual_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testXMLParser()
+{
+	testXMLParser_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testXMLParser_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testStringParser()
+{
+	testStringParser_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testStringParser_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testAddEdge()
+{
+	testAddEdge_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testAddEdge_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testRemoveEdge()
+{
+	testRemoveEdge_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testRemoveEdge_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testAddNode()
+{
+	testAddNode_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testAddNode_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testRemoveNode()
+{
+	testRemoveNode_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testRemoveNode_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testNeighborEdges()
+{
+	testNeighborEdges_impl(graph::REPRESENTATION::ADJACENCY_LIST);
+	testNeighborEdges_impl(graph::REPRESENTATION::ADJACENCY_MATRIX);
+}
+
+void GraphTest::testCopyConstruct_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -27,7 +80,7 @@ void GraphTest::testCopyConstruct()
 	graph::Node n3("n3");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addNode(n1);
 	dg.addNode(n2);
 	dg.addNode(n3);
@@ -41,7 +94,7 @@ void GraphTest::testCopyConstruct()
 	CPPUNIT_ASSERT(dg2 == dg3);
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addNode(n1);
 	ug.addNode(n2);
 	ug.addNode(n3);
@@ -55,7 +108,7 @@ void GraphTest::testCopyConstruct()
 	CPPUNIT_ASSERT(ug2 == ug3);
 }
 
-void GraphTest::testEqual()
+void GraphTest::testEqual_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -63,14 +116,14 @@ void GraphTest::testEqual()
 	graph::Node n3("n3");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addNode(n1);
 	dg.addNode(n2);
 	dg.addNode(n3);
 	dg.addEdge(graph::DirectedEdge(n1, n2));
 	dg.addEdge(graph::DirectedEdge(n1, n3));
 
-	graph::DirectedGraph dg2(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg2(representation);
 	dg2.addNode(n1);
 	dg2.addNode(n2);
 	dg2.addEdge(graph::DirectedEdge(n1, n2));
@@ -84,14 +137,14 @@ void GraphTest::testEqual()
 	CPPUNIT_ASSERT(dg == dg2);
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addNode(n1);
 	ug.addNode(n2);
 	ug.addNode(n3);
 	ug.addEdge(graph::UndirectedEdge(n1, n2));
 	ug.addEdge(graph::UndirectedEdge(n1, n3));
 
-	graph::UndirectedGraph ug2(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug2(representation);
 	ug2.addNode(n1);
 	ug2.addNode(n2);
 	ug2.addEdge(graph::UndirectedEdge(n1, n2));
@@ -105,7 +158,7 @@ void GraphTest::testEqual()
 	CPPUNIT_ASSERT(ug == ug2);
 }
 
-void GraphTest::testXMLParser()
+void GraphTest::testXMLParser_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -113,7 +166,7 @@ void GraphTest::testXMLParser()
 	graph::Node n3("n3");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addNode(n1);
 	dg.addNode(n2);
 	dg.addNode(n3);
@@ -126,7 +179,7 @@ void GraphTest::testXMLParser()
 	CPPUNIT_ASSERT(dg1 == dg2);
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addNode(n1);
 	ug.addNode(n2);
 	ug.addNode(n3);
@@ -139,7 +192,7 @@ void GraphTest::testXMLParser()
 	CPPUNIT_ASSERT(ug1 == ug2);
 }
 
-void GraphTest::testStringParser()
+void GraphTest::testStringParser_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -147,7 +200,7 @@ void GraphTest::testStringParser()
 	graph::Node n3("n3");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addNode(n1);
 	dg.addNode(n2);
 	dg.addNode(n3);
@@ -160,7 +213,7 @@ void GraphTest::testStringParser()
 	CPPUNIT_ASSERT(dg1 == dg2);
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addNode(n1);
 	ug.addNode(n2);
 	ug.addNode(n3);
@@ -173,7 +226,7 @@ void GraphTest::testStringParser()
 	CPPUNIT_ASSERT(ug1 == ug2);
 }
 
-void GraphTest::testAddEdge()
+void GraphTest::testAddEdge_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -182,91 +235,91 @@ void GraphTest::testAddEdge()
 	graph::Node n4("n4");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addNode(n1);
 	dg.addNode(n2);
 	dg.addNode(n3);
 	dg.addNode(n4);
 
-	CPPUNIT_ASSERT(dg.getEdges().empty());
-	CPPUNIT_ASSERT(dg.findEdges(n1, n2).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.getEdges().empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n1, n2).empty());
 
 	dg.addEdge(graph::DirectedEdge(n1, n2));
-	CPPUNIT_ASSERT(dg.getEdges().size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n1, n2).size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n2, n1).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n2, n1).empty());
 
 	// Multi-edge can only be added with non-empty label
-	CPPUNIT_ASSERT(dg.addEdge(graph::DirectedEdge(n1, n2)) == false);
-	CPPUNIT_ASSERT(dg.getEdges().size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n1, n2).size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n2, n1).empty());
+	CPPUNIT_ASSERT_EQUAL(false, dg.addEdge(graph::DirectedEdge(n1, n2)));
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n2, n1).empty());
 
 	dg.addEdge(graph::DirectedEdge(n2, n3));
-	CPPUNIT_ASSERT(dg.getEdges().size() == 2);
-	CPPUNIT_ASSERT(dg.findEdges(n2, n3).size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n3, n2).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(2, dg.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.findEdges(n2, n3).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n3, n2).empty());
 
 	dg.addEdge(graph::DirectedEdge(n3, n4));
-	CPPUNIT_ASSERT(dg.getEdges().size() == 3);
-	CPPUNIT_ASSERT(dg.findEdges(n3, n4).size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n4, n3).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(3, dg.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n4, n3).empty());
 
 	// Multi-edge can only be added with non-empty label
-	CPPUNIT_ASSERT(dg.addEdge(graph::DirectedEdge(n3, n4)) == false);
-	CPPUNIT_ASSERT(dg.getEdges().size() == 3);
-	CPPUNIT_ASSERT(dg.findEdges(n3, n4).size() == 1);
-	CPPUNIT_ASSERT(dg.findEdges(n4, n3).empty());
+	CPPUNIT_ASSERT_EQUAL(false, dg.addEdge(graph::DirectedEdge(n3, n4)));
+	CPPUNIT_ASSERT_EQUAL_INT(3, dg.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n4, n3).empty());
 
 	dg.addEdge(graph::DirectedEdge(n3, n4, "multi-edge"));
-	CPPUNIT_ASSERT(dg.getEdges().size() == 4);
-	CPPUNIT_ASSERT(dg.findEdges(n3, n4).size() == 2);
-	CPPUNIT_ASSERT(dg.findEdges(n4, n3).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(4, dg.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(2, dg.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n4, n3).empty());
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addNode(n1);
 	ug.addNode(n2);
 	ug.addNode(n3);
 	ug.addNode(n4);
 
-	CPPUNIT_ASSERT(ug.getEdges().empty());
-	CPPUNIT_ASSERT(ug.findEdges(n1, n2).empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.getEdges().empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.findEdges(n1, n2).empty());
 
 	ug.addEdge(graph::UndirectedEdge(n1, n2));
-	CPPUNIT_ASSERT(ug.getEdges().size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n1, n2).size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n2, n1).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n2, n1).size());
 
 	// Multi-edge can only be added with non-empty label
-	CPPUNIT_ASSERT(ug.addEdge(graph::UndirectedEdge(n1, n2)) == false);
-	CPPUNIT_ASSERT(ug.getEdges().size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n1, n2).size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n2, n1).size() == 1);
+	CPPUNIT_ASSERT_EQUAL(false, ug.addEdge(graph::UndirectedEdge(n1, n2)));
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n2, n1).size());
 
 	ug.addEdge(graph::UndirectedEdge(n2, n3));
-	CPPUNIT_ASSERT(ug.getEdges().size() == 2);
-	CPPUNIT_ASSERT(ug.findEdges(n2, n3).size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n3, n2).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n2, n3).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n3, n2).size());
 
 	ug.addEdge(graph::UndirectedEdge(n3, n4));
-	CPPUNIT_ASSERT(ug.getEdges().size() == 3);
-	CPPUNIT_ASSERT(ug.findEdges(n3, n4).size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n4, n3).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(3, ug.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n4, n3).size());
 
 	// Multi-edge can only be added with non-empty label
-	CPPUNIT_ASSERT(ug.addEdge(graph::UndirectedEdge(n3, n4)) == false);
-	CPPUNIT_ASSERT(ug.getEdges().size() == 3);
-	CPPUNIT_ASSERT(ug.findEdges(n3, n4).size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n4, n3).size() == 1);
+	CPPUNIT_ASSERT_EQUAL(false, ug.addEdge(graph::UndirectedEdge(n3, n4)));
+	CPPUNIT_ASSERT_EQUAL_INT(3, ug.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n4, n3).size());
 
 	ug.addEdge(graph::UndirectedEdge(n3, n4, "multi-edge"));
-	CPPUNIT_ASSERT(ug.getEdges().size() == 4);
-	CPPUNIT_ASSERT(ug.findEdges(n3, n4).size() == 2);
-	CPPUNIT_ASSERT(ug.findEdges(n4, n3).size() == 2);
+	CPPUNIT_ASSERT_EQUAL_INT(4, ug.getEdges().size());
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.findEdges(n4, n3).size());
 }
 
-void GraphTest::testRemoveEdge()
+void GraphTest::testRemoveEdge_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -275,126 +328,126 @@ void GraphTest::testRemoveEdge()
 	graph::Node n4("n4");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addEdge(graph::DirectedEdge(n1, n2));
 	dg.addEdge(graph::DirectedEdge(n1, n2, "multi-edge"));
 	dg.addEdge(graph::DirectedEdge(n2, n3));
 	dg.addEdge(graph::DirectedEdge(n3, n4));
 	dg.addEdge(graph::DirectedEdge(n4, n1));
 
-	CPPUNIT_ASSERT(dg.getNodes().size() == 4);
-	CPPUNIT_ASSERT(dg.getEdges().size() == 5);
+	CPPUNIT_ASSERT_EQUAL_INT(4, dg.getNodes().size());
+	CPPUNIT_ASSERT_EQUAL_INT(5, dg.getEdges().size());
 
-	CPPUNIT_ASSERT(dg.neighbors(n1).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.neighbors(n1).size());
 	dg.removeEdge(graph::DirectedEdge(n1, n2));
-	CPPUNIT_ASSERT(dg.findEdges(n1, n2).size() == 1);
-	CPPUNIT_ASSERT(dg.neighbors(n1).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.neighbors(n1).size());
 
-	CPPUNIT_ASSERT(dg.neighbors(n1).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.neighbors(n1).size());
 	dg.removeEdge(graph::DirectedEdge(n1, n2, "multi-edge"));
-	CPPUNIT_ASSERT(dg.findEdges(n1, n2).size() == 0);
-	CPPUNIT_ASSERT(dg.neighbors(n1).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(0, dg.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.neighbors(n1).empty());
 
-	CPPUNIT_ASSERT(dg.neighbors(n2).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.neighbors(n2).size());
 	dg.removeEdge(graph::DirectedEdge(n2, n3));
-	CPPUNIT_ASSERT(dg.findEdges(n2, n3).size() == 0);
-	CPPUNIT_ASSERT(dg.neighbors(n2).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(0, dg.findEdges(n2, n3).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.neighbors(n2).empty());
 
-	CPPUNIT_ASSERT(dg.neighbors(n3).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.neighbors(n3).size());
 	dg.removeEdge(graph::DirectedEdge(n3, n4));
-	CPPUNIT_ASSERT(dg.findEdges(n3, n4).size() == 0);
-	CPPUNIT_ASSERT(dg.neighbors(n3).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(0, dg.findEdges(n3, n4).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.neighbors(n3).empty());
 
-	CPPUNIT_ASSERT(dg.neighbors(n4).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.neighbors(n4).size());
 	dg.removeEdge(graph::DirectedEdge(n4, n1));
-	CPPUNIT_ASSERT(dg.findEdges(n4, n1).size() == 0);
-	CPPUNIT_ASSERT(dg.neighbors(n4).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(0, dg.findEdges(n4, n1).size());
+	CPPUNIT_ASSERT_EQUAL(true, dg.neighbors(n4).empty());
 
-	CPPUNIT_ASSERT(dg.getEdges().empty());
-	CPPUNIT_ASSERT(dg.getNodes().empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.getEdges().empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.getNodes().empty());
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addEdge(graph::UndirectedEdge(n1, n2));
 	ug.addEdge(graph::UndirectedEdge(n1, n2, "multi-edge"));
 	ug.addEdge(graph::UndirectedEdge(n2, n3));
 	ug.addEdge(graph::UndirectedEdge(n3, n4));
 	ug.addEdge(graph::UndirectedEdge(n4, n1));
 
-	CPPUNIT_ASSERT(ug.getNodes().size() == 4);
-	CPPUNIT_ASSERT(ug.getEdges().size() == 5);
+	CPPUNIT_ASSERT_EQUAL_INT(4, ug.getNodes().size());
+	CPPUNIT_ASSERT_EQUAL_INT(5, ug.getEdges().size());
 
-	CPPUNIT_ASSERT(ug.neighbors(n1).size() == 2);
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.neighbors(n1).size());
 	ug.removeEdge(graph::UndirectedEdge(n1, n2));
-	CPPUNIT_ASSERT(ug.findEdges(n1, n2).size() == 1);
-	CPPUNIT_ASSERT(ug.neighbors(n1).size() == 2);
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.neighbors(n1).size());
 
-	CPPUNIT_ASSERT(ug.neighbors(n1).size() == 2);
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.neighbors(n1).size());
 	ug.removeEdge(graph::UndirectedEdge(n1, n2, "multi-edge"));
-	CPPUNIT_ASSERT(ug.findEdges(n1, n2).size() == 0);
-	CPPUNIT_ASSERT(ug.neighbors(n1).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(0, ug.findEdges(n1, n2).size());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.neighbors(n1).size());
 
-	CPPUNIT_ASSERT(ug.neighbors(n2).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.neighbors(n2).size());
 	ug.removeEdge(graph::UndirectedEdge(n2, n3));
-	CPPUNIT_ASSERT(ug.findEdges(n2, n3).size() == 0);
+	CPPUNIT_ASSERT_EQUAL_INT(0, ug.findEdges(n2, n3).size());
 	CPPUNIT_ASSERT(ug.neighbors(n2).empty());
 
-	CPPUNIT_ASSERT(ug.neighbors(n3).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.neighbors(n3).size());
 	ug.removeEdge(graph::UndirectedEdge(n3, n4));
-	CPPUNIT_ASSERT(ug.findEdges(n3, n4).size() == 0);
+	CPPUNIT_ASSERT_EQUAL_INT(0, ug.findEdges(n3, n4).size());
 	CPPUNIT_ASSERT(ug.neighbors(n3).empty());
 
-	CPPUNIT_ASSERT(ug.neighbors(n4).size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.neighbors(n4).size());
 	ug.removeEdge(graph::UndirectedEdge(n4, n1));
-	CPPUNIT_ASSERT(ug.findEdges(n4, n1).size() == 0);
-	CPPUNIT_ASSERT(ug.neighbors(n4).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(0, ug.findEdges(n4, n1).size());
+	CPPUNIT_ASSERT_EQUAL(true, ug.neighbors(n4).empty());
 
-	CPPUNIT_ASSERT(ug.getEdges().empty());
-	CPPUNIT_ASSERT(ug.getNodes().empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.getEdges().empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.getNodes().empty());
 }
 
-void GraphTest::testAddNode()
+void GraphTest::testAddNode_impl(graph::REPRESENTATION representation)
 {
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 
-	CPPUNIT_ASSERT(dg.getNodes().size() == 0);
+	CPPUNIT_ASSERT_EQUAL_INT(0, dg.getNodes().size());
 	dg.addNode(graph::Node("n1"));
-	CPPUNIT_ASSERT(dg.getNodes().size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, dg.getNodes().size());
 	dg.addNode(graph::Node("n2"));
-	CPPUNIT_ASSERT(dg.getNodes().size() == 2);
+	CPPUNIT_ASSERT_EQUAL_INT(2, dg.getNodes().size());
 
-	CPPUNIT_ASSERT(dg.addNode(graph::Node("n2")) == false);
-	CPPUNIT_ASSERT(dg.getNodes().size() == 2);
+	CPPUNIT_ASSERT_EQUAL(false, dg.addNode(graph::Node("n2")));
+	CPPUNIT_ASSERT_EQUAL_INT(2, dg.getNodes().size());
 
 	dg.addNode(graph::Node("n3"));
-	CPPUNIT_ASSERT(dg.getNodes().size() == 3);
+	CPPUNIT_ASSERT_EQUAL_INT(3, dg.getNodes().size());
 	dg.addNode(graph::Node("n4"));
-	CPPUNIT_ASSERT(dg.getNodes().size() == 4);
+	CPPUNIT_ASSERT_EQUAL_INT(4, dg.getNodes().size());
 	dg.addNode(graph::Node("n5"));
-	CPPUNIT_ASSERT(dg.getNodes().size() == 5);
+	CPPUNIT_ASSERT_EQUAL_INT(5, dg.getNodes().size());
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 
-	CPPUNIT_ASSERT(ug.getNodes().size() == 0);
+	CPPUNIT_ASSERT_EQUAL_INT(0, ug.getNodes().size());
 	ug.addNode(graph::Node("n1"));
-	CPPUNIT_ASSERT(ug.getNodes().size() == 1);
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.getNodes().size());
 	ug.addNode(graph::Node("n2"));
-	CPPUNIT_ASSERT(ug.getNodes().size() == 2);
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.getNodes().size());
 
-	CPPUNIT_ASSERT(ug.addNode(graph::Node("n2")) == false);
-	CPPUNIT_ASSERT(ug.getNodes().size() == 2);
+	CPPUNIT_ASSERT_EQUAL(false, ug.addNode(graph::Node("n2")));
+	CPPUNIT_ASSERT_EQUAL_INT(2, ug.getNodes().size());
 
 	ug.addNode(graph::Node("n3"));
-	CPPUNIT_ASSERT(ug.getNodes().size() == 3);
+	CPPUNIT_ASSERT_EQUAL_INT(3, ug.getNodes().size());
 	ug.addNode(graph::Node("n4"));
-	CPPUNIT_ASSERT(ug.getNodes().size() == 4);
+	CPPUNIT_ASSERT_EQUAL_INT(4, ug.getNodes().size());
 	ug.addNode(graph::Node("n5"));
-	CPPUNIT_ASSERT(ug.getNodes().size() == 5);
+	CPPUNIT_ASSERT_EQUAL_INT(5, ug.getNodes().size());
 }
 
-void GraphTest::testRemoveNode()
+void GraphTest::testRemoveNode_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -403,64 +456,64 @@ void GraphTest::testRemoveNode()
 	graph::Node n4("n4");
 
 	// Directed
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addEdge(graph::DirectedEdge(n1, n2));
 	dg.addEdge(graph::DirectedEdge(n1, n2, "multi-edge"));
 	dg.addEdge(graph::DirectedEdge(n2, n3));
 	dg.addEdge(graph::DirectedEdge(n3, n4));
 	dg.addEdge(graph::DirectedEdge(n4, n1));
 
-	CPPUNIT_ASSERT(dg.getNodes().size() == 4);
-	CPPUNIT_ASSERT(dg.getEdges().size() == 5);
+	CPPUNIT_ASSERT_EQUAL_INT(4, dg.getNodes().size());
+	CPPUNIT_ASSERT_EQUAL_INT(5, dg.getEdges().size());
 
 	dg.removeNode(n1);
-	CPPUNIT_ASSERT(dg.neighbors(n4).empty());
-	CPPUNIT_ASSERT(dg.findEdges(n1, n2).empty());
-	CPPUNIT_ASSERT(dg.findEdges(n4, n1).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.neighbors(n4).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n1, n2).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n4, n1).empty());
 
 	dg.removeNode(n2);
-	CPPUNIT_ASSERT(dg.findEdges(n2, n3).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n2, n3).empty());
 
 	dg.removeNode(n3);
-	CPPUNIT_ASSERT(dg.findEdges(n3, n4).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n3, n4).empty());
 
 	dg.removeNode(n4);
-	CPPUNIT_ASSERT(dg.findEdges(n4, n1).empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.findEdges(n4, n1).empty());
 
-	CPPUNIT_ASSERT(dg.getEdges().empty());
-	CPPUNIT_ASSERT(dg.getNodes().empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.getEdges().empty());
+	CPPUNIT_ASSERT_EQUAL(true, dg.getNodes().empty());
 
 	// Undirected
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addEdge(graph::UndirectedEdge(n1, n2));
 	ug.addEdge(graph::UndirectedEdge(n1, n2, "multi-edge"));
 	ug.addEdge(graph::UndirectedEdge(n2, n3));
 	ug.addEdge(graph::UndirectedEdge(n3, n4));
 	ug.addEdge(graph::UndirectedEdge(n4, n1));
 
-	CPPUNIT_ASSERT(ug.getNodes().size() == 4);
-	CPPUNIT_ASSERT(ug.getEdges().size() == 5);
+	CPPUNIT_ASSERT_EQUAL_INT(4, ug.getNodes().size());
+	CPPUNIT_ASSERT_EQUAL_INT(5, ug.getEdges().size());
 
 	ug.removeNode(n1);
-	CPPUNIT_ASSERT(ug.neighbors(n4).size() == 1);
-	CPPUNIT_ASSERT(ug.findEdges(n1, n2).empty());
-	CPPUNIT_ASSERT(ug.findEdges(n4, n1).empty());
+	CPPUNIT_ASSERT_EQUAL_INT(1, ug.neighbors(n4).size());
+	CPPUNIT_ASSERT_EQUAL(true, ug.findEdges(n1, n2).empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.findEdges(n4, n1).empty());
 
 	ug.removeNode(n2);
-	CPPUNIT_ASSERT(ug.findEdges(n2, n3).empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.findEdges(n2, n3).empty());
 
 	ug.removeNode(n3);
-	CPPUNIT_ASSERT(ug.neighbors(n4).empty());
-	CPPUNIT_ASSERT(ug.findEdges(n3, n4).empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.neighbors(n4).empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.findEdges(n3, n4).empty());
 
 	ug.removeNode(n4);
-	CPPUNIT_ASSERT(ug.findEdges(n4, n1).empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.findEdges(n4, n1).empty());
 
-	CPPUNIT_ASSERT(ug.getEdges().empty());
-	CPPUNIT_ASSERT(ug.getNodes().empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.getEdges().empty());
+	CPPUNIT_ASSERT_EQUAL(true, ug.getNodes().empty());
 }
 
-void GraphTest::testNeighborEdges()
+void GraphTest::testNeighborEdges_impl(graph::REPRESENTATION representation)
 {
 	// Common
 	graph::Node n1("n1");
@@ -476,7 +529,7 @@ void GraphTest::testNeighborEdges()
 	graph::DirectedEdge de5(n3, n4);
 	graph::DirectedEdge de6(n4, n1);
 
-	graph::DirectedGraph dg(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::DirectedGraph dg(representation);
 	dg.addEdge(de1);
 	dg.addEdge(de2);
 	dg.addEdge(de3);
@@ -485,16 +538,16 @@ void GraphTest::testNeighborEdges()
 	dg.addEdge(de6);
 
 	std::set<graph::DirectedEdge> dexpected = { de1, de2, de3 };
-	CPPUNIT_ASSERT(dg.neighborEdges(n1) == dexpected);
+	CPPUNIT_ASSERT_EQUAL(dexpected, dg.neighborEdges(n1));
 
 	dexpected = { de4 };
-	CPPUNIT_ASSERT(dg.neighborEdges(n2) == dexpected);
+	CPPUNIT_ASSERT_EQUAL(dexpected, dg.neighborEdges(n2));
 
 	dexpected = { de5 };
-	CPPUNIT_ASSERT(dg.neighborEdges(n3) == dexpected);
+	CPPUNIT_ASSERT_EQUAL(dexpected, dg.neighborEdges(n3));
 
 	dexpected = { de6 };
-	CPPUNIT_ASSERT(dg.neighborEdges(n4) == dexpected);
+	CPPUNIT_ASSERT_EQUAL(dexpected, dg.neighborEdges(n4));
 
 	// Undirected
 	graph::UndirectedEdge ue1(n1, n2);
@@ -504,7 +557,7 @@ void GraphTest::testNeighborEdges()
 	graph::UndirectedEdge ue5(n3, n4);
 	graph::UndirectedEdge ue6(n4, n1);
 
-	graph::UndirectedGraph ug(graph::REPRESENTATION::ADJACENCY_LIST);
+	graph::UndirectedGraph ug(representation);
 	ug.addEdge(ue1);
 	ug.addEdge(ue2);
 	ug.addEdge(ue3);
@@ -513,15 +566,15 @@ void GraphTest::testNeighborEdges()
 	ug.addEdge(ue6);
 
 	std::set<graph::UndirectedEdge> uexpected = { ue1, ue2, ue3, ue6 };
-	CPPUNIT_ASSERT(ug.neighborEdges(n1) == uexpected);
+	CPPUNIT_ASSERT_EQUAL(uexpected, ug.neighborEdges(n1));
 
 	uexpected = { ue1, ue2, ue4 };
-	CPPUNIT_ASSERT(ug.neighborEdges(n2) == uexpected);
+	CPPUNIT_ASSERT_EQUAL(uexpected, ug.neighborEdges(n2));
 
 	uexpected = { ue3, ue4, ue5 };
-	CPPUNIT_ASSERT(ug.neighborEdges(n3) == uexpected);
+	CPPUNIT_ASSERT_EQUAL(uexpected, ug.neighborEdges(n3));
 
 	uexpected = { ue5, ue6 };
-	CPPUNIT_ASSERT(ug.neighborEdges(n4) == uexpected);
+	CPPUNIT_ASSERT_EQUAL(uexpected, ug.neighborEdges(n4));
 }
 
diff --git a/alib2data/test-src/graph/GraphTest.h b/alib2data/test-src/graph/GraphTest.h
index f2849cce74..edc57e97d9 100644
--- a/alib2data/test-src/graph/GraphTest.h
+++ b/alib2data/test-src/graph/GraphTest.h
@@ -3,6 +3,9 @@
 
 #include <cppunit/extensions/HelperMacros.h>
 
+#include "graph/directed/DirectedGraph.h"
+#include "graph/undirected/UndirectedGraph.h"
+
 class GraphTest : public CppUnit::TestFixture
 {
 	CPPUNIT_TEST_SUITE(GraphTest);
@@ -31,6 +34,17 @@ public:
 	void testAddNode();
 	void testRemoveNode();
 	void testNeighborEdges();
+
+	void testCopyConstruct_impl(graph::REPRESENTATION representation);
+	void testEqual_impl(graph::REPRESENTATION representation);
+	void testXMLParser_impl(graph::REPRESENTATION representation);
+	void testStringParser_impl(graph::REPRESENTATION representation);
+
+	void testAddEdge_impl(graph::REPRESENTATION representation);
+	void testRemoveEdge_impl(graph::REPRESENTATION representation);
+	void testAddNode_impl(graph::REPRESENTATION representation);
+	void testRemoveNode_impl(graph::REPRESENTATION representation);
+	void testNeighborEdges_impl(graph::REPRESENTATION representation);
 };
 
 #endif	// GRAPH_TEST_H_
-- 
GitLab