-
Notifications
You must be signed in to change notification settings - Fork 0
/
chapter_9f.rb
131 lines (109 loc) · 2.61 KB
/
chapter_9f.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
require 'minitest/reporters'
MiniTest::Unit.runner = MiniTest::SuiteRunner.new
MiniTest::Unit.runner.reporters << MiniTest::Reporters::SpecReporter.new
require 'minitest/autorun'
############## Page ??? ##############
class Wheel
attr_reader :rim, :tire
def initialize(rim, tire)
@rim = rim
@tire = tire
end
def width # <---- used to be 'diameter'
rim + (tire * 2)
end
# ...
end
############## Page ??? ##############
class Gear
attr_reader :chainring, :cog, :wheel
def initialize(args)
@chainring = args[:chainring]
@cog = args[:cog]
@wheel = args[:wheel]
end
def gear_inches
ratio * wheel.diameter
end
def ratio
chainring / cog.to_f
end
# ...
end
############## Page ??? ##############
class Gear
# ...
def gear_inches
ratio * wheel.diameter # <--- obsolete
end
end
############## Page 224 ##############
class DiameterDouble
def diameter # The interface changed to 'width',
10 # but this double and Gear both
end # still use 'diameter'.
end
class GearTest < MiniTest::Unit::TestCase
def test_calculates_gear_inches
gear = Gear.new(
chainring: 52,
cog: 11,
wheel: DiameterDouble.new)
assert_in_delta(47.27,
gear.gear_inches,
0.01)
end
end
############## Page 225 ##############
class WheelTest < MiniTest::Unit::TestCase
def setup
@wheel = Wheel.new(26, 1.5)
end
def test_implements_the_diameterizable_interface
assert_respond_to(@wheel, :width)
end
def test_calculates_diameter
# ...
end
end
############## Page 226 ##############
module DiameterizableInterfaceTest
def test_implements_the_diameterizable_interface
assert_respond_to(@object, :width)
end
end
############## Page 226 ##############
class WheelTest < MiniTest::Unit::TestCase
include DiameterizableInterfaceTest
def setup
@wheel = @object = Wheel.new(26, 1.5)
end
def test_calculates_diameter
# ...
end
end
############## Page 227 ##############
class DiameterDouble
def diameter
10
end
end
# Prove the test double honors the interface this
# test expects.
class DiameterDoubleTest < MiniTest::Unit::TestCase
include DiameterizableInterfaceTest
def setup
@object = DiameterDouble.new
end
end
class GearTest < MiniTest::Unit::TestCase
def test_calculates_gear_inches
gear = Gear.new(
chainring: 52,
cog: 11,
wheel: DiameterDouble.new)
assert_in_delta(47.27,
gear.gear_inches,
0.01)
end
end