Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. RPM_TO_SPEED_MULTIPLIER = 10
  2. require "minitest/autorun"
  3. require "minitest/pride"
  4. require_relative "delegator.rb"
  5. class Tire # Part of Car
  6. def initialize(producer:, diameter:)
  7. @producer = producer # String
  8. @diameter = diameter # String
  9. @dirty = [true, false].sample # Random state
  10. end
  11.  
  12. def dirty
  13. @dirty
  14. end
  15. end
  16.  
  17. class Engine # Part of Car
  18. def initialize(capacity:, horses:)
  19. @capacity = capacity # Integer
  20. @horses = horses # Integer
  21. @rpm = 0 # Integer
  22. @dirty = [true, false].sample # Random state
  23. @is_electric = true # All engines are electric
  24. end
  25.  
  26. def accelerate(kilometers)
  27. # Lets say that our speed increase linearly with rotations per second.
  28. @rpm += kilometers * RPM_TO_SPEED_MULTIPLIER # Convert speed into rpm
  29. end
  30.  
  31. def horses
  32. @horses
  33. end
  34.  
  35. def rpm
  36. @rpm
  37. end
  38.  
  39. def is_electric? # Reader
  40. @is_electric
  41. end
  42.  
  43. def dirty
  44. @dirty
  45. end
  46. end
  47.  
  48. class Car # Main class
  49. include Enumerable
  50. Module.prepend MyDelegate # Include my_delegate method
  51. def initialize(name:, engine:, tires:) # Car consist of 3 parts: brand, engine and array of tires
  52. @name = name
  53. @engine = engine
  54. @tires_pack = tires
  55. end
  56.  
  57. my_delegate :rpm, :accelerate, :horses, :is_electric?, to: :@engine # Delegating Engine instance methods to instance variable @engine
  58.  
  59. my_delegate :each, :find, :find_all, to: :details # Delegating Enumerables into "details" Car instance method
  60.  
  61. my_delegate :capitalize, to: :@name #Delegating capitalize string method to @name instance variable
  62.  
  63. def engine #Reader
  64. @engine
  65. end
  66.  
  67.  
  68. def speed #Reader
  69. rpm * RPM_TO_SPEED_MULTIPLIER
  70. end
  71.  
  72. def details # => Array
  73. @tires_pack + [@engine]
  74. end
  75. end
  76.  
  77. class MyDelegateTest< Minitest::Test #Tests
  78. def test_1
  79. engine = Engine.new(capacity: 0, horses: 200)
  80. tire1 = Tire.new(producer: :michelin, diameter: 17)
  81. tire2 = Tire.new(producer: :michelin, diameter: 17)
  82. tire3 = Tire.new(producer: :good_year, diameter: 18)
  83. tire4 = Tire.new(producer: :good_year, diameter: 18)
  84. c = Car.new(name: "Nissan", engine: engine, tires: [tire1, tire2, tire3, tire4])
  85.  
  86. assert_equal c.horses, 200
  87. assert_equal c.capitalize, "Nissan".capitalize
  88. end
  89. end
  90.  
  91. engine = Engine.new(capacity: 0, horses: 200)
  92. tire1 = Tire.new(producer: :michelin, diameter: 17)
  93. tire2 = Tire.new(producer: :michelin, diameter: 17)
  94.  
  95. tire3 = Tire.new(producer: :good_year, diameter: 18)
  96. tire4 = Tire.new(producer: :good_year, diameter: 18)
  97.  
  98. c = Car.new(name: "Nissan", engine: engine, tires: [tire1, tire2, tire3, tire4])
  99.  
  100. pp "INITIAL: speed: #{c.speed}"
  101. c.accelerate(10)
  102. pp "ACCELERATE 1: speed #{c.speed}, rpm: #{c.rpm}"
  103. c.accelerate(20)
  104. pp "ACCELERATE 2: speed #{c.speed}, rpm: #{c.rpm}"
  105. pp c.each {|detail| puts "Detail: #{detail}" }
  106. pp "Finding engine details:"
  107. pp c.find {|detail| detail.is_a?(Engine) }
  108.  
  109. pp "Finding dirty details:"
  110. pp c.select(&:dirty)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement