chessmate 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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