Created
September 4, 2019 17:29
-
-
Save ysv/821c0cc61c85b365ed9a4ba97b3c9de1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| RPM_TO_SPEED_MULTIPLIER = 10 | |
| class Tire | |
| def initialize(producer:, diameter:) | |
| @producer = producer | |
| @diameter = diameter | |
| @dirty = [true, false].sample | |
| end | |
| def dirty | |
| @dirty | |
| end | |
| end | |
| class Engine | |
| def initialize(capacity:, horses:) | |
| @capacity = capacity | |
| @horses = horses | |
| @rpm = 0 | |
| @dirty = [true, false].sample | |
| @is_electric = true | |
| end | |
| def accelerate(kilometers) | |
| # Lets say that our speed increase linearly with rotations per second. | |
| @rpm += kilometers * RPM_TO_SPEED_MULTIPLIER | |
| end | |
| def rpm | |
| @rpm | |
| end | |
| def is_electric? | |
| @is_electric | |
| end | |
| def dirty | |
| @dirty | |
| end | |
| end | |
| class Car | |
| include Enumerable | |
| def initialize(name:, engine:, tires:) | |
| @name = name | |
| @engine = engine | |
| @tires_pack = tires | |
| end | |
| my_delegate :rpm, :accelerate, :horses, :is_electric?, to: :@engine | |
| my_delegate :each, to: :details | |
| my_delegate :capitalize, to: :@name | |
| def speed | |
| rpm * RPM_TO_SPEED_MULTIPLIER | |
| end | |
| def details # => Array | |
| @tires_pack + [@engine] | |
| end | |
| end | |
| def test_1 | |
| engine = Engine.new(capacity: 0, horses: 200) | |
| tire1 = Tire.new(producer: :michelin, diameter: 17) | |
| tire2 = Tire.new(producer: :michelin, diameter: 17) | |
| tire3 = Tire.new(producer: :good_year, diameter: 18) | |
| tire4 = Tire.new(producer: :good_year, diameter: 18) | |
| c = Car.new(name: 'Nissan', engine: engine, tires: [tire1, tire2, tire3,tire4]) | |
| assert_equal c.horses, 200 | |
| assert_equal c.capitalize, 'Nissan'.capitalize | |
| end | |
| engine = Engine.new(capacity: 0, horses: 200) | |
| tire1 = Tire.new(producer: :michelin, diameter: 17) | |
| tire2 = Tire.new(producer: :michelin, diameter: 17) | |
| tire3 = Tire.new(producer: :good_year, diameter: 18) | |
| tire4 = Tire.new(producer: :good_year, diameter: 18) | |
| c = Car.new(name: 'Nissan', engine: engine, tires: [tire1, tire2, tire3,tire4]) | |
| pp "INITIAL: speed: #{c.speed}" | |
| c.accelerate(10) | |
| pp "ACCELERATE 1: speed #{c.speed}, rpm: #{c.rpm}" | |
| c.accelerate(20) | |
| pp "ACCELERATE 2: speed #{c.speed}, rpm: #{c.rpm}" | |
| pp c.each { |detail| pp detail.to_s } | |
| pp "Finding engine details:" | |
| pp c.find { |detail| detail.is_a?(Engine) } | |
| pp "Finding dirty details:" | |
| pp c.find_all {|detail| detail.dirty } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment