|
| 1 | +require'minitest/autorun' |
| 2 | +require_relative'topological_sort' |
| 3 | +require_relative'unweighted_graph' |
| 4 | + |
| 5 | +classTestTopologicalSort <Minitest::Test |
| 6 | +deftest_topological_sort_returns_valid_order_for_acyclic_graph |
| 7 | +wardrobe_items=[:underwear,:trousers,:belt,:shirt,:tie,:jacket,:socks,:shoes,:watch] |
| 8 | +wardrobe_graph=UnweightedGraph.new(nodes:wardrobe_items,directed:true) |
| 9 | +wardrobe_graph.add_edge(:underwear,:trousers) |
| 10 | +wardrobe_graph.add_edge(:underwear,:shoes) |
| 11 | +wardrobe_graph.add_edge(:socks,:shoes) |
| 12 | +wardrobe_graph.add_edge(:trousers,:shoes) |
| 13 | +wardrobe_graph.add_edge(:trousers,:belt) |
| 14 | +wardrobe_graph.add_edge(:shirt,:belt) |
| 15 | +wardrobe_graph.add_edge(:belt,:jacket) |
| 16 | +wardrobe_graph.add_edge(:shirt,:tie) |
| 17 | +wardrobe_graph.add_edge(:tie,:jacket) |
| 18 | + |
| 19 | +sorted_items=TopologicalSorter.new(wardrobe_graph).topological_sort |
| 20 | + |
| 21 | +assertsorted_items.index(:underwear) <sorted_items.index(:trousers) |
| 22 | +assertsorted_items.index(:underwear) <sorted_items.index(:shoes) |
| 23 | +assertsorted_items.index(:socks) <sorted_items.index(:shoes) |
| 24 | +assertsorted_items.index(:trousers) <sorted_items.index(:shoes) |
| 25 | +assertsorted_items.index(:trousers) <sorted_items.index(:belt) |
| 26 | +assertsorted_items.index(:shirt) <sorted_items.index(:belt) |
| 27 | +assertsorted_items.index(:belt) <sorted_items.index(:jacket) |
| 28 | +assertsorted_items.index(:shirt) <sorted_items.index(:tie) |
| 29 | +assertsorted_items.index(:tie) <sorted_items.index(:jacket) |
| 30 | +end |
| 31 | + |
| 32 | +deftest_topological_sort_raises_exception_for_undirected_graph |
| 33 | +nodes=[:u,:v] |
| 34 | +graph=UnweightedGraph.new(nodes:nodes,directed:false) |
| 35 | +graph.add_edge(:u,:v) |
| 36 | + |
| 37 | +assert_raisesArgumentErrordo |
| 38 | +TopologicalSorter.new(graph).topological_sort |
| 39 | +end |
| 40 | +end |
| 41 | + |
| 42 | +deftest_topological_sort_raises_exception_for_cyclic_graph |
| 43 | +nodes=[:u,:v] |
| 44 | +graph=UnweightedGraph.new(nodes:nodes,directed:true) |
| 45 | +graph.add_edge(:u,:v) |
| 46 | +graph.add_edge(:v,:u) |
| 47 | + |
| 48 | +assert_raisesArgumentErrordo |
| 49 | +TopologicalSorter.new(graph).topological_sort |
| 50 | +end |
| 51 | +end |
| 52 | +end |