toyrobot 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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