1
- use area:: Area ;
2
- use cell:: Cell ;
3
- use universe:: Universe ;
4
-
5
1
use super :: * ;
6
2
7
3
pub const N : usize = 4 ;
8
4
5
+ #[ cfg( test) ]
6
+ mod tests;
7
+
9
8
#[ derive( Debug ) ]
10
9
pub enum HandleError {
11
10
OutOfRange ,
@@ -34,15 +33,43 @@ pub fn get_special(i: usize, area: Area) -> Universe {
34
33
}
35
34
}
36
35
37
- // height: 5
38
- // width: 5
39
- // 01234
40
- // 0.....0
41
- // 1.---.1
42
- // 2.|.|.2
43
- // 3.---.3
44
- // 4.....4
45
- // 01234
36
+ pub fn rand ( area : Area ) -> Universe {
37
+ let cells = ( 0 ..area. len ( ) ) . map ( |_i| fastrand:: bool ( ) . into ( ) ) . collect ( ) ;
38
+ Universe { area, cells }
39
+ }
40
+
41
+ pub fn stripes ( area : Area ) -> Universe {
42
+ let cells = ( 0 ..area. len ( ) )
43
+ . map ( |i| {
44
+ if i % 2 == 0 || i % 7 == 0 {
45
+ Cell :: Alive
46
+ } else {
47
+ Cell :: Dead
48
+ }
49
+ } )
50
+ . collect ( ) ;
51
+ Universe { area, cells }
52
+ }
53
+
54
+ pub fn empty ( area : Area ) -> Universe {
55
+ let cells = vec ! [ Cell :: Dead ; area. len( ) ] ;
56
+ Universe :: new ( area, cells)
57
+ }
58
+
59
+ pub fn full ( area : Area ) -> Universe {
60
+ let cells = vec ! [ Cell :: Alive ; area. len( ) ] ;
61
+ Universe { area, cells }
62
+ }
63
+
64
+ /// height: 5
65
+ /// width: 5
66
+ /// 01234
67
+ /// 0.....0
68
+ /// 1.---.1
69
+ /// 2.|.|.2
70
+ /// 3.---.3
71
+ /// 4.....4
72
+ /// 01234
46
73
pub fn frame ( area : Area ) -> Universe {
47
74
let mut univ = empty ( area) ;
48
75
if area. height < 3 || area. width < 3 {
@@ -63,64 +90,6 @@ pub fn frame(area: Area) -> Universe {
63
90
}
64
91
univ
65
92
}
66
- #[ test]
67
- fn frame_test00 ( ) {
68
- let area = Area :: new ( 3 , 2 ) ;
69
- let univ = Universe :: from_vec_str ( & [ "___" . to_owned ( ) , "___" . to_owned ( ) ] ) ;
70
- let frame = frame ( area) ;
71
- print ! ( "{frame}" ) ;
72
- assert_eq ! ( univ, frame) ;
73
- }
74
- #[ test]
75
- fn frame_test0 ( ) {
76
- let area = Area :: new ( 3 , 3 ) ;
77
- let univ = Universe :: from_vec_str ( & [ "___" . to_owned ( ) , "_#_" . to_owned ( ) , "___" . to_owned ( ) ] ) ;
78
- let frame = frame ( area) ;
79
- print ! ( "{frame}" ) ;
80
- assert_eq ! ( univ, frame) ;
81
- }
82
- #[ test]
83
- fn frame_test1 ( ) {
84
- let area = Area :: new ( 4 , 4 ) ;
85
- let univ = Universe :: from_vec_str ( & [
86
- "____" . to_owned ( ) ,
87
- "_##_" . to_owned ( ) ,
88
- "_##_" . to_owned ( ) ,
89
- "____" . to_owned ( ) ,
90
- ] ) ;
91
- let frame = frame ( area) ;
92
- print ! ( "{frame}" ) ;
93
- assert_eq ! ( univ, frame) ;
94
- }
95
- #[ test]
96
- fn frame_test2 ( ) {
97
- let area = Area :: new ( 5 , 5 ) ;
98
- let univ = Universe :: from_vec_str ( & [
99
- "_____" . to_owned ( ) ,
100
- "_###_" . to_owned ( ) ,
101
- "_#_#_" . to_owned ( ) ,
102
- "_###_" . to_owned ( ) ,
103
- "_____" . to_owned ( ) ,
104
- ] ) ;
105
- let frame = frame ( area) ;
106
- print ! ( "{frame}" ) ;
107
- assert_eq ! ( univ, frame) ;
108
- }
109
- #[ test]
110
- fn frame_test3 ( ) {
111
- let area = Area :: new ( 6 , 6 ) ;
112
- let univ = Universe :: from_vec_str ( & [
113
- "______" . to_owned ( ) ,
114
- "_####_" . to_owned ( ) ,
115
- "_#__#_" . to_owned ( ) ,
116
- "_#__#_" . to_owned ( ) ,
117
- "_####_" . to_owned ( ) ,
118
- "______" . to_owned ( ) ,
119
- ] ) ;
120
- let frame = frame ( area) ;
121
- print ! ( "{frame}" ) ;
122
- assert_eq ! ( univ, frame) ;
123
- }
124
93
125
94
pub const COPPERHEAD : & str = "\
126
95
_____#_##___
@@ -154,168 +123,23 @@ __#
154
123
#_#
155
124
_##" ;
156
125
157
- #[ test]
158
- fn featherweight_spaceship_test ( ) {
159
- let area = Area :: new ( 3 , 3 ) ;
160
- let m = Universe :: from_str ( FEATHERWEIGTH_SPACESHIP ) ;
161
- assert_eq ! ( m. area, area) ;
162
- dbg ! ( & m) ;
163
- let alive = [ ( 0u8 , 2u8 ) , ( 1u8 , 0u8 ) , ( 1u8 , 2u8 ) , ( 2u8 , 1u8 ) , ( 2u8 , 2u8 ) ] ;
164
- for alive_cell in alive {
165
- dbg ! ( alive_cell) ;
166
- assert_eq ! ( m. get( alive_cell) , Some ( & Cell :: Alive ) ) ;
167
- }
168
- assert ! ( m. get( ( 3u8 , 3u8 ) ) . is_none( ) ) ;
169
- assert ! ( m. get( ( 3u8 , 4u8 ) ) . is_none( ) ) ;
170
- assert ! ( m. get( ( 4u8 , 3u8 ) ) . is_none( ) ) ;
171
- }
172
-
173
126
/// 8x4
174
127
pub const RABBITS : & str = "\
175
128
#_____#_
176
129
__#___#_
177
130
__#__#_#
178
131
_#_#____" ;
179
132
180
- #[ test]
181
- fn rabbits_test ( ) {
182
- let area = Area :: new ( 8 , 4 ) ;
183
- let m = Universe :: from_str ( RABBITS ) ;
184
- assert_eq ! ( m. area, area) ;
185
- dbg ! ( & m) ;
186
- let alive = [
187
- ( 0u8 , 0u8 ) ,
188
- ( 0u8 , 6u8 ) ,
189
- ( 1u8 , 2u8 ) ,
190
- ( 1u8 , 6u8 ) ,
191
- ( 2u8 , 2u8 ) ,
192
- ( 2u8 , 5u8 ) ,
193
- ( 2u8 , 7u8 ) ,
194
- ( 3u8 , 1u8 ) ,
195
- ( 3u8 , 3u8 ) ,
196
- ] ;
197
- for alive_cell in alive {
198
- dbg ! ( alive_cell) ;
199
- assert_eq ! ( m. get( alive_cell) , Some ( & Cell :: Alive ) ) ;
200
- }
201
- assert ! ( m. get( ( 4u8 , 8u8 ) ) . is_none( ) ) ;
202
- assert ! ( m. get( ( 8u8 , 4u8 ) ) . is_none( ) ) ;
203
- }
204
-
205
133
/// 3×5
206
134
pub const BONK_TIE : & str = "\
207
135
##_
208
136
##_
209
137
__#
210
138
__#
211
139
__#" ;
212
- #[ test]
213
- fn bonk_tie_test ( ) {
214
- let area = Area :: new ( 3 , 5 ) ;
215
- let m = Universe :: from_str ( BONK_TIE ) ;
216
- assert_eq ! ( m. area, area) ;
217
- dbg ! ( & m) ;
218
- let alive = [
219
- ( 0u8 , 0u8 ) ,
220
- ( 0u8 , 1u8 ) ,
221
- ( 1u8 , 0u8 ) ,
222
- ( 1u8 , 1u8 ) ,
223
- ( 2u8 , 2u8 ) ,
224
- ( 3u8 , 2u8 ) ,
225
- ( 4u8 , 2u8 ) ,
226
- ] ;
227
- for alive_cell in alive {
228
- dbg ! ( alive_cell) ;
229
- assert_eq ! ( m. get( alive_cell) , Some ( & Cell :: Alive ) ) ;
230
- }
231
- assert ! ( m. get( ( 4u8 , 3u8 ) ) . is_none( ) ) ;
232
- assert ! ( m. get( ( 3u8 , 4u8 ) ) . is_none( ) ) ;
233
- }
234
140
235
141
/// 7×3
236
142
pub const ACORN : & str = "\
237
143
_#_____
238
144
___#___
239
145
##__###" ;
240
-
241
- #[ test]
242
- fn acorn_test ( ) {
243
- let area = Area :: new ( 7 , 3 ) ;
244
- let m = Universe :: from_str ( ACORN ) ;
245
- assert_eq ! ( m. area, area) ;
246
- dbg ! ( & m) ;
247
- let alive = [
248
- ( 0u8 , 1u8 ) ,
249
- ( 1u8 , 3u8 ) ,
250
- ( 2u8 , 0u8 ) ,
251
- ( 2u8 , 1u8 ) ,
252
- ( 2u8 , 4u8 ) ,
253
- ( 2u8 , 5u8 ) ,
254
- ( 2u8 , 6u8 ) ,
255
- ] ;
256
- for alive_cell in alive {
257
- dbg ! ( alive_cell) ;
258
- assert_eq ! ( m. get( alive_cell) , Some ( & Cell :: Alive ) ) ;
259
- }
260
- assert ! ( m. get( ( 4u8 , 3u8 ) ) . is_none( ) ) ;
261
- assert ! ( m. get( ( 3u8 , 4u8 ) ) . is_none( ) ) ;
262
- }
263
-
264
- /// `area.len()`
265
- pub fn rand ( area : Area ) -> Universe {
266
- let cells = ( 0 ..area. len ( ) ) . map ( |_i| fastrand:: bool ( ) . into ( ) ) . collect ( ) ;
267
- Universe { area, cells }
268
- }
269
-
270
- /// `area.len()`
271
- pub fn stripes ( area : Area ) -> Universe {
272
- let cells = ( 0 ..area. len ( ) )
273
- . map ( |i| {
274
- if i % 2 == 0 || i % 7 == 0 {
275
- Cell :: Alive
276
- } else {
277
- Cell :: Dead
278
- }
279
- } )
280
- . collect ( ) ;
281
- Universe { area, cells }
282
- }
283
- #[ test]
284
- fn stripes_test ( ) {
285
- let area = Area :: new ( 0 , 0 ) ;
286
- let m = stripes ( area) ;
287
- assert ! ( m. cells. is_empty( ) ) ;
288
- assert_eq ! ( m. area, area) ;
289
- dbg ! ( & m) ;
290
- assert ! ( m. get( ( 4u8 , 3u8 ) ) . is_none( ) ) ;
291
- assert ! ( m. get( ( 3u8 , 4u8 ) ) . is_none( ) ) ;
292
- assert ! ( m. get( ( 0u8 , 1u8 ) ) . is_none( ) ) ;
293
- assert ! ( m. get( ( 1u8 , 0u8 ) ) . is_none( ) ) ;
294
- }
295
-
296
- pub fn empty ( area : Area ) -> Universe {
297
- let cells = vec ! [ Cell :: Dead ; area. len( ) ] ;
298
- Universe :: new ( area, cells)
299
- }
300
-
301
- /// `area.len()`
302
- pub fn full ( area : Area ) -> Universe {
303
- let cells = vec ! [ Cell :: Alive ; area. len( ) ] ;
304
- Universe { area, cells }
305
- }
306
- #[ test]
307
- fn full_test ( ) {
308
- let area = Area :: new ( 4 , 3 ) ;
309
- let m = full ( area) ;
310
- assert_eq ! ( m. area, area) ;
311
- assert ! ( m. cells. iter( ) . all( |j| * j == Cell :: Alive ) ) ;
312
- dbg ! ( & m) ;
313
- for i in 0 ..m. height ( ) - 1 {
314
- for j in 0 ..m. width ( ) - 1 {
315
- dbg ! ( ( i, j) ) ;
316
- assert_eq ! ( m. get( ( i, j) ) , Some ( & Cell :: Alive ) ) ;
317
- }
318
- }
319
- assert ! ( m. get( ( 4u8 , 3u8 ) ) . is_none( ) ) ;
320
- assert ! ( m. get( ( 3u8 , 4u8 ) ) . is_none( ) ) ;
321
- }
0 commit comments