Created
January 25, 2016 19:08
-
-
Save anonymous/be022c47bec3174a9584 to your computer and use it in GitHub Desktop.
This file contains 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
class Wheel | |
attr_reader :rim, :tire | |
def initialize(rim, tire) | |
@rim = rim | |
@tire = tire | |
end | |
def diameter | |
rim + (tire * 2) | |
end | |
end | |
class Gear | |
attr_reader :chainring, :cog, :wheel, :observer | |
def initialize(args) | |
@chainring = args[:chainring] | |
@cog = args[:cog] | |
@wheel = args[:wheel] | |
@observer = args[:observer] | |
end | |
def gear_inches | |
ratio * wheel.diameter | |
end | |
def ratio | |
chainring / cog.to_f | |
end | |
def set_chainring(new_chainring) | |
@chainring = new_chainring | |
changed | |
end | |
def set_cog(new_cog) | |
@cog = new_cog | |
changed | |
end | |
def changed | |
observer.changed(chainring, cog) | |
end | |
end | |
require "minitest/autorun" | |
class WheelTest < MiniTest::Test | |
def setup | |
@wheel = Wheel.new(26, 1.5) | |
end | |
def test_implements_the_diameterizable_interface | |
assert_respond_to(@wheel, :diameter) | |
end | |
def test_calculates_diameter | |
wheel = Wheel.new(26, 1.5) | |
assert_in_delta(29, | |
wheel.diameter, | |
0.01) | |
end | |
end | |
# Create a player of the 'Diameterizable' role. | |
class DiameterDouble | |
def diameter | |
10 | |
end | |
end | |
class GearTest < MiniTest::Test | |
def setup | |
@wheel = @diameterizable = DiameterDouble.new | |
end | |
def test_calculates_gear_inches | |
gear = Gear.new( | |
chainring: 52, | |
cog: 11, | |
wheel: @wheel) | |
assert_in_delta(47.27, | |
gear.gear_inches, | |
0.01) | |
end | |
end | |
class GearTest < MiniTest::Test | |
def setup | |
@observer = MiniTest::Mock.new | |
@gear = Gear.new( | |
chainring: 52, | |
cog: 11, | |
observer: @observer) | |
end | |
def test_notifies_observers_when_cogs_change | |
@observer.expect(:changed, true, [52, 27]) | |
@gear.set_cog(27) | |
@observer.verify | |
end | |
def test_notifies_observers_when_chaings_change | |
@observer.expect(:changed, true, [42, 11]) | |
@gear.set_chainring(42) | |
@observer.verify | |
end | |
end |
This file contains 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
Run options: --seed 38813 | |
# Running: | |
..E.. | |
Finished in 0.001324s, 3776.4350 runs/s, 1510.5740 assertions/s. | |
1) Error: | |
GearTest#test_calculates_gear_inches: | |
NoMethodError: undefined method `diameter' for nil:NilClass | |
failing_test.rb:25:in `gear_inches' | |
failing_test.rb:88:in `test_calculates_gear_inches' | |
5 runs, 2 assertions, 0 failures, 1 errors, 0 skips |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment