Skip to content

Commit

Permalink
Add and refactor test cases.
Browse files Browse the repository at this point in the history
Fix BFS when traversing from vertex with self loop
  • Loading branch information
jvanecek committed Jan 6, 2019
1 parent bc5fc0b commit 275ca47
Show file tree
Hide file tree
Showing 6 changed files with 150 additions and 80 deletions.
68 changes: 57 additions & 11 deletions source/Mole-Tests/BreadthFirstTraversalTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,71 @@ Class {
}

{ #category : #private }
BreadthFirstTraversalTest >> directedGraphExpectedNodesTraversed [
BreadthFirstTraversalTest >> graphTraversalAlgorithm [

^ #(0 1 3 4 2)
^ BreadthFirstTraversal new
]

{ #category : #private }
BreadthFirstTraversalTest >> directedTreeExpectedNodesTraversed [
{ #category : #tests }
BreadthFirstTraversalTest >> testTraverseDirectedGraph [

^ #(0 1 2 4 3 5)
| graph |

graph := self directedGraph.

self assertTraversing: graph from: 0 visitsInOrder: #(0 1 3 4 2)
]

{ #category : #private }
BreadthFirstTraversalTest >> graphTraversalAlgorithm [
{ #category : #tests }
BreadthFirstTraversalTest >> testTraverseDirectedTree [

^ BreadthFirstTraversal new
| graph |

graph := self directedTree.

self assertTraversing: graph from: 0 visitsInOrder: #(0 1 2 4 3 5)
]

{ #category : #private }
BreadthFirstTraversalTest >> undirectedGraphExpectedNodesTraversed [
{ #category : #tests }
BreadthFirstTraversalTest >> testTraverseDisconnectedDirectedGraph [

| graph |

graph := self disconnectedDirectedGraph.

self assertTraversing: graph from: 1 visitsInOrder: #(1 2 3).
self assertTraversing: graph from: 4 visitsInOrder: #(4 5).
self assertTraversing: graph from: 7 visitsInOrder: #(7).
]

{ #category : #tests }
BreadthFirstTraversalTest >> testTraverseDisconnectedUndirectedGraph [

| graph |

graph := self disconnectedUndirectedGraph.

self assertTraversing: graph from: 1 visitsInOrder: #(1 2 3).
self assertTraversing: graph from: 4 visitsInOrder: #(4 5 6).
self assertTraversing: graph from: 7 visitsInOrder: #(7).
]

{ #category : #tests }
BreadthFirstTraversalTest >> testTraverseGraphFromNotIncludedVertex [

| graph |

graph := self directedTree.

self assertTraversing: graph from: 99 visitsInOrder: #()
]

{ #category : #tests }
BreadthFirstTraversalTest >> testTraverseUndirectedGraph [

| graph |

^ #(0 1 2 3 4)
graph := self undirectedGraph.

self assertTraversing: graph from: 0 visitsInOrder: #(0 1 2 3 4)
]
62 changes: 54 additions & 8 deletions source/Mole-Tests/DepthFirstTraversalTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,71 @@ Class {
}

{ #category : #private }
DepthFirstTraversalTest >> directedGraphExpectedNodesTraversed [
DepthFirstTraversalTest >> graphTraversalAlgorithm [

^ #(0 1 3 4 2)
^ DepthFirstTraversal new
]

{ #category : #private }
DepthFirstTraversalTest >> directedTreeExpectedNodesTraversed [
DepthFirstTraversalTest >> testTraverseDirectedGraph [

| graph |

^ #(0 1 2 3 4 5)
graph := self directedGraph.

self assertTraversing: graph from: 0 visitsInOrder: #(0 1 3 4 2)
]

{ #category : #tests }
DepthFirstTraversalTest >> testTraverseDirectedTree [

| graph |

graph := self directedTree.

self assertTraversing: graph from: 0 visitsInOrder: #(0 1 2 3 4 5)
]

{ #category : #private }
DepthFirstTraversalTest >> graphTraversalAlgorithm [
DepthFirstTraversalTest >> testTraverseDisconnectedDirectedGraph [

| graph |

graph := self disconnectedDirectedGraph.

^ DepthFirstTraversal new
self assertTraversing: graph from: 1 visitsInOrder: #(1 2 3).
self assertTraversing: graph from: 4 visitsInOrder: #(4 5).
self assertTraversing: graph from: 7 visitsInOrder: #(7).
]

{ #category : #private }
DepthFirstTraversalTest >> undirectedGraphExpectedNodesTraversed [
DepthFirstTraversalTest >> testTraverseDisconnectedUndirectedGraph [

| graph |

graph := self disconnectedUndirectedGraph.

self assertTraversing: graph from: 1 visitsInOrder: #(1 2 3).
self assertTraversing: graph from: 4 visitsInOrder: #(4 5 6).
self assertTraversing: graph from: 7 visitsInOrder: #(7).
]

{ #category : #private }
DepthFirstTraversalTest >> testTraverseGraphFromNotIncludedVertex [

| graph |

graph := self directedTree.

self assertTraversing: graph from: 99 visitsInOrder: #()
]

{ #category : #private }
DepthFirstTraversalTest >> testTraverseUndirectedGraph [

| graph |

^ #(0 1 2 4 3)
graph := self undirectedGraph.

self assertTraversing: graph from: 0 visitsInOrder: #(0 1 2 4 3).
]
87 changes: 33 additions & 54 deletions source/Mole-Tests/GraphTraversalAlgorithmTest.class.st
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"
I'm an abstract test case for GraphShortestPathWalker
I'm an abstract test case for GraphTraversalAlgorithmTest
"
Class {
#name : #GraphTraversalAlgorithmTest,
Expand All @@ -13,6 +13,16 @@ GraphTraversalAlgorithmTest class >> isAbstract [
^ self name = #GraphTraversalAlgorithmTest
]

{ #category : #assertions }
GraphTraversalAlgorithmTest >> assertTraversing: aGraph from: aSourceVertex visitsInOrder: aVertexCollection [

| path |

path := OrderedCollection new.
self graphTraversalAlgorithm traverse: aGraph from: aSourceVertex doing: [ :node | path add: node ].
self assert: path asArray equals: aVertexCollection.
]

{ #category : #private }
GraphTraversalAlgorithmTest >> directedGraph [

Expand All @@ -26,12 +36,6 @@ GraphTraversalAlgorithmTest >> directedGraph [
buildDirected
]

{ #category : #private }
GraphTraversalAlgorithmTest >> directedGraphExpectedNodesTraversed [

self subclassResponsibility
]

{ #category : #private }
GraphTraversalAlgorithmTest >> directedTree [

Expand All @@ -46,9 +50,29 @@ GraphTraversalAlgorithmTest >> directedTree [
]

{ #category : #private }
GraphTraversalAlgorithmTest >> directedTreeExpectedNodesTraversed [
GraphTraversalAlgorithmTest >> disconnectedDirectedGraph [

^ self subclassResponsibility
^ self graphBuilder
connect: 1 to: 2;
connect: 1 to: 3;
connect: 3 to: 2;
connect: 6 to: 4;
connect: 4 to: 5;
loopOn: 7;
buildDirected
]

{ #category : #private }
GraphTraversalAlgorithmTest >> disconnectedUndirectedGraph [

^ self graphBuilder
connect: 1 to: 2;
connect: 1 to: 3;
connect: 3 to: 2;
connect: 6 to: 4;
connect: 4 to: 5;
loopOn: 7;
buildUndirected
]

{ #category : #private }
Expand All @@ -63,45 +87,6 @@ GraphTraversalAlgorithmTest >> graphTraversalAlgorithm [
^ self subclassResponsibility
]

{ #category : #tests }
GraphTraversalAlgorithmTest >> testTraverseDirectedGraph [

| graph path |

graph := self directedGraph.
path := OrderedCollection new.

self graphTraversalAlgorithm traverse: graph from: 0 doing: [ :node | path add: node ].

self assert: path asArray equals: self directedGraphExpectedNodesTraversed
]

{ #category : #tests }
GraphTraversalAlgorithmTest >> testTraverseDirectedTree [

| graph path |

graph := self directedTree.
path := OrderedCollection new.

self graphTraversalAlgorithm traverse: graph from: 0 doing: [ :node | path add: node ].

self assert: path asArray equals: self directedTreeExpectedNodesTraversed
]

{ #category : #tests }
GraphTraversalAlgorithmTest >> testTraverseUndirectedGraph [

| graph path |

graph := self undirectedGraph.
path := OrderedCollection new.

self graphTraversalAlgorithm traverse: graph from: 0 doing: [ :node | path add: node ].

self assert: path asArray equals: self undirectedGraphExpectedNodesTraversed
]

{ #category : #private }
GraphTraversalAlgorithmTest >> undirectedGraph [

Expand All @@ -114,9 +99,3 @@ GraphTraversalAlgorithmTest >> undirectedGraph [
connect: 4 to: 2;
buildUndirected
]

{ #category : #private }
GraphTraversalAlgorithmTest >> undirectedGraphExpectedNodesTraversed [

self subclassResponsibility
]
6 changes: 3 additions & 3 deletions source/Mole/BreadthFirstTraversal.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ BreadthFirstTraversal >> traverse: aGraph from: aSourceVertex doing: aBlock [
(aGraph includesVertex: aSourceVertex)
ifTrue: [ aBlock value: aSourceVertex ].

self traverse: aGraph from: aSourceVertex doing: aBlock havingVisited: OrderedCollection new.
self traverse: aGraph from: aSourceVertex doing: aBlock havingVisited: (OrderedCollection with: aSourceVertex).
]

{ #category : #'private-traverse' }
BreadthFirstTraversal >> traverse: aGraph from: aSourceVertex doing: aBlock havingVisited: aVertexCollection [

| neighborsToVisit |

neighborsToVisit := (aGraph directSuccessorsOf: aSourceVertex) reject: [ :neighbor | aVertexCollection includes: neighbor ].
aVertexCollection add: aSourceVertex; addAll: neighborsToVisit.
neighborsToVisit := (aGraph directSuccessorsOf: aSourceVertex) copyWithoutAll: aVertexCollection.
aVertexCollection addAll: neighborsToVisit.
neighborsToVisit do: aBlock; do: [ :neighbor | self traverse: aGraph from: neighbor doing: aBlock havingVisited: aVertexCollection ]

]
4 changes: 2 additions & 2 deletions source/Mole/DepthFirstTraversal.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ DepthFirstTraversal >> traverse: aGraph from: aSourceVertex doing: aBlock [
(aGraph includesVertex: aSourceVertex)
ifTrue: [ aBlock value: aSourceVertex ].

self traverse: aGraph from: aSourceVertex doing: aBlock havingVisited: OrderedCollection new.
self traverse: aGraph from: aSourceVertex doing: aBlock havingVisited: (OrderedCollection with: aSourceVertex).
]

{ #category : #'private-traverse' }
DepthFirstTraversal >> traverse: aGraph from: aSourceVertex doing: aBlock havingVisited: aVertexCollection [

aVertexCollection add: aSourceVertex.
(aGraph directSuccessorsOf: aSourceVertex) do: [ :neighbor |
(aVertexCollection includes: neighbor) ifFalse: [
aBlock value: neighbor.
aVertexCollection add: neighbor.
self traverse: aGraph from: neighbor doing: aBlock havingVisited: aVertexCollection ] ]
]
3 changes: 1 addition & 2 deletions source/Mole/DirectedGraph.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ DirectedGraph class >> withValidVertices: aVertexCollection andEdges: anEdgeColl
{ #category : #accessing }
DirectedGraph >> directSuccessorsOf: aSourceVertex [

^ (self edgesOutgoingFrom: aSourceVertex)
collect: [ :directedEdge | directedEdge target ]
^ (self edgesOutgoingFrom: aSourceVertex) collect: #target
]

{ #category : #'private - accessing' }
Expand Down

0 comments on commit 275ca47

Please sign in to comment.