maux_robot 0.0.3 → 0.0.4
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 +4 -4
- data/README.md +2 -0
- data/lib/maux_robot/cli.rb +4 -29
- data/lib/maux_robot/parser.rb +44 -0
- data/lib/maux_robot/position.rb +16 -2
- data/lib/maux_robot/robot.rb +7 -9
- data/lib/maux_robot/version.rb +1 -1
- data/lib/maux_robot.rb +5 -1
- data/spec/maux_robot/cli_spec.rb +4 -53
- data/spec/maux_robot/parser_spec.rb +69 -0
- data/spec/maux_robot/position_spec.rb +10 -10
- data/spec/maux_robot/robot_spec.rb +14 -5
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bf2d0fed313bcc6043144745aa33467fa7c8ab0
|
4
|
+
data.tar.gz: a63febfee434feda427515e282367fb974b223c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f04f82e9a2914420a34898662e02231d4f744bfc6035e51302b091af5058eba85c74beaf32bcb69d0954643494cf9624571ee6ae68cbec58bcb437e75a514213
|
7
|
+
data.tar.gz: 0304f7d1f1110a3ca0b048bce64dc59bbd87087903345c3e97696fe0b42052dcc72d93349084ca66413b319f32514f1b89b10cec330f1bfd40dd59acc3cc7b76
|
data/README.md
CHANGED
data/lib/maux_robot/cli.rb
CHANGED
@@ -4,8 +4,6 @@ module MauxRobot
|
|
4
4
|
|
5
5
|
# The CLI is a class responsible of handling command line interface
|
6
6
|
class CLI
|
7
|
-
ALLOWED_ORDERS = %i[left right move place report].freeze
|
8
|
-
|
9
7
|
attr_reader :robot
|
10
8
|
def initialize
|
11
9
|
@robot = Robot.new
|
@@ -24,38 +22,15 @@ module MauxRobot
|
|
24
22
|
end
|
25
23
|
|
26
24
|
def parse(line_input)
|
27
|
-
|
28
|
-
order = sanitize_order(clean_input.shift)
|
29
|
-
return unless order
|
30
|
-
|
31
|
-
command = { order: order }
|
32
|
-
|
33
|
-
if clean_input.any?
|
34
|
-
arguments = sanitize_arguments(clean_input.join(''))
|
35
|
-
command[:arguments] = arguments
|
36
|
-
end
|
37
|
-
|
38
|
-
command
|
25
|
+
Parser.new.parse(line_input)
|
39
26
|
end
|
40
27
|
|
41
28
|
def execute(command)
|
42
|
-
if command
|
43
|
-
@robot.send(command[:order])
|
44
|
-
else
|
29
|
+
if command.has_key?(:arguments)
|
45
30
|
@robot.send(command[:order], command[:arguments])
|
31
|
+
else
|
32
|
+
@robot.send(command[:order])
|
46
33
|
end
|
47
34
|
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def sanitize_order(input_string)
|
52
|
-
order = input_string.downcase.to_sym
|
53
|
-
order if ALLOWED_ORDERS.include?(order)
|
54
|
-
end
|
55
|
-
|
56
|
-
def sanitize_arguments(arguments)
|
57
|
-
arguments = arguments.delete(' ').split(',')
|
58
|
-
{ x: arguments[0], y: arguments[1], face: arguments[2] }
|
59
|
-
end
|
60
35
|
end
|
61
36
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MauxRobot
|
4
|
+
|
5
|
+
class Parser
|
6
|
+
ALLOWED_ORDERS = %i[left right move place report verbose].freeze
|
7
|
+
|
8
|
+
def parse(line_input)
|
9
|
+
clean_input = line_input.strip.squeeze(' ').split(' ')
|
10
|
+
order = sanitize_order(clean_input.shift)
|
11
|
+
return unless order
|
12
|
+
|
13
|
+
command = { order: order }
|
14
|
+
|
15
|
+
if clean_input.any?
|
16
|
+
arguments = sanitize_arguments(order, clean_input.join(''))
|
17
|
+
command[:arguments] = arguments
|
18
|
+
end
|
19
|
+
|
20
|
+
command
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def sanitize_order(input_string)
|
27
|
+
order = input_string.downcase.to_sym
|
28
|
+
order if ALLOWED_ORDERS.include?(order)
|
29
|
+
end
|
30
|
+
|
31
|
+
def sanitize_arguments(order, arguments)
|
32
|
+
case order
|
33
|
+
when :place
|
34
|
+
arguments = arguments.delete(' ').split(',')
|
35
|
+
{ x: arguments[0], y: arguments[1], face: arguments[2] }
|
36
|
+
when :report
|
37
|
+
{ format: arguments.downcase.to_sym }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
data/lib/maux_robot/position.rb
CHANGED
@@ -26,17 +26,21 @@ module MauxRobot
|
|
26
26
|
POSSIBLE_DIRECTIONS.include?(@face)
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
29
|
+
def left
|
30
|
+
return self unless valid_direction?
|
30
31
|
next_direction_index = ( POSSIBLE_DIRECTIONS.index(@face) + 1 ) % 4
|
31
32
|
@face = POSSIBLE_DIRECTIONS[next_direction_index]
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
+
def right
|
36
|
+
return self unless valid_direction?
|
35
37
|
next_direction_index = ( POSSIBLE_DIRECTIONS.index(@face) - 1 )
|
36
38
|
@face = POSSIBLE_DIRECTIONS[next_direction_index]
|
37
39
|
end
|
38
40
|
|
39
41
|
def forward_position
|
42
|
+
return self unless valid_direction?
|
43
|
+
|
40
44
|
x = @x + POSSIBLE_MOVEMENTS[@face][:x]
|
41
45
|
y = @y + POSSIBLE_MOVEMENTS[@face][:y]
|
42
46
|
Position.new(x, y, @face)
|
@@ -45,5 +49,15 @@ module MauxRobot
|
|
45
49
|
def to_s
|
46
50
|
"#{@x},#{@y},#{@face.upcase.to_s}"
|
47
51
|
end
|
52
|
+
|
53
|
+
def ==(other)
|
54
|
+
other.x == x && other.y == y && other.face == face
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class NullPosition < Position
|
59
|
+
def initialize
|
60
|
+
super(nil, nil, nil)
|
61
|
+
end
|
48
62
|
end
|
49
63
|
end
|
data/lib/maux_robot/robot.rb
CHANGED
@@ -1,31 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'forwardable'
|
4
|
+
|
3
5
|
module MauxRobot
|
4
6
|
|
5
7
|
# The main class. It executes the actions using its table and position
|
6
8
|
class Robot
|
7
9
|
attr_reader :position
|
8
10
|
|
11
|
+
extend Forwardable
|
12
|
+
def_delegators :@position, :left, :right
|
13
|
+
|
9
14
|
def initialize(table=MauxRobot::Table.new)
|
10
15
|
@table = table
|
16
|
+
@position = MauxRobot::NullPosition.new
|
11
17
|
end
|
12
18
|
|
13
19
|
def place(x:, y:, face:)
|
14
20
|
position = MauxRobot::Position.new(x, y, face)
|
15
21
|
|
16
|
-
if position.valid_direction?
|
22
|
+
if position.valid_direction? && @table.contains?(position)
|
17
23
|
@position = position
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
21
|
-
def left
|
22
|
-
@position&.turn_left
|
23
|
-
end
|
24
|
-
|
25
|
-
def right
|
26
|
-
@position&.turn_right
|
27
|
-
end
|
28
|
-
|
29
27
|
def move
|
30
28
|
next_position = @position.forward_position
|
31
29
|
|
data/lib/maux_robot/version.rb
CHANGED
data/lib/maux_robot.rb
CHANGED
data/spec/maux_robot/cli_spec.rb
CHANGED
@@ -3,66 +3,17 @@
|
|
3
3
|
require 'maux_robot'
|
4
4
|
|
5
5
|
describe MauxRobot::CLI do
|
6
|
-
describe '#parse' do
|
7
|
-
context 'valid orders' do
|
8
|
-
it '#report' do
|
9
|
-
expect(subject.parse('REPORT')).to eq(order: :report)
|
10
|
-
end
|
11
|
-
|
12
|
-
it '#move' do
|
13
|
-
expect(subject.parse('MOVE')).to eq(order: :move)
|
14
|
-
end
|
15
|
-
|
16
|
-
it '#left' do
|
17
|
-
expect(subject.parse('LEFT')).to eq(order: :left)
|
18
|
-
end
|
19
|
-
|
20
|
-
it '#right' do
|
21
|
-
expect(subject.parse('RIGHT')).to eq(order: :right)
|
22
|
-
end
|
23
|
-
|
24
|
-
it '#place' do
|
25
|
-
expect(subject.parse('PLACE 0,3,WEST')).to eq(order: :place, arguments: { x: '0', y: '3', face: 'WEST' })
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'orders with spaces and downcase' do
|
30
|
-
it '#report' do
|
31
|
-
expect(subject.parse(' repoRT')).to eq(order: :report)
|
32
|
-
end
|
33
|
-
|
34
|
-
it '#move' do
|
35
|
-
expect(subject.parse('move ')).to eq(order: :move)
|
36
|
-
end
|
37
|
-
|
38
|
-
it '#left' do
|
39
|
-
expect(subject.parse(' LefT ')).to eq(order: :left)
|
40
|
-
end
|
41
|
-
|
42
|
-
it '#right' do
|
43
|
-
expect(subject.parse(' rigHt')).to eq(order: :right)
|
44
|
-
end
|
45
|
-
|
46
|
-
it '#place' do
|
47
|
-
expect(subject.parse('PLACE 2 , 1 , NOrth')).to eq(order: :place, arguments: { x: '2', y: '1', face: 'NOrth' })
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'ignores anything else' do
|
52
|
-
expect(subject.parse('blablabla balbla')).to be_nil
|
53
|
-
end
|
54
|
-
end
|
55
6
|
|
56
7
|
describe '#execute' do
|
57
|
-
context '
|
58
|
-
it '
|
8
|
+
context 'parsed input without arguments' do
|
9
|
+
it 'should send proper message to robot' do
|
59
10
|
expect(subject.robot).to receive(:move)
|
60
11
|
subject.execute(order: :move)
|
61
12
|
end
|
62
13
|
end
|
63
14
|
|
64
|
-
context 'place' do
|
65
|
-
it 'send
|
15
|
+
context 'parsed place command with arguments' do
|
16
|
+
it 'should send proper message to robot' do
|
66
17
|
expect(subject.robot).to receive(:place).with(x: '0', y: '2', face: 'EAST')
|
67
18
|
subject.execute(order: :place, arguments: { x: '0', y: '2', face: 'EAST' })
|
68
19
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'maux_robot'
|
4
|
+
|
5
|
+
describe MauxRobot::Parser do
|
6
|
+
describe '#parse' do
|
7
|
+
context 'valid orders' do
|
8
|
+
it '#report' do
|
9
|
+
expect(subject.parse('REPORT')).to eq(order: :report)
|
10
|
+
end
|
11
|
+
|
12
|
+
it '#report csv' do
|
13
|
+
expect(subject.parse('REPORT CSV')).to eq(order: :report, arguments: { format: :csv })
|
14
|
+
end
|
15
|
+
|
16
|
+
it '#report json' do
|
17
|
+
expect(subject.parse('REPORT JSON')).to eq(order: :report, arguments: { format: :json })
|
18
|
+
end
|
19
|
+
|
20
|
+
it '#move' do
|
21
|
+
expect(subject.parse('MOVE')).to eq(order: :move)
|
22
|
+
end
|
23
|
+
|
24
|
+
it '#left' do
|
25
|
+
expect(subject.parse('LEFT')).to eq(order: :left)
|
26
|
+
end
|
27
|
+
|
28
|
+
it '#right' do
|
29
|
+
expect(subject.parse('RIGHT')).to eq(order: :right)
|
30
|
+
end
|
31
|
+
|
32
|
+
it '#verbose' do
|
33
|
+
expect(subject.parse('VERBOSE')).to eq(order: :verbose)
|
34
|
+
end
|
35
|
+
|
36
|
+
it '#place' do
|
37
|
+
expect(subject.parse('PLACE 0,3,WEST')).to eq(order: :place, arguments: { x: '0', y: '3', face: 'WEST' })
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'orders with spaces and downcase' do
|
42
|
+
it '#report' do
|
43
|
+
expect(subject.parse(' repoRT')).to eq(order: :report)
|
44
|
+
end
|
45
|
+
|
46
|
+
it '#move' do
|
47
|
+
expect(subject.parse('move ')).to eq(order: :move)
|
48
|
+
end
|
49
|
+
|
50
|
+
it '#left' do
|
51
|
+
expect(subject.parse(' LefT ')).to eq(order: :left)
|
52
|
+
end
|
53
|
+
|
54
|
+
it '#right' do
|
55
|
+
expect(subject.parse(' rigHt')).to eq(order: :right)
|
56
|
+
end
|
57
|
+
|
58
|
+
it '#place' do
|
59
|
+
expect(subject.parse('PLACE 2 , 1 , NOrth')).to eq(order: :place, arguments: { x: '2', y: '1', face: 'NOrth' })
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'invalid orders' do
|
64
|
+
it 'ignores anything else' do
|
65
|
+
expect(subject.parse('blablabla balbla')).to be_nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -36,34 +36,34 @@ describe MauxRobot::Position do
|
|
36
36
|
describe 'rotation' do
|
37
37
|
let(:position) { MauxRobot::Position.new(2, 2, :north) }
|
38
38
|
|
39
|
-
context '#
|
39
|
+
context '#left' do
|
40
40
|
it 'should rotate counter-clockwise' do
|
41
|
-
position.
|
41
|
+
position.left
|
42
42
|
expect(position.face).to eq(:west)
|
43
43
|
|
44
|
-
position.
|
44
|
+
position.left
|
45
45
|
expect(position.face).to eq(:south)
|
46
46
|
|
47
|
-
position.
|
47
|
+
position.left
|
48
48
|
expect(position.face).to eq(:east)
|
49
49
|
|
50
|
-
position.
|
50
|
+
position.left
|
51
51
|
expect(position.face).to eq(:north)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
context '#
|
55
|
+
context '#right' do
|
56
56
|
it 'should rotate clockwise' do
|
57
|
-
position.
|
57
|
+
position.right
|
58
58
|
expect(position.face).to eq(:east)
|
59
59
|
|
60
|
-
position.
|
60
|
+
position.right
|
61
61
|
expect(position.face).to eq(:south)
|
62
62
|
|
63
|
-
position.
|
63
|
+
position.right
|
64
64
|
expect(position.face).to eq(:west)
|
65
65
|
|
66
|
-
position.
|
66
|
+
position.right
|
67
67
|
expect(position.face).to eq(:north)
|
68
68
|
end
|
69
69
|
end
|
@@ -4,13 +4,14 @@ require 'maux_robot'
|
|
4
4
|
|
5
5
|
describe MauxRobot::Robot do
|
6
6
|
subject(:robot) { described_class.new }
|
7
|
+
let(:null_position) { MauxRobot::NullPosition.new }
|
7
8
|
|
8
9
|
describe '#place' do
|
9
10
|
context 'given a valid place' do
|
10
11
|
it 'should have a position' do
|
11
12
|
robot.place(x: 0, y: 0, face: :north)
|
12
13
|
|
13
|
-
expect(robot.position).not_to
|
14
|
+
expect(robot.position).not_to eq null_position
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
@@ -18,7 +19,7 @@ describe MauxRobot::Robot do
|
|
18
19
|
it 'should not have a position' do
|
19
20
|
robot.place(x: 5, y: 0, face: :south)
|
20
21
|
|
21
|
-
expect(robot.position).to
|
22
|
+
expect(robot.position).to eq null_position
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -26,7 +27,7 @@ describe MauxRobot::Robot do
|
|
26
27
|
it 'should not have a position' do
|
27
28
|
robot.place(x: 0, y: 2, face: :south_east)
|
28
29
|
|
29
|
-
expect(robot.position).to
|
30
|
+
expect(robot.position).to eq null_position
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
@@ -37,7 +38,7 @@ describe MauxRobot::Robot do
|
|
37
38
|
robot.place(x: 0, y: 2, face: :south_east)
|
38
39
|
robot.left
|
39
40
|
|
40
|
-
expect(robot.position).to
|
41
|
+
expect(robot.position).to eq null_position
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
@@ -57,7 +58,7 @@ describe MauxRobot::Robot do
|
|
57
58
|
robot.place(x: 0, y: 2, face: :north_west)
|
58
59
|
robot.right
|
59
60
|
|
60
|
-
expect(robot.position).to
|
61
|
+
expect(robot.position).to eq null_position
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
@@ -72,6 +73,14 @@ describe MauxRobot::Robot do
|
|
72
73
|
end
|
73
74
|
|
74
75
|
describe '#move' do
|
76
|
+
context 'robot not placed' do
|
77
|
+
it 'should silently ignore' do
|
78
|
+
robot.move
|
79
|
+
|
80
|
+
expect(robot.position).to eq null_position
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
75
84
|
context 'to a place on the table' do
|
76
85
|
it 'should update its position' do
|
77
86
|
robot.place(x: 3, y: 2, face: :north)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maux_robot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mauricio Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -44,11 +44,13 @@ files:
|
|
44
44
|
- bin/maux_robot
|
45
45
|
- lib/maux_robot.rb
|
46
46
|
- lib/maux_robot/cli.rb
|
47
|
+
- lib/maux_robot/parser.rb
|
47
48
|
- lib/maux_robot/position.rb
|
48
49
|
- lib/maux_robot/robot.rb
|
49
50
|
- lib/maux_robot/table.rb
|
50
51
|
- lib/maux_robot/version.rb
|
51
52
|
- spec/maux_robot/cli_spec.rb
|
53
|
+
- spec/maux_robot/parser_spec.rb
|
52
54
|
- spec/maux_robot/position_spec.rb
|
53
55
|
- spec/maux_robot/robot_spec.rb
|
54
56
|
- spec/maux_robot/table_spec.rb
|