Skip to content

Commit

Permalink
move stuff around, tweak regex used to recognize numbers so that it w…
Browse files Browse the repository at this point in the history
…ill handle units with only one character right.
  • Loading branch information
olbrich committed Apr 23, 2011
1 parent ab1536e commit 1b3fa0c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 25 deletions.
33 changes: 17 additions & 16 deletions lib/ruby_units/unit.rb
Expand Up @@ -879,6 +879,21 @@ def truncate
Unit.new(@scalar.truncate, @numerator, @denominator)
end

# returns next unit in a range. '1 mm'.unit.succ #=> '2 mm'.unit
# only works when the scalar is an integer
def succ
raise ArgumentError, "Non Integer Scalar" unless @scalar == @scalar.to_i
Unit.new(@scalar.to_i.succ, @numerator, @denominator)
end
alias :next :succ

# returns next unit in a range. '1 mm'.unit.succ #=> '2 mm'.unit
# only works when the scalar is an integer
def pred
raise ArgumentError, "Non Integer Scalar" unless @scalar == @scalar.to_i
Unit.new(@scalar.to_i.pred, @numerator, @denominator)
end


# Tries to make a Time object from current unit. Assumes the current unit hold the duration in seconds from the epoch.
def to_time
Expand Down Expand Up @@ -959,21 +974,7 @@ def from(time_point = ::Time.now)
alias :after :from
alias :from_now :from

# returns next unit in a range. '1 mm'.unit.succ #=> '2 mm'.unit
# only works when the scalar is an integer
def succ
raise ArgumentError, "Non Integer Scalar" unless @scalar == @scalar.to_i
Unit.new(@scalar.to_i.succ, @numerator, @denominator)
end
alias :next :succ

# returns next unit in a range. '1 mm'.unit.succ #=> '2 mm'.unit
# only works when the scalar is an integer
def pred
raise ArgumentError, "Non Integer Scalar" unless @scalar == @scalar.to_i
Unit.new(@scalar.to_i.pred, @numerator, @denominator)
end



# automatically coerce objects to units when possible
# if an object defines a 'to_unit' method, it will be coerced using that method
Expand Down Expand Up @@ -1230,7 +1231,7 @@ def self.parse_into_numbers_and_units(string)
rational = %r{[+-]?\d+\/\d+}
# complex numbers... -1.2+3i, +1.2-3.3i
complex = %r{#{sci}{2,2}i}
anynumber = %r{(?:(#{complex}|#{rational}|#{sci})\b)?\s?([\D].+)?}
anynumber = %r{(?:(#{complex}|#{rational}|#{sci})\b)?\s?([\D].*)?}
num, unit = string.scan(anynumber).first
[case num
when NilClass
Expand Down
20 changes: 11 additions & 9 deletions test/test_ruby-units.rb
Expand Up @@ -86,7 +86,7 @@ def teardown

def test_to_yaml
unit = "1 mm".u
assert_equal "--- !ruby/object:Unit \nscalar: 1.0\nnumerator: \n- <milli>\n- <meter>\ndenominator: \n- <1>\nsignature: 1\nbase_scalar: 0.001\n", unit.to_yaml
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
end

def test_time
Expand All @@ -96,9 +96,8 @@ def test_time
assert_equal a - 3600, a - "1 h".unit
assert_in_delta Time.now - "1 h".unit, "1 h".ago, 1
assert_in_delta Time.now + 3600, "1 h".from_now, 1
assert_in_delta "1 h".unit + Time.now, "1 h".from_now, 1
assert_in_delta Time.now + "1 h".unit, "1 h".from_now, 1
assert_in_delta Time.now - 3600, "1 h".before_now, 1
assert_in_delta((Time.now.unit - Time.now).unit.scalar, 0, 1)
assert_equal "60 min", "min".until(Time.now + 3600).to_s
assert_equal "01:00", "min".since(Time.now - 3600).to_s("%H:%M")
assert_in_delta Time.now, "now".time, 1
Expand Down Expand Up @@ -629,8 +628,7 @@ def test_temperature_conversions
assert_equal b+a, '118 tempF'.unit
assert_equal a-b, '82 tempF'.unit
assert_in_delta((a-c).scalar, '50 degF'.unit.scalar, 0.01)
assert_equal b+d, '20 degC'.unit

assert_in_delta '20 degC'.unit, b+d, Unit("0.01 degC")
assert_raises(ArgumentError) { a * b }
assert_raises(ArgumentError) { a / b }
assert_raises(ArgumentError) { a ** 2 }
Expand Down Expand Up @@ -676,7 +674,7 @@ def test_to_s
unit2 = Unit.new("mm")
assert_equal "1 mm", unit2.to_s
assert_equal "0.04 in", unit2.to_s("%0.2f in")
assert_equal "0.1 cm", unit2.to_s("cm")
assert_equal "1/10 cm", unit2.to_s("cm")
unit3 = Unit.new("1 mm")
assert_equal "1 mm", unit3.to_s
assert_equal "0.04 in", unit3.to_s("%0.2f in")
Expand Down Expand Up @@ -963,8 +961,8 @@ def test_to_s_cache
a.to_s # cache the conversion to itself
b = Unit.new('2 mm')
assert_equal('2 mm', b.to_s)
assert_equal('0.001 m', a.to_s('m'))
assert_equal('0.001 m', a.output['m'])
assert_equal('1/1000 m', a.to_s('m'))
assert_equal('1/1000 m', a.output['m'])
end

def test_version
Expand Down Expand Up @@ -997,7 +995,11 @@ def test_parse_into_numbers_and_units
assert_equal([1/4,"m"], Unit.parse_into_numbers_and_units("1/4 m"))
assert_equal([-1/4,"m"], Unit.parse_into_numbers_and_units("-1/4 m"))
assert_equal([1,"m"], Unit.parse_into_numbers_and_units("1 m"))
assert_equal([1,"m"], Unit.parse_into_numbers_and_units("m"))
assert_equal([1,"m"], Unit.parse_into_numbers_and_units("m"))
assert_equal([10,""], Unit.parse_into_numbers_and_units("10"))
assert_equal([10.0,""], Unit.parse_into_numbers_and_units("10.0"))
assert_equal([(1/4),""], Unit.parse_into_numbers_and_units("1/4"))
assert_equal([Complex(1,1),""], Unit.parse_into_numbers_and_units("1+1i"))
end

end
Expand Down

0 comments on commit 1b3fa0c

Please sign in to comment.