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.
- checksums.yaml +7 -0
- data/.gitignore +34 -0
- data/CONTRIBUTING.md +28 -0
- data/LICENSE +24 -0
- data/README.md +148 -0
- data/Rakefile +21 -0
- data/bin/toyrobot +5 -0
- data/data/example_input_a.txt +3 -0
- data/data/example_input_b.txt +3 -0
- data/data/example_input_c.txt +6 -0
- data/lib/toy_robot/application.rb +38 -0
- data/lib/toy_robot/board.rb +16 -0
- data/lib/toy_robot/command/base.rb +5 -0
- data/lib/toy_robot/command/parser/base.rb +58 -0
- data/lib/toy_robot/command/parser/place.rb +37 -0
- data/lib/toy_robot/command/parser.rb +20 -0
- data/lib/toy_robot/command/token.rb +11 -0
- data/lib/toy_robot/factory.rb +83 -0
- data/lib/toy_robot/placement.rb +34 -0
- data/lib/toy_robot/pose.rb +79 -0
- data/lib/toy_robot/robot.rb +41 -0
- data/lib/toy_robot/robot_controller.rb +35 -0
- data/lib/toy_robot/view.rb +22 -0
- data/lib/toy_robot.rb +1 -0
- data/test/integration/test_application.rb +24 -0
- data/test/integration/test_factory.rb +18 -0
- data/test/integration/test_toy_robot.rb +9 -0
- data/test/test_board.rb +31 -0
- data/test/test_command.rb +22 -0
- data/test/test_command_matcher.rb +32 -0
- data/test/test_command_matcher_interface.rb +31 -0
- data/test/test_command_matcher_left.rb +20 -0
- data/test/test_command_matcher_move.rb +21 -0
- data/test/test_command_matcher_place.rb +56 -0
- data/test/test_command_matcher_report.rb +21 -0
- data/test/test_command_matcher_right.rb +20 -0
- data/test/test_placement.rb +94 -0
- data/test/test_pose.rb +146 -0
- data/test/test_reporter_interface.rb +7 -0
- data/test/test_robot.rb +70 -0
- data/test/test_robot_controller.rb +62 -0
- data/test/test_view.rb +32 -0
- data/toyrobot.gemspec +20 -0
- metadata +139 -0
    
        data/test/test_robot.rb
    ADDED
    
    | @@ -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
         |