toyrobot 0.0.1

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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +34 -0
  3. data/CONTRIBUTING.md +28 -0
  4. data/LICENSE +24 -0
  5. data/README.md +148 -0
  6. data/Rakefile +21 -0
  7. data/bin/toyrobot +5 -0
  8. data/data/example_input_a.txt +3 -0
  9. data/data/example_input_b.txt +3 -0
  10. data/data/example_input_c.txt +6 -0
  11. data/lib/toy_robot/application.rb +38 -0
  12. data/lib/toy_robot/board.rb +16 -0
  13. data/lib/toy_robot/command/base.rb +5 -0
  14. data/lib/toy_robot/command/parser/base.rb +58 -0
  15. data/lib/toy_robot/command/parser/place.rb +37 -0
  16. data/lib/toy_robot/command/parser.rb +20 -0
  17. data/lib/toy_robot/command/token.rb +11 -0
  18. data/lib/toy_robot/factory.rb +83 -0
  19. data/lib/toy_robot/placement.rb +34 -0
  20. data/lib/toy_robot/pose.rb +79 -0
  21. data/lib/toy_robot/robot.rb +41 -0
  22. data/lib/toy_robot/robot_controller.rb +35 -0
  23. data/lib/toy_robot/view.rb +22 -0
  24. data/lib/toy_robot.rb +1 -0
  25. data/test/integration/test_application.rb +24 -0
  26. data/test/integration/test_factory.rb +18 -0
  27. data/test/integration/test_toy_robot.rb +9 -0
  28. data/test/test_board.rb +31 -0
  29. data/test/test_command.rb +22 -0
  30. data/test/test_command_matcher.rb +32 -0
  31. data/test/test_command_matcher_interface.rb +31 -0
  32. data/test/test_command_matcher_left.rb +20 -0
  33. data/test/test_command_matcher_move.rb +21 -0
  34. data/test/test_command_matcher_place.rb +56 -0
  35. data/test/test_command_matcher_report.rb +21 -0
  36. data/test/test_command_matcher_right.rb +20 -0
  37. data/test/test_placement.rb +94 -0
  38. data/test/test_pose.rb +146 -0
  39. data/test/test_reporter_interface.rb +7 -0
  40. data/test/test_robot.rb +70 -0
  41. data/test/test_robot_controller.rb +62 -0
  42. data/test/test_view.rb +32 -0
  43. data/toyrobot.gemspec +20 -0
  44. metadata +139 -0
@@ -0,0 +1,70 @@
1
+ require_relative '../lib/toy_robot/robot'
2
+ require_relative 'test_reporter_interface'
3
+ require 'minitest/autorun'
4
+
5
+ module ToyRobot
6
+ class RobotTest < MiniTest::Unit::TestCase
7
+ include ReporterInterfaceTest
8
+
9
+ def setup
10
+ @observer = MiniTest::Mock.new.expect(:on_board?, true)
11
+ @robot = @object = Robot.new(placement: @observer)
12
+ end
13
+
14
+ def teardown
15
+ @observer = nil
16
+ @robot = nil
17
+ end
18
+
19
+ def test_respond_to_public_interface
20
+ assert_respond_to @robot, :place
21
+ assert_respond_to @robot, :move
22
+ assert_respond_to @robot, :right
23
+ assert_respond_to @robot, :left
24
+ end
25
+
26
+ def test_that_it_places
27
+ placement = MiniTest::Mock.new.expect(:update, nil, [nil])
28
+ @robot.instance_variable_set(:@placement, placement)
29
+
30
+ @robot.place(nil)
31
+ placement.verify
32
+ end
33
+
34
+ def test_that_it_moves
35
+ @observer.expect(:advance, nil)
36
+ @robot.move
37
+ @observer.verify
38
+ end
39
+
40
+ def test_that_it_turns_right
41
+ @observer.expect(:rotate, nil, [90])
42
+ @robot.right
43
+ @observer.verify
44
+ end
45
+
46
+ def test_that_it_turns_left
47
+ @observer.expect(:rotate, nil, [-90])
48
+ @robot.left
49
+ @observer.verify
50
+ end
51
+
52
+ def test_that_it_reports
53
+ @observer.expect(:report, nil)
54
+ @robot.report
55
+ @observer.verify
56
+ end
57
+
58
+ def test_that_it_ignores_commands_if_unplaced
59
+ observer = MiniTest::Mock.new
60
+ @robot.instance_variable_set(:@placement, observer)
61
+
62
+ [:move, :right, :left, :report].each do |command|
63
+ observer.expect(:on_board?, false)
64
+ @robot.send(command)
65
+ end
66
+
67
+ observer.verify
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,62 @@
1
+ require_relative '../lib/toy_robot/robot_controller'
2
+ require 'minitest/autorun'
3
+
4
+ module ToyRobot
5
+ class RobotControllerTest < MiniTest::Unit::TestCase
6
+ CommandDouble = Struct.new(:token, :args)
7
+
8
+ def setup
9
+ @command_double = CommandDouble.new(nil, nil)
10
+ @robot = MiniTest::Mock.new
11
+ @view = MiniTest::Mock.new
12
+ @robot_controller = RobotController.new(
13
+ robot: @robot,
14
+ view: @view
15
+ )
16
+ end
17
+
18
+ def test_respond_to_public_interface
19
+ assert_respond_to @robot_controller, :input
20
+ end
21
+
22
+ def test_it_delegates_a_place_command_to_robot
23
+ @command_double.token = Command::Token::PLACE
24
+
25
+ @robot.expect(:place, nil, [@command_double.args])
26
+ @robot_controller.input(@command_double)
27
+ @robot.verify
28
+ end
29
+
30
+ def test_it_delegates_a_move_command_to_robot
31
+ @command_double.token = Command::Token::MOVE
32
+
33
+ @robot.expect(:move, nil)
34
+ @robot_controller.input(@command_double)
35
+ @robot.verify
36
+ end
37
+
38
+ def test_it_delegates_a_left_command_to_robot
39
+ @command_double.token = Command::Token::LEFT
40
+
41
+ @robot.expect(:left, nil)
42
+ @robot_controller.input(@command_double)
43
+ @robot.verify
44
+ end
45
+
46
+ def test_it_delegates_a_right_command_to_robot
47
+ @command_double.token = Command::Token::RIGHT
48
+
49
+ @robot.expect(:right, nil)
50
+ @robot_controller.input(@command_double)
51
+ @robot.verify
52
+ end
53
+
54
+ def test_it_delegates_a_report_command_to_view
55
+ @command_double.token = Command::Token::REPORT
56
+
57
+ @view.expect(:report, nil)
58
+ @robot_controller.input(@command_double)
59
+ @view.verify
60
+ end
61
+ end
62
+ end
data/test/test_view.rb ADDED
@@ -0,0 +1,32 @@
1
+ require_relative '../lib/toy_robot/view'
2
+ require 'minitest/autorun'
3
+
4
+ module ToyRobot
5
+ class ViewTest < MiniTest::Unit::TestCase
6
+ def setup
7
+ @output = MiniTest::Mock.new
8
+ @robot_double = OpenStruct.new(
9
+ report: {
10
+ x: 'X',
11
+ y: 'Y',
12
+ orientation: :facing
13
+ }
14
+ )
15
+ @view = View.new(
16
+ robot: @robot_double,
17
+ output: @output
18
+ )
19
+ end
20
+
21
+ def test_responds_to_public_interface
22
+ assert_respond_to @view, :report
23
+ end
24
+
25
+ def test_that_it_reports
26
+ write = 'X,Y,FACING'
27
+ @output.expect :puts, nil, [write]
28
+ @view.report
29
+ @output.verify
30
+ end
31
+ end
32
+ end
data/toyrobot.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'toyrobot'
3
+ spec.version = '0.0.1'
4
+ spec.authors = ['Matias Anaya']
5
+ spec.email = ['matiasanaya@gmail.com']
6
+ spec.summary = %q{A toy robot simulator}
7
+ spec.description = %q{A toy robot that rules a 5x5 board.}
8
+ spec.homepage = 'https://github.com/matiasanaya/toy-robot-simulator'
9
+ spec.license = 'UNLICENSE'
10
+
11
+ spec.files = `git ls-files -z`.split("\x0")
12
+ spec.executables = ['toyrobot']
13
+ spec.test_files = spec.files.grep(%r{^(test)/})
14
+ spec.require_paths = ['lib']
15
+
16
+ spec.required_ruby_version = '~> 2.1'
17
+
18
+ spec.add_development_dependency 'rake', '~> 10.3'
19
+ spec.add_development_dependency 'minitest', '~> 4.7', '>= 4.7.5'
20
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: toyrobot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matias Anaya
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '10.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '10.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.7'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 4.7.5
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '4.7'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 4.7.5
47
+ description: A toy robot that rules a 5x5 board.
48
+ email:
49
+ - matiasanaya@gmail.com
50
+ executables:
51
+ - toyrobot
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - ".gitignore"
56
+ - CONTRIBUTING.md
57
+ - LICENSE
58
+ - README.md
59
+ - Rakefile
60
+ - bin/toyrobot
61
+ - data/example_input_a.txt
62
+ - data/example_input_b.txt
63
+ - data/example_input_c.txt
64
+ - lib/toy_robot.rb
65
+ - lib/toy_robot/application.rb
66
+ - lib/toy_robot/board.rb
67
+ - lib/toy_robot/command/base.rb
68
+ - lib/toy_robot/command/parser.rb
69
+ - lib/toy_robot/command/parser/base.rb
70
+ - lib/toy_robot/command/parser/place.rb
71
+ - lib/toy_robot/command/token.rb
72
+ - lib/toy_robot/factory.rb
73
+ - lib/toy_robot/placement.rb
74
+ - lib/toy_robot/pose.rb
75
+ - lib/toy_robot/robot.rb
76
+ - lib/toy_robot/robot_controller.rb
77
+ - lib/toy_robot/view.rb
78
+ - test/integration/test_application.rb
79
+ - test/integration/test_factory.rb
80
+ - test/integration/test_toy_robot.rb
81
+ - test/test_board.rb
82
+ - test/test_command.rb
83
+ - test/test_command_matcher.rb
84
+ - test/test_command_matcher_interface.rb
85
+ - test/test_command_matcher_left.rb
86
+ - test/test_command_matcher_move.rb
87
+ - test/test_command_matcher_place.rb
88
+ - test/test_command_matcher_report.rb
89
+ - test/test_command_matcher_right.rb
90
+ - test/test_placement.rb
91
+ - test/test_pose.rb
92
+ - test/test_reporter_interface.rb
93
+ - test/test_robot.rb
94
+ - test/test_robot_controller.rb
95
+ - test/test_view.rb
96
+ - toyrobot.gemspec
97
+ homepage: https://github.com/matiasanaya/toy-robot-simulator
98
+ licenses:
99
+ - UNLICENSE
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.1'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.2.2
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: A toy robot simulator
121
+ test_files:
122
+ - test/integration/test_application.rb
123
+ - test/integration/test_factory.rb
124
+ - test/integration/test_toy_robot.rb
125
+ - test/test_board.rb
126
+ - test/test_command.rb
127
+ - test/test_command_matcher.rb
128
+ - test/test_command_matcher_interface.rb
129
+ - test/test_command_matcher_left.rb
130
+ - test/test_command_matcher_move.rb
131
+ - test/test_command_matcher_place.rb
132
+ - test/test_command_matcher_report.rb
133
+ - test/test_command_matcher_right.rb
134
+ - test/test_placement.rb
135
+ - test/test_pose.rb
136
+ - test/test_reporter_interface.rb
137
+ - test/test_robot.rb
138
+ - test/test_robot_controller.rb
139
+ - test/test_view.rb