-
Notifications
You must be signed in to change notification settings - Fork 0
/
spec_game_of_life.rb
211 lines (194 loc) · 7.72 KB
/
spec_game_of_life.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#this is the spec file for the game
require 'rspec'
require_relative 'game_of_life.rb'
RSpec.describe World do
context 'Creating a new World' do
world = World.new
cell = Cell.new(1,1)
it 'should create a new world object' do
expect(world.is_a?(World)).to eq true
end
it 'should respond to proper methods' do
expect(world.respond_to?(:rows)).to eq true
expect(world.respond_to?(:cols)).to eq true
expect(world.respond_to?(:cell_grid)).to eq true
expect(world.respond_to?(:live_neighbours_around_cell)).to eq true
expect(world.respond_to?(:cells)).to eq true
expect(world.respond_to?(:randomly_populate)).to eq true
expect(world.respond_to?(:live_cells)).to eq true
end
it 'should create proper cell grid on initilization' do
expect(world.cell_grid.is_a?(Array)).to eq true
world.cell_grid.each do |row|
expect(row.is_a?(Array)).to eq true
row.each do |col|
expect(col.is_a?(Cell)).to eq true
end
end
end
it 'should add all the cells to cells array' do
expect(world.cells.count).to eq 9
end
it 'should detect a neighbour to the north' do
expect(world.cell_grid[0][1]) == be_dead
world.cell_grid[0][1].alive = true
expect(world.cell_grid[0][1]) == be_alive
expect(world.live_neighbours_around_cell(world.cell_grid[1][1]).count).to eq 1
world.cell_grid[0][1].alive = false
end
it 'should detect a neighbour to the Noth-east' do
world.cell_grid[cell.y-1][cell.x+1].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y-1][cell.x+1].alive = false
end
it 'should detect a neighbour to the east' do
world.cell_grid[cell.y][cell.x+1].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y][cell.x+1].alive = false
end
it 'should detect a neighbour to the South-east' do
world.cell_grid[cell.y+1][cell.x+1].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y+1][cell.x+1].alive = false
end
it 'should detect a neighbour to the Souht' do
world.cell_grid[cell.y+1][cell.x].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y+1][cell.x].alive = false
end
it 'should detect a neighbour to the South-weast' do
world.cell_grid[cell.y+1][cell.x-1].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y+1][cell.x-1].alive = false
end
it 'should detect a neighbour to the Weast' do
world.cell_grid[cell.y][cell.x-1].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y][cell.x-1].alive = false
end
it 'should detect a neighbour to the Noth-weast' do
world.cell_grid[cell.y-1][cell.x-1].alive = true
expect(world.live_neighbours_around_cell(cell).count).to eq 1
world.cell_grid[cell.y-1][cell.x-1].alive = false
end
it 'should randomly populate the world' do
world = World.new
expect(world.live_cells.count).to eq 0
world.randomly_populate
expect(world.live_cells.count).not_to be_zero
end
end
end
RSpec.describe Cell do
context 'Creating a new cell' do
cell = Cell.new
it 'should create a new cell object' do
expect(cell.is_a?(Cell)).to eq true
end
it 'should respond to proper methods' do
expect(cell.respond_to?(:alive)).to eq true
expect(cell.respond_to?(:x)).to eq true
expect(cell.respond_to?(:y)).to eq true
expect(cell.respond_to?(:alive?)).to eq true
expect(cell.respond_to?(:die!)).to eq true
expect(cell.respond_to?(:live!)).to eq true
end
it 'should initialize properly' do
expect(cell.alive).to eq false
expect(cell.x) == 0
expect(cell.y) == 0
end
end
end
RSpec.describe Game do
let!(:world) {World.new}
context 'game context'do
game = Game.new
it 'should create a new Game object'do
expect(game.is_a?(Game)).to eq true
end
it 'should respond to proper methods'do
expect(game.respond_to?(:world)).to eq true
expect(game.respond_to?(:seeds)).to eq true
end
it 'should initialize properly' do
expect(game.world.is_a?(World)).to eq true
expect(game.seeds.is_a?(Array)).to eq true
end
it 'should plant seeds properly' do
game = Game.new(world, [[1,2],[0,2]])
expect(world.cell_grid[1][2].alive?).to eq true
expect(world.cell_grid[0][2].alive?).to eq true
end
end
context 'rules context' do
game = Game.new
context 'Rule 1: Any live cell with fewer than two live neighbours dies, as if by underpopulation' do
it 'should kill a live cell with no live neighbours' do
world = World.new
game = Game.new
game.world.cell_grid[1][1].alive = true
expect(game.world.cell_grid[1][1].alive?).to eq true
game.tick!
expect(game.world.cell_grid[1][1].alive?).to eq false
end
it 'should kill a live cell with 1 live neighbours'do
world = World.new
game = Game.new(world,[[1,0],[2,0]])
game.tick!
expect(world.cell_grid[1][0].alive?).to eq false
expect(world.cell_grid[2][0].alive?).to eq false
end
it 'doesnt kill live cell with 2 live neighbours' do
world = World.new
game = Game.new(world,[[2,0],[1,1],[2,2]])
game.tick!
expect(world.cell_grid[1][1].alive?).to eq true
expect(world.cell_grid[2][0].alive?).to eq false
expect(world.cell_grid[2][2].alive?).to eq false
end
end
context 'Rule 2:Any live cell with two or three live neighbours lives on to the next generation.' do
it 'should keep a live cell with 2 neighbours' do
world = World.new
game = Game.new(world,[[0,1],[1,1],[2,1]])
expect(world.live_neighbours_around_cell(world.cell_grid[1][1]).count) == 2
game.tick!
expect(world.cell_grid[1][1].alive?).to eq true
expect(world.cell_grid[0][1].alive?).to eq false
expect(world.cell_grid[2][1].alive?).to eq false
end
it 'should keep a live cell with 3 neighbours' do
world = World.new
game = Game.new(world,[[0,1],[1,1],[2,1],[2,2]])
expect(world.live_neighbours_around_cell(world.cell_grid[1][1]).count) == 2
game.tick!
expect(world.cell_grid[1][1].alive?).to eq true
expect(world.cell_grid[0][1].alive?).to eq false
expect(world.cell_grid[2][1].alive?).to eq true
expect(world.cell_grid[2][2].alive?).to eq true
end
end
context 'Rule 3: Any live cell with more than three live neighbours dies, as if by overpopulation.' do
it 'should kill a live cell with more than 3 live neighbours' do
world = World.new
game = Game.new(world,[[0,0],[1,1],[1,0],[2,0],[2,2]])
game.tick!
expect(world.cell_grid[1][1].alive?).to eq false
expect(world.cell_grid[0][0].alive?).to eq true
expect(world.cell_grid[1][0].alive?).to eq true
expect(world.cell_grid[2][2].alive?).to eq false
expect(world.cell_grid[2][0].alive?).to eq true
end
end
context 'Rule 4: Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.' do
it 'should become live a cell with exactly 3 live neighbours' do
world = World.new
game = Game.new(world,[[0,1],[1,1],[2,1]])
game.tick!
expect(world.cell_grid[1][0].alive?).to eq true
expect(world.cell_grid[1][2].alive?).to eq true
end
end
end
end