Skip to content

Commit 6aab620

Browse files
committed
Updated with XCTest Swift3 syntax for shortest path
1 parent b2688ad commit 6aab620

File tree

2 files changed

+116
-115
lines changed

2 files changed

+116
-115
lines changed
Lines changed: 80 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,107 @@
11
// MARK: - Edge
22

33
public class Edge: Equatable {
4-
public var neighbor: Node
5-
6-
public init(neighbor: Node) {
7-
self.neighbor = neighbor
8-
}
4+
public var neighbor: Node
5+
6+
public init(neighbor: Node) {
7+
self.neighbor = neighbor
8+
}
99
}
1010

1111
public func == (lhs: Edge, rhs: Edge) -> Bool {
12-
return lhs.neighbor == rhs.neighbor
12+
return lhs.neighbor == rhs.neighbor
1313
}
1414

15+
1516
// MARK: - Node
1617

1718
public class Node: CustomStringConvertible, Equatable {
18-
public var neighbors: [Edge]
19-
20-
public private(set) var label: String
21-
public var distance: Int?
22-
public var visited: Bool
23-
24-
public init(label: String) {
25-
self.label = label
26-
neighbors = []
27-
visited = false
28-
}
29-
30-
public var description: String {
31-
if let distance = distance {
32-
return "Node(label: \(label), distance: \(distance))"
19+
public var neighbors: [Edge]
20+
21+
public private(set) var label: String
22+
public var distance: Int?
23+
public var visited: Bool
24+
25+
public init(label: String) {
26+
self.label = label
27+
neighbors = []
28+
visited = false
29+
}
30+
31+
public var description: String {
32+
if let distance = distance {
33+
return "Node(label: \(label), distance: \(distance))"
34+
}
35+
return "Node(label: \(label), distance: infinity)"
36+
}
37+
38+
public var hasDistance: Bool {
39+
return distance != nil
40+
}
41+
42+
public func remove(edge: Edge) {
43+
neighbors.remove(at: neighbors.index { $0 === edge }!)
3344
}
34-
return "Node(label: \(label), distance: infinity)"
35-
}
36-
37-
public var hasDistance: Bool {
38-
return distance != nil
39-
}
40-
41-
public func remove(edge: Edge) {
42-
neighbors.removeAtIndex(neighbors.indexOf { $0 === edge }!)
43-
}
4445
}
4546

4647
public func == (lhs: Node, rhs: Node) -> Bool {
47-
return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors
48+
return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors
4849
}
4950

5051
// MARK: - Graph
5152

5253
public class Graph: CustomStringConvertible, Equatable {
53-
public private(set) var nodes: [Node]
54-
55-
public init() {
56-
self.nodes = []
57-
}
58-
59-
public func addNode(label: String) -> Node {
60-
let node = Node(label: label)
61-
nodes.append(node)
62-
return node
63-
}
64-
65-
public func addEdge(source: Node, neighbor: Node) {
66-
let edge = Edge(neighbor: neighbor)
67-
source.neighbors.append(edge)
68-
}
69-
70-
public var description: String {
71-
var description = ""
72-
73-
for node in nodes {
74-
if !node.neighbors.isEmpty {
75-
description += "[node: \(node.label) edges: \(node.neighbors.map { $0.neighbor.label})]"
76-
}
54+
public private(set) var nodes: [Node]
55+
56+
public init() {
57+
self.nodes = []
7758
}
78-
return description
79-
}
80-
81-
public func findNodeWithLabel(label: String) -> Node {
82-
return nodes.filter { $0.label == label }.first!
83-
}
84-
85-
public func duplicate() -> Graph {
86-
let duplicated = Graph()
87-
88-
for node in nodes {
89-
duplicated.addNode(node.label)
59+
60+
public func addNode(label: String) -> Node {
61+
let node = Node(label: label)
62+
nodes.append(node)
63+
return node
9064
}
91-
92-
for node in nodes {
93-
for edge in node.neighbors {
94-
let source = duplicated.findNodeWithLabel(node.label)
95-
let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)
96-
duplicated.addEdge(source, neighbor: neighbour)
97-
}
65+
66+
public func addEdge(_ source: Node, neighbor: Node) {
67+
let edge = Edge(neighbor: neighbor)
68+
source.neighbors.append(edge)
69+
}
70+
71+
public var description: String {
72+
var description = ""
73+
74+
for node in nodes {
75+
if !node.neighbors.isEmpty {
76+
description += "[node: \(node.label) edges: \(node.neighbors.map { $0.neighbor.label})]"
77+
}
78+
}
79+
return description
80+
}
81+
82+
public func findNodeWithLabel(label: String) -> Node {
83+
return nodes.filter { $0.label == label }.first!
84+
}
85+
86+
public func duplicate() -> Graph {
87+
let duplicated = Graph()
88+
89+
for node in nodes {
90+
duplicated.addNode(label: node.label)
91+
}
92+
93+
for node in nodes {
94+
for edge in node.neighbors {
95+
let source = duplicated.findNodeWithLabel(label: node.label)
96+
let neighbour = duplicated.findNodeWithLabel(label: edge.neighbor.label)
97+
duplicated.addEdge(source, neighbor: neighbour)
98+
}
99+
}
100+
101+
return duplicated
98102
}
99-
100-
return duplicated
101-
}
102103
}
103104

104105
public func == (lhs: Graph, rhs: Graph) -> Bool {
105-
return lhs.nodes == rhs.nodes
106+
return lhs.nodes == rhs.nodes
106107
}

Shortest Path (Unweighted)/Tests/ShortestPathTests.swift

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ class ShortestPathTests: XCTestCase {
44

55
func testShortestPathWhenGivenTree() {
66
let tree = Graph()
7-
let nodeA = tree.addNode("a")
8-
let nodeB = tree.addNode("b")
9-
let nodeC = tree.addNode("c")
10-
let nodeD = tree.addNode("d")
11-
let nodeE = tree.addNode("e")
12-
let nodeF = tree.addNode("f")
13-
let nodeG = tree.addNode("g")
14-
let nodeH = tree.addNode("h")
7+
let nodeA = tree.addNode(label: "a")
8+
let nodeB = tree.addNode(label: "b")
9+
let nodeC = tree.addNode(label: "c")
10+
let nodeD = tree.addNode(label: "d")
11+
let nodeE = tree.addNode(label: "e")
12+
let nodeF = tree.addNode(label: "f")
13+
let nodeG = tree.addNode(label: "g")
14+
let nodeH = tree.addNode(label: "h")
1515
tree.addEdge(nodeA, neighbor: nodeB)
1616
tree.addEdge(nodeA, neighbor: nodeC)
1717
tree.addEdge(nodeB, neighbor: nodeD)
@@ -20,30 +20,30 @@ class ShortestPathTests: XCTestCase {
2020
tree.addEdge(nodeC, neighbor: nodeG)
2121
tree.addEdge(nodeE, neighbor: nodeH)
2222

23-
let shortestPaths = breadthFirstSearchShortestPath(tree, source: nodeA)
23+
let shortestPaths = breadthFirstSearchShortestPath(graph: tree, source: nodeA)
2424

25-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeA.label).distance, 0)
26-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeB.label).distance, 1)
27-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeC.label).distance, 1)
28-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeD.label).distance, 2)
29-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeE.label).distance, 2)
30-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeF.label).distance, 2)
31-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeG.label).distance, 2)
32-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeH.label).distance, 3)
25+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeA.label).distance, 0)
26+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeB.label).distance, 1)
27+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeC.label).distance, 1)
28+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeD.label).distance, 2)
29+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeE.label).distance, 2)
30+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeF.label).distance, 2)
31+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeG.label).distance, 2)
32+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeH.label).distance, 3)
3333
}
3434

3535
func testShortestPathWhenGivenGraph() {
3636
let graph = Graph()
3737

38-
let nodeA = graph.addNode("a")
39-
let nodeB = graph.addNode("b")
40-
let nodeC = graph.addNode("c")
41-
let nodeD = graph.addNode("d")
42-
let nodeE = graph.addNode("e")
43-
let nodeF = graph.addNode("f")
44-
let nodeG = graph.addNode("g")
45-
let nodeH = graph.addNode("h")
46-
let nodeI = graph.addNode("i")
38+
let nodeA = graph.addNode(label:"a")
39+
let nodeB = graph.addNode(label:"b")
40+
let nodeC = graph.addNode(label:"c")
41+
let nodeD = graph.addNode(label:"d")
42+
let nodeE = graph.addNode(label:"e")
43+
let nodeF = graph.addNode(label:"f")
44+
let nodeG = graph.addNode(label:"g")
45+
let nodeH = graph.addNode(label:"h")
46+
let nodeI = graph.addNode(label:"i")
4747

4848
graph.addEdge(nodeA, neighbor: nodeB)
4949
graph.addEdge(nodeA, neighbor: nodeH)
@@ -74,16 +74,16 @@ class ShortestPathTests: XCTestCase {
7474
graph.addEdge(nodeI, neighbor: nodeG)
7575
graph.addEdge(nodeI, neighbor: nodeH)
7676

77-
let shortestPaths = breadthFirstSearchShortestPath(graph, source: nodeA)
77+
let shortestPaths = breadthFirstSearchShortestPath(graph: graph, source: nodeA)
7878

79-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeA.label).distance, 0)
80-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeB.label).distance, 1)
81-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeC.label).distance, 2)
82-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeD.label).distance, 3)
83-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeE.label).distance, 4)
84-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeF.label).distance, 3)
85-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeG.label).distance, 2)
86-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeH.label).distance, 1)
87-
XCTAssertEqual(shortestPaths.findNodeWithLabel(nodeI.label).distance, 2)
79+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeA.label).distance, 0)
80+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeB.label).distance, 1)
81+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeC.label).distance, 2)
82+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeD.label).distance, 3)
83+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeE.label).distance, 4)
84+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeF.label).distance, 3)
85+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeG.label).distance, 2)
86+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeH.label).distance, 1)
87+
XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeI.label).distance, 2)
8888
}
8989
}

0 commit comments

Comments
 (0)