aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorTeddy Wing2015-04-16 02:13:04 -0400
committerTeddy Wing2015-04-16 02:13:04 -0400
commit6984fc31370564332ceab60c203cd6f1e695d61a (patch)
treea53d6b3ecf3c1ba4f35fcd245c30757e1a266e11 /spec
parentfa951e520b7637d9e67c31a0a8b61733e253f90b (diff)
parent93351518faf3bb4f63b4a3cc1ef28f5c06e09f01 (diff)
downloadtic-tac-toe-master.tar.bz2
Merge branch 'rspec-style'HEADmaster
Diffstat (limited to 'spec')
-rw-r--r--spec/board_spec.rb147
-rw-r--r--spec/player_spec.rb47
-rw-r--r--spec/spec_helper.rb2
3 files changed, 196 insertions, 0 deletions
diff --git a/spec/board_spec.rb b/spec/board_spec.rb
new file mode 100644
index 0000000..70caa81
--- /dev/null
+++ b/spec/board_spec.rb
@@ -0,0 +1,147 @@
+require 'spec_helper'
+require 'board'
+
+describe Board do
+ before do
+ @board = Board.new
+ end
+
+ it 'starts with a grid of dots' do
+ @board.instance_variable_get('@board').must_equal [
+ ['.', '.', '.'],
+ ['.', '.', '.'],
+ ['.', '.', '.']
+ ]
+ end
+
+ describe '#render' do
+ it 'must be a grid' do
+ @board.render.must_equal <<EOF
+...
+...
+...
+EOF
+ end
+
+ it 'must be the correct board' do
+ @board.instance_variable_set(:@board, [
+ ['.', 'X', 'O'],
+ ['X', '.', '.'],
+ ['.', '.', '.'],
+ ])
+ @board.render.must_equal <<EOF
+.XO
+X..
+...
+EOF
+ end
+ end
+
+ describe '#transform_coordinates' do
+ it 'converts string coordinates to an array' do
+ @board.transform_coordinates('0,4').must_equal [0, 4]
+ end
+
+ it "returns nil if coordinates don't match the format" do
+ @board.transform_coordinates('4').must_be_nil
+ @board.transform_coordinates('4 2').must_be_nil
+ @board.transform_coordinates('booyakacha').must_be_nil
+ @board.transform_coordinates('booya,kacha').must_be_nil
+ end
+ end
+
+ describe '#update_cell' do
+ it 'updates a given cell with a given value' do
+ value = 'X'
+ @board.update_cell(1, 2, value)
+ @board.instance_variable_get(:@board)[1][2].must_equal value
+ end
+ end
+
+ describe '#winner?' do
+ before do
+ @board = Board.new
+ end
+
+ it 'must be nil when no player has won' do
+ @board.winner?.must_be_nil
+ end
+
+ it 'must be the winning player' do
+ end
+
+ it 'counts horizontal matches as wins' do
+ @board.instance_variable_set(:@board, [
+ ['X', 'X', 'X'],
+ ['X', 'O', 'O'],
+ ['O', 'X', 'O'],
+ ])
+ @board.winner?.must_equal 'X'
+
+ @board.instance_variable_set(:@board, [
+ ['X', 'O', 'X'],
+ ['O', 'O', 'O'],
+ ['O', 'X', 'X'],
+ ])
+ @board.winner?.must_equal 'O'
+
+ @board.instance_variable_set(:@board, [
+ ['O', 'X', 'X'],
+ ['X', 'O', 'X'],
+ ['O', 'O', 'O'],
+ ])
+ @board.winner?.must_equal 'O'
+ end
+
+ it 'counts vertical matches as wins' do
+ @board.instance_variable_set(:@board, [
+ ['X', 'O', 'X'],
+ ['X', 'O', 'O'],
+ ['X', 'X', 'O'],
+ ])
+ @board.winner?.must_equal 'X'
+
+ @board.instance_variable_set(:@board, [
+ ['X', 'O', 'X'],
+ ['X', 'O', 'O'],
+ ['O', 'O', 'X'],
+ ])
+ @board.winner?.must_equal 'O'
+
+ @board.instance_variable_set(:@board, [
+ ['O', 'X', 'X'],
+ ['X', 'O', 'X'],
+ ['O', 'O', 'X'],
+ ])
+ @board.winner?.must_equal 'X'
+ end
+
+ it 'counts diagonal matches as wins' do
+ @board.instance_variable_set(:@board, [
+ ['O', 'X', 'X'],
+ ['X', 'O', 'O'],
+ ['O', 'X', 'O'],
+ ])
+ @board.winner?.must_equal 'O'
+
+ @board.instance_variable_set(:@board, [
+ ['X', 'O', 'X'],
+ ['O', 'X', 'O'],
+ ['O', 'X', 'X'],
+ ])
+ @board.winner?.must_equal 'X'
+ end
+ end
+
+ describe '#array_items_equal' do
+ it 'is true when all elements in the array are equal' do
+ Board.new.send(:array_items_equal,
+ ['X', 'X', 'X', 'X', 'X', 'X', 'X']).must_equal true
+ end
+
+ it 'is false when any element is not equal to the rest' do
+ Board.new.send(:array_items_equal,
+ ['X', 'O', 'X', 'X', 'X', 'X', 'X']).must_equal false
+ end
+ end
+end
diff --git a/spec/player_spec.rb b/spec/player_spec.rb
new file mode 100644
index 0000000..11bfd35
--- /dev/null
+++ b/spec/player_spec.rb
@@ -0,0 +1,47 @@
+require 'spec_helper'
+require 'board'
+require 'player'
+
+describe Player do
+ describe 'insignias' do
+ it 'knows what an X insignia is' do
+ Player::INSIGNIAS[:x].must_equal 'X'
+ end
+
+ it 'knows what an O insignia is' do
+ Player::INSIGNIAS[:o].must_equal 'O'
+ end
+ end
+
+ describe '#insignia' do
+ it 'must be the correct insignia' do
+ insignia = Player::INSIGNIAS[:o]
+ player = Player.new(insignia, Board.new)
+ player.insignia.must_equal insignia
+ end
+ end
+
+ describe '#move' do
+ before do
+ @board = Board.new
+ @player = Player.new(Player::INSIGNIAS[:x], @board)
+ end
+
+ it 'raises an ArgumentError given nil coordinates' do
+ -> { @player.move(nil) }.must_raise ArgumentError
+ end
+
+ it 'adds a piece to the correct coordinates on `board`' do
+ @player.move([1, 2])
+ @board.instance_variable_get(:@board)[1][2].must_equal \
+ @player.instance_variable_get(:@insignia)
+ end
+
+ it 'uses the correct insignia for the move' do
+ insignia = Player::INSIGNIAS[:o]
+ player = Player.new(insignia, @board)
+ player.move([0, 1])
+ @board.instance_variable_get(:@board)[0][1].must_equal insignia
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
new file mode 100644
index 0000000..1655612
--- /dev/null
+++ b/spec/spec_helper.rb
@@ -0,0 +1,2 @@
+require 'minitest/spec'
+require 'minitest/autorun'