chessmate 0.1.0 → 0.3.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,975 @@
1
+ require 'spec_helper'
2
+ require_relative '../lib/chessmate'
3
+ require_relative '../lib/helpers/notation_parser'
4
+ Dir["../lib/pieces/*.rb"].each {|file| require file}
5
+
6
+ describe ChessMate do
7
+
8
+ describe "board method" do
9
+ before :each do
10
+ @chess = ChessMate.new
11
+ end
12
+
13
+ it "should return the board state" do
14
+ expect(@chess.board).to eql(
15
+ [
16
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
17
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
18
+ [nil, nil, nil, nil, nil, nil, nil, nil],
19
+ [nil, nil, nil, nil, nil, nil, nil, nil],
20
+ [nil, nil, nil, nil, nil, nil, nil, nil],
21
+ [nil, nil, nil, nil, nil, nil, nil, nil],
22
+ ['WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP'],
23
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
24
+ ]
25
+ )
26
+ end
27
+ end
28
+
29
+ describe "update method" do
30
+ before :each do
31
+ @chess = ChessMate.new
32
+ end
33
+
34
+ it "should update the board after moving" do
35
+ @chess.update([6,0], [5,0])
36
+ expect(@chess.board).to eql(
37
+ [
38
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
39
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
40
+ [nil, nil, nil, nil, nil, nil, nil, nil],
41
+ [nil, nil, nil, nil, nil, nil, nil, nil],
42
+ [nil, nil, nil, nil, nil, nil, nil, nil],
43
+ ['WP', nil, nil, nil, nil, nil, nil, nil],
44
+ [nil, 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP'],
45
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
46
+ ]
47
+ )
48
+ end
49
+
50
+ it "should update the turn on a successful update" do
51
+ turn = @chess.turn
52
+ @chess.update([6,0], [5,0])
53
+ expect(@chess.turn).to eql(turn + 1)
54
+ end
55
+ end
56
+
57
+ describe "turn method" do
58
+ it "should show the current turn" do
59
+ chess = ChessMate.new
60
+ expect(chess.turn).to eql(1)
61
+ end
62
+ end
63
+
64
+ describe "in_check method" do
65
+ it "should return a hash of values values on game start" do
66
+ chess = ChessMate.new
67
+ expect(chess.in_check).to eql(
68
+ {
69
+ "white": false,
70
+ "black": false
71
+ }
72
+ )
73
+ end
74
+ end
75
+
76
+ describe "in_check? method" do
77
+ it "should return a hash value" do
78
+ chess = ChessMate.new
79
+ check = chess.in_check?
80
+ expect(check.is_a? Hash).to eql(true)
81
+ end
82
+
83
+ it "should handle a malformed board by returning default value" do
84
+ board = Array.new(8) { Array.new(8,nil) }
85
+ chess = ChessMate.new(board)
86
+ expect(chess.in_check?).to eql(
87
+ {
88
+ "white": false,
89
+ "black": false
90
+ }
91
+ )
92
+ end
93
+
94
+ it "should should return false if neither king is in check" do
95
+ chess = ChessMate.new
96
+ expect(chess.in_check?).to eql(
97
+ {
98
+ "white": false,
99
+ "black": false
100
+ }
101
+ )
102
+ end
103
+
104
+ it "should return true if the white king is in check" do
105
+ board = Array.new(8) { Array.new(8,nil) }
106
+ board[7][4] = "WK"
107
+ board[0][4] = "BQ"
108
+ board[0][5] = "BK"
109
+ chess = ChessMate.new(board)
110
+ expect(chess.in_check?).to eql(
111
+ {
112
+ "white": true,
113
+ "black": false
114
+ }
115
+ )
116
+ end
117
+
118
+ it "should return true if the black king is in check" do
119
+ board = Array.new(8) { Array.new(8,nil) }
120
+ board[7][4] = "WK"
121
+ board[7][5] = "WQ"
122
+ board[0][5] = "BK"
123
+ chess = ChessMate.new(board)
124
+ expect(chess.in_check?).to eql(
125
+ {
126
+ "white": false,
127
+ "black": true
128
+ }
129
+ )
130
+ end
131
+
132
+ it "should not update the board to test for king in check" do
133
+ chess = ChessMate.new
134
+ chess.in_check?
135
+ expect(chess.board).to eql(
136
+ [
137
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
138
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
139
+ [nil, nil, nil, nil, nil, nil, nil, nil],
140
+ [nil, nil, nil, nil, nil, nil, nil, nil],
141
+ [nil, nil, nil, nil, nil, nil, nil, nil],
142
+ [nil, nil, nil, nil, nil, nil, nil, nil],
143
+ ['WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP'],
144
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
145
+ ]
146
+ )
147
+ end
148
+ end
149
+
150
+ describe "move method" do
151
+ before :each do
152
+ @chess = ChessMate.new
153
+ end
154
+
155
+ it "should test that the king is not in check before moving" do
156
+ board = Array.new(8) { Array.new(8,nil) }
157
+ board[7][4] = "WK"
158
+ board[6][0] = "WP"
159
+ board[0][4] = "BK"
160
+ board[1][4] = "BQ"
161
+ chess = ChessMate.new(board)
162
+ chess.move('a2', 'a3')
163
+ expect(chess.in_check?).to eql(
164
+ {
165
+ "white": true,
166
+ "black": false
167
+ }
168
+ )
169
+ expect(chess.board).to eql(
170
+ [
171
+ [nil, nil, nil, nil, "BK", nil, nil, nil],
172
+ [nil, nil, nil, nil, "BQ", nil, nil, nil],
173
+ [nil, nil, nil, nil, nil, nil, nil, nil],
174
+ [nil, nil, nil, nil, nil, nil, nil, nil],
175
+ [nil, nil, nil, nil, nil, nil, nil, nil],
176
+ [nil, nil, nil, nil, nil, nil, nil, nil],
177
+ ["WP", nil, nil, nil, nil, nil, nil, nil],
178
+ [nil, nil, nil, nil, "WK", nil, nil, nil],
179
+ ]
180
+ )
181
+ end
182
+
183
+ it "should not let players move into check" do
184
+ board = Array.new(8) { Array.new(8,nil) }
185
+ board[7][4] = "WK"
186
+ board[0][4] = "BK"
187
+ board[0][3] = "BQ"
188
+ chess = ChessMate.new(board)
189
+ chess.move('e1', 'd1')
190
+ expect(chess.board).to eql(
191
+ [
192
+ [nil, nil, nil, "BQ", "BK", nil, nil, nil],
193
+ [nil, nil, nil, nil, nil, nil, nil, nil],
194
+ [nil, nil, nil, nil, nil, nil, nil, nil],
195
+ [nil, nil, nil, nil, nil, nil, nil, nil],
196
+ [nil, nil, nil, nil, nil, nil, nil, nil],
197
+ [nil, nil, nil, nil, nil, nil, nil, nil],
198
+ [nil, nil, nil, nil, nil, nil, nil, nil],
199
+ [nil, nil, nil, nil, "WK", nil, nil, nil],
200
+ ]
201
+ )
202
+ end
203
+
204
+ it "should let players move out of check" do
205
+ board = Array.new(8) { Array.new(8,nil) }
206
+ board[7][3] = "WK"
207
+ board[0][4] = "BK"
208
+ board[0][3] = "BQ"
209
+ chess = ChessMate.new(board)
210
+ chess.move('d1', 'e1')
211
+ expect(chess.board).to eql(
212
+ [
213
+ [nil, nil, nil, "BQ", "BK", nil, nil, nil],
214
+ [nil, nil, nil, nil, nil, nil, nil, nil],
215
+ [nil, nil, nil, nil, nil, nil, nil, nil],
216
+ [nil, nil, nil, nil, nil, nil, nil, nil],
217
+ [nil, nil, nil, nil, nil, nil, nil, nil],
218
+ [nil, nil, nil, nil, nil, nil, nil, nil],
219
+ [nil, nil, nil, nil, nil, nil, nil, nil],
220
+ [nil, nil, nil, nil, "WK", nil, nil, nil],
221
+ ]
222
+ )
223
+ end
224
+
225
+ it "should return false if the move is not within the bounds of the board" do
226
+ expect(@chess.move('z2', 'c3')).to eql(false)
227
+ expect(@chess.board).to eql(
228
+ [
229
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
230
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
231
+ [nil, nil, nil, nil, nil, nil, nil, nil],
232
+ [nil, nil, nil, nil, nil, nil, nil, nil],
233
+ [nil, nil, nil, nil, nil, nil, nil, nil],
234
+ [nil, nil, nil, nil, nil, nil, nil, nil],
235
+ ['WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP'],
236
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
237
+ ]
238
+ )
239
+ end
240
+
241
+ it "should return false if the origin or destination are malformed" do
242
+ expect(@chess.move('22', 'c3')).to eql(false)
243
+ expect(@chess.move('zz', 'c3')).to eql(false)
244
+ end
245
+
246
+ it "should generally return false and not update the board if the path is blocked" do
247
+ expect(@chess.move('d1', 'a1')).to eql(false)
248
+ expect(@chess.move('d1', 'd8')).to eql(false)
249
+ expect(@chess.move('d1', 'b3')).to eql(false)
250
+ expect(@chess.board).to eql(
251
+ [
252
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
253
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
254
+ [nil, nil, nil, nil, nil, nil, nil, nil],
255
+ [nil, nil, nil, nil, nil, nil, nil, nil],
256
+ [nil, nil, nil, nil, nil, nil, nil, nil],
257
+ [nil, nil, nil, nil, nil, nil, nil, nil],
258
+ ['WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP'],
259
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
260
+ ]
261
+ )
262
+ end
263
+
264
+ context "for pawns" do
265
+ it "should update the board if pawn move is valid" do
266
+ @chess.move('c2', 'c3')
267
+ expect(@chess.board).to eql(
268
+ [
269
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
270
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
271
+ [nil, nil, nil, nil, nil, nil, nil, nil],
272
+ [nil, nil, nil, nil, nil, nil, nil, nil],
273
+ [nil, nil, nil, nil, nil, nil, nil, nil],
274
+ [nil, nil, 'WP', nil, nil, nil, nil, nil],
275
+ ['WP', 'WP', nil, 'WP', 'WP', 'WP', 'WP', 'WP'],
276
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
277
+ ]
278
+ )
279
+ end
280
+
281
+ it "should return false if the pawn move is invalid" do
282
+ expect(@chess.move('c2', 'd3')).to eql(false)
283
+ end
284
+
285
+ it "should update the board if pawn's first move is 2 squares" do
286
+ chess = ChessMate.new
287
+ chess.move('c2', 'c4')
288
+ expect(chess.board).to eql(
289
+ [
290
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
291
+ ['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
292
+ [nil, nil, nil, nil, nil, nil, nil, nil],
293
+ [nil, nil, nil, nil, nil, nil, nil, nil],
294
+ [nil, nil, "WP", nil, nil, nil, nil, nil],
295
+ [nil, nil, nil, nil, nil, nil, nil, nil],
296
+ ['WP', 'WP', nil, 'WP', 'WP', 'WP', 'WP', 'WP'],
297
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
298
+ ]
299
+ )
300
+ chess = ChessMate.new
301
+ chess.move('b7', 'b5')
302
+ expect(chess.board).to eql(
303
+ [
304
+ ['BR', 'BN', 'BB', 'BQ', 'BK', 'BB', 'BN', 'BR'],
305
+ ['BP', nil, 'BP', 'BP', 'BP', 'BP', 'BP', 'BP'],
306
+ [nil, nil, nil, nil, nil, nil, nil, nil],
307
+ [nil, 'BP', nil, nil, nil, nil, nil, nil],
308
+ [nil, nil, nil, nil, nil, nil, nil, nil],
309
+ [nil, nil, nil, nil, nil, nil, nil, nil],
310
+ ['WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP'],
311
+ ['WR', 'WN', 'WB', 'WQ', 'WK', 'WB', 'WN', 'WR']
312
+ ]
313
+ )
314
+ end
315
+
316
+ it "should not allow a pawn to move 2 spaces if the 1st space is occupied" do
317
+ board = Array.new(8) { Array.new(8,nil) }
318
+ board[6][0] = "WP"
319
+ board[5][0] = "BP"
320
+ chess = ChessMate.new(board)
321
+ chess.move('a2', 'a4')
322
+ expect(chess.board).to eql(
323
+ [
324
+ [nil, nil, nil, nil, nil, nil, nil, nil],
325
+ [nil, nil, nil, nil, nil, nil, nil, nil],
326
+ [nil, nil, nil, nil, nil, nil, nil, nil],
327
+ [nil, nil, nil, nil, nil, nil, nil, nil],
328
+ [nil, nil, nil, nil, nil, nil, nil, nil],
329
+ ['BP', nil, nil, nil, nil, nil, nil, nil],
330
+ ['WP', nil, nil, nil, nil, nil, nil, nil],
331
+ [nil, nil, nil, nil, nil, nil, nil, nil],
332
+ ]
333
+ )
334
+ end
335
+
336
+ it "should allow for capturing diagonally" do
337
+ board = Array.new(8) { Array.new(8,nil) }
338
+ board[5][5] = "WP"
339
+ board[4][4] = "BP"
340
+ chess = ChessMate.new(board)
341
+ chess.move('f3', 'e4')
342
+ expect(chess.board).to eql(
343
+ [
344
+ [nil, nil, nil, nil, nil, nil, nil, nil],
345
+ [nil, nil, nil, nil, nil, nil, nil, nil],
346
+ [nil, nil, nil, nil, nil, nil, nil, nil],
347
+ [nil, nil, nil, nil, nil, nil, nil, nil],
348
+ [nil, nil, nil, nil, 'WP', nil, nil, nil],
349
+ [nil, nil, nil, nil, nil, nil, nil, nil],
350
+ [nil, nil, nil, nil, nil, nil, nil, nil],
351
+ [nil, nil, nil, nil, nil, nil, nil, nil],
352
+ ]
353
+ )
354
+ end
355
+
356
+ it "should not allow pawns to move backwards to capture" do
357
+ board = Array.new(8) { Array.new(8,nil) }
358
+ board[4][4] = "WP"
359
+ board[5][5] = "BP"
360
+ chess = ChessMate.new(board)
361
+ chess.move('e4', 'f3')
362
+ expect(chess.board).to eql(
363
+ [
364
+ [nil, nil, nil, nil, nil, nil, nil, nil],
365
+ [nil, nil, nil, nil, nil, nil, nil, nil],
366
+ [nil, nil, nil, nil, nil, nil, nil, nil],
367
+ [nil, nil, nil, nil, nil, nil, nil, nil],
368
+ [nil, nil, nil, nil, 'WP', nil, nil, nil],
369
+ [nil, nil, nil, nil, nil, 'BP', nil, nil],
370
+ [nil, nil, nil, nil, nil, nil, nil, nil],
371
+ [nil, nil, nil, nil, nil, nil, nil, nil],
372
+ ]
373
+ )
374
+ end
375
+
376
+ it "should not allow pawns to capture pieces of same color" do
377
+ board = Array.new(8) { Array.new(8,nil) }
378
+ board[4][4] = "WP"
379
+ board[5][5] = "WP"
380
+ chess = ChessMate.new(board)
381
+ chess.move('f3', 'e4')
382
+ expect(chess.board).to eql(
383
+ [
384
+ [nil, nil, nil, nil, nil, nil, nil, nil],
385
+ [nil, nil, nil, nil, nil, nil, nil, nil],
386
+ [nil, nil, nil, nil, nil, nil, nil, nil],
387
+ [nil, nil, nil, nil, nil, nil, nil, nil],
388
+ [nil, nil, nil, nil, 'WP', nil, nil, nil],
389
+ [nil, nil, nil, nil, nil, 'WP', nil, nil],
390
+ [nil, nil, nil, nil, nil, nil, nil, nil],
391
+ [nil, nil, nil, nil, nil, nil, nil, nil],
392
+ ]
393
+ )
394
+ end
395
+
396
+ it "should not allow pawns to move backwards in general" do
397
+ board = Array.new(8) { Array.new(8,nil) }
398
+ board[4][4] = "WP"
399
+ board[5][5] = "BP"
400
+ chess = ChessMate.new(board)
401
+ chess.move('e4', 'e3')
402
+ expect(chess.board).to eql(
403
+ [
404
+ [nil, nil, nil, nil, nil, nil, nil, nil],
405
+ [nil, nil, nil, nil, nil, nil, nil, nil],
406
+ [nil, nil, nil, nil, nil, nil, nil, nil],
407
+ [nil, nil, nil, nil, nil, nil, nil, nil],
408
+ [nil, nil, nil, nil, 'WP', nil, nil, nil],
409
+ [nil, nil, nil, nil, nil, 'BP', nil, nil],
410
+ [nil, nil, nil, nil, nil, nil, nil, nil],
411
+ [nil, nil, nil, nil, nil, nil, nil, nil],
412
+ ]
413
+ )
414
+ end
415
+ end
416
+
417
+ context "for rooks" do
418
+ it "should update the board if rook moves vertically" do
419
+ board = Array.new(8) { Array.new(8,nil) }
420
+ board[7][0] = "WR"
421
+ chess = ChessMate.new(board)
422
+ chess.move('a1', 'a8')
423
+ expect(chess.board).to eql(
424
+ [
425
+ ["WR", nil, nil, nil, nil, nil, nil, nil],
426
+ [nil, nil, nil, nil, nil, nil, nil, nil],
427
+ [nil, nil, nil, nil, nil, nil, nil, nil],
428
+ [nil, nil, nil, nil, nil, nil, nil, nil],
429
+ [nil, nil, nil, nil, nil, nil, nil, nil],
430
+ [nil, nil, nil, nil, nil, nil, nil, nil],
431
+ [nil, nil, nil, nil, nil, nil, nil, nil],
432
+ [nil, nil, nil, nil, nil, nil, nil, nil],
433
+ ]
434
+ )
435
+ end
436
+
437
+ it "should update the board if the rook moves horizontally" do
438
+ board = Array.new(8) { Array.new(8,nil) }
439
+ board[7][0] = "WR"
440
+ chess = ChessMate.new(board)
441
+ chess.move('a1', 'h1')
442
+ expect(chess.board).to eql(
443
+ [
444
+ [nil, nil, nil, nil, nil, nil, nil, nil],
445
+ [nil, nil, nil, nil, nil, nil, nil, nil],
446
+ [nil, nil, nil, nil, nil, nil, nil, nil],
447
+ [nil, nil, nil, nil, nil, nil, nil, nil],
448
+ [nil, nil, nil, nil, nil, nil, nil, nil],
449
+ [nil, nil, nil, nil, nil, nil, nil, nil],
450
+ [nil, nil, nil, nil, nil, nil, nil, nil],
451
+ [nil, nil, nil, nil, nil, nil, nil, "WR"],
452
+ ]
453
+ )
454
+ end
455
+
456
+ it "should return false for a move that is neither horizontal or vertical" do
457
+ board = Array.new(8) { Array.new(8,nil) }
458
+ board[7][0] = "WR"
459
+ chess = ChessMate.new(board)
460
+ expect(chess.move('a1','g8')).to eql(false)
461
+ end
462
+
463
+ it "should allow capturing pieces of opposite color" do
464
+ board = Array.new(8) { Array.new(8,nil) }
465
+ board[7][0] = "WR"
466
+ board[7][7] = "BR"
467
+ chess = ChessMate.new(board)
468
+ chess.move('a1', 'h1')
469
+ expect(chess.board).to eql(
470
+ [
471
+ [nil, nil, nil, nil, nil, nil, nil, nil],
472
+ [nil, nil, nil, nil, nil, nil, nil, nil],
473
+ [nil, nil, nil, nil, nil, nil, nil, nil],
474
+ [nil, nil, nil, nil, nil, nil, nil, nil],
475
+ [nil, nil, nil, nil, nil, nil, nil, nil],
476
+ [nil, nil, nil, nil, nil, nil, nil, nil],
477
+ [nil, nil, nil, nil, nil, nil, nil, nil],
478
+ [nil, nil, nil, nil, nil, nil, nil, "WR"],
479
+ ]
480
+ )
481
+ end
482
+
483
+ it "should not allow capturing pieces of same color" do
484
+ board = Array.new(8) { Array.new(8,nil) }
485
+ board[7][0] = "WR"
486
+ board[7][7] = "WR"
487
+ chess = ChessMate.new(board)
488
+ chess.move('a1', 'h1')
489
+ expect(chess.board).to eql(
490
+ [
491
+ [nil, nil, nil, nil, nil, nil, nil, nil],
492
+ [nil, nil, nil, nil, nil, nil, nil, nil],
493
+ [nil, nil, nil, nil, nil, nil, nil, nil],
494
+ [nil, nil, nil, nil, nil, nil, nil, nil],
495
+ [nil, nil, nil, nil, nil, nil, nil, nil],
496
+ [nil, nil, nil, nil, nil, nil, nil, nil],
497
+ [nil, nil, nil, nil, nil, nil, nil, nil],
498
+ ["WR", nil, nil, nil, nil, nil, nil, "WR"],
499
+ ]
500
+ )
501
+ end
502
+ end
503
+
504
+ context "for bishops" do
505
+ it "should update the board if the bishop moves diagonally" do
506
+ board = Array.new(8) { Array.new(8,nil) }
507
+ board[7][2] = "WB"
508
+ chess = ChessMate.new(board)
509
+ chess.move('c1', 'h6')
510
+ expect(chess.board).to eql(
511
+ [
512
+ [nil, nil, nil, nil, nil, nil, nil, nil],
513
+ [nil, nil, nil, nil, nil, nil, nil, nil],
514
+ [nil, nil, nil, nil, nil, nil, nil, 'WB'],
515
+ [nil, nil, nil, nil, nil, nil, nil, nil],
516
+ [nil, nil, nil, nil, nil, nil, nil, nil],
517
+ [nil, nil, nil, nil, nil, nil, nil, nil],
518
+ [nil, nil, nil, nil, nil, nil, nil, nil],
519
+ [nil, nil, nil, nil, nil, nil, nil, nil],
520
+ ]
521
+ )
522
+ end
523
+
524
+ it "should return false for a move that is not diagonal" do
525
+ board = Array.new(8) { Array.new(8,nil) }
526
+ board[7][2] = "WB"
527
+ chess = ChessMate.new(board)
528
+ expect(chess.move('c1','c8')).to eql(false)
529
+ expect(chess.move('c1','h7')).to eql(false)
530
+ expect(chess.move('c1','h8')).to eql(false)
531
+
532
+ end
533
+
534
+ it "should allow capturing pieces of opposite color" do
535
+ board = Array.new(8) { Array.new(8,nil) }
536
+ board[7][2] = "WB"
537
+ board[2][7] = "BB"
538
+ chess = ChessMate.new(board)
539
+ chess.move('c1', 'h6')
540
+ expect(chess.board).to eql(
541
+ [
542
+ [nil, nil, nil, nil, nil, nil, nil, nil],
543
+ [nil, nil, nil, nil, nil, nil, nil, nil],
544
+ [nil, nil, nil, nil, nil, nil, nil, 'WB'],
545
+ [nil, nil, nil, nil, nil, nil, nil, nil],
546
+ [nil, nil, nil, nil, nil, nil, nil, nil],
547
+ [nil, nil, nil, nil, nil, nil, nil, nil],
548
+ [nil, nil, nil, nil, nil, nil, nil, nil],
549
+ [nil, nil, nil, nil, nil, nil, nil, nil],
550
+ ]
551
+ )
552
+ end
553
+
554
+ it "should not allow capturing pieces of same color" do
555
+ board = Array.new(8) { Array.new(8,nil) }
556
+ board[7][2] = "WB"
557
+ board[2][7] = "WB"
558
+ chess = ChessMate.new(board)
559
+ chess.move('c1', 'h6')
560
+ expect(chess.board).to eql(
561
+ [
562
+ [nil, nil, nil, nil, nil, nil, nil, nil],
563
+ [nil, nil, nil, nil, nil, nil, nil, nil],
564
+ [nil, nil, nil, nil, nil, nil, nil, 'WB'],
565
+ [nil, nil, nil, nil, nil, nil, nil, nil],
566
+ [nil, nil, nil, nil, nil, nil, nil, nil],
567
+ [nil, nil, nil, nil, nil, nil, nil, nil],
568
+ [nil, nil, nil, nil, nil, nil, nil, nil],
569
+ [nil, nil, "WB", nil, nil, nil, nil, nil],
570
+ ]
571
+ )
572
+ end
573
+ end
574
+
575
+ context "for knights" do
576
+ it "should update the board if the knight moves 2 horizontal, 1 vertical" do
577
+ board = Array.new(8) { Array.new(8,nil) }
578
+ board[7][2] = "WN"
579
+ chess = ChessMate.new(board)
580
+ chess.move('c1', 'e2')
581
+ expect(chess.board).to eql(
582
+ [
583
+ [nil, nil, nil, nil, nil, nil, nil, nil],
584
+ [nil, nil, nil, nil, nil, nil, nil, nil],
585
+ [nil, nil, nil, nil, nil, nil, nil, nil],
586
+ [nil, nil, nil, nil, nil, nil, nil, nil],
587
+ [nil, nil, nil, nil, nil, nil, nil, nil],
588
+ [nil, nil, nil, nil, nil, nil, nil, nil],
589
+ [nil, nil, nil, nil, 'WN', nil, nil, nil],
590
+ [nil, nil, nil, nil, nil, nil, nil, nil],
591
+ ]
592
+ )
593
+ end
594
+
595
+ it "should update the board if the knight moves 1 horizontal, 2 vertical" do
596
+ board = Array.new(8) { Array.new(8,nil) }
597
+ board[7][2] = "WN"
598
+ chess = ChessMate.new(board)
599
+ chess.move('c1', 'd3')
600
+ expect(chess.board).to eql(
601
+ [
602
+ [nil, nil, nil, nil, nil, nil, nil, nil],
603
+ [nil, nil, nil, nil, nil, nil, nil, nil],
604
+ [nil, nil, nil, nil, nil, nil, nil, nil],
605
+ [nil, nil, nil, nil, nil, nil, nil, nil],
606
+ [nil, nil, nil, nil, nil, nil, nil, nil],
607
+ [nil, nil, nil, 'WN', nil, nil, nil, nil],
608
+ [nil, nil, nil, nil, nil, nil, nil, nil],
609
+ [nil, nil, nil, nil, nil, nil, nil, nil],
610
+ ]
611
+ )
612
+ end
613
+
614
+ it "should return false if the move is invalid" do
615
+ board = Array.new(8) { Array.new(8,nil) }
616
+ board[7][2] = "WN"
617
+ chess = ChessMate.new(board)
618
+ expect(chess.move('c1','c8')).to eql(false)
619
+ end
620
+
621
+ it "should allow capturing pieces of opposite color" do
622
+ board = Array.new(8) { Array.new(8,nil) }
623
+ board[7][2] = "WN"
624
+ board[5][3] = "BN"
625
+ chess = ChessMate.new(board)
626
+ chess.move('c1', 'd3')
627
+ expect(chess.board).to eql(
628
+ [
629
+ [nil, nil, nil, nil, nil, nil, nil, nil],
630
+ [nil, nil, nil, nil, nil, nil, nil, nil],
631
+ [nil, nil, nil, nil, nil, nil, nil, nil],
632
+ [nil, nil, nil, nil, nil, nil, nil, nil],
633
+ [nil, nil, nil, nil, nil, nil, nil, nil],
634
+ [nil, nil, nil, 'WN', nil, nil, nil, nil],
635
+ [nil, nil, nil, nil, nil, nil, nil, nil],
636
+ [nil, nil, nil, nil, nil, nil, nil, nil],
637
+ ]
638
+ )
639
+ end
640
+
641
+ it "should not allow capturing pieces of same color" do
642
+ board = Array.new(8) { Array.new(8,nil) }
643
+ board[7][2] = "WN"
644
+ board[5][3] = "WN"
645
+ chess = ChessMate.new(board)
646
+ chess.move('c1', 'd3')
647
+ expect(chess.board).to eql(
648
+ [
649
+ [nil, nil, nil, nil, nil, nil, nil, nil],
650
+ [nil, nil, nil, nil, nil, nil, nil, nil],
651
+ [nil, nil, nil, nil, nil, nil, nil, nil],
652
+ [nil, nil, nil, nil, nil, nil, nil, nil],
653
+ [nil, nil, nil, nil, nil, nil, nil, nil],
654
+ [nil, nil, nil, 'WN', nil, nil, nil, nil],
655
+ [nil, nil, nil, nil, nil, nil, nil, nil],
656
+ [nil, nil, 'WN', nil, nil, nil, nil, nil],
657
+ ]
658
+ )
659
+ end
660
+ end
661
+
662
+ context "for queens" do
663
+ it "should update the board if the queen moves vertically" do
664
+ board = Array.new(8) { Array.new(8,nil) }
665
+ board[7][3] = "WQ"
666
+ chess = ChessMate.new(board)
667
+ chess.move('d1', 'd8')
668
+ expect(chess.board).to eql(
669
+ [
670
+ [nil, nil, nil, "WQ", nil, nil, nil, nil],
671
+ [nil, nil, nil, nil, nil, nil, nil, nil],
672
+ [nil, nil, nil, nil, nil, nil, nil, nil],
673
+ [nil, nil, nil, nil, nil, nil, nil, nil],
674
+ [nil, nil, nil, nil, nil, nil, nil, nil],
675
+ [nil, nil, nil, nil, nil, nil, nil, nil],
676
+ [nil, nil, nil, nil, nil, nil, nil, nil],
677
+ [nil, nil, nil, nil, nil, nil, nil, nil],
678
+ ]
679
+ )
680
+ end
681
+
682
+ it "should update the board if the queen moves horizontally" do
683
+ board = Array.new(8) { Array.new(8,nil) }
684
+ board[7][3] = "WQ"
685
+ chess = ChessMate.new(board)
686
+ chess.move('d1', 'h1')
687
+ expect(chess.board).to eql(
688
+ [
689
+ [nil, nil, nil, nil, nil, nil, nil, nil],
690
+ [nil, nil, nil, nil, nil, nil, nil, nil],
691
+ [nil, nil, nil, nil, nil, nil, nil, nil],
692
+ [nil, nil, nil, nil, nil, nil, nil, nil],
693
+ [nil, nil, nil, nil, nil, nil, nil, nil],
694
+ [nil, nil, nil, nil, nil, nil, nil, nil],
695
+ [nil, nil, nil, nil, nil, nil, nil, nil],
696
+ [nil, nil, nil, nil, nil, nil, nil, "WQ"],
697
+ ]
698
+ )
699
+ end
700
+
701
+ it "should update the board if the queen moves diagonally" do
702
+ board = Array.new(8) { Array.new(8,nil) }
703
+ board[7][3] = "WQ"
704
+ chess = ChessMate.new(board)
705
+ chess.move('d1', 'h5')
706
+ expect(chess.board).to eql(
707
+ [
708
+ [nil, nil, nil, nil, nil, nil, nil, nil],
709
+ [nil, nil, nil, nil, nil, nil, nil, nil],
710
+ [nil, nil, nil, nil, nil, nil, nil, nil],
711
+ [nil, nil, nil, nil, nil, nil, nil, "WQ"],
712
+ [nil, nil, nil, nil, nil, nil, nil, nil],
713
+ [nil, nil, nil, nil, nil, nil, nil, nil],
714
+ [nil, nil, nil, nil, nil, nil, nil, nil],
715
+ [nil, nil, nil, nil, nil, nil, nil, nil],
716
+ ]
717
+ )
718
+ end
719
+
720
+ it "should return false if the queen makes an otherwise invalid move" do
721
+ board = Array.new(8) { Array.new(8,nil) }
722
+ board[7][3] = "WQ"
723
+ chess = ChessMate.new(board)
724
+ expect(chess.move('d1', 'h8')).to eql(false)
725
+ end
726
+
727
+ it "should allow capturing pieces of opposite color" do
728
+ board = Array.new(8) { Array.new(8,nil) }
729
+ board[7][3] = "WQ"
730
+ board[7][7] = "BQ"
731
+ chess = ChessMate.new(board)
732
+ chess.move('d1', 'h1')
733
+ expect(chess.board).to eql(
734
+ [
735
+ [nil, nil, nil, nil, nil, nil, nil, nil],
736
+ [nil, nil, nil, nil, nil, nil, nil, nil],
737
+ [nil, nil, nil, nil, nil, nil, nil, nil],
738
+ [nil, nil, nil, nil, nil, nil, nil, nil],
739
+ [nil, nil, nil, nil, nil, nil, nil, nil],
740
+ [nil, nil, nil, nil, nil, nil, nil, nil],
741
+ [nil, nil, nil, nil, nil, nil, nil, nil],
742
+ [nil, nil, nil, nil, nil, nil, nil, "WQ"],
743
+ ]
744
+ )
745
+ end
746
+
747
+ it "should not allow capturing pieces of same color" do
748
+ board = Array.new(8) { Array.new(8,nil) }
749
+ board[7][3] = "WQ"
750
+ board[7][7] = "WQ"
751
+ chess = ChessMate.new(board)
752
+ chess.move('d1', 'h1')
753
+ expect(chess.board).to eql(
754
+ [
755
+ [nil, nil, nil, nil, nil, nil, nil, nil],
756
+ [nil, nil, nil, nil, nil, nil, nil, nil],
757
+ [nil, nil, nil, nil, nil, nil, nil, nil],
758
+ [nil, nil, nil, nil, nil, nil, nil, nil],
759
+ [nil, nil, nil, nil, nil, nil, nil, nil],
760
+ [nil, nil, nil, nil, nil, nil, nil, nil],
761
+ [nil, nil, nil, nil, nil, nil, nil, nil],
762
+ [nil, nil, nil, "WQ", nil, nil, nil, "WQ"],
763
+ ]
764
+ )
765
+ end
766
+ end
767
+
768
+ context "for kings" do
769
+ it "should update the board if the king moves 1 space vertically" do
770
+ board = Array.new(8) { Array.new(8,nil) }
771
+ board[7][4] = "WK"
772
+ chess = ChessMate.new(board)
773
+ chess.move('e1', 'e2')
774
+ expect(chess.board).to eql(
775
+ [
776
+ [nil, nil, nil, nil, nil, nil, nil, nil],
777
+ [nil, nil, nil, nil, nil, nil, nil, nil],
778
+ [nil, nil, nil, nil, nil, nil, nil, nil],
779
+ [nil, nil, nil, nil, nil, nil, nil, nil],
780
+ [nil, nil, nil, nil, nil, nil, nil, nil],
781
+ [nil, nil, nil, nil, nil, nil, nil, nil],
782
+ [nil, nil, nil, nil, "WK", nil, nil, nil],
783
+ [nil, nil, nil, nil, nil, nil, nil, nil],
784
+ ]
785
+ )
786
+ end
787
+
788
+ it "should update the board if the king moves 1 space horizontally" do
789
+ board = Array.new(8) { Array.new(8,nil) }
790
+ board[7][4] = "WK"
791
+ chess = ChessMate.new(board)
792
+ chess.move('e1', 'f1')
793
+ expect(chess.board).to eql(
794
+ [
795
+ [nil, nil, nil, nil, nil, nil, nil, nil],
796
+ [nil, nil, nil, nil, nil, nil, nil, nil],
797
+ [nil, nil, nil, nil, nil, nil, nil, nil],
798
+ [nil, nil, nil, nil, nil, nil, nil, nil],
799
+ [nil, nil, nil, nil, nil, nil, nil, nil],
800
+ [nil, nil, nil, nil, nil, nil, nil, nil],
801
+ [nil, nil, nil, nil, nil, nil, nil, nil],
802
+ [nil, nil, nil, nil, nil, "WK", nil, nil],
803
+ ]
804
+ )
805
+ end
806
+
807
+ it "should update the board if the king moves 1 space diagonally" do
808
+ board = Array.new(8) { Array.new(8,nil) }
809
+ board[7][4] = "WK"
810
+ chess = ChessMate.new(board)
811
+ chess.move('e1', 'f2')
812
+ expect(chess.board).to eql(
813
+ [
814
+ [nil, nil, nil, nil, nil, nil, nil, nil],
815
+ [nil, nil, nil, nil, nil, nil, nil, nil],
816
+ [nil, nil, nil, nil, nil, nil, nil, nil],
817
+ [nil, nil, nil, nil, nil, nil, nil, nil],
818
+ [nil, nil, nil, nil, nil, nil, nil, nil],
819
+ [nil, nil, nil, nil, nil, nil, nil, nil],
820
+ [nil, nil, nil, nil, nil, "WK", nil, nil],
821
+ [nil, nil, nil, nil, nil, nil, nil, nil],
822
+ ]
823
+ )
824
+ end
825
+
826
+ it "should return false if the king makes an otherwise invalid move" do
827
+ board = Array.new(8) { Array.new(8,nil) }
828
+ board[7][4] = "WK"
829
+ chess = ChessMate.new(board)
830
+ expect(chess.move('e1', 'h8')).to eql(false)
831
+ end
832
+
833
+ it "should allow capturing pieces of opposite color" do
834
+ board = Array.new(8) { Array.new(8,nil) }
835
+ board[7][4] = "WK"
836
+ board[6][4] = "BP"
837
+ chess = ChessMate.new(board)
838
+ chess.move('e1', 'e2')
839
+ expect(chess.board).to eql(
840
+ [
841
+ [nil, nil, nil, nil, nil, nil, nil, nil],
842
+ [nil, nil, nil, nil, nil, nil, nil, nil],
843
+ [nil, nil, nil, nil, nil, nil, nil, nil],
844
+ [nil, nil, nil, nil, nil, nil, nil, nil],
845
+ [nil, nil, nil, nil, nil, nil, nil, nil],
846
+ [nil, nil, nil, nil, nil, nil, nil, nil],
847
+ [nil, nil, nil, nil, "WK", nil, nil, nil],
848
+ [nil, nil, nil, nil, nil, nil, nil, nil],
849
+ ]
850
+ )
851
+ end
852
+
853
+ it "should not allow capturing pieces of same color" do
854
+ board = Array.new(8) { Array.new(8,nil) }
855
+ board[7][4] = "WK"
856
+ board[6][4] = "WP"
857
+ chess = ChessMate.new(board)
858
+ chess.move('e1', 'e2')
859
+ expect(chess.board).to eql(
860
+ [
861
+ [nil, nil, nil, nil, nil, nil, nil, nil],
862
+ [nil, nil, nil, nil, nil, nil, nil, nil],
863
+ [nil, nil, nil, nil, nil, nil, nil, nil],
864
+ [nil, nil, nil, nil, nil, nil, nil, nil],
865
+ [nil, nil, nil, nil, nil, nil, nil, nil],
866
+ [nil, nil, nil, nil, nil, nil, nil, nil],
867
+ [nil, nil, nil, nil, "WP", nil, nil, nil],
868
+ [nil, nil, nil, nil, "WK", nil, nil, nil],
869
+ ]
870
+ )
871
+ end
872
+ end
873
+ end
874
+
875
+ describe "in_check_after_move? method" do
876
+ before :each do
877
+ @board = Array.new(8) { Array.new(8,nil) }
878
+ @board[7][4] = "WK"
879
+ @board[0][4] = "BK"
880
+ @board[0][3] = "BQ"
881
+ @chess = ChessMate.new(@board)
882
+ end
883
+ it "should return true if the moving color is in check after the move" do
884
+ expect(@chess.in_check_after_move?([7,4], [7,3])).to eql(true)
885
+ end
886
+
887
+ it "should return false if the moving color is not in check after the move" do
888
+ expect(@chess.in_check_after_move?([7,4], [7,5])).to eql(false)
889
+ end
890
+
891
+ it "should not update the actual game board to test" do
892
+ test_board = Array.new(8) { Array.new(8,nil) }
893
+ test_board[7][4] = "WK"
894
+ test_board[0][4] = "BK"
895
+ test_board[0][3] = "BQ"
896
+ @chess.in_check_after_move?([7,4], [7,3])
897
+ expect(test_board.object_id).to_not eql(@board.object_id)
898
+ expect(test_board).to eql(@chess.board)
899
+ end
900
+
901
+ it "should return true if the checking piece is captured, but still results in check" do
902
+ board = Array.new(8) { Array.new(8,nil) }
903
+ board[7][4] = "WK"
904
+ board[6][4] = "BQ"
905
+ board[3][4] = "BK"
906
+ board[4][4] = "BR"
907
+ chess = ChessMate.new(board)
908
+ expect(chess.in_check_after_move?([7,4], [6,4])).to eql(true)
909
+ end
910
+ end
911
+
912
+ describe "valid_moves? method" do
913
+ it "should return true if there are valid moves" do
914
+ board = Array.new(8) { Array.new(8,nil) }
915
+ board[7][4] = "WK"
916
+ board[0][4] = "BK"
917
+ chess = ChessMate.new(board)
918
+ expect(chess.any_valid_moves?("W")).to eql(true)
919
+ end
920
+
921
+ it "should return false if there are no valid moves" do
922
+ board = Array.new(8) { Array.new(8,nil) }
923
+ board[7][4] = "WK"
924
+ board[6][4] = "BQ"
925
+ board[3][4] = "BK"
926
+ board[4][4] = "BR"
927
+ chess = ChessMate.new(board)
928
+ expect(chess.any_valid_moves?("W")).to eql(false)
929
+ end
930
+ end
931
+
932
+ describe "checkmate? method" do
933
+ it "should return true if no valid moves remain and currently in check" do
934
+ board = Array.new(8) { Array.new(8,nil) }
935
+ board[7][4] = "WK"
936
+ board[6][4] = "BQ"
937
+ board[3][4] = "BK"
938
+ board[4][4] = "BR"
939
+ chess = ChessMate.new(board)
940
+ expect(chess.checkmate?("W")).to eql(true)
941
+ end
942
+
943
+ it "should return false if there are valid moves" do
944
+ chess = ChessMate.new
945
+ expect(chess.checkmate?("W")).to eql(false)
946
+ end
947
+ end
948
+
949
+ describe "draw? method" do
950
+ it "should return true if no valid moves remain and currently not in check" do
951
+ board = Array.new(8) { Array.new(8,nil) }
952
+ board[7][4] = "WK"
953
+ board[5][3] = "BQ"
954
+ board[5][4] = "BK"
955
+ board[4][5] = "BR"
956
+ chess = ChessMate.new(board)
957
+ expect(chess.draw?("W")).to eql(true)
958
+ end
959
+
960
+ it "should return false if there are valid moves" do
961
+ chess = ChessMate.new
962
+ expect(chess.checkmate?("W")).to eql(false)
963
+ end
964
+
965
+ it "should return false if checkmated" do
966
+ board = Array.new(8) { Array.new(8,nil) }
967
+ board[7][4] = "WK"
968
+ board[6][3] = "BQ"
969
+ board[5][4] = "BK"
970
+ board[4][5] = "BR"
971
+ chess = ChessMate.new(board)
972
+ expect(chess.draw?("W")).to eql(false)
973
+ end
974
+ end
975
+ end