ruby-units 1.3.2 → 1.4.0

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.
Files changed (42) hide show
  1. data/CHANGELOG.txt +25 -7
  2. data/LICENSE.txt +1 -1
  3. data/README.md +68 -55
  4. data/RakeFile +27 -18
  5. data/TODO +2 -1
  6. data/VERSION +1 -1
  7. data/lib/ruby-units.rb +2 -2
  8. data/lib/ruby_units.rb +2 -2
  9. data/lib/ruby_units/array.rb +4 -2
  10. data/lib/ruby_units/date.rb +17 -4
  11. data/lib/ruby_units/definition.rb +100 -0
  12. data/lib/ruby_units/fixnum.rb +6 -4
  13. data/lib/ruby_units/math.rb +32 -2
  14. data/lib/ruby_units/numeric.rb +2 -1
  15. data/lib/ruby_units/object.rb +8 -1
  16. data/lib/ruby_units/string.rb +10 -109
  17. data/lib/ruby_units/string/extra.rb +45 -11
  18. data/lib/ruby_units/time.rb +11 -2
  19. data/lib/ruby_units/unit.rb +722 -434
  20. data/lib/ruby_units/unit_definitions.rb +3 -252
  21. data/lib/ruby_units/unit_definitions/base.rb +103 -0
  22. data/lib/ruby_units/unit_definitions/prefix.rb +40 -0
  23. data/lib/ruby_units/unit_definitions/standard.rb +705 -0
  24. data/lib/ruby_units/version.rb +1 -0
  25. data/ruby-units.gemspec +15 -20
  26. metadata +46 -35
  27. data/Gemfile +0 -12
  28. data/Manifest.txt +0 -19
  29. data/autotest/discover.rb +0 -1
  30. data/spec/ruby-units/array_spec.rb +0 -14
  31. data/spec/ruby-units/complex_spec.rb +0 -37
  32. data/spec/ruby-units/date_spec.rb +0 -38
  33. data/spec/ruby-units/math_spec.rb +0 -63
  34. data/spec/ruby-units/numeric_spec.rb +0 -12
  35. data/spec/ruby-units/object_spec.rb +0 -7
  36. data/spec/ruby-units/string/extra_spec.rb +0 -45
  37. data/spec/ruby-units/string_spec.rb +0 -20
  38. data/spec/ruby-units/time_spec.rb +0 -28
  39. data/spec/ruby-units/unit_spec.rb +0 -965
  40. data/spec/spec_helper.rb +0 -5
  41. data/test/test_cache.rb +0 -26
  42. data/test/test_ruby-units.rb +0 -976
data/spec/spec_helper.rb DELETED
@@ -1,5 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- Bundler.setup(:development)
4
- require 'rspec/core'
5
- require File.dirname(__FILE__) + "/../lib/ruby-units"
data/test/test_cache.rb DELETED
@@ -1,26 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'ruby-units'
4
-
5
- class TestCache < Test::Unit::TestCase
6
- def setup
7
- Unit::Cache.clear
8
- end
9
-
10
- def test_clear
11
- Unit::Cache.set("m", "m".unit)
12
- Unit::Cache.clear
13
- assert_nil(Unit::Cache.get('m'))
14
- end
15
-
16
- def test_set_cache
17
- assert_nothing_raised { Unit::Cache.set("m", "m".unit) }
18
- assert Unit::Cache.get.keys.include?('m')
19
- end
20
-
21
- def test_get_cache
22
- Unit::Cache.set("m", "m".unit)
23
- assert_equal("m".unit, Unit::Cache.get['m'])
24
- end
25
-
26
- end
@@ -1,976 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'ruby-units'
4
- require 'yaml'
5
- begin
6
- require 'chronic'
7
- rescue LoadError
8
- warn "Can't test Chronic integration unless gem 'chronic' is installed"
9
- end
10
- begin
11
- require 'uncertain'
12
- rescue LoadError
13
- warn "Can't test Uncertain Units unless 'Uncertain' gem is installed"
14
- end
15
-
16
-
17
- class Unit < Numeric
18
- @@USER_DEFINITIONS = {'<inchworm>' => [%w{inworm inchworm}, 0.0254, :length, %w{<meter>} ],
19
- '<habenero>' => [%w{degH}, 100, :temperature, %w{<celsius>}]}
20
- Unit.setup
21
- end
22
-
23
- class Time
24
- @@forced_now = nil
25
- @@forced_gmt = nil
26
- class << self
27
- alias :unforced_now :now
28
- def forced_now
29
- @@forced_now.nil? ? unforced_now : @@forced_now
30
- end
31
- alias :now :forced_now
32
-
33
- def forced_now=(now)
34
- @@forced_now = now
35
- end
36
- end
37
-
38
- alias :unforced_gmt :gmt_offset
39
- def forced_gmt
40
- @@forced_gmt.nil? ? unforced_gmt : @@forced_gmt
41
- end
42
- alias :gmt_offset :forced_gmt
43
-
44
- def forced_gmt=(gmt)
45
- @@forced_gmt = now
46
- end
47
-
48
- end
49
-
50
- class DateTime
51
- @@forced_now = nil
52
- class << self
53
- alias :unforced_now :now
54
- def forced_now
55
- return @@forced_now ? @@forced_now : unforced_now
56
- end
57
- alias :now :forced_now
58
-
59
- def forced_now=(now)
60
- @@forced_now = now
61
- end
62
-
63
- end
64
- end
65
-
66
- class Dummy
67
- def to_unit
68
- '1 mm'.unit
69
- end
70
- end
71
-
72
- class TestRubyUnits < Test::Unit::TestCase
73
-
74
- def setup
75
- @april_fools = Time.at 1143910800
76
- @april_fools_datetime = DateTime.parse('2006-04-01T12:00:00-05:00')
77
- Time.forced_now = @april_fools
78
- DateTime.forced_now = @april_fools_datetime
79
- #Unit.clear_cache
80
- end
81
-
82
- def teardown
83
- Time.forced_now = nil
84
- DateTime.forced_now = nil
85
- end
86
-
87
- def test_to_yaml
88
- unit = "1 mm".u
89
- if RUBY_PLATFORM == "java"
90
- # apparently jruby's implementation of yaml has some white space differences
91
- assert_equal "--- !ruby/object:Unit \nscalar: 1\nnumerator: \n - <milli>\n - <meter>\ndenominator: \n - <1>\nsignature: 1\nbase_scalar: !ruby/object:Rational \n denominator: 1000\n numerator: 1\n", unit.to_yaml
92
- else
93
- assert_equal "--- !ruby/object:Unit \nscalar: 1\nnumerator: \n- <milli>\n- <meter>\ndenominator: \n- <1>\nsignature: 1\nbase_scalar: !ruby/object:Rational \n denominator: 1000\n numerator: 1\n", unit.to_yaml
94
- end
95
- end
96
-
97
- def test_time
98
- a = Time.now
99
- assert_equal "s", a.to_unit.units
100
- assert_equal a + 3600, a + "1 h".unit
101
- assert_equal a - 3600, a - "1 h".unit
102
- assert_in_delta Time.now - "1 h".unit, Unit("1 h").ago, 1
103
- assert_in_delta Time.now + 3600, Unit("1 h").from(Time.now), 1
104
- assert_in_delta Time.now + "1 h".unit, Unit("1 h").from(Time.now), 1
105
- assert_in_delta Time.now - 3600, Unit("1 h").before_now, 1
106
- assert_equal "60 min", Unit("min").until(Time.now + 3600).to_s
107
- assert_equal "01:00", Unit("min").since(Time.now - 3600).to_s("%H:%M")
108
- end
109
-
110
- def test_time_helpers
111
- assert_equal @april_fools, Time.now
112
- assert_equal @april_fools_datetime, DateTime.now
113
- assert_equal 1143910800, Unit.new(Time.now).scalar
114
- assert_equal @april_fools.unit.to_time, @april_fools
115
- assert_equal Time.in('1 day'), @april_fools + 86400
116
- assert_equal "2006-04-01T12:00:00-05:00", @april_fools_datetime.inspect
117
- assert_equal "2006-04-01T00:00:00+00:00", '2453826.5 days'.unit.to_datetime.to_s
118
- end
119
-
120
- def test_string_helpers
121
- assert_equal '1 mm'.convert_to('in'), Unit('1 mm').convert_to('in')
122
- end
123
-
124
- [:sin, :cos, :tan, :sinh, :cosh, :tanh].each do |trig|
125
- define_method("test_#{trig}") do
126
- assert_equal Math.send(trig, Math::PI), Math.send(trig, "180 deg".unit)
127
- end
128
- end
129
-
130
- def test_clone
131
- unit1= "1 mm".unit
132
- unit2 = unit1.clone
133
- assert_not_equal unit1.numerator.object_id, unit2.numerator.object_id
134
- assert_not_equal unit1.denominator.object_id, unit2.denominator.object_id
135
- assert unit1 === unit2
136
- end
137
-
138
- def test_unary_minus
139
- unit1 = Unit.new("1 mm^2")
140
- unit2 = Unit.new("-1 mm^2")
141
- assert_equal unit1, -unit2
142
- end
143
-
144
- def test_unary_plus
145
- unit1 = Unit.new("1 mm")
146
- assert_equal unit1, +unit1
147
- end
148
-
149
- def test_create_unit_only
150
- unit1 = Unit.new("m")
151
- assert_equal ['<meter>'], unit1.numerator
152
- assert_equal 1.0, unit1.scalar
153
- end
154
-
155
- def test_to_base
156
- unit1 = Unit.new("100 cm")
157
- assert_in_delta 1, unit1.to_base.scalar, 0.001
158
- unit2 = Unit("1 mm^2 ms^-2")
159
- assert_in_delta 1, unit2.to_base.scalar, 0.001
160
- end
161
-
162
- def test_to_unit
163
- unit1 = "1 mm".to_unit
164
- assert_equal unit1, unit1.to_unit
165
- assert Unit === unit1
166
- unit2 = Unit("1 mm")
167
- assert Unit === unit1
168
- assert unit1 == unit2
169
- unit1 = "2.54 cm".to_unit("in")
170
- assert_in_delta 1, unit1.scalar, 0.001
171
- assert_equal ['<inch>'], unit1.numerator
172
- unit1 = "2.54 cm".unit("in")
173
- assert_in_delta 1, unit1.scalar, 0.001
174
- assert_equal ['<inch>'], unit1.numerator
175
- unit1 = 1.unit
176
- assert_in_delta 1, unit1.scalar, 0.001
177
- assert_equal ['<1>'], unit1.numerator
178
- unit1 = [1,'mm'].unit
179
- assert_in_delta 1, unit1.scalar, 0.001
180
- assert_equal ['<milli>','<meter>'], unit1.numerator
181
- end
182
-
183
- def test_create_unitless
184
- unit1 = Unit("1")
185
- assert_equal 1, unit1.to_f
186
- assert_equal ['<1>'],unit1.numerator
187
- assert_equal ['<1>'],unit1.denominator
188
- unit1 = Unit.new("1.5")
189
- assert_equal 1.5,unit1.to_f
190
- assert_equal ['<1>'],unit1.numerator
191
- assert_equal ['<1>'],unit1.denominator
192
- end
193
-
194
- def test_create_simple
195
- unit1 = Unit.new("1 m")
196
- assert_equal 1,unit1.scalar
197
- assert_equal ['<meter>'], unit1.numerator
198
- assert_equal ['<1>'],unit1.denominator
199
- end
200
-
201
- def test_create_compound
202
- unit1 = Unit.new("1 N*m")
203
- assert_equal 1,unit1.scalar
204
- assert_equal ['<newton>','<meter>'],unit1.numerator
205
- assert_equal ['<1>'],unit1.denominator
206
- end
207
-
208
- def test_create_with_denominator
209
- unit1 = Unit.new("1 m/s")
210
- assert_equal 1, unit1.scalar
211
- assert_equal ['<meter>'],unit1.numerator
212
- assert_equal ['<second>'],unit1.denominator
213
- end
214
-
215
- def test_create_with_powers
216
- unit1 = Unit.new("1 m^2/s^2")
217
- assert_equal 1, unit1.scalar
218
- assert_equal ['<meter>','<meter>'],unit1.numerator
219
- assert_equal ['<second>','<second>'],unit1.denominator
220
- unit1 = Unit.new("1 m^2 kg^2 J^2/s^2")
221
- assert_equal 1, unit1.scalar
222
- assert_equal ['<meter>','<meter>','<kilogram>','<kilogram>','<joule>','<joule>'],unit1.numerator
223
- assert_equal ['<second>','<second>'],unit1.denominator
224
-
225
- end
226
-
227
- def test_create_with_zero_power
228
- unit1 = Unit.new("1 m^0")
229
- assert_equal 1,unit1.scalar
230
- assert_equal ['<1>'],unit1.numerator
231
- assert_equal ['<1>'],unit1.denominator
232
- end
233
-
234
- def test_create_with_negative_powers
235
- unit1 = Unit.new("1 m^2 s^-2")
236
- assert_equal 1, unit1.scalar
237
- assert_equal ['<meter>','<meter>'],unit1.numerator
238
- assert_equal ['<second>','<second>'],unit1.denominator
239
- end
240
-
241
- def test_create_from_array
242
- unit1 = Unit.new(1, "mm^2", "ul^2")
243
- assert_equal 1, unit1.scalar
244
- assert_equal ['<milli>','<meter>','<milli>','<meter>'], unit1.numerator
245
- assert_equal ['<micro>','<liter>','<micro>','<liter>'], unit1.denominator
246
- end
247
-
248
- def test_bad_create
249
- assert_raises(ArgumentError) { Unit.new(nil)}
250
- assert_raises(ArgumentError) { Unit.new(true)}
251
- assert_raises(ArgumentError) { Unit.new(false)}
252
- assert_raises(ArgumentError) { Unit.new(/(.+)/)}
253
- end
254
-
255
- def test_convert
256
- unit1 = Unit.new("1 attoparsec/microfortnight")
257
- assert_nothing_raised {
258
- unit2 = unit1 >> "in/s"
259
- assert_equal ['<inch>'],unit2.numerator
260
- assert_equal ['<second>'],unit2.denominator
261
- assert_in_delta 1.0043269330917,unit2.scalar,0.00001
262
- }
263
- end
264
-
265
- def test_add_operator
266
- a = '0 mm'.unit
267
- b = '10 cm'.unit
268
- c = '1 in'.unit
269
- d = '1 ml'.unit
270
-
271
- assert_equal((a+b), b)
272
- assert_equal((a+b).units, b.units)
273
- assert_equal((b+a), b)
274
- assert_equal((b+a).units, b.units)
275
- assert_in_delta((b+c).scalar, 12.54, 0.01)
276
- assert_equal((b+c).units, 'cm')
277
- assert_raises(ArgumentError) {
278
- b + d
279
- }
280
- end
281
-
282
- def test_subtract_operator
283
- a = '0 mm'.unit
284
- b = '10 cm'.unit
285
- c = '1 in'.unit
286
- d = '1 ml'.unit
287
-
288
- assert_equal((a-b), -b)
289
- assert_equal((a-b).units, b.units)
290
- assert_equal((b-a), b)
291
- assert_equal((b-a).units, b.units)
292
- assert_in_delta((b-c).scalar, 7.46, 0.01)
293
- assert_equal((b-c).units, 'cm')
294
- assert_raises(ArgumentError) {
295
- b - d
296
- }
297
- end
298
-
299
- def test_convert_to
300
- unit1 = Unit.new("1 mm")
301
- unit2 = Unit.new("1 ft")
302
- assert_nothing_raised {
303
- unit3 = unit1 >> unit2
304
- assert_equal ['<foot>'], unit3.numerator
305
- assert_equal ['<1>'],unit3.denominator
306
- unit3 = unit1 >> "ft"
307
- assert_equal ['<foot>'], unit3.numerator
308
- assert_equal ['<1>'],unit3.denominator
309
- }
310
- assert_raises(ArgumentError) { unit1 >> 5.0}
311
- assert_equal unit1, unit1.convert_to(true)
312
- assert_equal unit1, unit1.convert_to(false)
313
- assert_equal unit1, unit1.convert_to(nil)
314
- end
315
-
316
- def test_compare
317
- unit1 = "1 mm".unit
318
- unit2 = "1 mm".unit
319
- unit3 = unit2 >> "in"
320
- assert unit1 === unit2
321
- assert !(unit1 === unit3)
322
- assert unit1 === "1 mm"
323
- end
324
-
325
- def test_matched_units
326
- unit1 = Unit.new("1 m*kg/s")
327
- unit2 = Unit.new("1 in*pound/min")
328
- assert unit1 =~ unit2
329
- end
330
-
331
- def test_matched_units_using_string
332
- unit1 = Unit.new("1 m*kg/s")
333
- assert unit1 =~ "in*pound/min"
334
- end
335
-
336
- def test_unmatched_units
337
- unit1 = Unit.new("1 m*kg/s")
338
- unit2 = Unit.new("1 mm")
339
- assert unit1 !~ unit2
340
- end
341
-
342
- def test_comparison_like_units
343
- unit1 = Unit.new("1 in")
344
- unit2 = Unit.new("1 mm")
345
- assert_nothing_raised {
346
- assert unit1 > unit2
347
- }
348
- end
349
-
350
- def test_comparison_unlike_units
351
- unit1 = Unit.new("1 kg")
352
- unit2 = Unit.new("1 mm")
353
- assert_raise(ArgumentError) { unit1 > unit2 }
354
- end
355
-
356
- def test_add_like_units
357
- unit1 = Unit.new("1 mm")
358
- unit2 = Unit.new("2 mm")
359
- assert_nothing_raised {
360
- assert_equal 3.0, (unit1+unit2).scalar
361
- }
362
- end
363
-
364
- def test_add_similar_units
365
- unit1 = Unit.new("1 cm")
366
- unit2 = Unit.new("1 in")
367
- assert_nothing_raised {
368
- unit3 = unit1 + unit2
369
- assert_in_delta 3.54, unit3.scalar, 0.01
370
- }
371
- end
372
-
373
- def test_subtract_similar_units
374
- unit1 = Unit.new("1 cm")
375
- unit2 = Unit.new("1 in")
376
- assert_nothing_raised {
377
- unit3 = unit1 - unit2
378
- assert_in_delta(-1.54, unit3.scalar, 0.01)
379
- }
380
- end
381
-
382
- def test_add_unlike_units
383
- unit1 = Unit.new("1 mm")
384
- unit2 = Unit.new("2 ml")
385
- assert_raise(ArgumentError) {(unit1+unit2).scalar}
386
- end
387
-
388
- def test_add_coerce
389
- unit1 = "1 mm".unit
390
- assert_nothing_raised {
391
- unit2 = unit1 + "1 mm"
392
- assert_equal "2 mm".unit, unit2
393
- }
394
- assert_nothing_raised {
395
- unit2 = unit1 + [1,"mm"]
396
- assert_equal "2 mm".unit, unit2
397
- }
398
- assert_nothing_raised {
399
- unit2 = "1".unit + 1
400
- assert_equal "2".unit, unit2
401
- }
402
- assert_raises(ArgumentError) {
403
- "1".unit + nil
404
- }
405
- end
406
-
407
- def test_subtract_coerce
408
- unit1 = "1 mm".unit
409
- assert_nothing_raised {
410
- unit2 = unit1 - "1 mm"
411
- assert_equal "0 mm".unit, unit2
412
- }
413
- end
414
- def test_multiply_coerce
415
- unit1 = "1 mm".unit
416
- assert_nothing_raised {
417
- unit2 = unit1 * "1 mm"
418
- assert_equal "1 mm^2".unit, unit2
419
- }
420
- end
421
- def test_divide_coerce
422
- unit1 = "1 mm".unit
423
- assert_nothing_raised {
424
- unit2 = unit1 / "1 mm"
425
- assert_equal "1".unit, unit2
426
- }
427
- end
428
-
429
- def test_signature #"1 m s deg K kg A mol cd byte rad
430
- unit1 = Unit.new("1 m*s*degK*kg*A*mol*cd*byte*rad*dollar")
431
- assert_equal unit1.signature, (0..9).inject(0) {|product, n| product + 20**n}
432
- end
433
-
434
- def test_subtract_like_units
435
- unit1 = Unit.new("1 mm")
436
- unit2 = Unit.new("2 mm")
437
- assert_nothing_raised {
438
- assert_equal(-1, (unit1-unit2).scalar)
439
- }
440
- end
441
-
442
- def test_subtract_unlike_units
443
- unit1 = Unit.new("1 mm")
444
- unit2 = Unit.new("2 ml")
445
- assert_raise(ArgumentError) {(unit1-unit2).scalar}
446
- end
447
-
448
- def test_multiply
449
- unit1 = Unit.new("1 m/ms")
450
- unit2 = Unit.new("1 m/ms")
451
- assert_nothing_raised {
452
- unit3 = unit1 * unit2
453
- assert_equal Unit.new("1 m^2/ms^2"), unit3
454
- }
455
- assert_equal unit1 * 0, '0 m/ms'.unit
456
- end
457
-
458
- def test_divide
459
- unit1 = Unit.new("200 M*g/mol")
460
- unit2 = Unit.new("200 g/mole")
461
- assert_nothing_raised {
462
- unit3 = unit1 / unit2
463
- assert_equal Unit.new("1 M"), unit3
464
- }
465
- assert_equal unit2 / 1, unit2
466
- unit3 = '0 s'.unit
467
- assert_raises(ZeroDivisionError) {
468
- unit1 / unit3
469
- }
470
-
471
- assert_raises(ZeroDivisionError) {
472
- unit1 / 0
473
- }
474
- end
475
-
476
- def test_inverse
477
- unit1 = Unit.new("1 m")
478
- unit2 = Unit.new("1 1/m")
479
- assert_equal unit2, unit1.inverse
480
- assert_raises((ZeroDivisionError)) { 0.unit.inverse }
481
- end
482
-
483
- def test_exponentiate_positive
484
- unit1 = Unit.new("1 mm")
485
- unit2 = Unit.new("1 mm^2")
486
- assert_nothing_raised {
487
- assert_equal unit2, unit1**2
488
- }
489
- end
490
-
491
- def test_exponentiate_float
492
- unit1 = Unit.new("1 mm")
493
- assert_raise(ArgumentError) {unit1**2.5}
494
- end
495
-
496
- def test_exponentiate_negative
497
- unit1 = Unit.new("1 m")
498
- unit2 = Unit.new("1 m^-2")
499
- assert_nothing_raised {
500
- assert_equal unit2, unit1**-2
501
- }
502
- assert_raises(ZeroDivisionError) {
503
- "0 mm".unit**-1
504
- }
505
- end
506
-
507
- def test_exponentiate_zero
508
- unit1 = Unit.new("10 mm")
509
- unit2 = Unit.new("1")
510
- assert_nothing_raised {
511
- assert_equal unit2, unit1**0
512
- }
513
- assert_equal 1, "0 mm".unit**0
514
- end
515
-
516
- def test_abs
517
- unit1 = Unit.new("-1 mm")
518
- assert_equal "1 mm".unit, unit1.abs
519
- end
520
-
521
- def test_ceil
522
- unit1 = Unit.new("1.1 mm")
523
- unit2 = Unit.new("2 mm")
524
- assert_equal unit2, unit1.ceil
525
- assert_equal(('1 mm'.unit / '1 mm'.unit).ceil, 1)
526
- assert_equal("11 kg*m".unit, ("1003 kg*m".unit / 100).ceil)
527
- end
528
-
529
- def test_floor
530
- unit1 = Unit.new("1.1 mm")
531
- unit2 = Unit.new("1 mm")
532
- assert_equal unit2, unit1.floor
533
- assert_equal(('1 mm'.unit / '1 mm'.unit).floor, 1)
534
- end
535
-
536
- def test_to_int
537
- assert_raises(RuntimeError) {Unit.new("1.1 mm").to_i}
538
- assert_nothing_raised {Unit.new(10.5).to_i}
539
- end
540
-
541
- def test_truncate
542
- unit1 = Unit.new("1.1 mm")
543
- unit2 = Unit.new("1 mm")
544
- assert_equal unit2, unit1.truncate
545
- assert_equal((unit1/unit2).truncate, 1)
546
- end
547
-
548
- def test_round
549
- unit1 = Unit.new("1.1 mm")
550
- unit2 = Unit.new("1 mm")
551
- assert_equal unit2, unit1.round
552
- assert_equal((unit1/unit2).round, 1)
553
- end
554
-
555
- def test_zero?
556
- unit1 = Unit.new("0")
557
- assert unit1.zero?
558
- end
559
-
560
- def test_nonzero?
561
- unit1 = Unit.new("0")
562
- unit2 = Unit.new("1 mm")
563
- assert_nil unit1.nonzero?
564
- assert_equal unit2, unit2.nonzero?
565
- end
566
-
567
- def test_equality
568
- unit1 = Unit.new("1 cm")
569
- unit2 = Unit.new("10 mm")
570
- assert unit1 == unit2
571
- end
572
-
573
- def test_temperature_conversions
574
- assert_raises(ArgumentError) { '-1 tempK'.unit}
575
- assert_raises(ArgumentError) { '-1 tempR'.unit}
576
- assert_raises(ArgumentError) { '-1000 tempC'.unit}
577
- assert_raises(ArgumentError) { '-1000 tempF'.unit}
578
-
579
- assert_in_delta '32 tempF'.unit.base_scalar, '0 tempC'.unit.base_scalar, 0.01
580
- assert_in_delta '0 tempC'.unit.base_scalar, '32 tempF'.unit.base_scalar, 0.01
581
- assert_in_delta '0 tempC'.unit.base_scalar, '273.15 tempK'.unit.base_scalar, 0.01
582
- assert_in_delta '0 tempC'.unit.base_scalar, '491.67 tempR'.unit.base_scalar, 0.01
583
-
584
- a = '10 degC'.unit
585
- assert_equal a >> 'tempC', '-263.15 tempC'.unit
586
- assert_equal a >> 'tempK', '10 tempK'.unit
587
- assert_equal a >> 'tempR', '18 tempR'.unit
588
- assert_equal a >> 'tempF', '-441.67 tempF'.unit
589
-
590
- unit1 = '37 tempC'.unit
591
- assert_equal unit1 >> 'tempF' >> 'tempK' >> 'tempR' >> 'tempC', unit1
592
-
593
- a = '100 tempF'.unit
594
- b = '10 degC'.unit
595
- c = '50 tempF'.unit
596
- d = '18 degF'.unit
597
- assert_equal('118 tempF'.unit,a+b)
598
- assert_equal b+a, '118 tempF'.unit
599
- assert_equal a-b, '82 tempF'.unit
600
- assert_in_delta((a-c).scalar, '50 degF'.unit.scalar, 0.01)
601
- assert_in_delta '20 degC'.unit.scalar, (b+d).scalar, 0.01
602
- assert_raises(ArgumentError) { a * b }
603
- assert_raises(ArgumentError) { a / b }
604
- assert_raises(ArgumentError) { a ** 2 }
605
- assert_raises(ArgumentError) { c - '400 degK'.unit}
606
- assert_equal a, a.convert_to('tempF')
607
- end
608
-
609
- def test_feet
610
- unit1 = Unit.new("6'6\"")
611
- assert_in_delta 6.5, unit1.scalar, 0.01
612
- unit2 = "6'".unit
613
- assert_equal unit2, '6 feet'.unit
614
- unit3 = '6"'.unit
615
- assert_equal unit3, '6 inch'.unit
616
-
617
- end
618
-
619
- def test_pounds
620
- unit1 = Unit.new("8 pounds, 8 ounces")
621
- assert_in_delta 8.5, unit1.scalar, 0.01
622
- assert_equal '150#'.unit, '150 lbs'.unit
623
- end
624
-
625
- # these units are 'ambiguous' and could be mis-parsed
626
- def test_parse_tricky_units
627
- unit1 = Unit.new('1 mm') #sometimes parsed as 'm*m'
628
- assert_equal ['<milli>','<meter>'], unit1.numerator
629
- unit2 = Unit.new('1 cd') # could be a 'centi-day' instead of a candela
630
- assert_equal ['<candela>'], unit2.numerator
631
- unit3 = Unit.new('1 min') # could be a 'milli-inch' instead of a minute
632
- assert_equal ['<minute>'], unit3.numerator
633
- unit4 = Unit.new('1 ft') # could be a 'femto-ton' instead of a foot
634
- assert_equal ['<foot>'], unit4.numerator
635
- unit5 = "1 atm".unit
636
- assert_equal ['<atm>'], unit5.numerator
637
- unit6 = "1 doz".unit
638
- assert_equal ['<dozen>'], unit6.numerator
639
- end
640
-
641
- def test_to_s
642
- unit1 = Unit.new("1")
643
- assert_equal "1", unit1.to_s
644
- unit2 = Unit.new("mm")
645
- assert_equal "1 mm", unit2.to_s
646
- assert_equal "0.04 in", unit2.to_s("%0.2f in")
647
- assert_equal "1/10 cm", unit2.to_s("cm")
648
- unit3 = Unit.new("1 mm")
649
- assert_equal "1 mm", unit3.to_s
650
- assert_equal "0.04 in", unit3.to_s("%0.2f in")
651
- unit4 = Unit.new("1 mm^2")
652
- assert_equal "1 mm^2", unit4.to_s
653
- unit5 = Unit.new("1 mm^2 s^-2")
654
- assert_equal "1 mm^2/s^2", unit5.to_s
655
- unit6= Unit.new("1 kg*m/s")
656
- assert_equal "1 kg*m/s", unit6.to_s
657
- unit7= Unit.new("1 1/m")
658
- assert_equal "1 1/m", unit7.to_s
659
- assert_equal("1.5 mm", Unit.new("1.5 mm").to_s)
660
- assert_equal("1.5 mm", "#{Unit.new('1.5 mm')}")
661
- end
662
-
663
- def test_to_feet_inches
664
- unit1 = Unit.new("6'5\"")
665
- assert_equal "6'5\"", unit1.to_s(:ft)
666
- assert_raises(ArgumentError) {
667
- unit1 = Unit.new("1 kg")
668
- unit1.to_s(:ft)
669
- }
670
- end
671
-
672
- def test_to_lbs_oz
673
- unit1 = Unit.new("8 lbs 8 oz")
674
- assert_equal "8 lbs, 8 oz", unit1.to_s(:lbs)
675
- assert_raises(ArgumentError) {
676
- unit1 = Unit.new("1 m")
677
- unit1.to_s(:lbs)
678
- }
679
- end
680
-
681
- def test_add_units
682
- a = Unit.new("1 inchworm")
683
- assert_equal "1 inworm", a.to_s
684
- end
685
-
686
- def test_ideal_gas_law
687
- p = Unit "100 kPa"
688
- v = Unit "1 m^3"
689
- n = Unit "1 mole"
690
- r = Unit "8.31451 J/mol*degK"
691
- t = ((p*v)/(n*r)).convert_to('tempK')
692
- assert_in_delta 12027.16,t.base_scalar, 0.1
693
- end
694
-
695
-
696
- def test_eliminate_terms
697
- a = ['<meter>','<meter>','<kelvin>','<second>']
698
- b = ['<meter>','<meter>','<second>']
699
- h = Unit.eliminate_terms(1,a,b)
700
- assert_equal ['<kelvin>'], h[:numerator]
701
- end
702
-
703
- def test_to_base_consistency
704
- a = "1 W*m/J*s".unit
705
- assert_equal a.signature, a.to_base.signature
706
- end
707
-
708
- def test_unit_roots
709
- unit1 = Unit "2 m*J*kg"
710
- unit2 = Unit "4 m^2*J^2*kg^2"
711
- unit3 = Unit "8 m^3*J^3*kg^3"
712
- assert_equal unit2**(1/2), unit1
713
- assert_equal unit3**(1/3), unit1
714
- end
715
-
716
- def test_inspect
717
- unit1 = Unit "1 mm"
718
- assert_equal "1 mm", unit1.inspect
719
- assert_not_equal "1.0 mm", unit1.inspect(:dump)
720
- end
721
-
722
- def test_to_f
723
- assert_equal 1, 1.unit.to_f
724
- assert_raises(RuntimeError) {
725
- assert_equal 1, "1 mm".unit.to_f
726
- }
727
- end
728
-
729
- def test_exponentiate_float2
730
- assert_equal "2 m".unit, "4 m^2".unit**(0.5)
731
- assert_raises(ArgumentError) { "1 mm".unit**(2/3)}
732
- assert_raises(ArgumentError) { "1 mm".unit**("A")}
733
-
734
- end
735
-
736
- def test_range
737
- a = Unit "1 mm"
738
- b = Unit "3 mm"
739
- c = (a..b).to_a
740
- assert_equal ["1 mm".unit, "2 mm".unit, "3 mm".unit], c
741
- end
742
-
743
- def test_scientific
744
- a = Unit "1e6 cells"
745
- assert_equal 1e6, a.scalar
746
- assert_equal "cells", a.units
747
- end
748
-
749
- if defined?(Uncertain)
750
- def test_uncertain
751
- a = '1 +/- 1 mm'.unit
752
- assert_equal a.to_s, '1 +/- 1 mm'
753
- end
754
- end
755
-
756
- def test_format
757
- assert_equal "%0.2f" % "1 mm".unit, "1.00 mm"
758
- end
759
-
760
- def test_bad_units
761
- assert_raises(ArgumentError) { '1 doohickey / thingamabob'.unit}
762
- assert_raises(ArgumentError) { '1 minimeter'.unit}
763
- end
764
-
765
- def test_currency
766
- assert_nothing_raised {"$1".unit}
767
- end
768
-
769
- def test_kind
770
- a = "1 mm".unit
771
- assert_equal a.kind, :length
772
- end
773
-
774
- def test_percent
775
- assert_nothing_raised {
776
- "1 percent".unit
777
- "1%".unit
778
- "0.01%".unit
779
- }
780
- a = '100 ml'.unit
781
- b = '50%'.unit
782
- c = a*b >> 'ml'
783
- assert c =~ a
784
- assert_in_delta '50 ml'.unit.scalar, c.scalar, 0.0001
785
- end
786
-
787
- def test_parse
788
- assert_nothing_raised { "1 1/m".unit }
789
- assert_raises(ArgumentError) { "3 s/s/ft".unit }
790
- assert_raises(ArgumentError) { "3 s**2|,s**2".unit }
791
- assert_raises(ArgumentError) { "3 s**2 4s s**2".unit }
792
- assert_raises(ArgumentError) { "3 s 5^6".unit }
793
- assert_raises(ArgumentError) { "".unit }
794
- assert_raises(ArgumentError) { " ".unit }
795
- assert_raises(ArgumentError) { "\t".unit }
796
- assert_raises(ArgumentError) { "\t\t".unit }
797
- assert_raises(ArgumentError) { "\n".unit }
798
- end
799
-
800
- def test_inline_conversions
801
- assert_equal "60 s".unit, Unit.parse("1 min to seconds")
802
- assert_equal "60 s".unit, Unit.parse("1 min as seconds")
803
- assert_equal "60 s".unit, Unit.parse("1 min in seconds")
804
- end
805
-
806
- def test_time_conversions
807
- today = Time.now
808
- assert_equal today,@april_fools
809
- last_century = today - '150 years'.unit
810
- assert_equal last_century.to_date, DateTime.parse('1856-04-01')
811
- end
812
-
813
- def test_coercion
814
- assert_nothing_raised { 1.0 * '1 mm'.unit}
815
- assert_nothing_raised { '1 mm'.unit * 1.0}
816
- end
817
-
818
- def test_zero
819
- assert_nothing_raised { Unit.new(0) }
820
- end
821
-
822
- def test_divide_results_in_unitless
823
- a = '10 mg/ml'.unit
824
- b = '10 mg/ml'.unit
825
- assert_equal a/b, 1
826
- end
827
-
828
- def test_wt_percent
829
- a = '1 wt%'.unit
830
- b = '1 g/dl'.unit
831
- assert_equal a,b
832
- end
833
-
834
- def test_parse_durations
835
- assert_equal "1:00".unit, '1 hour'.unit
836
- assert_equal "1:30".unit, "1.5 hour".unit
837
- assert_equal "1:30:30".unit, "1.5 hour".unit + '30 sec'.unit
838
- assert_equal "1:30:30,200".unit, "1.5 hour".unit + '30 sec'.unit + '200 usec'.unit
839
- end
840
-
841
- def test_coercion_2
842
- a = Dummy.new
843
- b = '1 mm'.unit
844
- assert_equal '2 mm'.unit, b + a
845
- end
846
-
847
- def test_create_with_other_unit
848
- a = '1 g'.unit
849
- b = 0.unit(a)
850
- assert_equal b, '0 g'.unit
851
- end
852
-
853
- def test_sqrt
854
- a = '-9 mm^2'.unit
855
- b = a**(0.5)
856
- assert_in_delta Math.sqrt(a).to_unit.scalar.real, b.scalar.real, 0.00001
857
- # ruby 1.8.x uses .image while 1.9.x uses .imaginary
858
- if Complex.instance_methods.include?(:imaginary)
859
- assert_in_delta Math.sqrt(a).to_unit.scalar.imaginary, b.scalar.imaginary, 0.00001
860
- else
861
- assert_in_delta Math.sqrt(a).to_unit.scalar.image, b.scalar.image, 0.00001
862
- end
863
- end
864
-
865
- def test_div
866
- assert_equal 11,"23 m".unit.div('2 m'.unit)
867
- end
868
-
869
- def test_divmod
870
- assert_equal [277,1], 555.unit('mm').divmod(2.unit('mm'))
871
- assert_equal [277, 0.0010000000000000373], '0.555 m'.unit.divmod('2 mm'.unit)
872
- assert_raises(ArgumentError) { '1 m'.unit.divmod('1 kg'.unit) }
873
- end
874
-
875
- if Math.respond_to?(:cbrt)
876
- def test_cbrt
877
- assert_in_delta '2 mm'.to_unit, Math.cbrt('8 mm^3'.to_unit), 0.0001
878
- end
879
- end
880
-
881
- def test_hypot
882
- assert_equal Math.hypot('3 mm'.unit,'4 mm'.unit), '5 mm'.unit
883
- assert_raises(ArgumentError) { Math.hypot('3 mm'.unit, '4 kg'.unit)}
884
- end
885
-
886
- def test_complex
887
- assert_equal '1+1i mm'.unit.scalar, Complex(1,1)
888
- assert_equal '1+1i'.unit.scalar, Complex(1,1)
889
- assert_raises(RuntimeError) { '1+1i mm'.unit.to_c}
890
- end
891
-
892
- def test_atan2
893
- assert_equal Math.atan2('1 mm'.unit,'1 mm'.unit), Math.atan2(1,1)
894
- assert_raises(ArgumentError) {Math.atan2('1 mm'.unit, '1 lb'.unit)}
895
- assert_raises(RuntimeError) {Math.atan2('1 mm'.unit, 1)}
896
- end
897
-
898
- def test_rational_units
899
- assert_equal '1/4 cup'.unit, '0.25 cup'.unit
900
- assert_equal '1/4 in/s'.unit, '0.25 in/s'.unit
901
- assert_equal '1/4'.unit, 0.25
902
- end
903
-
904
- def test_to_date
905
- a = Time.now
906
- assert_equal a.send(:to_date), Date.today
907
- end
908
-
909
- def test_natural_language
910
- assert_equal Unit.parse("10 mm in cm"), '10 mm'.unit.convert_to('cm')
911
- end
912
-
913
- def test_round_pounds
914
- assert_equal '1 lbs'.unit, '1.1 lbs'.unit.round
915
- end
916
-
917
- def test_explicit_init
918
- assert_equal '1 lbf'.unit, '1 <pound-force>'.unit
919
- assert_equal '1 lbs'.unit, '1 <pound>'.unit
920
- assert_equal('1 kg*m'.unit, '1 <kilogram>*<meter>'.unit)
921
- end
922
-
923
- def test_format_nil_string
924
- assert_nothing_raised {"" % nil}
925
- assert_nothing_raised {"" % false}
926
- end
927
-
928
- def test_to_s_cache
929
- Unit.clear_cache
930
- a = Unit.new('1 mm')
931
- a.to_s # cache the conversion to itself
932
- b = Unit.new('2 mm')
933
- assert_equal('2 mm', b.to_s)
934
- assert_equal('1/1000 m', a.to_s('m'))
935
- assert_equal('1/1000 m', a.output['m'])
936
- end
937
-
938
- def test_version
939
- assert_equal('1.3.2', Unit::VERSION)
940
- end
941
-
942
- def test_negation
943
- a = 1.to_unit
944
- assert_equal(a.class, (1-a).class)
945
- end
946
-
947
- def test_degree
948
- assert "100 tempF".unit.degree?
949
- assert "100 degC".unit.degree?
950
- assert !"1 mm".unit.degree?
951
- end
952
-
953
- def test_temperature
954
- assert "100 tempF".unit.temperature?
955
- assert !"100 degC".unit.temperature?
956
- assert !"1 mm".unit.temperature?
957
- end
958
-
959
- def test_parse_into_numbers_and_units
960
- assert_equal([1,"m"], Unit.parse_into_numbers_and_units("1 m"))
961
- assert_equal([1.0,"m"], Unit.parse_into_numbers_and_units("1.0 m"))
962
- assert_equal([0.1,"m"], Unit.parse_into_numbers_and_units("0.1 m"))
963
- assert_equal([0.1,"m"], Unit.parse_into_numbers_and_units(".1 m"))
964
- assert_equal([-1.23E-3,"m"], Unit.parse_into_numbers_and_units("-1.23E-3 m"))
965
- assert_equal([1/4,"m"], Unit.parse_into_numbers_and_units("1/4 m"))
966
- assert_equal([-1/4,"m"], Unit.parse_into_numbers_and_units("-1/4 m"))
967
- assert_equal([1,"m"], Unit.parse_into_numbers_and_units("1 m"))
968
- assert_equal([1,"m"], Unit.parse_into_numbers_and_units("m"))
969
- assert_equal([10,""], Unit.parse_into_numbers_and_units("10"))
970
- assert_equal([10.0,""], Unit.parse_into_numbers_and_units("10.0"))
971
- assert_equal([(1/4),""], Unit.parse_into_numbers_and_units("1/4"))
972
- assert_equal([Complex(1,1),""], Unit.parse_into_numbers_and_units("1+1i"))
973
- end
974
-
975
- end
976
-