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/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
- Dimensional::Dimension.register('Length')
7
- Dimensional::Dimension.register('Mass')
8
- Dimensional::Dimension.register('Time')
9
- Dimensional::Dimension.register('Temperature', 'Temp') # Θ is the proper symbol, but it can't be represented in US ASCII
10
- Dimensional::Dimension.register('Electric Charge', 'Q')
11
- Dimensional::Dimension.register('Area', 'A', {Dimensional::Dimension[:L] => 2})
12
- Dimensional::Dimension.register('Volume', 'V', {Dimensional::Dimension[:L] => 3})
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
- Dimensional::System.register('SI - International System (kg, tonne, m)', 'SI')
16
- Dimensional::System.register('US Customary (lbs, ton, ft)', 'US') # http://en.wikipedia.org/wiki/United_States_customary_units
17
- Dimensional::System.register('US Customary Troy (oz)', 'USt') # http://en.wikipedia.org/wiki/United_States_customary_units
18
- Dimensional::System.register('British Imperial (lbs, ton, ft)', 'Imp') # http://en.wikipedia.org/wiki/Imperial_units
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
- Dimensional::Configurator.start do
33
+ Configurator.start do
21
34
  dimension(:L) do
22
35
  system(:SI) do
23
- base('meter', 'm', :detector => /\A(meters?|m)\Z/) do
24
- derive('centimeter', 'cm', Rational(1, 100), :detector => /\A(centimeters?|cm)\Z/)
25
- derive('kilometer', 'km', 1000, :detector => /\A(kilometers?|km)\Z/)
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
- prefer(:hull)
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', Dimensional::Unit[:M, :SI, 'gram'], 453.59237, :detector => /\A(pounds?|lbs?|#)\Z/) do # avoirdupois
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', Dimensional::Unit[:M, :SI, 'gram'], 453.59237, :detector => /\A(pounds?|lbs?|#)\Z/) do
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', %w(meter meter).map{|name| Dimensional::Unit[:L, :SI, name]}, :detector => /\A(sq\.?\s?meters?|m2)\Z/) do
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', %w(yard yard).map{|name| Dimensional::Unit[:L, :US, name]}, :detector => /yd2/) do
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, %w(mile mile).map{|name| Dimensional::Unit[:L, :US, name]}, :detector => /\A(sq(uare|\.)?\s?miles?)\Z/) do
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', %w(meter meter meter).map{|name| Dimensional::Unit[:L, :SI, name]}, :detector => /\A(cubic meters?|m3)\Z/) do
100
- derive('cubic decimeter', 'dm3', Rational(1, 1000), :detector => /\A(cubic decimeters?|dm3)\Z/) do
101
- self.alias('liter', 'l', :detector => /\A(liters?|l|L)\Z/) do
102
- derive('milliliter', 'ml', Rational(1, 1000), :detector => /\A(milliliters?|ml|mL)\Z/)
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', Dimensional::Unit[:V, :SI, 'milliliter'], 28.4130625, :detector => /\A((fluid )?ounces?|oz)\Z/)
109
- # register :ounce, :conversion => [28.4130625, :milliliter], :detector => /\A(imperial\s(fluid )?imp\.\sounces?|imp\.\soz)\Z/, :abbreviation => "imp. oz"
110
- # register :gill, :conversion => [5, :ounce], :detector => /\A(gills?|gi)\Z/, :abbreviation => "gi"
111
- # register :cup, :conversion => [2, :gill], :detector => /\A(cups?)\Z/, :abbreviation => "cp"
112
- # register :pint, :conversion => [2, :cup], :detector => /\A(pints?|pt)\Z/, :abbreviation => "pt"
113
- # register :quart, :conversion => [2, :pint], :detector => /\A(quarts?|qt)\Z/, :abbreviation => "qt"
114
- # register :gallon, :conversion => [4, :quart], :detector => /\A(gallons?|gal)\Z/, :abbreviation => "gal"
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
- # # Common US Customary units for volume, based on the SI Base Unit 'liter'
118
- # register :minim, :conversion => [0.00006161152, :liter], :abbreviation => "min" # Base Unit
119
- # register :dram, :conversion => [60, :minim], :abbreviation => "fl dr"
120
- # register :ounce, :conversion => [8, :dram], :detector => /\A((fluid )?ounces?|oz)\Z/, :abbreviation => "fl oz"
121
- # register :gill, :conversion => [4, :ounce], :detector => /\A(gills?|gi)\Z/, :abbreviation => "gi"
122
- # register :cup, :conversion => [2, :gill], :detector => /\A(cups?)\Z/, :abbreviation => "cp"
123
- # register :pint, :conversion => [2, :cup], :detector => /\A(pints?|pt)\Z/, :abbreviation => "pt"
124
- # register :quart, :conversion => [2, :pint], :detector => /\A(quarts?|qt)\Z/, :abbreviation => "qt"
125
- # register :gallon, :conversion => [4, :quart], :detector => /\A(gallons?|gal)\Z/, :abbreviation => "gal"
126
- end
127
- end
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
@@ -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.exponents
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.exponents.has_key?(l)
24
- assert_equal 4, a.exponents[l]
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
@@ -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 = Measure.parse("1 acre", Metric[:forestry])
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