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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +20 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Guardfile +30 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +11 -0
- data/lib/minesweeper/core.rb +6 -0
- data/lib/minesweeper/core/elements/cell.rb +57 -0
- data/lib/minesweeper/core/elements/cell_state.rb +16 -0
- data/lib/minesweeper/core/elements/flagged_state.rb +21 -0
- data/lib/minesweeper/core/elements/hidden_state.rb +21 -0
- data/lib/minesweeper/core/elements/revealed_state.rb +12 -0
- data/lib/minesweeper/core/explosives/explosion_error.rb +10 -0
- data/lib/minesweeper/core/explosives/mine.rb +14 -0
- data/lib/minesweeper/core/explosives/mine_coordinates.rb +27 -0
- data/lib/minesweeper/core/explosives/mine_coordinates_factory.rb +21 -0
- data/lib/minesweeper/core/explosives/mine_layer.rb +32 -0
- data/lib/minesweeper/core/explosives/null_mine.rb +12 -0
- data/lib/minesweeper/core/minefield.rb +118 -0
- data/lib/minesweeper/core/minefield_solved_error.rb +7 -0
- data/lib/minesweeper/core/version.rb +6 -0
- data/minesweeper.gemspec +27 -0
- data/test/minesweeper/core/elements/cell_state_spy.rb +35 -0
- data/test/minesweeper/core/elements/cell_test.rb +82 -0
- data/test/minesweeper/core/elements/flagged_state_test.rb +42 -0
- data/test/minesweeper/core/elements/hidden_state_test.rb +41 -0
- data/test/minesweeper/core/elements/revealed_state_test.rb +34 -0
- data/test/minesweeper/core/explosives/mine_coordinates_factory_test.rb +57 -0
- data/test/minesweeper/core/explosives/mine_coordinates_test.rb +37 -0
- data/test/minesweeper/core/explosives/mine_layer_test.rb +109 -0
- data/test/minesweeper/core/explosives/mine_spy.rb +14 -0
- data/test/minesweeper/core/explosives/mine_test.rb +16 -0
- data/test/minesweeper/core/explosives/null_mine_test.rb +15 -0
- data/test/minesweeper/core/minefield_test.rb +121 -0
- data/test/test_helper.rb +4 -0
- metadata +179 -0
@@ -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
|
+
|
data/test/test_helper.rb
ADDED
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
|