text2048 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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