Skip to content

Commit 0485693

Browse files
committed
Added reversed graph and tests
1 parent 1e1f999 commit 0485693

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

Sources/SwiftGraph/Graph.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,17 @@ extension Graph {
244244
public func edgeExists(_ edge: E) -> Bool {
245245
return edges[edge.u].contains(edge)
246246
}
247+
248+
/// Returns a graph of the same type with all edges reversed.
249+
///
250+
/// - returns: Graph of the same type with all edges reversed.
251+
public func reversed() -> Self {
252+
let g = Self(vertices: self.vertices)
253+
for e in self.edgeList() {
254+
g.addEdge(e.reversed(), directed: e.directed)
255+
}
256+
return g
257+
}
247258

248259

249260
// MARK: Implement Printable protocol

Tests/SwiftGraphTests/SwiftGraphSortTests.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,25 @@ class SwiftGraphSortTests: XCTestCase {
2323
// pg 1016 Liang
2424
let dressDAG: UnweightedGraph<String> = UnweightedGraph<String>(vertices: ["undershorts", "socks", "pants", "shoes", "watch", "belt", "shirt", "tie", "jacket"])
2525

26+
private func comesBefore<T: Equatable>(order: [T], a: T, b: T) -> Bool {
27+
let aPos = order.firstIndex { (i) -> Bool in
28+
return i == a
29+
}
30+
let bPos = order.firstIndex { (i) -> Bool in
31+
return i == b
32+
}
33+
34+
guard let A = aPos, let B = bPos else { return false }
35+
return A < B
36+
}
37+
38+
func testComesBefore() {
39+
XCTAssertTrue(comesBefore(order: [5, 4, 3, 2, 1], a: 3, b: 1))
40+
XCTAssertTrue(comesBefore(order: [5, 4, 3, 2, 1], a: 5, b: 2))
41+
XCTAssertTrue(comesBefore(order: ["A", "B", "C"], a: "A", b: "C"))
42+
43+
}
44+
2645
override func setUp() {
2746
super.setUp()
2847
// Put setup code here. This method is called before the invocation of each test method in the class.
@@ -56,5 +75,15 @@ class SwiftGraphSortTests: XCTestCase {
5675
}
5776
print(result)
5877
XCTAssertEqual(result.count, 9, "All items in sort.")
78+
XCTAssertTrue(comesBefore(order: result, a: "undershorts", b: "shoes"))
79+
XCTAssertTrue(comesBefore(order: result, a: "pants", b: "shoes"))
80+
XCTAssertTrue(comesBefore(order: result, a: "socks", b: "shoes"))
81+
XCTAssertTrue(comesBefore(order: result, a: "undershorts", b: "pants"))
82+
XCTAssertTrue(comesBefore(order: result, a: "pants", b: "belt"))
83+
XCTAssertTrue(comesBefore(order: result, a: "belt", b: "jacket"))
84+
XCTAssertTrue(comesBefore(order: result, a: "shirt", b: "tie"))
85+
XCTAssertTrue(comesBefore(order: result, a: "shirt", b: "belt"))
86+
XCTAssertTrue(comesBefore(order: result, a: "tie", b: "jacket"))
87+
5988
}
6089
}

Tests/SwiftGraphTests/SwiftGraphTests.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,44 @@ class SwiftGraphTests: XCTestCase {
9595
XCTAssertFalse(graph.edgeExists(fromIndex: 2, toIndex: 3))
9696
XCTAssertFalse(graph.edgeExists(fromIndex: 3, toIndex: 2))
9797
}
98+
99+
func testCitesReversedDirected() {
100+
let g = UnweightedGraph<String>(vertices: ["Atlanta", "New York", "Miami"])
101+
g.addEdge(from: "Atlanta", to: "New York", directed: true)
102+
g.addEdge(from: "Miami", to: "Atlanta", directed: true)
103+
g.addEdge(from: "New York", to: "Miami", directed: true)
104+
105+
XCTAssertTrue(g.edgeExists(from: "Atlanta", to: "New York"))
106+
XCTAssertTrue(g.edgeExists(from: "Miami", to: "Atlanta"))
107+
XCTAssertTrue(g.edgeExists(from: "New York", to: "Miami"))
108+
109+
let r: UnweightedGraph<String> = g.reversed()
110+
XCTAssertFalse(r.edgeExists(from: "Atlanta", to: "New York"))
111+
XCTAssertFalse(r.edgeExists(from: "Miami", to: "Atlanta"))
112+
XCTAssertFalse(r.edgeExists(from: "New York", to: "Miami"))
113+
114+
XCTAssertTrue(r.edgeExists(from: "New York", to: "Atlanta"))
115+
XCTAssertTrue(r.edgeExists(from: "Atlanta", to: "Miami"))
116+
XCTAssertTrue(r.edgeExists(from: "Miami", to: "New York"))
117+
}
118+
119+
func testCitesReversedUndirected() {
120+
let g = UnweightedGraph<String>(vertices: ["Atlanta", "New York", "Miami"])
121+
g.addEdge(from: "Atlanta", to: "New York", directed: false)
122+
g.addEdge(from: "Miami", to: "Atlanta", directed: false)
123+
g.addEdge(from: "New York", to: "Miami", directed: false)
124+
125+
XCTAssertTrue(g.edgeExists(from: "Atlanta", to: "New York"))
126+
XCTAssertTrue(g.edgeExists(from: "Miami", to: "Atlanta"))
127+
XCTAssertTrue(g.edgeExists(from: "New York", to: "Miami"))
128+
129+
let r: UnweightedGraph<String> = g.reversed()
130+
XCTAssertTrue(r.edgeExists(from: "Atlanta", to: "New York"))
131+
XCTAssertTrue(r.edgeExists(from: "Miami", to: "Atlanta"))
132+
XCTAssertTrue(r.edgeExists(from: "New York", to: "Miami"))
133+
134+
XCTAssertTrue(r.edgeExists(from: "New York", to: "Atlanta"))
135+
XCTAssertTrue(r.edgeExists(from: "Atlanta", to: "Miami"))
136+
XCTAssertTrue(r.edgeExists(from: "Miami", to: "New York"))
137+
}
98138
}

0 commit comments

Comments
 (0)