toy 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.
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ module Toy
4
+ class Unit
5
+ attr_reader :table, :x, :y, :object
6
+
7
+ def initialize(table=Table.new, x, y)
8
+ raise Error::CoordinateError unless x.is_a?(Fixnum)
9
+ raise Error::CoordinateError unless y.is_a?(Fixnum)
10
+ raise Error::TableError unless table.is_a?(Table)
11
+
12
+ @table = table
13
+ @x = x
14
+ @y = y
15
+ @object = nil
16
+ end
17
+
18
+ def hold!(object)
19
+ @object = object
20
+ end
21
+
22
+ def release!
23
+ @object = nil
24
+ end
25
+
26
+ def available?
27
+ @object.nil?
28
+ end
29
+
30
+ module Error
31
+ class CoordinateError < ArgumentError
32
+ def message
33
+ 'Coordinates must be of type Fixnum!'
34
+ end
35
+ end
36
+
37
+ class TableError < ArgumentError
38
+ def message
39
+ 'Table must be of type Table!'
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ module Toy
4
+ class UnitCollection
5
+ attr_reader :all
6
+
7
+ def initialize(direction=Toy::Direction)
8
+ @all = []
9
+ @direction = direction
10
+ end
11
+
12
+ def add(unit)
13
+ raise Error::UnitError unless unit.is_a?(Unit)
14
+
15
+ @all << unit
16
+ end
17
+
18
+ def find_by_coordinates(x, y)
19
+ @all.find { |unit| unit.x == x && unit.y == y }
20
+ end
21
+
22
+ def find_by_object(object)
23
+ @all.find { |unit| unit.object == object }
24
+ end
25
+
26
+ def find_north_of(x, y)
27
+ @all.find { |unit| unit.x == x && unit.y == y.succ }
28
+ end
29
+
30
+ def find_east_of(x, y)
31
+ @all.find { |unit| unit.x == x.succ && unit.y == y }
32
+ end
33
+
34
+ def find_south_of(x, y)
35
+ @all.find { |unit| unit.x == x && unit.y == y.pred }
36
+ end
37
+
38
+ def find_west_of(x, y)
39
+ @all.find { |unit| unit.x == x.pred && unit.y == y }
40
+ end
41
+
42
+ def find_by_direction_of(x, y, direction)
43
+ raise Error::DirectionError unless @direction::DIRECTION.include?(direction)
44
+
45
+ send("find_#{direction}_of", x, y)
46
+ end
47
+
48
+ module Error
49
+ class UnitError < ArgumentError
50
+ def message
51
+ 'Argument must be of type Unit!'
52
+ end
53
+ end
54
+
55
+ class DirectionError < ArgumentError
56
+ def message
57
+ 'Invalid direction!'
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module Toy
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,162 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Toy::Controller do
6
+ let(:controller) { Toy::Controller.new }
7
+
8
+ describe '#start' do
9
+ context 'on invalid command' do
10
+ before { allow(controller).to receive(:gets).and_return('INVALID', 'STOP') }
11
+
12
+ specify do
13
+ expect { controller.start }.to output("Invalid command! Type HELP for list of available commands.\n").to_stdout
14
+ end
15
+ end
16
+
17
+ context 'on HELP' do
18
+ before { allow(controller).to receive(:gets).and_return('HELP', 'STOP') }
19
+
20
+ specify do
21
+ expect { controller.start }.to output("Available commands: STOP HELP PLACE MOVE LEFT RIGHT REPORT\n").to_stdout
22
+ end
23
+ end
24
+
25
+ context 'on PLACE' do
26
+ context 'when valid arguments' do
27
+ before { allow(controller).to receive(:gets).and_return('PLACE 1,1,NORTH', 'STOP') }
28
+
29
+ specify do
30
+ controller.start
31
+ expect(controller.robot.position).to eq([1, 1, :north])
32
+ end
33
+ end
34
+
35
+ context 'when invalid coordinates' do
36
+ before { allow(controller).to receive(:gets).and_return('PLACE 1,INVALID,NORTH', 'STOP') }
37
+
38
+ specify do
39
+ expect { controller.start }.to output("Coordinates must be of type Fixnum!\n").to_stdout
40
+ end
41
+ end
42
+
43
+ context 'when invalid direciton' do
44
+ before { allow(controller).to receive(:gets).and_return('PLACE 1,1,INVALID', 'STOP') }
45
+
46
+ specify do
47
+ expect { controller.start }.to output("Invalid direction!\n").to_stdout
48
+ end
49
+ end
50
+
51
+ context 'when invalid arguments' do
52
+ before { allow(controller).to receive(:gets).and_return('PLACE 1,INVALID', 'STOP') }
53
+
54
+ specify do
55
+ expect { controller.start }.to output("Invalid placement arguments!\n").to_stdout
56
+ end
57
+ end
58
+
59
+ context 'when unit is taken' do
60
+ before { allow(controller).to receive(:gets).and_return('PLACE 1,1,NORTH','PLACE 1,1,NORTH', 'STOP') }
61
+
62
+ specify do
63
+ expect { controller.start }.to output("Not available!\n").to_stdout
64
+ end
65
+ end
66
+
67
+ context 'when unit is not non-existant' do
68
+ before { allow(controller).to receive(:gets).and_return('PLACE 12,12,NORTH', 'STOP') }
69
+
70
+ specify do
71
+ expect { controller.start }.to output("Not available!\n").to_stdout
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'on MOVE' do
77
+ before { allow(controller).to receive(:gets).and_return('MOVE', 'STOP') }
78
+
79
+ context 'when placed' do
80
+ context 'when unit is available' do
81
+ before { controller.robot.place(0, 0, :north) }
82
+
83
+ specify do
84
+ controller.start
85
+ expect(controller.robot.position).to eq([0, 1, :north])
86
+ end
87
+ end
88
+
89
+ context 'when unit is not available' do
90
+ before { controller.robot.place(0, 0, :south) }
91
+
92
+ specify do
93
+ controller.start
94
+ expect(controller.robot.position).to eq([0, 0, :south])
95
+ end
96
+ end
97
+ end
98
+
99
+ context 'when not placed' do
100
+ specify do
101
+ expect { controller.start }.to output("Robot is not placed!\n").to_stdout
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'on LEFT' do
107
+ before { allow(controller).to receive(:gets).and_return('LEFT', 'STOP') }
108
+
109
+ context 'when placed' do
110
+ before { controller.robot.place(0, 0, :north) }
111
+
112
+ specify do
113
+ controller.start
114
+ expect(controller.robot.facing).to eq(:west)
115
+ end
116
+ end
117
+
118
+ context 'when not placed' do
119
+ specify do
120
+ expect { controller.start }.to output("Robot is not placed!\n").to_stdout
121
+ end
122
+ end
123
+ end
124
+
125
+ context 'on RIGHT' do
126
+ before { allow(controller).to receive(:gets).and_return('RIGHT', 'STOP') }
127
+
128
+ context 'when placed' do
129
+ before { controller.robot.place(0, 0, :north) }
130
+
131
+ specify do
132
+ controller.start
133
+ expect(controller.robot.facing).to eq(:east)
134
+ end
135
+ end
136
+
137
+ context 'when not placed' do
138
+ specify do
139
+ expect { controller.start }.to output("Robot is not placed!\n").to_stdout
140
+ end
141
+ end
142
+ end
143
+
144
+ context 'on REPORT' do
145
+ before { allow(controller).to receive(:gets).and_return('REPORT', 'STOP') }
146
+
147
+ context 'when placed' do
148
+ before { controller.robot.place(0, 0, :north) }
149
+
150
+ specify do
151
+ expect { controller.start }.to output("0,0,NORTH\n").to_stdout
152
+ end
153
+ end
154
+
155
+ context 'when not placed' do
156
+ specify do
157
+ expect { controller.start }.to output("Robot is not placed!\n").to_stdout
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Toy::Direction do
6
+ let(:direction) { Toy::Direction }
7
+
8
+ describe '.rotate_left' do
9
+ context 'when valid arguments' do
10
+ specify { expect(direction.rotate_left(:north)).to eq(:west) }
11
+ specify { expect(direction.rotate_left(:east)).to eq(:north) }
12
+ end
13
+
14
+ context 'when invalid arguments' do
15
+ specify do
16
+ expect { direction.rotate_left(:invalid) }.to \
17
+ raise_error Toy::Direction::Error::DirectionError, 'Invalid direction!'
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '.rotate_right' do
23
+ context 'when valid arguments' do
24
+ specify { expect(direction.rotate_right(:west)).to eq(:north) }
25
+ specify { expect(direction.rotate_right(:east)).to eq(:south) }
26
+ end
27
+
28
+ context 'when invalid arguments' do
29
+ specify do
30
+ expect { direction.rotate_right(:invalid) }.to \
31
+ raise_error Toy::Direction::Error::DirectionError, 'Invalid direction!'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,143 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Toy::Robot do
6
+ let(:robot) { Toy::Robot.new }
7
+
8
+ describe '#facing' do
9
+ context 'when placed' do
10
+ before { robot.place(0, 0, :north) }
11
+
12
+ specify { expect(robot.facing).to eq(:north) }
13
+ end
14
+
15
+ context 'when not placed' do
16
+ specify { expect(robot.facing).to eq(nil) }
17
+ end
18
+ end
19
+
20
+ describe '#table' do
21
+ specify { expect(robot.table.is_a?(Table)).to eq(true) }
22
+ end
23
+
24
+ describe '#place' do
25
+ context 'when valid arguments' do
26
+ before { robot.place(0, 0, :north) }
27
+
28
+ specify { expect(robot.facing).to eq(:north) }
29
+ specify { expect(robot.position).to eq([0, 0, :north]) }
30
+ end
31
+
32
+ context 'when invalid direction' do
33
+ specify do
34
+ expect { robot.place(0, 0, :invalid) }.to \
35
+ raise_error Toy::Direction::Error::DirectionError, 'Invalid direction!'
36
+ end
37
+ end
38
+
39
+ context 'when invalid coordinate' do
40
+ specify do
41
+ expect { robot.place(:invalid, 0, :north) }.to \
42
+ raise_error(Toy::Unit::Error::CoordinateError, 'Coordinates must be of type Fixnum!')
43
+ end
44
+
45
+ specify do
46
+ expect { robot.place(0, :invalid, :north) }.to \
47
+ raise_error(Toy::Unit::Error::CoordinateError, 'Coordinates must be of type Fixnum!')
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#placed?' do
53
+ context 'when placed' do
54
+ before { robot.place(0, 0, :north) }
55
+
56
+ specify { expect(robot.placed?).to eq(true) }
57
+ end
58
+
59
+ context 'when not placed' do
60
+ specify { expect(robot.placed?).to eq(false) }
61
+ end
62
+ end
63
+
64
+ describe '#position' do
65
+ context 'when placed' do
66
+ before { robot.place(0, 0, :north) }
67
+
68
+ specify { expect(robot.position).to eq([0, 0, :north]) }
69
+ end
70
+
71
+ context 'when not placed' do
72
+ specify do
73
+ expect { robot.position }.to \
74
+ raise_error(Toy::Robot::Error::PlacementError, 'Robot is not placed!')
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#move!' do
80
+ context 'when placed' do
81
+ context 'when target unit is available' do
82
+ before do
83
+ robot.place(0, 0, :north)
84
+ robot.move!
85
+ end
86
+
87
+ specify { expect(robot.position).to eq([0, 1, :north]) }
88
+ end
89
+
90
+ context 'when target unit is not available' do
91
+ before do
92
+ robot.place(0, 0, :south)
93
+ robot.move!
94
+ end
95
+
96
+ specify { expect(robot.position).to eq([0, 0, :south]) }
97
+ end
98
+ end
99
+
100
+ context 'when not placed' do
101
+ specify do
102
+ expect { robot.move! }.to \
103
+ raise_error(Toy::Robot::Error::PlacementError, 'Robot is not placed!')
104
+ end
105
+ end
106
+ end
107
+
108
+ describe '#turn_left!' do
109
+ context 'when placed' do
110
+ before do
111
+ robot.place(0, 0, :north)
112
+ robot.turn_left!
113
+ end
114
+
115
+ specify { expect(robot.position).to eq([0, 0, :west]) }
116
+ end
117
+
118
+ context 'when not placed' do
119
+ specify do
120
+ expect { robot.turn_left! }.to \
121
+ raise_error(Toy::Robot::Error::PlacementError, 'Robot is not placed!')
122
+ end
123
+ end
124
+ end
125
+
126
+ describe '#turn_right!' do
127
+ context 'when placed' do
128
+ before do
129
+ robot.place(0, 0, :north)
130
+ robot.turn_right!
131
+ end
132
+
133
+ specify { expect(robot.position).to eq([0, 0, :east]) }
134
+ end
135
+
136
+ context 'when not placed' do
137
+ specify do
138
+ expect { robot.turn_right! }.to \
139
+ raise_error(Toy::Robot::Error::PlacementError, 'Robot is not placed!')
140
+ end
141
+ end
142
+ end
143
+ end