minesweeper-core 2.0.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 (39) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +20 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/Guardfile +30 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +24 -0
  9. data/Rakefile +11 -0
  10. data/lib/minesweeper/core.rb +6 -0
  11. data/lib/minesweeper/core/elements/cell.rb +57 -0
  12. data/lib/minesweeper/core/elements/cell_state.rb +16 -0
  13. data/lib/minesweeper/core/elements/flagged_state.rb +21 -0
  14. data/lib/minesweeper/core/elements/hidden_state.rb +21 -0
  15. data/lib/minesweeper/core/elements/revealed_state.rb +12 -0
  16. data/lib/minesweeper/core/explosives/explosion_error.rb +10 -0
  17. data/lib/minesweeper/core/explosives/mine.rb +14 -0
  18. data/lib/minesweeper/core/explosives/mine_coordinates.rb +27 -0
  19. data/lib/minesweeper/core/explosives/mine_coordinates_factory.rb +21 -0
  20. data/lib/minesweeper/core/explosives/mine_layer.rb +32 -0
  21. data/lib/minesweeper/core/explosives/null_mine.rb +12 -0
  22. data/lib/minesweeper/core/minefield.rb +118 -0
  23. data/lib/minesweeper/core/minefield_solved_error.rb +7 -0
  24. data/lib/minesweeper/core/version.rb +6 -0
  25. data/minesweeper.gemspec +27 -0
  26. data/test/minesweeper/core/elements/cell_state_spy.rb +35 -0
  27. data/test/minesweeper/core/elements/cell_test.rb +82 -0
  28. data/test/minesweeper/core/elements/flagged_state_test.rb +42 -0
  29. data/test/minesweeper/core/elements/hidden_state_test.rb +41 -0
  30. data/test/minesweeper/core/elements/revealed_state_test.rb +34 -0
  31. data/test/minesweeper/core/explosives/mine_coordinates_factory_test.rb +57 -0
  32. data/test/minesweeper/core/explosives/mine_coordinates_test.rb +37 -0
  33. data/test/minesweeper/core/explosives/mine_layer_test.rb +109 -0
  34. data/test/minesweeper/core/explosives/mine_spy.rb +14 -0
  35. data/test/minesweeper/core/explosives/mine_test.rb +16 -0
  36. data/test/minesweeper/core/explosives/null_mine_test.rb +15 -0
  37. data/test/minesweeper/core/minefield_test.rb +121 -0
  38. data/test/test_helper.rb +4 -0
  39. metadata +179 -0
@@ -0,0 +1,14 @@
1
+ module Minesweeper
2
+ module Core
3
+ module Explosives
4
+ class MineSpy
5
+ attr_reader :trigger_called
6
+
7
+ def trigger
8
+ @trigger_called = true
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,16 @@
1
+ require_relative '../../../test_helper.rb'
2
+ require 'minesweeper/core/explosives/mine'
3
+ require 'minesweeper/core/explosives/explosion_error'
4
+
5
+ module Minesweeper
6
+ module Core
7
+ module Explosives
8
+ class MineTest < Test::Unit::TestCase
9
+ def test_trigger_should_raise_error
10
+ assert_raise(ExplosionError) { Mine.new.trigger }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,15 @@
1
+ require_relative '../../../test_helper.rb'
2
+ require 'minesweeper/core/explosives/null_mine'
3
+
4
+ module Minesweeper
5
+ module Core
6
+ module Explosives
7
+ class NullMineTest < Test::Unit::TestCase
8
+ def test_trigger_does_not_raise_exception
9
+ assert_nothing_raised(RuntimeError) { NullMine.new.trigger }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,121 @@
1
+ require 'minesweeper/core/minefield'
2
+ require 'minesweeper/core/elements/cell'
3
+ require 'minesweeper/core/explosives/explosion_error'
4
+ require 'minesweeper/core/minefield_solved_error'
5
+ require_relative '../../test_helper.rb'
6
+
7
+ module Minesweeper
8
+ module Core
9
+ class MineFieldTest < Test::Unit::TestCase
10
+ def test_initialization_expects_a_strictly_positive_integer_parameter
11
+ assert_raise(ArgumentError) { Minefield.new(-1) }
12
+ assert_raise(ArgumentError) { Minefield.new('a') }
13
+ assert_raise(ArgumentError) { Minefield.new(0) }
14
+ end
15
+
16
+ def test_minefield_row_count_is_accessible
17
+ assert_equal(4, Minefield.new(4).row_count)
18
+ end
19
+
20
+ def test_string_representation_after_initialization
21
+ assert_equal('H', Minefield.new(1).to_s, "The string representation of a MineField of row_count 1 is invalid")
22
+ assert_equal('HHHH', Minefield.new(2).to_s, "The string representation of a MineField of row_count 2 is invalid")
23
+ end
24
+
25
+ def test_hiding_a_mine_at_invalid_position_raises_an_error
26
+ assert_raise(RangeError) { Minefield.new(1).hide_mine_at(1, 1) }
27
+ end
28
+
29
+ def test_hiding_a_mine_somewhere_should_make_that_cell_explosive
30
+ @minefield = Minefield.new(1)
31
+ @minefield.hide_mine_at(0, 0)
32
+ assert_raise(Explosives::ExplosionError) { @minefield.reveal_at(0, 0) }
33
+ end
34
+
35
+ def test_hiding_a_mine_somewhere_should_increase_the_mine_counters_of_cells_around
36
+ @minefield = Minefield.new(3)
37
+ @minefield.hide_mine_at(1, 1)
38
+ assert_mine_around(0, 0)
39
+ assert_mine_around(0, 1)
40
+ assert_mine_around(0, 2)
41
+ assert_mine_around(1, 0)
42
+ assert_mine_around(1, 2)
43
+ assert_mine_around(2, 2)
44
+ assert_mine_around(2, 1)
45
+ assert_mine_around(2, 0)
46
+ end
47
+
48
+ def assert_mine_around(row_index, col_index)
49
+ assert_equal(1, @minefield.mines_around(row_index, col_index))
50
+ end
51
+
52
+ def test_hiding_a_mine_somewhere_should_not_increase_the_mine_counters_of_non_adjacent_cells
53
+ @minefield = Minefield.new(3)
54
+ @minefield.hide_mine_at(2,2)
55
+ assert_no_mine_around(0, 0)
56
+ assert_no_mine_around(0, 1)
57
+ assert_no_mine_around(0, 2)
58
+ assert_no_mine_around(1, 0)
59
+ assert_no_mine_around(2, 0)
60
+ end
61
+
62
+ def assert_no_mine_around(row_index, col_index)
63
+ assert_equal(0, @minefield.mines_around(row_index, col_index))
64
+ end
65
+
66
+ def test_given_a_non_explosive_cell_with_no_mines_around_when_revealed_then_adjacent_cells_are_revealed
67
+ @minefield = Minefield.new(6)
68
+ @minefield.hide_mine_at(0, 0)
69
+ @minefield.hide_mine_at(1, 2)
70
+ @minefield.hide_mine_at(1, 3)
71
+ @minefield.hide_mine_at(1, 4)
72
+ @minefield.hide_mine_at(3, 1)
73
+ @minefield.reveal_at(4, 4)
74
+ expected = 'HHHHHH'
75
+ expected << 'HHHHHH'
76
+ expected << 'HH3321'
77
+ expected << 'HH1000'
78
+ expected << '111000'
79
+ expected << '000000'
80
+ assert_equal(expected, @minefield.to_s)
81
+ end
82
+
83
+ def test_revealing_a_cell_at_invalid_position_raises_error
84
+ assert_raise(RangeError) { Minefield.new(1).reveal_at(1, 1) }
85
+ end
86
+
87
+ def test_flagging_a_cell_at_an_invalid_position_raises_error
88
+ assert_raise(RangeError) { Minefield.new(1).flag_at(1, 1) }
89
+ end
90
+
91
+ def test_flagging_a_cell_should_change_its_state
92
+ @minefield = Minefield.new(1)
93
+ @minefield.flag_at(0, 0)
94
+ assert_equal('F', @minefield.to_s)
95
+ end
96
+
97
+ def test_unflagging_a_cell_at_an_invalid_position_raises_error
98
+ assert_raise(RangeError) { Minefield.new(1).unflag_at(1, 1) }
99
+ end
100
+
101
+ def test_unflagging_a_cell_should_change_its_state
102
+ @minefield = Minefield.new(1)
103
+ @minefield.flag_at(0, 0)
104
+ @minefield.unflag_at(0, 0)
105
+ assert_equal('H', @minefield.to_s)
106
+ end
107
+
108
+ def test_when_player_flags_a_cell_then_player_doesnt_win_if_it_is_not_the_last_remaining_mined_cell
109
+ @minefield = Minefield.new(2)
110
+ assert_nothing_raised(MinefieldSolvedError) { @minefield.flag_at(0, 0) }
111
+ end
112
+
113
+ def test_when_player_flags_a_cell_then_player_wins_the_game_if_it_is_the_last_remaining_mined_cell
114
+ @minefield = Minefield.new(1)
115
+ @minefield.hide_mine_at(0,0)
116
+ assert_raise(MinefieldSolvedError) { @minefield.flag_at(0,0) }
117
+ end
118
+ end
119
+ end
120
+ end
121
+
@@ -0,0 +1,4 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'test/unit'
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minesweeper-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Sebastien Varlet
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: This gem defines the core classes of a minesweeper game such as Minefield,
98
+ Cell, and Mine.
99
+ email:
100
+ - sebastien.varlet@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - .coveralls.yml
106
+ - .gitignore
107
+ - .travis.yml
108
+ - Gemfile
109
+ - Guardfile
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - lib/minesweeper/core.rb
114
+ - lib/minesweeper/core/elements/cell.rb
115
+ - lib/minesweeper/core/elements/cell_state.rb
116
+ - lib/minesweeper/core/elements/flagged_state.rb
117
+ - lib/minesweeper/core/elements/hidden_state.rb
118
+ - lib/minesweeper/core/elements/revealed_state.rb
119
+ - lib/minesweeper/core/explosives/explosion_error.rb
120
+ - lib/minesweeper/core/explosives/mine.rb
121
+ - lib/minesweeper/core/explosives/mine_coordinates.rb
122
+ - lib/minesweeper/core/explosives/mine_coordinates_factory.rb
123
+ - lib/minesweeper/core/explosives/mine_layer.rb
124
+ - lib/minesweeper/core/explosives/null_mine.rb
125
+ - lib/minesweeper/core/minefield.rb
126
+ - lib/minesweeper/core/minefield_solved_error.rb
127
+ - lib/minesweeper/core/version.rb
128
+ - minesweeper.gemspec
129
+ - test/minesweeper/core/elements/cell_state_spy.rb
130
+ - test/minesweeper/core/elements/cell_test.rb
131
+ - test/minesweeper/core/elements/flagged_state_test.rb
132
+ - test/minesweeper/core/elements/hidden_state_test.rb
133
+ - test/minesweeper/core/elements/revealed_state_test.rb
134
+ - test/minesweeper/core/explosives/mine_coordinates_factory_test.rb
135
+ - test/minesweeper/core/explosives/mine_coordinates_test.rb
136
+ - test/minesweeper/core/explosives/mine_layer_test.rb
137
+ - test/minesweeper/core/explosives/mine_spy.rb
138
+ - test/minesweeper/core/explosives/mine_test.rb
139
+ - test/minesweeper/core/explosives/null_mine_test.rb
140
+ - test/minesweeper/core/minefield_test.rb
141
+ - test/test_helper.rb
142
+ homepage: https://github.com/svarlet/minesweeper
143
+ licenses:
144
+ - MIT
145
+ metadata: {}
146
+ post_install_message:
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubyforge_project:
162
+ rubygems_version: 2.4.5
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: Core model of the minesweeper game.
166
+ test_files:
167
+ - test/minesweeper/core/elements/cell_state_spy.rb
168
+ - test/minesweeper/core/elements/cell_test.rb
169
+ - test/minesweeper/core/elements/flagged_state_test.rb
170
+ - test/minesweeper/core/elements/hidden_state_test.rb
171
+ - test/minesweeper/core/elements/revealed_state_test.rb
172
+ - test/minesweeper/core/explosives/mine_coordinates_factory_test.rb
173
+ - test/minesweeper/core/explosives/mine_coordinates_test.rb
174
+ - test/minesweeper/core/explosives/mine_layer_test.rb
175
+ - test/minesweeper/core/explosives/mine_spy.rb
176
+ - test/minesweeper/core/explosives/mine_test.rb
177
+ - test/minesweeper/core/explosives/null_mine_test.rb
178
+ - test/minesweeper/core/minefield_test.rb
179
+ - test/test_helper.rb