7
7
8
8
namespace AlgorithmTests . GraphTraversal
9
9
{
10
- class DepthFirstSearchTests
10
+ public class DepthFirstSearchTests
11
11
{
12
12
[ Test ]
13
13
public void Small_maze_test ( )
@@ -24,26 +24,13 @@ public void Small_maze_test()
24
24
%.-----------------%
25
25
%%%%%%%%%%%%%%%%%%%%" ;
26
26
27
- Func < Point , char > getCell = p => maze . Split ( new [ ] { Environment . NewLine } , StringSplitOptions . None ) . Skip ( 1 ) . ToArray ( ) [ p . Y ] [ p . X ] ;
28
-
29
- Func < Point , IEnumerable < Point > > getNeighbours = p =>
30
- {
31
- var allPoints = new [ ]
32
- {
33
- new Point ( p . X , p . Y - 1 ) , // top
34
- new Point ( p . X + 1 , p . Y ) , // right
35
- new Point ( p . X , p . Y + 1 ) , // bottom
36
- new Point ( p . X - 1 , p . Y ) , // left
37
- } ;
38
-
39
- return allPoints . Where ( x => getCell ( x ) != '%' ) ;
40
-
41
- } ;
27
+ Func < Point , char > getCell = GetCell ( maze ) ;
28
+ Func < Point , IEnumerable < Point > > getNeighbours = GetNeighbours ( getCell ) ;
42
29
43
30
44
31
var result = DepthFirstSearch . Explore ( start , getNeighbours ) ;
45
32
46
- List < Point > path = new List < Point > ( ) ;
33
+ var path = new List < Point > ( ) ;
47
34
foreach ( var item in result )
48
35
{
49
36
path . Add ( item ) ;
@@ -110,29 +97,13 @@ public void Small_maze_FindPath_test()
110
97
%.-----------------%
111
98
%%%%%%%%%%%%%%%%%%%%" ;
112
99
113
- Func < Point , char > getCell = p =>
114
- {
115
- return maze . Split ( new [ ] { Environment . NewLine } , StringSplitOptions . None ) . Skip ( 1 ) . ToArray ( ) [ p . Y ] [ p . X ] ;
116
- } ;
117
-
118
- Func < Point , IEnumerable < Point > > getNeighbours = p =>
119
- {
120
- var allPoints = new [ ]
121
- {
122
- new Point ( p . X , p . Y - 1 ) , // top
123
- new Point ( p . X + 1 , p . Y ) , // right
124
- new Point ( p . X , p . Y + 1 ) , // bottom
125
- new Point ( p . X - 1 , p . Y ) , // left
126
- } ;
127
-
128
- return allPoints . Where ( x => getCell ( x ) != '%' ) ;
129
-
130
- } ;
100
+ var getCell = GetCell ( maze ) ;
101
+ var getNeighbours = GetNeighbours ( getCell ) ;
131
102
132
103
133
104
var result = DepthFirstSearch . FindPath ( start , getNeighbours , point => point == end ) . ToArray ( ) ;
134
105
135
- for ( int i = 0 ; i < result . Count ( ) - 1 ; i ++ )
106
+ for ( var i = 0 ; i < result . Length - 1 ; i ++ )
136
107
{
137
108
var twoPoints = result . Skip ( i ) . Take ( 2 ) . ToArray ( ) ;
138
109
var point1 = twoPoints [ 0 ] ;
@@ -150,17 +121,14 @@ public void Tiny_maze_FindPath_test()
150
121
var start = new Point ( 1 , 3 ) ;
151
122
var end = new Point ( 7 , 3 ) ;
152
123
153
- var maze = @"
124
+ const string maze = @"
154
125
%%%%%%%%%
155
126
%-------%
156
127
%%%%-%%%%
157
128
%P------%
158
129
%%%%%%%%%" ;
159
130
160
- Func < Point , char > getCell = p =>
161
- {
162
- return maze . Split ( new [ ] { Environment . NewLine } , StringSplitOptions . None ) . Skip ( 1 ) . ToArray ( ) [ p . Y ] [ p . X ] ;
163
- } ;
131
+ Func < Point , char > getCell = p => maze . Split ( new [ ] { Environment . NewLine } , StringSplitOptions . None ) . Skip ( 1 ) . ToArray ( ) [ p . Y ] [ p . X ] ;
164
132
165
133
Func < Point , IEnumerable < Point > > getNeighbours = p =>
166
134
{
@@ -179,7 +147,7 @@ public void Tiny_maze_FindPath_test()
179
147
180
148
var result = DepthFirstSearch . FindPath ( start , getNeighbours , point => point == end ) . ToArray ( ) ;
181
149
182
- for ( int i = 0 ; i < result . Count ( ) - 1 ; i ++ )
150
+ for ( var i = 0 ; i < result . Length - 1 ; i ++ )
183
151
{
184
152
var twoPoints = result . Skip ( i ) . Take ( 2 ) . ToArray ( ) ;
185
153
var point1 = twoPoints [ 0 ] ;
@@ -191,23 +159,47 @@ public void Tiny_maze_FindPath_test()
191
159
Assert . That ( result . Last ( ) , Is . EqualTo ( end ) ) ;
192
160
}
193
161
162
+ [ Test ]
163
+ public void Explore_should_stop_on_specific_condition ( )
164
+ {
165
+ var start = new Point ( 1 , 3 ) ;
166
+ var end = new Point ( 1 , 1 ) ;
167
+ Func < Point , bool > endCondition = point => point == end ;
168
+
169
+ const string maze = @"
170
+ %%%%%%%%%
171
+ %-------%
172
+ %%%%-%%%%
173
+ %P------%
174
+ %%%%%%%%%" ;
175
+
176
+ var getCell = GetCell ( maze ) ;
177
+ var getNeighbours = GetNeighbours ( getCell ) ;
178
+
179
+ var result = DepthFirstSearch
180
+ . Explore ( start , getNeighbours , endCondition )
181
+ . ToArray ( ) ;
182
+
183
+ Assert . That ( result . Count ( ) , Is . EqualTo ( 12 ) ) ;
184
+ Assert . That ( result . Last ( ) , Is . EqualTo ( end ) ) ;
185
+ }
186
+
194
187
[ Test ]
195
188
public void FindPath_should_return_empty_enumerqble_when_no_path_found ( )
196
189
{
197
190
var start = new Point ( 1 , 3 ) ;
198
191
var end = new Point ( 7 , 1 ) ;
199
192
200
- var maze = @"
193
+ const string maze = @"
201
194
%%%%%%%%%
202
195
%-------%
203
196
%%%%%%%%%
204
197
%P------%
205
198
%%%%%%%%%" ;
206
199
207
- Func < Point , char > getCell = GetCell ( maze ) ;
208
- Func < Point , IEnumerable < Point > > getNeighbours = GetNeighbours ( getCell ) ;
209
-
210
-
200
+ var getCell = GetCell ( maze ) ;
201
+ var getNeighbours = GetNeighbours ( getCell ) ;
202
+
211
203
var result = DepthFirstSearch . FindPath ( start , getNeighbours , point => point == end ) ;
212
204
213
205
Assert . That ( result , Is . Empty ) ;
@@ -226,7 +218,6 @@ private static Func<Point, IEnumerable<Point>> GetNeighbours(Func<Point, char> g
226
218
} ;
227
219
228
220
return allPoints . Where ( x => getCell ( x ) != '%' ) ;
229
-
230
221
} ;
231
222
}
232
223
0 commit comments