ruby-units 1.3.2 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
-