bashrw_ttt 0.1.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.
Files changed (130) hide show
  1. data/bin/play.rb +10 -0
  2. data/lib/ttt/ai.rb +33 -0
  3. data/lib/ttt/ai_easy.rb +17 -0
  4. data/lib/ttt/ai_hard.rb +21 -0
  5. data/lib/ttt/ai_medium.rb +21 -0
  6. data/lib/ttt/ai_medium_back.rb +58 -0
  7. data/lib/ttt/board.rb +37 -0
  8. data/lib/ttt/config_helper.rb +53 -0
  9. data/lib/ttt/config_options.rb +27 -0
  10. data/lib/ttt/context.rb +214 -0
  11. data/lib/ttt/four_by_four.rb +62 -0
  12. data/lib/ttt/game.rb +94 -0
  13. data/lib/ttt/game_history.rb +37 -0
  14. data/lib/ttt/game_interactor.rb +126 -0
  15. data/lib/ttt/human.rb +12 -0
  16. data/lib/ttt/interfaces/cli/lib/cli/board_selection.rb +34 -0
  17. data/lib/ttt/interfaces/cli/lib/cli/cli_game.rb +186 -0
  18. data/lib/ttt/interfaces/cli/lib/cli/cli_presenter.rb +216 -0
  19. data/lib/ttt/interfaces/cli/lib/cli/clio.rb +17 -0
  20. data/lib/ttt/interfaces/cli/lib/cli/play_again.rb +38 -0
  21. data/lib/ttt/interfaces/cli/lib/cli/player_selection.rb +43 -0
  22. data/lib/ttt/interfaces/cli/lib/cli/selection.rb +8 -0
  23. data/lib/ttt/interfaces/cli/lib/cli/walk_history.rb +48 -0
  24. data/lib/ttt/interfaces/cli/spec/cli/board_selection_spec.rb +29 -0
  25. data/lib/ttt/interfaces/cli/spec/cli/cli_game_spec.rb +376 -0
  26. data/lib/ttt/interfaces/cli/spec/cli/cli_presenter_spec.rb +147 -0
  27. data/lib/ttt/interfaces/cli/spec/cli/play_again_spec.rb +39 -0
  28. data/lib/ttt/interfaces/cli/spec/cli/player_selection_spec.rb +62 -0
  29. data/lib/ttt/interfaces/cli/spec/cli/walk_history_spec.rb +115 -0
  30. data/lib/ttt/interfaces/cli/spec/spec_helper.rb +14 -0
  31. data/lib/ttt/interfaces/limelight/four_by_four/props.rb +1 -0
  32. data/lib/ttt/interfaces/limelight/four_by_four/styles.rb +74 -0
  33. data/lib/ttt/interfaces/limelight/four_by_four_finished/props.rb +1 -0
  34. data/lib/ttt/interfaces/limelight/four_by_four_finished/styles.rb +74 -0
  35. data/lib/ttt/interfaces/limelight/game_list/players/load_button.rb +10 -0
  36. data/lib/ttt/interfaces/limelight/game_list/props.rb +17 -0
  37. data/lib/ttt/interfaces/limelight/game_list/styles.rb +8 -0
  38. data/lib/ttt/interfaces/limelight/main_menu/players/exit_ttt.rb +3 -0
  39. data/lib/ttt/interfaces/limelight/main_menu/players/load_game.rb +3 -0
  40. data/lib/ttt/interfaces/limelight/main_menu/players/new_game.rb +3 -0
  41. data/lib/ttt/interfaces/limelight/main_menu/props.rb +17 -0
  42. data/lib/ttt/interfaces/limelight/new_game/players/board_type.rb +1 -0
  43. data/lib/ttt/interfaces/limelight/new_game/players/new_game.rb +5 -0
  44. data/lib/ttt/interfaces/limelight/new_game/players/player_type.rb +1 -0
  45. data/lib/ttt/interfaces/limelight/new_game/players/setup_button.rb +21 -0
  46. data/lib/ttt/interfaces/limelight/new_game/props.rb +21 -0
  47. data/lib/ttt/interfaces/limelight/new_game/styles.rb +23 -0
  48. data/lib/ttt/interfaces/limelight/partials/board_partial.rb +14 -0
  49. data/lib/ttt/interfaces/limelight/partials/menu_button_partial.rb +5 -0
  50. data/lib/ttt/interfaces/limelight/partials/move_history_partial.rb +6 -0
  51. data/lib/ttt/interfaces/limelight/partials/title_history_partial.rb +10 -0
  52. data/lib/ttt/interfaces/limelight/players/board.rb +3 -0
  53. data/lib/ttt/interfaces/limelight/players/game.rb +4 -0
  54. data/lib/ttt/interfaces/limelight/players/generic_move_history.rb +5 -0
  55. data/lib/ttt/interfaces/limelight/players/generic_player.rb +8 -0
  56. data/lib/ttt/interfaces/limelight/players/left_button.rb +3 -0
  57. data/lib/ttt/interfaces/limelight/players/main_menu.rb +3 -0
  58. data/lib/ttt/interfaces/limelight/players/right_button.rb +3 -0
  59. data/lib/ttt/interfaces/limelight/playscripts/game_playscript.rb +169 -0
  60. data/lib/ttt/interfaces/limelight/production.rb +14 -0
  61. data/lib/ttt/interfaces/limelight/spec/game_playscript_spec.rb +218 -0
  62. data/lib/ttt/interfaces/limelight/spec/main_menu/main_menu_spec.rb +38 -0
  63. data/lib/ttt/interfaces/limelight/spec/new_game/new_game_spec.rb +45 -0
  64. data/lib/ttt/interfaces/limelight/spec/spec_helper.rb +8 -0
  65. data/lib/ttt/interfaces/limelight/stages.rb +6 -0
  66. data/lib/ttt/interfaces/limelight/styles.rb +119 -0
  67. data/lib/ttt/interfaces/limelight/three_by_three/props.rb +1 -0
  68. data/lib/ttt/interfaces/limelight/three_by_three/styles.rb +39 -0
  69. data/lib/ttt/interfaces/limelight/three_by_three_by_three/props.rb +1 -0
  70. data/lib/ttt/interfaces/limelight/three_by_three_by_three/styles.rb +119 -0
  71. data/lib/ttt/interfaces/limelight/three_by_three_by_three_finished/props.rb +1 -0
  72. data/lib/ttt/interfaces/limelight/three_by_three_by_three_finished/styles.rb +119 -0
  73. data/lib/ttt/interfaces/limelight/three_by_three_finished/props.rb +1 -0
  74. data/lib/ttt/interfaces/limelight/three_by_three_finished/styles.rb +39 -0
  75. data/lib/ttt/interfaces/rails/app/controllers/application_controller.rb +3 -0
  76. data/lib/ttt/interfaces/rails/app/controllers/ttt_games_controller.rb +86 -0
  77. data/lib/ttt/interfaces/rails/app/helpers/application_helper.rb +2 -0
  78. data/lib/ttt/interfaces/rails/app/models/ttt_game.rb +34 -0
  79. data/lib/ttt/interfaces/rails/app/presenters/web_game_presenter.rb +159 -0
  80. data/lib/ttt/interfaces/rails/autotest/discover.rb +1 -0
  81. data/lib/ttt/interfaces/rails/config/application.rb +67 -0
  82. data/lib/ttt/interfaces/rails/config/boot.rb +6 -0
  83. data/lib/ttt/interfaces/rails/config/environment.rb +5 -0
  84. data/lib/ttt/interfaces/rails/config/environments/development.rb +37 -0
  85. data/lib/ttt/interfaces/rails/config/environments/production.rb +67 -0
  86. data/lib/ttt/interfaces/rails/config/environments/test.rb +37 -0
  87. data/lib/ttt/interfaces/rails/config/initializers/backtrace_silencers.rb +7 -0
  88. data/lib/ttt/interfaces/rails/config/initializers/inflections.rb +15 -0
  89. data/lib/ttt/interfaces/rails/config/initializers/mime_types.rb +5 -0
  90. data/lib/ttt/interfaces/rails/config/initializers/secret_token.rb +7 -0
  91. data/lib/ttt/interfaces/rails/config/initializers/session_store.rb +8 -0
  92. data/lib/ttt/interfaces/rails/config/initializers/wrap_parameters.rb +14 -0
  93. data/lib/ttt/interfaces/rails/config/routes.rb +49 -0
  94. data/lib/ttt/interfaces/rails/db/schema.rb +28 -0
  95. data/lib/ttt/interfaces/rails/db/seeds.rb +7 -0
  96. data/lib/ttt/interfaces/rails/spec/controllers/ttt_games_controller_spec.rb +211 -0
  97. data/lib/ttt/interfaces/rails/spec/models/ttt_game_spec.rb +76 -0
  98. data/lib/ttt/interfaces/rails/spec/presenters/web_game_presenter_spec.rb +52 -0
  99. data/lib/ttt/interfaces/rails/spec/spec_helper.rb +13 -0
  100. data/lib/ttt/interfaces/web_interface/html_generator.rb +76 -0
  101. data/lib/ttt/interfaces/web_interface/web_game_presenter.rb +0 -0
  102. data/lib/ttt/minimax.rb +46 -0
  103. data/lib/ttt/move_history.rb +10 -0
  104. data/lib/ttt/move_traverser.rb +49 -0
  105. data/lib/ttt/player.rb +15 -0
  106. data/lib/ttt/riak_db.rb +53 -0
  107. data/lib/ttt/setup.rb +59 -0
  108. data/lib/ttt/three_by_three.rb +35 -0
  109. data/lib/ttt/three_by_three_by_three.rb +37 -0
  110. data/spec/spec_helper.rb +22 -0
  111. data/spec/ttt/ai_easy_spec.rb +15 -0
  112. data/spec/ttt/ai_hard_spec.rb +76 -0
  113. data/spec/ttt/ai_medium_spec.rb +65 -0
  114. data/spec/ttt/ai_spec.rb +50 -0
  115. data/spec/ttt/board_spec.rb +96 -0
  116. data/spec/ttt/config_helper_spec.rb +54 -0
  117. data/spec/ttt/context_spec.rb +398 -0
  118. data/spec/ttt/four_by_four_spec.rb +112 -0
  119. data/spec/ttt/game_history_spec.rb +41 -0
  120. data/spec/ttt/game_interactor_spec.rb +197 -0
  121. data/spec/ttt/game_spec.rb +246 -0
  122. data/spec/ttt/human_spec.rb +18 -0
  123. data/spec/ttt/move_history_spec.rb +13 -0
  124. data/spec/ttt/move_traverser_spec.rb +75 -0
  125. data/spec/ttt/player_spec.rb +13 -0
  126. data/spec/ttt/riak_db_spec.rb +64 -0
  127. data/spec/ttt/setup_spec.rb +63 -0
  128. data/spec/ttt/three_by_three_by_three_spec.rb +130 -0
  129. data/spec/ttt/three_by_three_spec.rb +110 -0
  130. metadata +238 -0
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ module CLI
4
+ describe CLIPresenter do
5
+ let(:instream) { StringIO.new }
6
+ let(:outstream) { StringIO.new }
7
+ let(:presenter) { CLIPresenter.new(instream, outstream) }
8
+
9
+ describe "#new" do
10
+ it "returns a new presenter object" do
11
+ presenter.should_not be_nil
12
+ end
13
+ end
14
+
15
+ describe "#output" do
16
+ it "sends an output message to the io" do
17
+ presenter.output "hello"
18
+ presenter.io.outstream.include? "Hello"
19
+ end
20
+ end
21
+
22
+ describe "#welcome_prompt" do
23
+ it "displays 'Welcome to TTT!'" do
24
+ presenter.welcome_prompt
25
+ presenter.io.outstream.include? "Welcome to TTT!"
26
+ end
27
+ end
28
+
29
+ describe "#command_list" do
30
+ it "sends a command list message to the io" do
31
+ presenter.io.should_receive(:output).at_least(4).times
32
+ presenter.command_list
33
+ presenter.io.outstream.include? "Please select an option from the following list:"
34
+ end
35
+ end
36
+
37
+ describe "#menu" do
38
+ it "sends a welcome prompt message to the io" do
39
+ presenter.io.outstream.include? "Welcome to TTT!"
40
+ presenter.io.outstream.include? "1. Play ttt!"
41
+ end
42
+ end
43
+
44
+ describe "#input" do
45
+ it "receives input from the command line" do
46
+ presenter.io.instream = StringIO.new("Hello\n")
47
+ presenter.input.chomp.should == "Hello"
48
+ end
49
+ end
50
+
51
+ describe "#process_game_list" do
52
+ it "sends an output message to the io" do
53
+ list = %w(5 4 3 2 1)
54
+ presenter.io.outstream = StringIO.new(list.join("\n"))
55
+ presenter.io.instream = StringIO.new("1\n")
56
+ presenter.io.should_receive(:output).at_least(2)
57
+ presenter.process_game_list(list)
58
+ presenter.io.outstream.string.should == "5\n4\n3\n2\n1"
59
+ end
60
+ end
61
+
62
+ describe "#sort_list" do
63
+ it "sorts an array of game id strings into integers" do
64
+ ary = %w(5 4 3 2 1)
65
+ presenter.sort_list(ary).should == %w(1 2 3 4 5)
66
+ end
67
+ end
68
+
69
+ describe "#no_games" do
70
+ it "displays 'No games were found.' to the user" do
71
+ presenter.no_games
72
+ presenter.io.outstream.include? "No games were found"
73
+ end
74
+ end
75
+
76
+ describe "#player_prompt" do
77
+ it "displays the prompt for the player type" do
78
+ history = stub(:each_with_index => [])
79
+ board = Array.new(9, ' ')
80
+ player = double('player')
81
+ player.stub(:prompt).and_return("Entere move:")
82
+ presenter.player_prompt(board, history, player)
83
+ presenter.io.outstream.include? "Enter move:"
84
+ end
85
+ end
86
+
87
+ describe "#output_three_by_three" do
88
+ it "prints game board" do
89
+ board = Array.new(9, ' ')
90
+ presenter.output_three_by_three(board)
91
+ presenter.io.outstream.string.chomp.should == "\n | | \n"+
92
+ "-----------------\n"+
93
+ " | | \n"+
94
+ "-----------------\n"+
95
+ " | | "
96
+ end
97
+ end
98
+
99
+ describe "#output_four_by_four" do
100
+ it "displays a four by four board" do
101
+ board = Array.new(16, ' ')
102
+ presenter.output_four_by_four(board)
103
+ presenter.io.outstream.string.chomp.should == "\n | | | \n"+
104
+ "-----------------------\n"+
105
+ " | | | \n"+
106
+ "-----------------------\n"+
107
+ " | | | \n"+
108
+ "-----------------------\n"+
109
+ " | | | "
110
+ end
111
+ end
112
+
113
+ describe "#winner_prompt" do
114
+ it "displays 'Player 1 is the winner!" do
115
+ presenter.winner_prompt("Player 1")
116
+ presenter.io.outstream.string.split("\n").include? "Player 1 is the winner!"
117
+ end
118
+ end
119
+
120
+ describe "#draw_prompt" do
121
+ it "displays 'It's a draw!'" do
122
+ presenter.draw_prompt
123
+ presenter.io.outstream.string.split("\n").include? "It's a draw!"
124
+ end
125
+ end
126
+
127
+ describe "#four_by_four_move_prompt" do
128
+ it "displays a help menu to indicate how the user can move on a 4x4 board" do
129
+ presenter.four_by_four_move_prompt
130
+ presenter.io.outstream.string.chomp.should == "\n 0 | 1 | 2 | 3 \n"+
131
+ "-----------------------\n"+
132
+ " 4 | 5 | 6 | 7 \n"+
133
+ "-----------------------\n"+
134
+ " 8 | 9 | 10 | 11 \n"+
135
+ "-----------------------\n"+
136
+ " 12 | 13 | 14 | 15 "
137
+ end
138
+ end
139
+
140
+ describe "#post_game_msg" do
141
+ it "prompts the user if they 'Would like to review the game history'?" do
142
+ presenter.post_game_msg
143
+ presenter.io.outstream.include? "\nWould you like to review the game history (y or n)?"
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module CLI
4
+ describe PlayAgain do
5
+ let(:presenter) { CLIPresenter.new(StringIO.new, StringIO.new) }
6
+ let(:againio) { PlayAgain.new(presenter) }
7
+
8
+ describe "#valid_reply?" do
9
+ it "returns nil if the play again response is not 'y' or 'n'" do
10
+ againio.valid_reply?("1\n").should == nil
11
+ end
12
+
13
+ it "returns zero if the play again response is 'y' or 'n'" do
14
+ againio.valid_reply?("n\n").should == 0
15
+ againio.valid_reply?("y\n").should == 0
16
+ end
17
+ end
18
+
19
+ describe "#play_again_msg" do
20
+ it "sends a play_again_msg message to gameio" do
21
+ presenter.should_receive(:play_again_msg)
22
+ againio.play_again_msg
23
+ end
24
+ end
25
+
26
+ describe "#play_again?" do
27
+ it "prompts the user to play again" do
28
+ presenter.io.instream = StringIO.new("n\n")
29
+ presenter.io.outstream.string.split("\n").include? "Play again (y or n)?"
30
+ end
31
+
32
+ it "prompts the user to re-enter input when invalid input is received" do
33
+ presenter.io.instream = StringIO.new("i\nn\n")
34
+ againio.play_again?
35
+ presenter.io.outstream.string.split("\n").include? "I'm sorry, I didn't understand you. Please try again."
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ module CLI
4
+ describe PlayerSelection do
5
+ let(:presenter) { CLIPresenter.new(StringIO.new, StringIO.new) }
6
+ let(:players) { TTT::Setup.new.players }
7
+
8
+ let(:ptypeio) { PlayerSelection.new(players, presenter) }
9
+
10
+ describe "#player_selection_valid?" do
11
+ it "returns false if input is not an integer within the range of available options" do
12
+ ptypeio.player_selection_valid?(10).should == false
13
+ ptypeio.player_selection_valid?(6).should == false
14
+ end
15
+
16
+ it "returns true if input is an integer within the range of available options" do
17
+ ptypeio.player_selection_valid?(2).should == true
18
+ ptypeio.player_selection_valid?(3).should == true
19
+ end
20
+ end
21
+
22
+ describe "#player_type_prompt" do
23
+ it "displays an enumerable list of player types the user can choose from" do
24
+ presenter.player_type_prompt(1, players)
25
+ ptypeio.presenter.io.outstream.string.split('n').include? "1. Human"
26
+ ptypeio.presenter.io.outstream.string.split('n').include? "2. AI Easy"
27
+ end
28
+ end
29
+
30
+ describe "#set_player_string" do
31
+ it "sets a player type string representing the class constant in the list of player types" do
32
+ ptypeio.set_player_string(1, 1)
33
+ ptypeio.player1.should == "Human"
34
+ ptypeio.set_player_string(2, 2)
35
+ ptypeio.player2.should == "AI Easy"
36
+ end
37
+ end
38
+
39
+ describe "#process_player_type_input" do
40
+ it "when input passes validation, the player type is associated with that player number as a string" do
41
+ ptypeio.process_player_type_input(1, "1\n")
42
+ ptypeio.player1.should == "Human"
43
+ end
44
+
45
+ it "when input doesn't pass validation, an error prompt is generated and the user is prompted to input again" do
46
+ ptypeio.presenter.io.instream = StringIO.new("1\n")
47
+ ptypeio.process_player_type_input(1, "6\n")
48
+ ptypeio.presenter.io.outstream.string.split("\n").include? "I'm sorry, I didn't understand. Please try again."
49
+ ptypeio.player1.should == "Human"
50
+ end
51
+ end
52
+
53
+ describe "#process" do
54
+ it "prompts the player to enter a type for player1 and player2, resulting in player1 and player2 being set" do
55
+ ptypeio.presenter.io.instream = StringIO.new("1\n1\n")
56
+ ptypeio.process
57
+ ptypeio.player1.should == "Human"
58
+ ptypeio.player2.should == "Human"
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ module CLI
4
+ describe WalkHistory do
5
+ let(:setup) { TTT::Setup.new }
6
+ let(:move_history) { [TTT::MoveHistory.new(:side => 'x', :move => '0'), TTT::MoveHistory.new(:side => 'o', :move => '1'), TTT::MoveHistory.new(:side => 'x', :move => '4'), TTT::MoveHistory.new(:side => 'o', :move => '5'), TTT::MoveHistory.new(:side => 'x', :move => '8') ] }
7
+ let(:game) { setup.new_game(:player1 => setup.players.first, :player2 => setup.players.first, :board => setup.boards.first) }
8
+ let(:presenter) { CLIPresenter.new(StringIO.new, StringIO.new) }
9
+ let(:walkio) { WalkHistory.new(presenter, game) }
10
+
11
+ before(:each) do
12
+ game.record_move(0, 'x')
13
+ game.mark_move(0, 'x')
14
+ game.record_move(1, 'o')
15
+ game.mark_move(1, 'o')
16
+ game.record_move(4, 'x')
17
+ game.mark_move(4, 'x')
18
+ game.record_move(5, 'o')
19
+ game.mark_move(5, 'o')
20
+ game.record_move(8, 'x')
21
+ game.mark_move(8, 'x')
22
+ end
23
+
24
+ describe "#build_board" do
25
+ it "returns a board array representing the game board at move index 0" do
26
+ walkio.build_board(game.board, 0).should == Array.new(9, ' ')
27
+ end
28
+
29
+ it "returns a board array representing the game board at move index 1" do
30
+ walkio.build_board(game.board, 1).should == ['x', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
31
+ end
32
+
33
+ it "returns a board array representing the game board at move index 2" do
34
+ walkio.build_board(game.board, 2).should == ['x', 'o', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
35
+ end
36
+
37
+ it "returns a board array representing the game board at move index 3" do
38
+ walkio.build_board(game.board, 3).should == ['x', 'o', ' ', ' ', 'x', ' ', ' ', ' ', ' ']
39
+ end
40
+
41
+ it "returns a board array representing the game board at move index 4" do
42
+ walkio.build_board(game.board, 4).should == ['x', 'o', ' ', ' ', 'x', 'o', ' ', ' ', ' ']
43
+ end
44
+
45
+ it "returns a board array representing the game board at move index 5" do
46
+ walkio.build_board(game.board, 5).should == ['x', 'o', ' ', ' ', 'x', 'o', ' ', ' ', 'x']
47
+ end
48
+ end
49
+
50
+ describe "#post_game_msg" do
51
+ it "prompts the user if they 'Would like to review the game history'?" do
52
+ walkio.stub(:process => nil)
53
+ walkio.presenter.stub(:input => 'n\n')
54
+ walkio.presenter.should_receive(:post_game_msg)
55
+ walkio.post_game_msg
56
+ end
57
+ end
58
+
59
+ describe "#process" do
60
+ it "does nothing if the user inputs 'n' or 'N'" do
61
+ walkio.process('n').should == nil
62
+ walkio.process('N').should == nil
63
+ end
64
+
65
+ it "does presents the user with the `walk_msg` prompt if the user input 'y' or 'Y'" do
66
+ walkio.should_receive(:walk_msg)
67
+ walkio.process('y\n')
68
+ end
69
+
70
+ it "gives the user an error message if they input invalid characters" do
71
+ walkio.process('1092093019823\n')
72
+ walkio.presenter.io.outstream.include? "error"
73
+ end
74
+ end
75
+
76
+ describe "#walk_msg" do
77
+ it "prompts the user to enter 1, 0 or -1 to walk forward, exit or go backward in the game history" do
78
+ walkio.presenter.stub(:input => '0')
79
+ walkio.walk_msg
80
+ walkio.presenter.io.outstream.include? "Enter -1 to go back, 0 for main menu, or 1 to go forward"
81
+ end
82
+ end
83
+
84
+ describe "#walk_history" do
85
+ before(:each) do
86
+ walkio.stub(:walk_msg => nil)
87
+ end
88
+ it "outputs the final board state when asked for a move index greater than the last move made index" do
89
+ final_board = walkio.game.board[]
90
+ walkio.walk_history(1)
91
+ walkio.presenter.io.outstream.include? final_board
92
+ end
93
+
94
+ it "returns a virgin board state when asked for a move index less than the first move made index" do
95
+ first_board = Array.new(9, " ")
96
+ walkio.walk_history(-100)
97
+ walkio.presenter.io.outstream.include? first_board
98
+ end
99
+
100
+ it "returns board at move index four when asked for the next move index (current move index is 3)" do
101
+ expected_board = ['x', 'o', ' ', ' ', 'x', 'o', ' ', ' ', ' ']
102
+ walkio.move_traverser.move_index = 3
103
+ walkio.walk_history(1)
104
+ walkio.presenter.io.outstream.include? expected_board
105
+ end
106
+
107
+ it "returns board at move index three when asked for the previous move index (current move index is 4)" do
108
+ expected_board = ['x', 'o', ' ', ' ', 'x', ' ', ' ', ' ', ' ']
109
+ walkio.move_traverser.move_index = 4
110
+ walkio.walk_history(-1)
111
+ walkio.presenter.io.outstream.include? expected_board
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
3
+ $LOAD_PATH.unshift File.expand_path('../../../../../', __FILE__)
4
+
5
+ require 'simplecov'
6
+ #SimpleCov.start
7
+ require 'cli/clio'
8
+ require 'cli/cli_game'
9
+ require 'cli/player_selection'
10
+ require 'cli/board_selection'
11
+ require 'ttt/setup'
12
+ require 'cli/cli_presenter'
13
+ require 'cli/selection'
14
+ require 'cli/walk_history'
@@ -0,0 +1 @@
1
+ __install 'partials/title_history_partial.rb', :text => "4x4", :n => 16, :c => 1
@@ -0,0 +1,74 @@
1
+ squares {
2
+ width 415
3
+ horizontal_alignment :center
4
+ vertical_alignment :center
5
+ }
6
+
7
+ square0 {
8
+ extends :square
9
+ extends :left_of_square
10
+ extends :above_square
11
+ }
12
+
13
+ square1 {
14
+ extends :square0
15
+ }
16
+
17
+ square2 {
18
+ extends :square0
19
+ }
20
+
21
+ square3 {
22
+ extends :above_square
23
+ }
24
+
25
+ square4 {
26
+ extends :square0
27
+ }
28
+
29
+ square5 {
30
+ extends :square0
31
+ }
32
+
33
+ square6 {
34
+ extends :square0
35
+ }
36
+
37
+ square7 {
38
+ extends :above_square
39
+ }
40
+
41
+ square8 {
42
+ extends :square0
43
+ }
44
+
45
+ square9 {
46
+ extends :square0
47
+ }
48
+
49
+ square10 {
50
+ extends :square0
51
+ }
52
+
53
+ square11 {
54
+ extends :above_square
55
+ }
56
+
57
+ square12 {
58
+ extends :square
59
+ extends :left_of_square
60
+ }
61
+
62
+ square13 {
63
+ extends :square
64
+ extends :left_of_square
65
+ }
66
+
67
+ square14 {
68
+ extends :square
69
+ extends :left_of_square
70
+ }
71
+
72
+ square15 {
73
+ extends :square
74
+ }