dimensional 0.0.6 → 0.1.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.
- data/CHANGELOG +2 -0
- data/Rakefile +1 -1
- data/lib/dimensional.rb +1 -1
- data/lib/dimensional/configuration.rb +90 -17
- data/lib/dimensional/configurator.rb +7 -34
- data/lib/dimensional/dimension.rb +24 -8
- data/lib/dimensional/metric.rb +115 -41
- data/lib/dimensional/system.rb +3 -2
- data/lib/dimensional/unit.rb +55 -17
- data/lib/dimensional/version.rb +1 -1
- data/test/configuration_test.rb +217 -0
- data/test/configurator_test.rb +25 -30
- data/test/demo.rb +240 -51
- data/test/dimension_test.rb +28 -3
- data/test/dimensional_test.rb +47 -2
- data/test/metric_test.rb +250 -78
- data/test/unit_test.rb +83 -19
- metadata +4 -5
- data/lib/dimensional/measure.rb +0 -122
- data/test/measure_test.rb +0 -226
data/test/demo.rb
CHANGED
@@ -1,66 +1,108 @@
|
|
1
1
|
require 'dimensional/configurator'
|
2
2
|
require 'rational'
|
3
|
+
include Dimensional
|
3
4
|
|
4
5
|
# Define fundamental dimensions and composite dimensions
|
5
6
|
# Reference: http://en.wikipedia.org/wiki/Dimensional_Analysis
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
Dimension.register('Mass')
|
8
|
+
Dimension.register('Length')
|
9
|
+
Dimension.register('Time')
|
10
|
+
Dimension.register('Electric Current', 'I')
|
11
|
+
Dimension.register('Temperature', 'Θ')
|
12
|
+
Dimension.register('Luminous Intensity', 'Iv')
|
13
|
+
Dimension.register('Electric Charge', 'Q')
|
14
|
+
Dimension.register('Frequency', 'f', {Dimension::T => -1})
|
15
|
+
Dimension.register('Area', 'A', {Dimension::L => 2})
|
16
|
+
Dimension.register('Volume', 'V', {Dimension::L => 3})
|
17
|
+
Dimension.register('Velocity', 'Vel', {Dimension::L => 1, Dimension::T => -1})
|
18
|
+
Dimension.register('Acceleration', 'Acc', {Dimension::L => 1, Dimension::T => -2})
|
19
|
+
Dimension.register('Force', 'F', {Dimension::M => 1, Dimension::L => 1, Dimension::T => -2})
|
20
|
+
Dimension.register('Torque', 'τ', {Dimension::M => 1, Dimension::L => 2, Dimension::T => -2}) # equivalent to Energy
|
21
|
+
Dimension.register('Energy', 'E', {Dimension::M => 1, Dimension::L => 2, Dimension::T => -2}) # a.k.a. work
|
22
|
+
Dimension.register('Power', 'P', {Dimension::M => 1, Dimension::L => 2, Dimension::T => -3})
|
23
|
+
Dimension.register('Voltage', 'emf', {Dimension::M => 1, Dimension::L => 2, Dimension::I => -1, Dimension::T => -3})
|
13
24
|
|
14
25
|
# Define common Systems of Measurement
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
26
|
+
System.register('SI - International System (kg, tonne, m)', 'SI')
|
27
|
+
System.register('US Customary (lbs, ton, ft)', 'US') # http://en.wikipedia.org/wiki/United_States_customary_units
|
28
|
+
System.register('US Customary Troy (oz)', 'USt') # http://en.wikipedia.org/wiki/United_States_customary_units
|
29
|
+
System.register('British Imperial (lbs, ton, ft)', 'Imp') # http://en.wikipedia.org/wiki/Imperial_units
|
30
|
+
System.register('British Admiralty', 'BA')
|
31
|
+
System.register('Foot-Pound-Second', 'FPS') #http://en.wikipedia.org/wiki/Foot-pound-second_system
|
19
32
|
|
20
|
-
|
33
|
+
Configurator.start do
|
21
34
|
dimension(:L) do
|
22
35
|
system(:SI) do
|
23
|
-
base('meter', 'm', :detector => /\A(
|
24
|
-
derive('
|
25
|
-
derive('
|
36
|
+
base('meter', 'm', :detector => /\A(met(er|re)s?|m)\Z/) do
|
37
|
+
derive('decimeter', 'dm', Rational(1, 10), :detector => /\A(decimet(er|re)s?|dm)\Z/, :preference => 0.5)
|
38
|
+
derive('centimeter', 'cm', Rational(1, 100), :detector => /\A(centimet(er|re)s?|cm)\Z/)
|
39
|
+
derive('decameter', 'km', 10, :detector => /\A(de(c|k)amet(er|re)s?|dam)\Z/)
|
40
|
+
derive('kilometer', 'km', 1000, :detector => /\A(kilomet(er|re)s?|km)\Z/)
|
41
|
+
derive('nautical mile', 'M', 1852, :detector => /\A(nautical miles?|NMs?|nmis?)\Z/)
|
26
42
|
end
|
27
43
|
end
|
28
44
|
system(:US) do # As of 1 July 1959 (http://en.wikipedia.org/wiki/United_States_customary_units#Units_of_length)
|
45
|
+
reference('yard', 'yd', Unit[:L, :SI, 'meter'], 0.9144, :detector => /\A(yards?|yds?)\Z/) do
|
46
|
+
derive('foot', 'ft', Rational(1,3), :detector => /\A(foot|feet|ft|')\Z/, :format => "%p'") do
|
47
|
+
derive('inch', 'in', Rational(1,12), :detector => /\A(inch|inches|in|")\Z/, :format => "%p\"")
|
48
|
+
end
|
49
|
+
derive('furlong', nil, 220, :detector => /\A(furlongs?)\Z/) do
|
50
|
+
derive('mile', 'mi', 8, :detector => /\Amiles?\Z/)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
system(:Imp) do
|
29
55
|
reference('yard', 'yd', Dimensional::Unit[:L, :SI, 'meter'], 0.9144, :detector => /\A(yards?|yds?)\Z/) do
|
30
56
|
derive('foot', 'ft', Rational(1,3), :detector => /\A(foot|feet|ft|')\Z/, :format => "%p'") do
|
31
|
-
|
32
|
-
derive('inch', 'in', Rational(1,12), :detector => /\A(inch|inches|in|")\Z/, :format => "%p\"")
|
57
|
+
derive('inch', 'in', Rational(1,12), :detector => /\A(inch|inches|in|")\Z/, :format => "%p\"")
|
33
58
|
end
|
34
59
|
derive('furlong', nil, 220, :detector => /\A(furlongs?)\Z/) do
|
35
60
|
derive('mile', 'mi', 8, :detector => /\Amiles?\Z/)
|
36
61
|
end
|
37
62
|
end
|
38
63
|
end
|
64
|
+
system(:BA) do
|
65
|
+
# The nautical mile was historically defined as the length of one minute of arc of latitude along the (current) meridian.
|
66
|
+
# That historical definition is thus not a true length standard. A precise translation of that definition into current units
|
67
|
+
# results in an approximation of 1852.216m. Note that this approximation is very different from the formally defined
|
68
|
+
# "international nautical mile." Reference:
|
69
|
+
# http://en.wikipedia.org/wiki/Nautical_mile#Conversions_to_other_units
|
70
|
+
reference('mile', 'nm', Dimensional::Unit[:L, :SI, 'meter'], 1852.216, :detector => /\A((nautical )?mile|nm|nmi)\Z/) do
|
71
|
+
derive('league', nil, 3, :detector => /\A(leagues?)\Z/)
|
72
|
+
derive('cable', nil, Rational(1,10), :detector => /\A(cables?|cbls?)\Z/) do
|
73
|
+
derive('fathom', 'fm', Rational(1,10), :detector => /\A(fathoms?|fms?)\Z/) do
|
74
|
+
derive('yard', 'yd', Rational(1,6), :detector => /\A(yards?|yds?)\Z/) do
|
75
|
+
derive('foot', 'ft', Rational(1,3), :detector => /\A(foot|feet|ft|')\Z/) do
|
76
|
+
derive('inch', 'in', Rational(1,12), :detector => /\A(inch|inches|in|")\Z/)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
39
83
|
end
|
40
84
|
dimension(:M) do
|
41
85
|
system(:SI) do
|
42
86
|
base('kilogram', 'kg', :detector => /\A(kilograms?|kg)\Z/) do
|
43
87
|
derive('tonne', 't', 1000, :detector => /\A(tonnes?)\Z/) do # metric ton
|
44
|
-
prefer(:displacement)
|
45
88
|
end
|
46
89
|
derive('gram', 'g', Rational(1, 1000), :detector => /\A(grams?|g)\Z/)
|
47
90
|
end
|
48
91
|
end
|
49
92
|
system(:US) do # Common units for mass and, occasionally, force/weight (http://en.wikipedia.org/wiki/United_States_customary_units#Units_of_mass)
|
50
|
-
reference('pound', 'lb',
|
93
|
+
reference('pound', 'lb', Unit[:M, :SI, 'gram'], 453.59237, :detector => /\A(pounds?|lbs?|#)\Z/) do # avoirdupois
|
51
94
|
derive('hundredweight', 'cwt', 100, :detector => /\A(hundredweights?|cwt)\Z/) do
|
52
95
|
derive('ton', 't', 20, :detector => /\A(tons?|t)\Z/) do # short ton
|
53
|
-
prefer(:displacement)
|
54
96
|
end
|
55
97
|
end
|
56
|
-
derive('ounce', 'oz', Rational(1, 16), :detector => /\A(ounces?|ozs?)\Z/)
|
98
|
+
derive('ounce', 'oz', Rational(1, 16), :detector => /\A(ounces?|ozs?)\Z/)
|
57
99
|
derive('grain', 'gr', Rational(1, 7000), :detector => /\A(grains?|gr)\Z/) do
|
58
100
|
derive('dram', 'dr', 27 + Rational(11, 32), :detector => /\A(drams?|dr)\Z/)
|
59
101
|
end
|
60
102
|
end
|
61
103
|
end
|
62
104
|
system(:Imp) do
|
63
|
-
reference('pound', 'lb',
|
105
|
+
reference('pound', 'lb', Unit[:M, :SI, 'gram'], 453.59237, :detector => /\A(pounds?|lbs?|#)\Z/) do
|
64
106
|
derive('grain', 'gr', Rational(1, 7000), :detector => /\A(grains?|gr)\Z/)
|
65
107
|
derive('drachm', 'dr', Rational(1, 256), :detector => /\A(drachms?|dr)\Z/)
|
66
108
|
derive('ounce', 'oz', Rational(1, 16), :detector => /\A(ounces?|ozs?)\Z/)
|
@@ -68,25 +110,29 @@ Dimensional::Configurator.start do
|
|
68
110
|
derive('quarter', nil, 28, :detector => /\A(quarters?)\Z/)
|
69
111
|
derive('hundredweight', 'cwt', 112, :detector => /\A(hundredweights?|cwt)\Z/)
|
70
112
|
derive('ton', 't', 2240, :detector => /\A(tons?|t)\Z/) do # long ton
|
71
|
-
prefer(:displacement)
|
72
113
|
end
|
73
114
|
end
|
74
115
|
end
|
75
116
|
end
|
76
117
|
|
118
|
+
dimension(:Iv) do
|
119
|
+
system(:SI) do
|
120
|
+
base('candela', 'cd')
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
77
124
|
dimension(:A) do
|
78
125
|
system(:SI) do
|
79
|
-
combine('square meter', 'm2',
|
126
|
+
combine('square meter', 'm2', {Unit[:L, :SI, :meter] => 2}, :detector => /\A(sq\.?\s?met(er|re)s?|m2)\Z/) do
|
80
127
|
derive('hectare', 'ha', 10000, :format => "%.4f%U") do
|
81
|
-
prefer(:forestry, :precision => -4, :format => "%s%U")
|
82
128
|
end
|
83
129
|
end
|
84
130
|
end
|
85
131
|
system(:US) do # All measures below are approximations due to the difference between a survey foot and an international foot.
|
86
|
-
combine('square yard', 'yd2',
|
132
|
+
combine('square yard', 'yd2', {Unit[:L, :US, :yard] => 2}, :detector => /yd2/) do
|
87
133
|
derive('acre', nil, 4840)
|
88
134
|
end
|
89
|
-
combine('square mile', nil,
|
135
|
+
combine('square mile', nil, {Unit[:L, :US, :mile] => 2}, :detector => /\A(sq(uare|\.)?\s?miles?)\Z/) do
|
90
136
|
self.alias('section', nil, :detector => /\Asections?\Z/) do
|
91
137
|
derive('township', 'twp', 36, :detector => /\Atownships?\Z/)
|
92
138
|
end
|
@@ -96,37 +142,153 @@ Dimensional::Configurator.start do
|
|
96
142
|
|
97
143
|
dimension(:V) do
|
98
144
|
system(:SI) do
|
99
|
-
combine('cubic meter', 'm3',
|
100
|
-
derive('cubic decimeter', 'dm3', Rational(1, 1000), :detector => /\A(cubic
|
101
|
-
self.alias('liter', 'l', :detector => /\A(
|
102
|
-
derive('milliliter', 'ml', Rational(1, 1000), :detector => /\A(
|
145
|
+
combine('cubic meter', 'm3', {Unit[:L, :SI, :meter] => 3}, :detector => /\A(cubic met(er|re)s?|m3)\Z/, :preference => 0.75) do
|
146
|
+
derive('cubic decimeter', 'dm3', Rational(1, 1000), :detector => /\A(cubic decimet(er|re)s?|dm3)\Z/, :preference => 0.5) do
|
147
|
+
self.alias('liter', 'l', :detector => /\A(lit(er|re)s?|l|L)\Z/) do
|
148
|
+
derive('milliliter', 'ml', Rational(1, 1000), :detector => /\A(millilit(er|re)s?|ml|mL)\Z/)
|
103
149
|
end
|
104
150
|
end
|
105
151
|
end
|
106
152
|
end
|
107
153
|
system(:Imp) do
|
108
|
-
reference('ounce', 'fl oz',
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
154
|
+
reference('ounce', 'fl oz', Unit[:V, :SI, 'milliliter'], 28.4130625, :detector => /\A((fluid )?ounces?|oz)\Z/) do
|
155
|
+
derive('gill', 'gi', 5, :detector => /\A(gills?|gis?)\Z/) do
|
156
|
+
derive('cup', 'cp', 2, :detector => /\A(cups?|cps?)\Z/) do
|
157
|
+
derive('pint', 'pt', 2, :detector => /\A(pints?|pts?)\Z/) do
|
158
|
+
derive('quart', 'qt', 2, :detector => /\A(quarts?|qts?)\Z/) do
|
159
|
+
derive('gallon', 'gal', 4, :detector => /\A(gallons?|gal)\Z/)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
system(:US) do
|
167
|
+
combine('cubic inch', 'in3', {Unit[:L, :US, :inch] => 3}, :detector => /\A(cubic inch(es)?|in3)\Z/ ) do
|
168
|
+
derive('gallon', 'g', 231, :detector => /\A(gallons?|gal)\Z/) do
|
169
|
+
derive('quart', 'qt', Rational(1,4), :detector => /\A(quarts?|qts?)\Z/) do
|
170
|
+
derive('pint', 'pt', Rational(1,2), :detector => /\A(pints?|pts?)\Z/) do
|
171
|
+
derive('cup', nil, Rational(1,2), :detector => /\Acups?\Z/) do
|
172
|
+
derive('gill', 'gi', Rational(1,2), :detector => /\A(gills?|gis?)\Z/) do
|
173
|
+
derive('fluid ounce', 'fl oz', Rational(1, 4), :detector => /\A((fluid )?ounces?|oz)\Z/) do
|
174
|
+
derive('dram', 'dr', Rational(1, 8), :detector => /\A((fluid )?dra(ch)?ms?|(fl )?drs?)\Z/) do
|
175
|
+
derive('minim', '♏', Rational(1, 60))
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
dimension(:T) do
|
188
|
+
system(:SI) do
|
189
|
+
base('second', 's', :detector => /\A(seconds?|s)\Z/) do
|
190
|
+
derive('minute', 'm', 60, :detector => /\A(minutes?|m)\Z/) do
|
191
|
+
derive('hour', 'h', 60, :detector => /\A(hours?|h)\Z/) do
|
192
|
+
derive('day', 'd', 24, :detector => /\A(days?)\Z/) do
|
193
|
+
derive('week', 'w', 7, :detector => /\A(weeks?|wks?)\Z/)
|
194
|
+
derive('year', 'yr', 365 + Rational(1, 4), :detector => /\A(years?|yrs?)\Z/)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
dimension(:f) do
|
203
|
+
system(:SI) do
|
204
|
+
combine('hertz', 'Hz', {Unit[:T, :SI, :s] => -1}) do
|
205
|
+
derive('revolution per minute', 'RPM', Rational(1, 60))
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
dimension(:Vel) do
|
211
|
+
system(:SI) do
|
212
|
+
combine('meter per second', 'm/s', {Unit[:L, :SI, :m] => 1, Unit[:T, :SI, :second] => -1}) do
|
213
|
+
derive('kilometer per hour', 'km/h', Rational(100, 60*60)) do
|
214
|
+
end
|
215
|
+
end
|
115
216
|
end
|
116
217
|
system(:US) do
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
218
|
+
combine('mile per hour', 'mph', {Unit[:L, :US, :mile] => 1, Unit[:T, :SI, :hour] => -1}, :detector => /\A(mile per hour|mph)\Z/)
|
219
|
+
end
|
220
|
+
system(:BA) do
|
221
|
+
combine('knot', 'kt', {Unit[:L, :BA, :nm] => 1, Unit[:T, :SI, :hour] => -1}, :detector => /\A(knots?|kts?)\Z/)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
dimension(:F) do
|
226
|
+
system(:SI) do
|
227
|
+
combine('newton', 'N', {Unit[:M, :SI, :kg] => 1, Unit[:L, :SI, :m] => 1, Unit[:T, :SI, :s] => -2})
|
228
|
+
end
|
229
|
+
system(:US) do
|
230
|
+
# This unit requires an estimate of the force of gravity.
|
231
|
+
# Reference: http://en.wikipedia.org/wiki/Pound-force
|
232
|
+
combine('pound', 'lbf', {Unit[:M, :US, :lb] => 1, Unit[:L, :US, :ft] => 1, Unit[:T, :SI, :s] => -2}, {:reference_factor => 32.17405, :detector => /\A(lb|lbf|pounds-force)\Z/})
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
dimension(:E) do
|
237
|
+
system(:SI) do
|
238
|
+
combine('joule', 'J', {Unit[:F, :SI, :N] => 1, Unit[:L, :SI, :m] => 1})
|
239
|
+
end
|
240
|
+
system(:US) do
|
241
|
+
combine('foot-pound', 'ft-lbf', {Unit[:F, :US, :lbf] => 1, Unit[:L, :US, :ft] => 1})
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
dimension(:P) do
|
246
|
+
system(:SI) do
|
247
|
+
combine('watt', 'W', {Unit[:E, :SI, :joule] => 1, Unit[:T, :SI, :s] => -1}) do
|
248
|
+
derive('kilowatt', 'kW', 1000)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
system(:US) do
|
252
|
+
# Using the definition for mechanical horsepower, http://en.wikipedia.org/wiki/Horsepower
|
253
|
+
# reference('horsepower', 'hp', Dimensional::Unit[:P, :SI, 'watt'], 745.69987158227022, :detector => /\A(horsepower|hp)\Z/)
|
254
|
+
combine('horsepower', 'hp', {Unit[:E, :US, :'ft-lbf'] => 1, Unit[:T, :SI, :m] => -1}, {:reference_factor => 33000})
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
dimension(:Temperature) do
|
259
|
+
system(:SI) do
|
260
|
+
base('Kelvin', 'K')
|
261
|
+
end
|
262
|
+
system(:US) do
|
263
|
+
reference('Rankine', '°R', Unit[:Temperature, :SI, :K], Rational(9, 5), :detector => /\A(°Ra?|degrees Rankine)\Z/)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
dimension(:I) do
|
268
|
+
system(:SI) do
|
269
|
+
base('Ampere', 'A', :detector => /\A(amp(ere)?s?|A)\Z/)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
dimension(:Q) do
|
274
|
+
system(:SI) do
|
275
|
+
combine('coulomb', 'C', {Unit[:I, :SI, :A] => 1, Unit[:T, :SI, :s] => 1}, :detector => /\A(coulombs?|C)\Z/)
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
dimension(:Voltage) do
|
280
|
+
system(:SI) do
|
281
|
+
combine('Volt', 'V',{Unit[:P, :SI, :W] => 1, Unit[:I, :SI, :A] => -1}, :detector => /\A(volts?|V)\Z/) do
|
282
|
+
derive('millivolt', 'mV', Rational(1, 1000))
|
283
|
+
derive('kilovolt', 'kV', 1000)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
129
288
|
dimension(nil) do
|
289
|
+
system(:SI) do
|
290
|
+
base('mole', 'mol')
|
291
|
+
end
|
130
292
|
system(:US) do
|
131
293
|
base('each', 'ea', :detector => /\Aea(ch)?\Z/) do
|
132
294
|
derive('pair', 'pr', 2, :detector => /\A(pr|pair)\Z/)
|
@@ -137,4 +299,31 @@ Dimensional::Configurator.start do
|
|
137
299
|
end
|
138
300
|
end
|
139
301
|
end
|
140
|
-
end
|
302
|
+
end
|
303
|
+
|
304
|
+
class Length < Dimensional::Metric
|
305
|
+
self.dimension = Dimensional::Dimension::L
|
306
|
+
self.default = Unit[:L, :SI, :m]
|
307
|
+
end
|
308
|
+
|
309
|
+
class Autonomy < Dimensional::Metric
|
310
|
+
self.dimension = Dimension::L
|
311
|
+
self.default = Unit[:L, :BA, :nm]
|
312
|
+
self.base = Unit[:L, :SI, :m]
|
313
|
+
configure(Unit[:L, :SI, :km], {:preference => 2})
|
314
|
+
configure(Unit[:L, :US, :mi], {:preference => 3.5})
|
315
|
+
configure(Unit[:L, :Imp, :mi], {:preference => 3.5})
|
316
|
+
end
|
317
|
+
|
318
|
+
class EngineDisplacement < Dimensional::Metric
|
319
|
+
self.dimension = Dimensional::Dimension::V
|
320
|
+
self.default = Unit[:V, :SI, :l]
|
321
|
+
self.base = default
|
322
|
+
configure(Unit[:V, :US, :in3], {:preference => 2})
|
323
|
+
end
|
324
|
+
|
325
|
+
class MechanicalPower < Dimensional::Metric
|
326
|
+
self.dimension = Dimensional::Dimension::P
|
327
|
+
self.default = Unit[:P, :SI, :W]
|
328
|
+
self.base = default
|
329
|
+
end
|
data/test/dimension_test.rb
CHANGED
@@ -13,15 +13,15 @@ class DimensionTest < Test::Unit::TestCase
|
|
13
13
|
assert d.fundamental?
|
14
14
|
assert_equal 'Mass', d.name
|
15
15
|
assert_equal 'M', d.symbol
|
16
|
-
assert_equal Hash.new, d.
|
16
|
+
assert_equal Hash.new, d.basis
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_create_new_composite_dimension
|
20
20
|
l = Dimension.new('Length')
|
21
21
|
assert_instance_of Dimension, a = Dimension.new('Hyperspace', 'H4', {l => 4})
|
22
22
|
assert !a.fundamental?
|
23
|
-
assert a.
|
24
|
-
assert_equal 4, a.
|
23
|
+
assert a.basis.has_key?(l)
|
24
|
+
assert_equal 4, a.basis[l]
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_register_new_dimension
|
@@ -52,4 +52,29 @@ class DimensionTest < Test::Unit::TestCase
|
|
52
52
|
def test_return_nil_on_nil_lookup
|
53
53
|
assert_nil Dimension[nil]
|
54
54
|
end
|
55
|
+
|
56
|
+
def test_identity
|
57
|
+
d0 = Dimension.new("Length", 'L')
|
58
|
+
d1 = Dimension.new("Length", 'l')
|
59
|
+
d2 = Dimension.new("Temperature", 'Q')
|
60
|
+
# d0 and d1 are effectively identical and should collide in hashes
|
61
|
+
assert_same d0.hash, d1.hash
|
62
|
+
assert d0.eql?(d1)
|
63
|
+
# d0 and d2 are distinct and should not collide in hashes
|
64
|
+
assert_not_same d0.hash, d2.hash
|
65
|
+
assert !d0.eql?(d2)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_equality
|
69
|
+
length = Dimension.new("Length")
|
70
|
+
mass = Dimension.new("Mass")
|
71
|
+
time = Dimension.new("Time")
|
72
|
+
d0 = Dimension.new("Weight", nil, {mass => 1, length => 1, time => -2})
|
73
|
+
d1 = Dimension.new("Force", nil, {mass => 1, length => 1, time => -2})
|
74
|
+
d2 = Dimension.new("Weight", nil, {mass => 1}) # For the physics-challenged out there, pay attention!
|
75
|
+
# d0 and d1 have the same value but different identities
|
76
|
+
assert_equal d0, d1
|
77
|
+
# d0 and d3 have the same identity but different values
|
78
|
+
assert_not_equal d0, d2
|
79
|
+
end
|
55
80
|
end
|
data/test/dimensional_test.rb
CHANGED
@@ -6,22 +6,67 @@ class DimensionalTest < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
def setup
|
8
8
|
load 'test/demo.rb'
|
9
|
+
@forestry = Class.new(Metric)
|
10
|
+
@forestry.instance_eval do
|
11
|
+
self.dimension = Dimension::A
|
12
|
+
configure(Unit[:A, :SI, :hectare], :precision => -4, :format => "%s%U")
|
13
|
+
end
|
9
14
|
end
|
10
15
|
|
11
16
|
def teardown
|
12
17
|
Dimension.reset!
|
13
18
|
System.reset!
|
14
19
|
Unit.reset!
|
15
|
-
Metric.reset!
|
16
20
|
end
|
17
21
|
|
18
22
|
def test_a_lot
|
19
23
|
100.times do
|
20
|
-
assert m0 =
|
24
|
+
assert m0 = @forestry.parse("1 acre")
|
21
25
|
assert u2 = Unit[:A, :SI, 'hectare']
|
22
26
|
assert m2 = m0.convert(u2)
|
23
27
|
assert_in_delta 0.40468564224, m2, 0.00001
|
24
28
|
assert_equal "0.4047ha", m2.to_s
|
25
29
|
end
|
26
30
|
end
|
31
|
+
|
32
|
+
def test_engine_displacement
|
33
|
+
assert m = EngineDisplacement.parse('5.7l')
|
34
|
+
assert_equal 5.7, m
|
35
|
+
assert_same Unit[:V, :SI, 'liter'], m.unit
|
36
|
+
m = m.change_system(:US)
|
37
|
+
assert_in_delta 347, m, 1
|
38
|
+
assert_same Unit[:V, :US, 'in3'], m.unit
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_mechanical_power
|
42
|
+
assert m = MechanicalPower.parse('430hp')
|
43
|
+
assert_equal 430, m
|
44
|
+
assert_same Unit[:P, :US, :hp], m.unit
|
45
|
+
m = m.change_system(:SI)
|
46
|
+
assert_in_delta 320, m, 1
|
47
|
+
assert_same Unit[:P, :SI, :kW], m.unit
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_speed
|
51
|
+
speed = Class.new(Metric)
|
52
|
+
speed.instance_eval do
|
53
|
+
self.dimension = Dimension::Vel
|
54
|
+
self.default = Unit[:Vel, :SI, :"km/h"]
|
55
|
+
self.base = default
|
56
|
+
end
|
57
|
+
assert m = speed.parse('20 knots')
|
58
|
+
assert_equal 20, m
|
59
|
+
assert_same Unit[:Vel, :BA, 'knot'], m.unit
|
60
|
+
m = m.change_system(:US)
|
61
|
+
assert_in_delta 23, m, 0.1
|
62
|
+
assert_same Unit[:Vel, :US, 'mph'], m.unit
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_autonomy
|
66
|
+
assert m = Autonomy.new(200000, Unit[:L, :SI, :meter])
|
67
|
+
assert_same Unit[:L, :SI, :meter], m.unit
|
68
|
+
m = m.change_system(:US)
|
69
|
+
assert_in_delta 124.3, m, 0.1
|
70
|
+
assert_same Unit[:L, :US, :mi], m.unit
|
71
|
+
end
|
27
72
|
end
|