diff --git a/roadmap/roadmap.cpp b/roadmap/roadmap.cpp index 37c568f..9dd4aa4 100644 --- a/roadmap/roadmap.cpp +++ b/roadmap/roadmap.cpp @@ -19,7 +19,7 @@ #include using namespace std; -#define DEBUG 1 + class ConcreteRoadMap : public AbstractRoadMap { private: map< string, set > adj; @@ -123,7 +123,7 @@ bool ConcreteRoadMap::reachable(const string& c1, const string& c2) const { set discovered; s.push_back(c1); while (!s.empty()) { - const string& v = s.front(); + const string v = s.front(); if (v == c2) return true; s.pop_front(); @@ -150,7 +150,12 @@ int ConcreteRoadMap::countIslands() const { s.push(std::pair(itr->first, itr->first)); first = true; while (!s.empty()) { - const std::pair& v = s.top(); + const std::pair v = s.top(); +#if DEBUG + std::cout << "Front is: " << v.first << " with parent " << + v.second << "\n"; +#endif + s.pop(); if (discovered.find(v.first) == discovered.end()) { @@ -164,9 +169,17 @@ int ConcreteRoadMap::countIslands() const { for (auto j = set.begin(); j != set.end(); ++j) { if (*j != v.second) { +#if DEBUG + cout << "Neighbor: " << *j << " parent: " << + v.first << "\n"; +#endif s.push(std::pair(*j, v.first)); } } + } else { +#if DEBUG + cout << v.first << " is discovered\n"; +#endif } first = false; diff --git a/roadmap/tests/optional_test1.cpp b/roadmap/tests/optional_test1.cpp new file mode 100644 index 0000000..3450947 --- /dev/null +++ b/roadmap/tests/optional_test1.cpp @@ -0,0 +1,106 @@ +#include +#include +#include + +#include "basic_testing.h" + +#include "../roadmap.h" + +TEST(basic_test) { + std::unique_ptr m(createRoadMap()); + + // Add roads on one island: + m->addRoad({"Locarno", "Lugano", "Agno"}); + assert_false(m->hasLoop()); + m->addRoad("Agno", "Berna"); + assert_false(m->hasLoop()); + m->addRoad("Locarno", "Berna"); + m->addRoad("Locarno", "Basel"); + m->addRoad({"Ginevra", "Basel", "Sciaffusa", "Zurigo"}); + + assert_int_eq(m->neighborCountForCity("Locarno"), 3); + assert_true(m->hasLoop()); + assert_int_eq(m->countIslands(), 1); + assert_int_eq(m->neighborCountForCity("Basel"), 3); + + m->addRoad("Basel", "Paris"); + assert_int_eq(m->neighborCountForCity("Basel"), 4); + + m->addRoad("London", "Edinburgh"); + m->addRoad("Dublin", "Belfast"); + m->addRoad("Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch", "Anglesey"); + + assert_int_eq(m->countIslands(), 4); + + m->addRoad("Belfast", "Edinburgh"); + assert_int_eq(m->countIslands(), 3); + assert_true(m->reachable("Agno", "Locarno")); + assert_false(m->reachable("Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch", "Edinburgh")); + m->addRoad("Anglesey", "London"); + assert_true(m->reachable("Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch", "Edinburgh")); + m->clear(); + assert_int_eq(m->countIslands(), 0); + + TEST_PASSED; +} + +TEST(loops_test) { + std::unique_ptr m(createRoadMap()); + + // Add roads on one island: + m->addRoad({"Naples", "Lugano", "Praia Grande"}); + assert_false(m->hasLoop()); + // Add roads on another island: + m->addRoad("Colorado", "Boulder"); + assert_false(m->hasLoop()); + // Add roads on another island: + m->addRoad("Milano", "Siena"); + assert_false(m->hasLoop()); + assert_int_eq(m->countIslands(), 3); + + // Merge two islands + m->addRoad("Milano", "Boulder"); + assert_false(m->hasLoop()); + assert_int_eq(m->countIslands(), 2); + + // Create Loop + m->addRoad("Colorado", "Siena"); + assert_true(m->hasLoop()); + assert_int_eq(m->countIslands(), 2); + + // Create another Loop + m->addRoad("Lugano", "Zurich"); + m->addRoad("Praia Grande", "Zurich"); + assert_int_eq(m->countIslands(), 2); + + // Merge two islands + m->addRoad("Praia Grande", "Naples"); + assert_false(m->reachable("Colorado", "Praia Grande")); + assert_int_eq(m->countIslands(), 2); + m->addRoad("Praia Grande", "Siena"); + m->addRoad("Naples", "Colorado"); + assert_int_eq(m->countIslands(), 1); + assert_int_eq(m->neighborCountForCity("Zurich"), 2); + m->addRoad({"Colorado", "Zurich", "Siena"}); + assert_true(m->reachable("Praia Grande", "Colorado")); + + m->clear(); + assert_int_eq(m->countIslands(), 0); + + TEST_PASSED; +} + +TEST(santaclaus_test) { + std::unique_ptr m(createRoadMap()); + + + TEST_PASSED; +} + +int main() { + RUN_TEST(basic_test); + RUN_TEST(loops_test); + RUN_TEST(santaclaus_test); + PRINT_TEST_RESULTS; + assert(ALL_TESTS_PASSED); +}