From 7c3e709795eb6ca78e7a65ea229c03af991dcde1 Mon Sep 17 00:00:00 2001
From: David Rosca <roscadav@fit.cvut.cz>
Date: Sun, 22 Mar 2015 10:56:42 +0100
Subject: [PATCH] Graph: Add hasNode/hasEdge methods + tests

---
 .../directed/AdjacencyListDirectedGraph.cpp   |  10 ++
 .../directed/AdjacencyListDirectedGraph.h     |   3 +
 .../directed/AdjacencyMatrixDirectedGraph.cpp |  10 ++
 .../directed/AdjacencyMatrixDirectedGraph.h   |   3 +
 .../src/graph/directed/DirectedGraph.cpp      |  10 ++
 alib2data/src/graph/directed/DirectedGraph.h  |   3 +
 alib2data/src/graph/directed/IDirectedGraph.h |   3 +
 .../AdjacencyListUndirectedGraph.cpp          |  10 ++
 .../undirected/AdjacencyListUndirectedGraph.h |   3 +
 .../AdjacencyMatrixUndirectedGraph.cpp        |  10 ++
 .../AdjacencyMatrixUndirectedGraph.h          |   3 +
 .../src/graph/undirected/IUndirectedGraph.h   |   3 +
 .../src/graph/undirected/UndirectedGraph.cpp  |  10 ++
 .../src/graph/undirected/UndirectedGraph.h    |   3 +
 alib2data/test-src/graph/GraphTest.cpp        | 100 ++++++++++++++++++
 alib2data/test-src/graph/GraphTest.h          |   3 +
 16 files changed, 187 insertions(+)

diff --git a/alib2data/src/graph/directed/AdjacencyListDirectedGraph.cpp b/alib2data/src/graph/directed/AdjacencyListDirectedGraph.cpp
index ccdbdda61b..be31ad5254 100644
--- a/alib2data/src/graph/directed/AdjacencyListDirectedGraph.cpp
+++ b/alib2data/src/graph/directed/AdjacencyListDirectedGraph.cpp
@@ -27,6 +27,16 @@ std::set<DirectedEdge> AdjacencyListDirectedGraph::allEdges() const
 	return edges;
 }
 
+bool AdjacencyListDirectedGraph::hasNode(const Node &node) const
+{
+	return adj.find(node) != adj.end();
+}
+
+bool AdjacencyListDirectedGraph::hasEdge(const DirectedEdge &edge) const
+{
+	return edges.find(edge) != edges.end();
+}
+
 bool AdjacencyListDirectedGraph::hasEdge(const Node &from, const Node &to) const
 {
 	auto search = adj.find(from);
diff --git a/alib2data/src/graph/directed/AdjacencyListDirectedGraph.h b/alib2data/src/graph/directed/AdjacencyListDirectedGraph.h
index 4586e96cd8..7ccfe90762 100644
--- a/alib2data/src/graph/directed/AdjacencyListDirectedGraph.h
+++ b/alib2data/src/graph/directed/AdjacencyListDirectedGraph.h
@@ -29,6 +29,9 @@ public:
 	std::set<Node> allNodes() const override;
 	std::set<DirectedEdge> allEdges() const override;
 
+	bool hasNode(const Node &node) const override;
+	bool hasEdge(const DirectedEdge &edge) const override;
+
 	bool hasEdge(const Node &from, const Node &to) const override;
 	std::set<DirectedEdge> findEdges(const Node &from, const Node &to) const override;
 
diff --git a/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp b/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp
index e0cfed03b5..0f1598b82a 100644
--- a/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp
+++ b/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp
@@ -19,6 +19,16 @@ std::set<DirectedEdge> AdjacencyMatrixDirectedGraph::allEdges() const
 	return edges;
 }
 
+bool AdjacencyMatrixDirectedGraph::hasNode(const Node &node) const
+{
+	return adj.find(node) != adj.end();
+}
+
+bool AdjacencyMatrixDirectedGraph::hasEdge(const DirectedEdge &edge) const
+{
+	return edges.find(edge) != edges.end();
+}
+
 bool AdjacencyMatrixDirectedGraph::hasEdge(const Node &from, const Node &to) const
 {
 	auto search = adj.find(from);
diff --git a/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.h b/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.h
index 5dc9aa4adc..277147dbee 100644
--- a/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.h
+++ b/alib2data/src/graph/directed/AdjacencyMatrixDirectedGraph.h
@@ -33,6 +33,9 @@ public:
 	std::set<Node> allNodes() const override;
 	std::set<DirectedEdge> allEdges() const override;
 
+	bool hasNode(const Node &node) const override;
+	bool hasEdge(const DirectedEdge &edge) const override;
+
 	bool hasEdge(const Node &from, const Node &to) const override;
 	std::set<DirectedEdge> findEdges(const Node &from, const Node &to) const override;
 
diff --git a/alib2data/src/graph/directed/DirectedGraph.cpp b/alib2data/src/graph/directed/DirectedGraph.cpp
index 525826bcbf..af07c466a6 100644
--- a/alib2data/src/graph/directed/DirectedGraph.cpp
+++ b/alib2data/src/graph/directed/DirectedGraph.cpp
@@ -72,6 +72,16 @@ std::set<Node> DirectedGraph::getNodes() const
 	return impl->allNodes();
 }
 
+bool DirectedGraph::hasNode(const Node &node) const
+{
+	return impl->hasNode(node);
+}
+
+bool DirectedGraph::hasEdge(const DirectedEdge &edge) const
+{
+	return impl->hasEdge(edge);
+}
+
 std::set<DirectedEdge> DirectedGraph::getEdges() const
 {
 	return impl->allEdges();
diff --git a/alib2data/src/graph/directed/DirectedGraph.h b/alib2data/src/graph/directed/DirectedGraph.h
index 306605437b..0844695284 100644
--- a/alib2data/src/graph/directed/DirectedGraph.h
+++ b/alib2data/src/graph/directed/DirectedGraph.h
@@ -32,6 +32,9 @@ public:
 	std::set<Node> getNodes() const;
 	std::set<DirectedEdge> getEdges() const;
 
+	bool hasNode(const Node &node) const;
+	bool hasEdge(const DirectedEdge &edge) const;
+
 	bool hasEdge(const Node &from, const Node &to) const;
 	std::set<DirectedEdge> findEdges(const Node &from, const Node &to) const;
 
diff --git a/alib2data/src/graph/directed/IDirectedGraph.h b/alib2data/src/graph/directed/IDirectedGraph.h
index c142659996..163c376b0b 100644
--- a/alib2data/src/graph/directed/IDirectedGraph.h
+++ b/alib2data/src/graph/directed/IDirectedGraph.h
@@ -16,6 +16,9 @@ public:
 	virtual std::set<Node> allNodes() const = 0;
 	virtual std::set<DirectedEdge> allEdges() const = 0;
 
+	virtual bool hasNode(const Node &node) const = 0;
+	virtual bool hasEdge(const DirectedEdge &edge) const = 0;
+
 	virtual bool hasEdge(const Node &from, const Node &to) const = 0;
 	virtual std::set<DirectedEdge> findEdges(const Node &from, const Node &to) const = 0;
 
diff --git a/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.cpp b/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.cpp
index 7d5fb88aeb..4f98050aac 100644
--- a/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.cpp
+++ b/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.cpp
@@ -20,6 +20,16 @@ std::set<UndirectedEdge> AdjacencyListUndirectedGraph::allEdges() const
 	return edges;
 }
 
+bool AdjacencyListUndirectedGraph::hasNode(const Node &node) const
+{
+	return adj.find(node) != adj.end();
+}
+
+bool AdjacencyListUndirectedGraph::hasEdge(const UndirectedEdge &edge) const
+{
+	return edges.find(edge) != edges.end();
+}
+
 bool AdjacencyListUndirectedGraph::hasEdge(const Node &first, const Node &second) const
 {
 	auto search = adj.find(first);
diff --git a/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.h b/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.h
index 6c4605bbfa..066ee6636d 100644
--- a/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.h
+++ b/alib2data/src/graph/undirected/AdjacencyListUndirectedGraph.h
@@ -32,6 +32,9 @@ public:
 	std::set<Node> allNodes() const override;
 	std::set<UndirectedEdge> allEdges() const override;
 
+	bool hasNode(const Node &node) const override;
+	bool hasEdge(const UndirectedEdge &edge) const override;
+
 	bool hasEdge(const Node &first, const Node &second) const override;
 	std::set<UndirectedEdge> findEdges(const Node &first, const Node &second) const override;
 
diff --git a/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp b/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp
index 49c50ba2e3..a1d42d0921 100644
--- a/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp
+++ b/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp
@@ -29,6 +29,16 @@ bool AdjacencyMatrixUndirectedGraph::hasEdge(const Node &first, const Node &seco
 	return search->second.find(second) != search->second.end();
 }
 
+bool AdjacencyMatrixUndirectedGraph::hasNode(const Node &node) const
+{
+	return adj.find(node) != adj.end();
+}
+
+bool AdjacencyMatrixUndirectedGraph::hasEdge(const UndirectedEdge &edge) const
+{
+	return edges.find(edge) != edges.end();
+}
+
 std::set<UndirectedEdge> AdjacencyMatrixUndirectedGraph::findEdges(const Node &first, const Node &second) const
 {
 	std::set<UndirectedEdge> out;
diff --git a/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h b/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h
index a877b030ab..a920d3dfa4 100644
--- a/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h
+++ b/alib2data/src/graph/undirected/AdjacencyMatrixUndirectedGraph.h
@@ -35,6 +35,9 @@ public:
 	std::set<Node> allNodes() const override;
 	std::set<UndirectedEdge> allEdges() const override;
 
+	bool hasNode(const Node &node) const override;
+	bool hasEdge(const UndirectedEdge &edge) const override;
+
 	bool hasEdge(const Node &first, const Node &second) const override;
 	std::set<UndirectedEdge> findEdges(const Node &first, const Node &second) const override;
 
diff --git a/alib2data/src/graph/undirected/IUndirectedGraph.h b/alib2data/src/graph/undirected/IUndirectedGraph.h
index 51c6574ba3..3e0ad5aacc 100644
--- a/alib2data/src/graph/undirected/IUndirectedGraph.h
+++ b/alib2data/src/graph/undirected/IUndirectedGraph.h
@@ -16,6 +16,9 @@ public:
 	virtual std::set<Node> allNodes() const = 0;
 	virtual std::set<UndirectedEdge> allEdges() const = 0;
 
+	virtual bool hasNode(const Node &node) const = 0;
+	virtual bool hasEdge(const UndirectedEdge &edge) const = 0;
+
 	virtual bool hasEdge(const Node &first, const Node &second) const = 0;
 	virtual std::set<UndirectedEdge> findEdges(const Node &first, const Node &second) const = 0;
 
diff --git a/alib2data/src/graph/undirected/UndirectedGraph.cpp b/alib2data/src/graph/undirected/UndirectedGraph.cpp
index bf0d409aa9..4209cf1674 100644
--- a/alib2data/src/graph/undirected/UndirectedGraph.cpp
+++ b/alib2data/src/graph/undirected/UndirectedGraph.cpp
@@ -77,6 +77,16 @@ std::set<UndirectedEdge> UndirectedGraph::getEdges() const
 	return impl->allEdges();
 }
 
+bool UndirectedGraph::hasNode(const Node &node) const
+{
+	return impl->hasNode(node);
+}
+
+bool UndirectedGraph::hasEdge(const UndirectedEdge &edge) const
+{
+	return impl->hasEdge(edge);
+}
+
 bool UndirectedGraph::hasEdge(const Node &from, const Node &to) const
 {
 	return impl->hasEdge(from, to);
diff --git a/alib2data/src/graph/undirected/UndirectedGraph.h b/alib2data/src/graph/undirected/UndirectedGraph.h
index ed6cdc68ae..8476e4d970 100644
--- a/alib2data/src/graph/undirected/UndirectedGraph.h
+++ b/alib2data/src/graph/undirected/UndirectedGraph.h
@@ -32,6 +32,9 @@ public:
 	std::set<Node> getNodes() const;
 	std::set<UndirectedEdge> getEdges() const;
 
+	bool hasNode(const Node &node) const;
+	bool hasEdge(const UndirectedEdge &edge) const;
+
 	bool hasEdge(const Node &from, const Node &to) const;
 	std::set<UndirectedEdge> findEdges(const Node &from, const Node &to) const;
 
diff --git a/alib2data/test-src/graph/GraphTest.cpp b/alib2data/test-src/graph/GraphTest.cpp
index 0fcd966d54..52132ffe5d 100644
--- a/alib2data/test-src/graph/GraphTest.cpp
+++ b/alib2data/test-src/graph/GraphTest.cpp
@@ -71,6 +71,11 @@ void GraphTest::testAddEdgeValue()
 	RUN_TEST(testAddEdgeValue_impl);
 }
 
+void GraphTest::testHasNodeAndEdge()
+{
+	RUN_TEST(testHasNodeAndEdge_impl);
+}
+
 void GraphTest::testCopyConstruct_impl(graph::REPRESENTATION representation)
 {
 	// Common
@@ -711,3 +716,98 @@ void GraphTest::testAddEdgeValue_impl(graph::REPRESENTATION representation)
 	CPPUNIT_ASSERT_EQUAL(2, ug.getEdgeValue(ue6));
 }
 
+void GraphTest::testHasNodeAndEdge_impl(graph::REPRESENTATION representation)
+{
+	// Common
+	graph::Node n1("n1");
+	graph::Node n2("n2");
+	graph::Node n3("n3");
+	graph::Node n4("n4");
+	graph::Node n5("n5");
+	graph::Node n6("n6");
+
+	// Directed
+	graph::DirectedEdge de1(n1, n2);
+	graph::DirectedEdge de2(n1, n3);
+	graph::DirectedEdge de3(n1, n4);
+	graph::DirectedEdge de4(n1, n5);
+	graph::DirectedEdge de5(n2, n5);
+	graph::DirectedEdge de6(n5, n6);
+
+	graph::DirectedGraph dg(representation);
+	dg.addEdge(de1, 2);
+	dg.addEdge(de2, 2);
+	dg.addEdge(de3, 1);
+	dg.addEdge(de4, 6);
+	dg.addEdge(de5, 3);
+	dg.addEdge(de6, 2);
+
+	CPPUNIT_ASSERT_EQUAL_INT(6, dg.getNodes().size());
+	CPPUNIT_ASSERT_EQUAL_INT(6, dg.getEdges().size());
+
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasNode(n1));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasNode(n2));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasNode(n3));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasNode(n4));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasNode(n5));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasNode(n6));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasNode(graph::Node("n7")));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasNode(graph::Node("n8")));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasNode(graph::Node("n9")));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasNode(graph::Node("n10")));
+
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasEdge(de1));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasEdge(de2));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasEdge(de3));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasEdge(de4));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasEdge(de5));
+	CPPUNIT_ASSERT_EQUAL(true, dg.hasEdge(de6));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasEdge(graph::DirectedEdge(n1, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasEdge(graph::DirectedEdge(n2, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasEdge(graph::DirectedEdge(n3, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasEdge(graph::DirectedEdge(n4, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, dg.hasEdge(graph::DirectedEdge(n1, n2, "a")));
+
+	// Undirected
+	graph::UndirectedEdge ue1(n1, n2);
+	graph::UndirectedEdge ue2(n1, n3);
+	graph::UndirectedEdge ue3(n1, n4);
+	graph::UndirectedEdge ue4(n1, n5);
+	graph::UndirectedEdge ue5(n2, n5);
+	graph::UndirectedEdge ue6(n5, n6);
+
+	graph::UndirectedGraph ug(representation);
+	ug.addEdge(ue1, 2);
+	ug.addEdge(ue2, 2);
+	ug.addEdge(ue3, 1);
+	ug.addEdge(ue4, 6);
+	ug.addEdge(ue5, 3);
+	ug.addEdge(ue6, 2);
+
+	CPPUNIT_ASSERT_EQUAL_INT(6, ug.getNodes().size());
+	CPPUNIT_ASSERT_EQUAL_INT(6, ug.getEdges().size());
+
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasNode(n1));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasNode(n2));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasNode(n3));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasNode(n4));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasNode(n5));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasNode(n6));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasNode(graph::Node("n7")));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasNode(graph::Node("n8")));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasNode(graph::Node("n9")));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasNode(graph::Node("n10")));
+
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasEdge(ue1));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasEdge(ue2));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasEdge(ue3));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasEdge(ue4));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasEdge(ue5));
+	CPPUNIT_ASSERT_EQUAL(true, ug.hasEdge(ue6));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasEdge(graph::UndirectedEdge(n1, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasEdge(graph::UndirectedEdge(n2, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasEdge(graph::UndirectedEdge(n3, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasEdge(graph::UndirectedEdge(n4, n6)));
+	CPPUNIT_ASSERT_EQUAL(false, ug.hasEdge(graph::UndirectedEdge(n1, n2, "a")));
+}
+
diff --git a/alib2data/test-src/graph/GraphTest.h b/alib2data/test-src/graph/GraphTest.h
index 50d9472e84..3ee02ff14f 100644
--- a/alib2data/test-src/graph/GraphTest.h
+++ b/alib2data/test-src/graph/GraphTest.h
@@ -20,6 +20,7 @@ class GraphTest : public CppUnit::TestFixture
 	CPPUNIT_TEST(testNeighborEdges);
 	CPPUNIT_TEST(testHasEdge);
 	CPPUNIT_TEST(testAddEdgeValue);
+	CPPUNIT_TEST(testHasNodeAndEdge);
 	CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -35,6 +36,7 @@ public:
 	void testNeighborEdges();
 	void testHasEdge();
 	void testAddEdgeValue();
+	void testHasNodeAndEdge();
 
 	void testCopyConstruct_impl(graph::REPRESENTATION representation);
 	void testEqual_impl(graph::REPRESENTATION representation);
@@ -48,6 +50,7 @@ public:
 	void testNeighborEdges_impl(graph::REPRESENTATION representation);
 	void testHasEdge_impl(graph::REPRESENTATION representation);
 	void testAddEdgeValue_impl(graph::REPRESENTATION representation);
+	void testHasNodeAndEdge_impl(graph::REPRESENTATION representation);
 };
 
 #endif	// GRAPH_TEST_H_
-- 
GitLab