loco_bot 1.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/.gitignore +14 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +393 -0
- data/Rakefile +9 -0
- data/bin/loco_bot_cli +10 -0
- data/lib/loco_bot/cli/command/base.rb +28 -0
- data/lib/loco_bot/cli/command/hodor.rb +14 -0
- data/lib/loco_bot/cli/command/left.rb +14 -0
- data/lib/loco_bot/cli/command/move.rb +14 -0
- data/lib/loco_bot/cli/command/place.rb +17 -0
- data/lib/loco_bot/cli/command/report.rb +18 -0
- data/lib/loco_bot/cli/command/right.rb +14 -0
- data/lib/loco_bot/cli/command.rb +34 -0
- data/lib/loco_bot/cli.rb +67 -0
- data/lib/loco_bot/robot/direction/east.rb +37 -0
- data/lib/loco_bot/robot/direction/north.rb +37 -0
- data/lib/loco_bot/robot/direction/south.rb +37 -0
- data/lib/loco_bot/robot/direction/west.rb +37 -0
- data/lib/loco_bot/robot/direction.rb +27 -0
- data/lib/loco_bot/robot.rb +102 -0
- data/lib/loco_bot/table.rb +94 -0
- data/lib/loco_bot/version.rb +4 -0
- data/lib/loco_bot.rb +8 -0
- data/loco_bot.gemspec +26 -0
- data/spec/loco_bot/cli/command/hodor_spec.rb +14 -0
- data/spec/loco_bot/cli/command/left_spec.rb +14 -0
- data/spec/loco_bot/cli/command/move_spec.rb +14 -0
- data/spec/loco_bot/cli/command/place_spec.rb +14 -0
- data/spec/loco_bot/cli/command/report_spec.rb +22 -0
- data/spec/loco_bot/cli/command/right_spec.rb +14 -0
- data/spec/loco_bot/cli/command_spec.rb +53 -0
- data/spec/loco_bot/cli_spec.rb +37 -0
- data/spec/loco_bot/robot/direction/east_spec.rb +25 -0
- data/spec/loco_bot/robot/direction/north_spec.rb +25 -0
- data/spec/loco_bot/robot/direction/south_spec.rb +25 -0
- data/spec/loco_bot/robot/direction/west_spec.rb +25 -0
- data/spec/loco_bot/robot/direction_spec.rb +35 -0
- data/spec/loco_bot/robot_spec.rb +247 -0
- data/spec/loco_bot/table_spec.rb +197 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/support/test_1.txt +3 -0
- data/spec/support/test_2.txt +3 -0
- data/spec/support/test_3.txt +6 -0
- data/spec/support/test_4.txt +28 -0
- metadata +183 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
RSpec.describe LocoBot::Robot::Direction::East do
|
2
|
+
describe '.left' do
|
3
|
+
subject { described_class.left }
|
4
|
+
|
5
|
+
it { is_expected.to eql LocoBot::Robot::Direction::North }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.right' do
|
9
|
+
subject { described_class.right }
|
10
|
+
|
11
|
+
it { is_expected.to eql LocoBot::Robot::Direction::South }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.label' do
|
15
|
+
subject { described_class.label }
|
16
|
+
|
17
|
+
it { is_expected.to eql 'EAST' }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.coordinates' do
|
21
|
+
subject { described_class.coordinates(21, 17) }
|
22
|
+
|
23
|
+
it { is_expected.to eql({ x: 22, y: 17 }) }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
RSpec.describe LocoBot::Robot::Direction::North do
|
2
|
+
describe '.left' do
|
3
|
+
subject { described_class.left }
|
4
|
+
|
5
|
+
it { is_expected.to eql LocoBot::Robot::Direction::West }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.right' do
|
9
|
+
subject { described_class.right }
|
10
|
+
|
11
|
+
it { is_expected.to eql LocoBot::Robot::Direction::East }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.label' do
|
15
|
+
subject { described_class.label }
|
16
|
+
|
17
|
+
it { is_expected.to eql 'NORTH' }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.coordinates' do
|
21
|
+
subject { described_class.coordinates(21, 17) }
|
22
|
+
|
23
|
+
it { is_expected.to eql({ x: 21, y: 18 }) }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
RSpec.describe LocoBot::Robot::Direction::South do
|
2
|
+
describe '.left' do
|
3
|
+
subject { described_class.left }
|
4
|
+
|
5
|
+
it { is_expected.to eql LocoBot::Robot::Direction::East }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.right' do
|
9
|
+
subject { described_class.right }
|
10
|
+
|
11
|
+
it { is_expected.to eql LocoBot::Robot::Direction::West }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.label' do
|
15
|
+
subject { described_class.label }
|
16
|
+
|
17
|
+
it { is_expected.to eql 'SOUTH' }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.coordinates' do
|
21
|
+
subject { described_class.coordinates(21, 17) }
|
22
|
+
|
23
|
+
it { is_expected.to eql({ x: 21, y: 16 }) }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
RSpec.describe LocoBot::Robot::Direction::West do
|
2
|
+
describe '.left' do
|
3
|
+
subject { described_class.left }
|
4
|
+
|
5
|
+
it { is_expected.to eql LocoBot::Robot::Direction::South }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.right' do
|
9
|
+
subject { described_class.right }
|
10
|
+
|
11
|
+
it { is_expected.to eql LocoBot::Robot::Direction::North }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.label' do
|
15
|
+
subject { described_class.label }
|
16
|
+
|
17
|
+
it { is_expected.to eql 'WEST' }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.coordinates' do
|
21
|
+
subject { described_class.coordinates(21, 17) }
|
22
|
+
|
23
|
+
it { is_expected.to eql({ x: 20, y: 17 }) }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
RSpec.describe LocoBot::Robot::Direction do
|
2
|
+
describe '.list' do
|
3
|
+
subject { described_class.list }
|
4
|
+
|
5
|
+
it { is_expected.to eql ['East', 'North', 'South', 'West'] }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.from_name' do
|
9
|
+
subject { described_class.from_name(direction) }
|
10
|
+
|
11
|
+
context 'passing :north' do
|
12
|
+
let(:direction) { :north }
|
13
|
+
|
14
|
+
it { is_expected.to eql LocoBot::Robot::Direction::North }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'passing :east' do
|
18
|
+
let(:direction) { :east }
|
19
|
+
|
20
|
+
it { is_expected.to eql LocoBot::Robot::Direction::East }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'passing :south' do
|
24
|
+
let(:direction) { :south }
|
25
|
+
|
26
|
+
it { is_expected.to eql LocoBot::Robot::Direction::South }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'passing :west' do
|
30
|
+
let(:direction) { :west }
|
31
|
+
|
32
|
+
it { is_expected.to eql LocoBot::Robot::Direction::West }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
RSpec.describe LocoBot::Robot do
|
2
|
+
let(:robot) { described_class.new }
|
3
|
+
let(:table) { LocoBot::Table.new(20, 20) }
|
4
|
+
|
5
|
+
describe '#place' do
|
6
|
+
subject { robot }
|
7
|
+
|
8
|
+
it 'calls Table#place_robot' do
|
9
|
+
expect(table).to receive(:place_robot).with(subject, 9, 3, LocoBot::Robot::Direction::East).once
|
10
|
+
|
11
|
+
subject.place(table, 9, 3, LocoBot::Robot::Direction::East)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#remove' do
|
16
|
+
subject { robot.remove }
|
17
|
+
|
18
|
+
context 'when placed on a table' do
|
19
|
+
before { robot.place(table, 6, 17, LocoBot::Robot::Direction::East) }
|
20
|
+
|
21
|
+
it 'calls Table#remove_robot' do
|
22
|
+
expect(table).to receive(:remove_robot).with(robot).once
|
23
|
+
|
24
|
+
subject
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when not placed on a table' do
|
29
|
+
it { expect(subject).to be false }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#move' do
|
34
|
+
subject { robot }
|
35
|
+
|
36
|
+
before { robot.place(table, x, y, direction) }
|
37
|
+
|
38
|
+
context 'facing north' do
|
39
|
+
let(:direction) { LocoBot::Robot::Direction::North }
|
40
|
+
let(:x) { 10 }
|
41
|
+
|
42
|
+
context 'when movement is possible' do
|
43
|
+
let(:y) { 0 }
|
44
|
+
|
45
|
+
it 'moves north' do
|
46
|
+
expect { subject.move }.to change { subject.y }.to(1)
|
47
|
+
expect { subject.move }.not_to change { subject.x }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when movement is not possible' do
|
52
|
+
let(:y) { 19 }
|
53
|
+
|
54
|
+
it 'does not move' do
|
55
|
+
expect { subject.move }.not_to change { subject.x }
|
56
|
+
expect { subject.move }.not_to change { subject.y }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'facing south' do
|
62
|
+
let(:direction) { LocoBot::Robot::Direction::South }
|
63
|
+
let(:x) { 10 }
|
64
|
+
|
65
|
+
context 'when movement is possible' do
|
66
|
+
let(:y) { 19 }
|
67
|
+
|
68
|
+
it 'moves south' do
|
69
|
+
expect { subject.move }.to change { subject.y }.to(18)
|
70
|
+
expect { subject.move }.not_to change { subject.x }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when movement is not possible' do
|
75
|
+
let(:y) { 0 }
|
76
|
+
|
77
|
+
it 'does not move' do
|
78
|
+
expect { subject.move }.not_to change { subject.x }
|
79
|
+
expect { subject.move }.not_to change { subject.y }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'facing east' do
|
85
|
+
let(:direction) { LocoBot::Robot::Direction::East }
|
86
|
+
let(:y) { 10 }
|
87
|
+
|
88
|
+
context 'when movement is possible' do
|
89
|
+
let(:x) { 0 }
|
90
|
+
|
91
|
+
it 'moves east' do
|
92
|
+
expect { subject.move }.to change { subject.x }.to(1)
|
93
|
+
expect { subject.move }.not_to change { subject.y }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when movement is not possible' do
|
98
|
+
let(:x) { 19 }
|
99
|
+
|
100
|
+
it 'does not move' do
|
101
|
+
expect { subject.move }.not_to change { subject.x }
|
102
|
+
expect { subject.move }.not_to change { subject.y }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'facing west' do
|
108
|
+
let(:direction) { LocoBot::Robot::Direction::West }
|
109
|
+
let(:y) { 10 }
|
110
|
+
|
111
|
+
context 'when movement is possible' do
|
112
|
+
let(:x) { 19 }
|
113
|
+
|
114
|
+
it 'moves west' do
|
115
|
+
expect { subject.move }.to change { subject.x }.to(18)
|
116
|
+
expect { subject.move }.not_to change { subject.y }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'when movement is not possible' do
|
121
|
+
let(:x) { 0 }
|
122
|
+
|
123
|
+
it 'does not move' do
|
124
|
+
expect { subject.move }.not_to change { subject.x }
|
125
|
+
expect { subject.move }.not_to change { subject.y }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#turn_left' do
|
132
|
+
subject { robot }
|
133
|
+
|
134
|
+
before { subject.place(table, 10, 10, direction) }
|
135
|
+
|
136
|
+
context 'facing north' do
|
137
|
+
let(:direction) { LocoBot::Robot::Direction::North }
|
138
|
+
|
139
|
+
it { expect { subject.turn_left }.to change { subject.direction }.to LocoBot::Robot::Direction::West }
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'facing south' do
|
143
|
+
let(:direction) { LocoBot::Robot::Direction::South }
|
144
|
+
|
145
|
+
it { expect { subject.turn_left }.to change { subject.direction }.to LocoBot::Robot::Direction::East }
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'facing east' do
|
149
|
+
let(:direction) { LocoBot::Robot::Direction::East }
|
150
|
+
|
151
|
+
it { expect { subject.turn_left }.to change { subject.direction }.to LocoBot::Robot::Direction::North }
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'facing west' do
|
155
|
+
let(:direction) { LocoBot::Robot::Direction::West }
|
156
|
+
|
157
|
+
it { expect { subject.turn_left }.to change { subject.direction }.to LocoBot::Robot::Direction::South }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe '#turn_right' do
|
162
|
+
subject { robot }
|
163
|
+
|
164
|
+
before { subject.place(table, 10, 10, direction) }
|
165
|
+
|
166
|
+
context 'facing north' do
|
167
|
+
let(:direction) { LocoBot::Robot::Direction::North }
|
168
|
+
|
169
|
+
it { expect { subject.turn_right }.to change { subject.direction }.to LocoBot::Robot::Direction::East }
|
170
|
+
end
|
171
|
+
|
172
|
+
context 'facing south' do
|
173
|
+
let(:direction) { LocoBot::Robot::Direction::South }
|
174
|
+
|
175
|
+
it { expect { subject.turn_right }.to change { subject.direction }.to LocoBot::Robot::Direction::West }
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'facing east' do
|
179
|
+
let(:direction) { LocoBot::Robot::Direction::East }
|
180
|
+
|
181
|
+
it { expect { subject.turn_right }.to change { subject.direction }.to LocoBot::Robot::Direction::South }
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'facing west' do
|
185
|
+
let(:direction) { LocoBot::Robot::Direction::West }
|
186
|
+
|
187
|
+
it { expect { subject.turn_right }.to change { subject.direction }.to LocoBot::Robot::Direction::North }
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#report' do
|
192
|
+
subject { robot.report }
|
193
|
+
|
194
|
+
context 'when placed on a table' do
|
195
|
+
before { robot.place(table, 6, 17, LocoBot::Robot::Direction::East) }
|
196
|
+
|
197
|
+
it { is_expected.to eql({x: 6, y: 17, direction: LocoBot::Robot::Direction::East}) }
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'when not placed on a table' do
|
201
|
+
it 'returns an empty Hash' do
|
202
|
+
expect(subject).to be_a Hash
|
203
|
+
expect(subject).to be_empty
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
describe '#hodor!' do
|
209
|
+
it { expect { robot.hodor! }.to output("HODOR HODOR !\n").to_stdout }
|
210
|
+
end
|
211
|
+
|
212
|
+
describe '#next_position' do
|
213
|
+
subject { robot.next_position }
|
214
|
+
|
215
|
+
context 'when not placed on a table' do
|
216
|
+
it { is_expected.to eql({}) }
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'when placed on a table' do
|
220
|
+
before { robot.place(table, 10, 10, direction) }
|
221
|
+
|
222
|
+
context 'facing north' do
|
223
|
+
let(:direction) { LocoBot::Robot::Direction::North }
|
224
|
+
|
225
|
+
it { is_expected.to eql({x: 10, y: 11}) }
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'facing south' do
|
229
|
+
let(:direction) { LocoBot::Robot::Direction::South }
|
230
|
+
|
231
|
+
it { is_expected.to eql({x: 10, y: 9}) }
|
232
|
+
end
|
233
|
+
|
234
|
+
context 'facing east' do
|
235
|
+
let(:direction) { LocoBot::Robot::Direction::East }
|
236
|
+
|
237
|
+
it { is_expected.to eql({x: 11, y: 10}) }
|
238
|
+
end
|
239
|
+
|
240
|
+
context 'facing west' do
|
241
|
+
let(:direction) { LocoBot::Robot::Direction::West }
|
242
|
+
|
243
|
+
it { is_expected.to eql({x: 9, y: 10}) }
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
RSpec.describe LocoBot::Table do
|
2
|
+
describe '#initialize' do
|
3
|
+
subject { described_class.new(width, height) }
|
4
|
+
let(:width) { 8 }
|
5
|
+
let(:height) { 3 }
|
6
|
+
|
7
|
+
it { expect(subject.width).to eql 8 }
|
8
|
+
it { expect(subject.height).to eql 3 }
|
9
|
+
it { expect(subject.robots).to be_empty }
|
10
|
+
|
11
|
+
context 'with an invalid width' do
|
12
|
+
let(:width) { 0 }
|
13
|
+
|
14
|
+
it { expect{ subject }.to(raise_error(ArgumentError)) }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with an invalid height' do
|
18
|
+
let(:height) { -5 }
|
19
|
+
|
20
|
+
it { expect{ subject }.to(raise_error(ArgumentError)) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with an invalid width and height' do
|
24
|
+
let(:width) { -16 }
|
25
|
+
let(:height) { 0 }
|
26
|
+
|
27
|
+
it { expect{ subject }.to(raise_error(ArgumentError)) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#place_robot' do
|
32
|
+
let(:table) { described_class.new(15, 15) }
|
33
|
+
let(:other_table) { described_class.new(10, 10) }
|
34
|
+
let(:robot) { LocoBot::Robot.new }
|
35
|
+
|
36
|
+
before { other_table.place_robot(robot, 5, 7, LocoBot::Robot::Direction::West) }
|
37
|
+
|
38
|
+
context 'with a valid position' do
|
39
|
+
it 'modifies the robot lists' do
|
40
|
+
expect(other_table.robots).to include(robot)
|
41
|
+
expect(table.robots).not_to include(robot)
|
42
|
+
|
43
|
+
table.place_robot(robot, 12, 14, LocoBot::Robot::Direction::South)
|
44
|
+
|
45
|
+
expect(other_table.robots).not_to include(robot)
|
46
|
+
expect(table.robots).to include(robot)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'changes the robot table, x, y and position' do
|
50
|
+
expect(robot.table).to eql other_table
|
51
|
+
expect(robot.x).to eql 5
|
52
|
+
expect(robot.y).to eql 7
|
53
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::West
|
54
|
+
|
55
|
+
table.place_robot(robot, 12, 14, LocoBot::Robot::Direction::South)
|
56
|
+
|
57
|
+
expect(robot.table).to eql table
|
58
|
+
expect(robot.x).to eql 12
|
59
|
+
expect(robot.y).to eql 14
|
60
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::South
|
61
|
+
end
|
62
|
+
|
63
|
+
it { expect(table.place_robot(robot, 12, 14, LocoBot::Robot::Direction::South)).to be true }
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'with an invalid position' do
|
67
|
+
it 'does not modify the robot lists' do
|
68
|
+
expect(other_table.robots).to include(robot)
|
69
|
+
expect(table.robots).not_to include(robot)
|
70
|
+
|
71
|
+
table.place_robot(robot, 617, 9001, LocoBot::Robot::Direction::South)
|
72
|
+
|
73
|
+
expect(other_table.robots).to include(robot)
|
74
|
+
expect(table.robots).not_to include(robot)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'does not change the robot table, x, y and position' do
|
78
|
+
expect(robot.table).to eql other_table
|
79
|
+
expect(robot.x).to eql 5
|
80
|
+
expect(robot.y).to eql 7
|
81
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::West
|
82
|
+
|
83
|
+
table.place_robot(robot, 617, 9001, LocoBot::Robot::Direction::South)
|
84
|
+
|
85
|
+
expect(robot.table).to eql other_table
|
86
|
+
expect(robot.x).to eql 5
|
87
|
+
expect(robot.y).to eql 7
|
88
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::West
|
89
|
+
end
|
90
|
+
|
91
|
+
it { expect(table.place_robot(robot, 617, 9001, LocoBot::Robot::Direction::South)).to be false }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#remove_robot' do
|
96
|
+
let(:table) { described_class.new(10, 10) }
|
97
|
+
let(:robot) { LocoBot::Robot.new }
|
98
|
+
|
99
|
+
before do
|
100
|
+
table.place_robot(LocoBot::Robot.new, 3, 4, LocoBot::Robot::Direction::North)
|
101
|
+
table.place_robot(LocoBot::Robot.new, 1, 8, LocoBot::Robot::Direction::West)
|
102
|
+
LocoBot::Table.new.place_robot(robot, 1, 3, LocoBot::Robot::Direction::South)
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'with a robot on another table' do
|
106
|
+
let(:other_table) { described_class.new(20, 20) }
|
107
|
+
|
108
|
+
before do
|
109
|
+
other_table.place_robot(robot, 1, 3, LocoBot::Robot::Direction::South)
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'does not modify the robot list' do
|
113
|
+
expect(table.robots.count).to eql 2
|
114
|
+
expect(table.robots).not_to include(robot)
|
115
|
+
|
116
|
+
table.remove_robot(robot)
|
117
|
+
|
118
|
+
expect(table.robots.count).to eql 2
|
119
|
+
expect(table.robots).not_to include(robot)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'does not set to nil robot table, x, y and direction' do
|
123
|
+
expect(robot.table).to eql other_table
|
124
|
+
expect(robot.x).to eql 1
|
125
|
+
expect(robot.y).to eql 3
|
126
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::South
|
127
|
+
|
128
|
+
table.remove_robot(robot)
|
129
|
+
|
130
|
+
expect(robot.table).to eql other_table
|
131
|
+
expect(robot.x).to eql 1
|
132
|
+
expect(robot.y).to eql 3
|
133
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::South
|
134
|
+
end
|
135
|
+
|
136
|
+
it { expect(table.remove_robot(robot)).to be false }
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'with the robot on the table' do
|
140
|
+
before { table.place_robot(robot, 5, 3, LocoBot::Robot::Direction::East) }
|
141
|
+
|
142
|
+
it 'removes the robot from the list' do
|
143
|
+
expect(table.robots.count).to eql 3
|
144
|
+
expect(table.robots).to include(robot)
|
145
|
+
|
146
|
+
table.remove_robot(robot)
|
147
|
+
|
148
|
+
expect(table.robots.count).to eql 2
|
149
|
+
expect(table.robots).not_to include(robot)
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'sets to nil robot table, x, y and direction' do
|
153
|
+
expect(robot.table).to eql table
|
154
|
+
expect(robot.x).to eql 5
|
155
|
+
expect(robot.y).to eql 3
|
156
|
+
expect(robot.direction).to eql LocoBot::Robot::Direction::East
|
157
|
+
|
158
|
+
table.remove_robot(robot)
|
159
|
+
|
160
|
+
expect(robot.table).to be_nil
|
161
|
+
expect(robot.x).to be_nil
|
162
|
+
expect(robot.y).to be_nil
|
163
|
+
expect(robot.direction).to be_nil
|
164
|
+
end
|
165
|
+
|
166
|
+
it { expect(table.remove_robot(robot)).to be true }
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe '#position_valid?' do
|
171
|
+
subject { table.position_valid?(x, y) }
|
172
|
+
let(:table) { described_class.new(10, 5) }
|
173
|
+
|
174
|
+
context 'with an out of bounds position' do
|
175
|
+
let(:x) { 5 }
|
176
|
+
let(:y) { 6 }
|
177
|
+
|
178
|
+
it { is_expected.to be false }
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'with an occupied position' do
|
182
|
+
let(:x) { 2 }
|
183
|
+
let(:y) { 3 }
|
184
|
+
|
185
|
+
before { table.place_robot(LocoBot::Robot.new, 2, 3, LocoBot::Robot::Direction::North) }
|
186
|
+
|
187
|
+
it { is_expected.to be false }
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'with a free position within bounds' do
|
191
|
+
let(:x) { 3 }
|
192
|
+
let(:y) { 1 }
|
193
|
+
|
194
|
+
it { is_expected.to be true }
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'codeclimate-test-reporter'
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter "/spec/"
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'loco_bot'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.expect_with :rspec do |expectations|
|
13
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
14
|
+
end
|
15
|
+
|
16
|
+
config.mock_with :rspec do |mocks|
|
17
|
+
mocks.verify_partial_doubles = true
|
18
|
+
end
|
19
|
+
|
20
|
+
config.disable_monkey_patching!
|
21
|
+
|
22
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
23
|
+
# file, and it's useful to allow more verbose output when running an
|
24
|
+
# individual spec file.
|
25
|
+
if config.files_to_run.one?
|
26
|
+
# Use the documentation formatter for detailed output,
|
27
|
+
# unless a formatter has already been configured
|
28
|
+
# (e.g. via a command-line flag).
|
29
|
+
config.default_formatter = 'doc'
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
PLACE 4,4,NORTH
|
2
|
+
MOVE
|
3
|
+
MOVE
|
4
|
+
RIGHT
|
5
|
+
MOVE
|
6
|
+
REPORT
|
7
|
+
|
8
|
+
RIGHT
|
9
|
+
MOVE
|
10
|
+
MOVE
|
11
|
+
RIGHT
|
12
|
+
MOVE
|
13
|
+
MOVE
|
14
|
+
LEFT
|
15
|
+
MOVE
|
16
|
+
REPORT
|
17
|
+
|
18
|
+
PLACE 1,6,WEST
|
19
|
+
REPORT
|
20
|
+
|
21
|
+
PLACE 1,4,WEST
|
22
|
+
MOVE
|
23
|
+
MOVE
|
24
|
+
LEFT
|
25
|
+
MOVE
|
26
|
+
LEFT
|
27
|
+
MOVE
|
28
|
+
REPORT
|