text2048 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+
3
+ require 'text2048/app'
4
+
5
+ describe Text2048::App do
6
+ describe '.new' do
7
+ context 'with no arguments' do
8
+ When(:result) { Text2048::App.new }
9
+ Then { result.view.is_a?(Text2048::CursesView) }
10
+ end
11
+
12
+ context 'with custom view' do
13
+ Given(:view) { double('view') }
14
+ When(:result) { Text2048::App.new(view) }
15
+ Then { result.view == view }
16
+ end
17
+ end
18
+
19
+ describe '#generate' do
20
+ Given(:view) { double('view', update: nil, zoom_tiles: nil) }
21
+ Given(:app) { Text2048::App.new(view) }
22
+
23
+ context 'with no arguments' do
24
+ When { app.generate }
25
+ Then { app.board.generated_tiles.size == 1 }
26
+ end
27
+
28
+ context 'with 2' do
29
+ When { app.generate(2) }
30
+ Then { app.board.generated_tiles.size == 2 }
31
+ end
32
+ end
33
+
34
+ describe '#step' do
35
+ Given(:new_board) do
36
+ double('new_board', merged_tiles: nil, generate?: nil)
37
+ end
38
+
39
+ context 'with command = :larger' do
40
+ Given(:view) { double('view', command: :larger, larger: nil) }
41
+ Given(:app) { Text2048::App.new(view) }
42
+ When { app.step }
43
+ Then { expect(view).to have_received(:larger) }
44
+ end
45
+
46
+ context 'with command = :smaller' do
47
+ Given(:view) { double('view', command: :smaller, smaller: nil) }
48
+ Given(:app) { Text2048::App.new(view) }
49
+ When { app.step }
50
+ Then { expect(view).to have_received(:smaller) }
51
+ end
52
+
53
+ context 'with command = :left' do
54
+ Given(:view) do
55
+ double('view', command: :left, update: nil, pop_tiles: nil)
56
+ end
57
+ Given(:board) { double('board', left: new_board, win?: nil, lose?: nil) }
58
+ Given(:app) { Text2048::App.new(view, board) }
59
+ When { app.step }
60
+ Then { expect(board).to have_received(:left) }
61
+ And { expect(view).to have_received(:update) }
62
+ end
63
+
64
+ context 'with command = :right' do
65
+ Given(:view) do
66
+ double('view', command: :right, update: nil, pop_tiles: nil)
67
+ end
68
+ Given(:board) do
69
+ double('board', right: new_board, win?: nil, lose?: nil)
70
+ end
71
+ Given(:app) { Text2048::App.new(view, board) }
72
+ When { app.step }
73
+ Then { expect(board).to have_received(:right) }
74
+ And { expect(view).to have_received(:update) }
75
+ end
76
+
77
+ context 'with command = :up' do
78
+ Given(:view) do
79
+ double('view', command: :up, update: nil, pop_tiles: nil)
80
+ end
81
+ Given(:board) { double('board', up: new_board, win?: nil, lose?: nil) }
82
+ Given(:app) { Text2048::App.new(view, board) }
83
+ When { app.step }
84
+ Then { expect(board).to have_received(:up) }
85
+ And { expect(view).to have_received(:update) }
86
+ end
87
+
88
+ context 'with command = :down' do
89
+ Given(:view) do
90
+ double('view', command: :down, update: nil, pop_tiles: nil)
91
+ end
92
+ Given(:board) { double('board', down: new_board, win?: nil, lose?: nil) }
93
+ Given(:app) { Text2048::App.new(view, board) }
94
+ When { app.step }
95
+ Then { expect(board).to have_received(:down) }
96
+ And { expect(view).to have_received(:update) }
97
+ end
98
+
99
+ context 'with command = :quit' do
100
+ Given(:view) { double('view', command: :quit) }
101
+ Given(:app) { Text2048::App.new(view) }
102
+ When(:result) { app.step }
103
+ Then { result == Failure(SystemExit) }
104
+ end
105
+ end
106
+ end
@@ -2,63 +2,71 @@
2
2
 
3
3
  require 'text2048'
4
4
 
5
- describe Text2048::Board, '.new' do
6
- context 'without arguments' do
7
- Given(:board) { Text2048::Board.new }
5
+ describe Text2048::Board do
6
+ Given(:board) do
7
+ initial_tiles ? Text2048::Board.new(initial_tiles) : Text2048::Board.new
8
+ end
9
+ Invariant { board.score == 0 }
10
+ Invariant { board.generated_tiles.empty? }
11
+ Invariant { board.merged_tiles.empty? }
12
+
13
+ context 'with no arguments' do
14
+ Given(:initial_tiles) {}
8
15
 
9
- Then { board.generated_tiles.empty? }
10
- And { board.merged_tiles.empty? }
11
- And { board.score == 0 }
16
+ describe '#tiles' do
17
+ When(:tiles) { board.tiles }
18
+ Then { tiles.empty? }
19
+ end
12
20
 
13
21
  describe '#generate' do
14
- When { board.generate }
15
- Then { board.generated_tiles.size == 1 }
22
+ When(:new_board) { board.generate }
23
+ Then { new_board.generated_tiles.size == 1 }
16
24
  end
17
- end
18
25
 
19
- context 'with one 2048 tile' do
20
- Given(:board) do
21
- Text2048::Board.new([[0, 0, 0, 0],
22
- [0, 0, 0, 0],
23
- [0, 2048, 0, 0],
24
- [0, 0, 0, 0]])
26
+ describe '#generate?' do
27
+ context 'with empty board' do
28
+ Given(:other) { Text2048::Board.new }
29
+ When(:result) { board.generate?(other) }
30
+ Then { result == false }
31
+ end
25
32
  end
26
33
 
27
- Then { board.win? }
28
- end
34
+ describe '#win?' do
35
+ When(:result) { board.win? }
36
+ Then { result == false }
37
+ end
29
38
 
30
- context 'with tiles which cannot be merged' do
31
- Given(:board) do
32
- Text2048::Board.new([[2, 4, 8, 16],
33
- [4, 8, 16, 32],
34
- [8, 16, 32, 64],
35
- [16, 32, 64, 128]])
39
+ describe '#lose?' do
40
+ When(:result) { board.lose? }
41
+ Then { result == false }
36
42
  end
37
43
 
38
- Then { board.lose? }
39
- end
44
+ describe '#right' do
45
+ When(:result) { board.right }
40
46
 
41
- context 'with all zeroes' do
42
- Given(:board) do
43
- Text2048::Board.new([[0, 0, 0, 0],
44
- [0, 0, 0, 0],
45
- [0, 0, 0, 0],
46
- [0, 0, 0, 0]])
47
+ Then do
48
+ result.to_a == [[0, 0, 0, 0],
49
+ [0, 0, 0, 0],
50
+ [0, 0, 0, 0],
51
+ [0, 0, 0, 0]]
52
+ end
53
+ And { result.score == 0 }
47
54
  end
48
55
 
49
- describe '#to_a' do
50
- When(:result) { board.to_a }
56
+ describe '#left' do
57
+ When(:result) { board.left }
51
58
 
52
59
  Then do
53
- result == [[0, 0, 0, 0],
54
- [0, 0, 0, 0],
55
- [0, 0, 0, 0],
56
- [0, 0, 0, 0]]
60
+ result.to_a == [[0, 0, 0, 0],
61
+ [0, 0, 0, 0],
62
+ [0, 0, 0, 0],
63
+ [0, 0, 0, 0]]
57
64
  end
65
+ And { result.score == 0 }
58
66
  end
59
67
 
60
- describe '#right' do
61
- When(:result) { board.right }
68
+ describe '#up' do
69
+ When(:result) { board.up }
62
70
 
63
71
  Then do
64
72
  result.to_a == [[0, 0, 0, 0],
@@ -68,14 +76,68 @@ describe Text2048::Board, '.new' do
68
76
  end
69
77
  And { result.score == 0 }
70
78
  end
79
+
80
+ describe '#down' do
81
+ When(:result) { board.down }
82
+
83
+ Then do
84
+ result.to_a == [[0, 0, 0, 0],
85
+ [0, 0, 0, 0],
86
+ [0, 0, 0, 0],
87
+ [0, 0, 0, 0]]
88
+ end
89
+ And { result.score == 0 }
90
+ end
91
+
92
+ describe '#to_a' do
93
+ When(:result) { board.to_a }
94
+ Then do
95
+ result == [[0, 0, 0, 0],
96
+ [0, 0, 0, 0],
97
+ [0, 0, 0, 0],
98
+ [0, 0, 0, 0]]
99
+ end
100
+ end
71
101
  end
72
102
 
73
- context 'with four 2s' do
74
- Given(:board) do
75
- Text2048::Board.new([[2, 0, 0, 0],
76
- [0, 2, 0, 0],
77
- [0, 0, 2, 0],
78
- [0, 0, 0, 2]])
103
+ context 'with four 2s in diagonal' do
104
+ Given(:initial_tiles) do
105
+ [[2, 0, 0, 0],
106
+ [0, 2, 0, 0],
107
+ [0, 0, 2, 0],
108
+ [0, 0, 0, 2]]
109
+ end
110
+
111
+ describe '#tiles' do
112
+ When(:tiles) { board.tiles }
113
+ Then { board.tiles.size == 4 }
114
+ And { board.tiles[[0, 0]] == 2 }
115
+ And { board.tiles[[1, 1]] == 2 }
116
+ And { board.tiles[[2, 2]] == 2 }
117
+ And { board.tiles[[3, 3]] == 2 }
118
+ end
119
+
120
+ describe '#generate' do
121
+ When(:new_board) { board.generate }
122
+ Then { new_board.generated_tiles.size == 1 }
123
+ end
124
+
125
+ describe '#generate?' do
126
+ context 'with empty board' do
127
+ Given(:other) { Text2048::Board.new }
128
+ When(:result) { board.generate?(other) }
129
+ Then { result == true }
130
+ end
131
+ end
132
+
133
+ describe '#win?' do
134
+ When(:result) { board.win? }
135
+ Then { result == false }
136
+ end
137
+
138
+ describe '#lose?' do
139
+ When(:result) { board.lose? }
140
+ Then { result == false }
79
141
  end
80
142
 
81
143
  describe '#right' do
@@ -87,16 +149,100 @@ describe Text2048::Board, '.new' do
87
149
  [0, 0, 0, 2],
88
150
  [0, 0, 0, 2]]
89
151
  end
152
+ And { result.merged_tiles.empty? }
90
153
  And { result.score == 0 }
91
154
  end
155
+
156
+ describe '#left' do
157
+ When(:result) { board.left }
158
+
159
+ Then do
160
+ result.to_a == [[2, 0, 0, 0],
161
+ [2, 0, 0, 0],
162
+ [2, 0, 0, 0],
163
+ [2, 0, 0, 0]]
164
+ end
165
+ And { result.merged_tiles.empty? }
166
+ And { result.score == 0 }
167
+ end
168
+
169
+ describe '#up' do
170
+ When(:result) { board.up }
171
+
172
+ Then do
173
+ result.to_a == [[2, 2, 2, 2],
174
+ [0, 0, 0, 0],
175
+ [0, 0, 0, 0],
176
+ [0, 0, 0, 0]]
177
+ end
178
+ And { result.merged_tiles.empty? }
179
+ And { result.score == 0 }
180
+ end
181
+
182
+ describe '#down' do
183
+ When(:result) { board.down }
184
+
185
+ Then do
186
+ result.to_a == [[0, 0, 0, 0],
187
+ [0, 0, 0, 0],
188
+ [0, 0, 0, 0],
189
+ [2, 2, 2, 2]]
190
+ end
191
+ And { result.merged_tiles.empty? }
192
+ And { result.score == 0 }
193
+ end
194
+
195
+ describe '#to_a' do
196
+ When(:result) { board.to_a }
197
+ Then do
198
+ result == [[2, 0, 0, 0],
199
+ [0, 2, 0, 0],
200
+ [0, 0, 2, 0],
201
+ [0, 0, 0, 2]]
202
+ end
203
+ end
92
204
  end
93
205
 
94
206
  context 'with six 2s that can be merged' do
95
- Given(:board) do
96
- Text2048::Board.new([[2, 0, 2, 0],
97
- [0, 2, 0, 0],
98
- [0, 2, 0, 2],
99
- [0, 0, 0, 2]])
207
+ Given(:initial_tiles) do
208
+ [[2, 0, 2, 0],
209
+ [0, 2, 0, 0],
210
+ [0, 2, 0, 2],
211
+ [0, 0, 0, 2]]
212
+ end
213
+
214
+ describe '#tiles' do
215
+ When(:tiles) { board.tiles }
216
+ Then { board.tiles.size == 6 }
217
+ And { board.tiles[[0, 0]] == 2 }
218
+ And { board.tiles[[0, 2]] == 2 }
219
+ And { board.tiles[[1, 1]] == 2 }
220
+ And { board.tiles[[2, 1]] == 2 }
221
+ And { board.tiles[[2, 3]] == 2 }
222
+ And { board.tiles[[3, 3]] == 2 }
223
+ end
224
+
225
+ describe '#generate' do
226
+ When(:new_board) { board.generate }
227
+ Then { new_board.generated_tiles.size == 1 }
228
+ end
229
+
230
+ describe '#generate?' do
231
+ context 'with empty board' do
232
+ Given(:other) { Text2048::Board.new }
233
+ When(:result) { board.generate?(other) }
234
+ Then { result == true }
235
+ end
236
+ end
237
+
238
+ describe '#win?' do
239
+ When(:result) { board.win? }
240
+ Then { result == false }
241
+ end
242
+
243
+ describe '#lose?' do
244
+ When(:result) { board.lose? }
245
+ Then { result == false }
100
246
  end
101
247
 
102
248
  describe '#right' do
@@ -108,8 +254,143 @@ describe Text2048::Board, '.new' do
108
254
  [0, 0, 0, 4],
109
255
  [0, 0, 0, 2]]
110
256
  end
111
- And { result[[0, 3]].merged? }
257
+ And { result.to_a[0][3].merged? }
258
+ And { result.to_a[2][3].merged? }
259
+ And { result.merged_tiles == [[0, 3], [2, 3]] }
260
+ And { result.score == 8 }
261
+ end
262
+
263
+ describe '#left' do
264
+ When(:result) { board.left }
265
+
266
+ Then do
267
+ result.to_a == [[4, 0, 0, 0],
268
+ [2, 0, 0, 0],
269
+ [4, 0, 0, 0],
270
+ [2, 0, 0, 0]]
271
+ end
272
+ And { result.to_a[0][0].merged? }
273
+ And { result.to_a[2][0].merged? }
274
+ And { result.merged_tiles == [[0, 0], [2, 0]] }
275
+ And { result.score == 8 }
276
+ end
277
+
278
+ describe '#up' do
279
+ When(:result) { board.up }
280
+
281
+ Then do
282
+ result.to_a == [[2, 4, 2, 4],
283
+ [0, 0, 0, 0],
284
+ [0, 0, 0, 0],
285
+ [0, 0, 0, 0]]
286
+ end
287
+ And { result.to_a[0][1].merged? }
288
+ And { result.to_a[0][3].merged? }
289
+ And { result.merged_tiles == [[0, 1], [0, 3]] }
290
+ And { result.score == 8 }
291
+ end
292
+
293
+ describe '#down' do
294
+ When(:result) { board.down }
295
+
296
+ Then do
297
+ result.to_a == [[0, 0, 0, 0],
298
+ [0, 0, 0, 0],
299
+ [0, 0, 0, 0],
300
+ [2, 4, 2, 4]]
301
+ end
302
+ And { result.to_a[3][1].merged? }
303
+ And { result.to_a[3][3].merged? }
304
+ And { result.merged_tiles == [[3, 1], [3, 3]] }
112
305
  And { result.score == 8 }
113
306
  end
307
+
308
+ describe '#to_a' do
309
+ When(:result) { board.to_a }
310
+ Then do
311
+ result == [[2, 0, 2, 0],
312
+ [0, 2, 0, 0],
313
+ [0, 2, 0, 2],
314
+ [0, 0, 0, 2]]
315
+ end
316
+ end
317
+ end
318
+
319
+ context 'with one 2048 tile' do
320
+ Given(:initial_tiles) do
321
+ [[0, 0, 0, 0],
322
+ [0, 0, 0, 0],
323
+ [0, 2048, 0, 0],
324
+ [0, 0, 0, 0]]
325
+ end
326
+
327
+ describe '#win?' do
328
+ When(:result) { board.win? }
329
+ Then { result == true }
330
+ end
331
+
332
+ describe '#lose?' do
333
+ When(:result) { board.lose? }
334
+ Then { result == false }
335
+ end
336
+ end
337
+
338
+ context 'with 16 tiles which cannot be merged' do
339
+ Given(:initial_tiles) do
340
+ [[2, 4, 8, 16],
341
+ [4, 8, 16, 32],
342
+ [8, 16, 32, 64],
343
+ [16, 32, 64, 128]]
344
+ end
345
+
346
+ describe '#tiles' do
347
+ When(:result) { board.tiles }
348
+ Then { result.size == 16 }
349
+ end
350
+
351
+ describe '#generate' do
352
+ When(:result) { board.generate }
353
+ Then { result == Failure(RuntimeError) }
354
+ end
355
+
356
+ describe '#win?' do
357
+ When(:result) { board.win? }
358
+ Then { result == false }
359
+ end
360
+
361
+ describe '#lose?' do
362
+ When(:result) { board.lose? }
363
+ Then { result == true }
364
+ end
365
+
366
+ describe '#right' do
367
+ When(:result) { board.right }
368
+ Then { result.to_a == board.to_a }
369
+ end
370
+
371
+ describe '#left' do
372
+ When(:result) { board.left }
373
+ Then { result.to_a == board.to_a }
374
+ end
375
+
376
+ describe '#up' do
377
+ When(:result) { board.up }
378
+ Then { result.to_a == board.to_a }
379
+ end
380
+
381
+ describe '#down' do
382
+ When(:result) { board.down }
383
+ Then { result.to_a == board.to_a }
384
+ end
385
+
386
+ describe '#to_a' do
387
+ When(:result) { board.to_a }
388
+ Then do
389
+ result == [[2, 4, 8, 16],
390
+ [4, 8, 16, 32],
391
+ [8, 16, 32, 64],
392
+ [16, 32, 64, 128]]
393
+ end
394
+ end
114
395
  end
115
396
  end