require 'test/unit' require 'big_money' require 'bigdecimal' class TestBigMoney < Test::Unit::TestCase def test_initialize_with_bigdecimal val = BigDecimal.new("1.005") assert_same val, BigMoney.new(val).amount, 'Should not create a clone of the input' end def test_initialize_with_string assert_equal BigDecimal.new("1.005"), BigMoney.new("1.005").amount assert_equal BigDecimal.new("10"), BigMoney.new("10").amount assert_equal BigDecimal.new("0"), BigMoney.new("0").amount assert_equal BigDecimal.new("0"), BigMoney.new("foo").amount end def test_initialize_with_integer assert_equal BigDecimal.new("100"), BigMoney.new(100).amount assert_equal BigDecimal.new("0"), BigMoney.new(0).amount end def test_initialize_with_float assert_equal BigDecimal.new("1.005"), BigMoney.new(1.005).amount assert_equal BigDecimal.new("0"), BigMoney.new(0.0).amount end def test_initialize_without_currency assert_equal BigMoney::Currency::USD.instance, BigMoney.new(1.23).currency end def test_initialize_with_currency assert_equal BigMoney::Currency::AUD.instance, BigMoney.new(1.23, :aud).currency assert_raises BigMoney::UnknownCurrency do BigMoney.new(1.23, :fud) end end def test_eql? assert BigMoney.new("1.00", :usd).eql?(BigMoney.new("1.00", :usd)) assert !BigMoney.new("1.00", :usd).eql?(BigMoney.new("1.01", :usd)) assert !BigMoney.new("1.00", :usd).eql?(BigMoney.new("1.00", :cad)) end def test_compare m1, m2 = BigMoney.new("1.00", :usd), BigMoney.new("1.50", :usd) assert_equal(-1, (m1 <=> m2)) assert_equal(0, (m1 <=> m1)) assert_equal(1, (m2 <=> m1)) m3 = BigMoney.new("1.00", :cad) assert_raises BigMoney::UncomparableCurrency do m1 <=> m3 end end def test_add m1, m2, m3 = BigMoney.new(1.00, :usd), BigMoney.new(1.50, :usd), BigMoney.new(0, :usd) assert_equal BigDecimal.new("2.50"), (m1 + m2).amount assert_equal BigDecimal.new("2.50"), (m2 + m1).amount assert_equal BigDecimal.new("1.00"), (m1 + m3).amount assert_equal BigDecimal.new("1.00"), (m3 + m1).amount assert_not_same m1, m1 + m3 assert_not_same m1, m3 + m1 assert_equal BigDecimal.new("5.50"), (m2 + 4).amount assert_equal BigDecimal.new("5.50"), (m2 + 4.00).amount end def test_subtract m1, m2, m3 = BigMoney.new(1.00, :usd), BigMoney.new(1.50, :usd), BigMoney.new(0, :usd) assert_equal BigDecimal.new("-0.50"), (m1 - m2).amount assert_equal BigDecimal.new("0.50"), (m2 - m1).amount assert_equal BigDecimal.new("1.00"), (m1 - m3).amount assert_equal BigDecimal.new("-1.00"), (m3 - m1).amount assert_equal BigDecimal.new("-2.50"), (m2 - 4).amount assert_equal BigDecimal.new("-2.50"), (m2 - 4.00).amount end def test_multiply m1, m2, m3 = BigMoney.new(2.00, :usd), BigMoney.new(1.50, :usd), BigMoney.new(0, :usd) assert_equal BigDecimal.new("4.00"), (m1 * m1).amount assert_equal BigDecimal.new("3.00"), (m1 * m2).amount assert_equal BigDecimal.new("3.00"), (m2 * m1).amount assert_equal BigDecimal.new("0"), (m1 * m3).amount assert_equal BigDecimal.new("0"), (m3 * m1).amount assert_equal BigDecimal.new("0"), (m3 * m3).amount assert_equal BigDecimal.new("3.00"), (m2 * 2).amount assert_equal BigDecimal.new("3.00"), (m2 * 2.00).amount end def test_divide m1, m2, m3 = BigMoney.new(2.00, :usd), BigMoney.new(1.50, :usd), BigMoney.new(0, :usd) assert_equal BigDecimal.new("1.00"), (m1 / m1).amount assert_equal BigDecimal.new("1.3333333333333334"), (m1 / m2).amount assert_equal BigDecimal.new("0.75"), (m2 / m1).amount assert_equal BigDecimal.new("0"), (m3 / m1).amount assert((m1 / m3).amount.infinite?) assert((m3 / m3).amount.nan?) assert((m1 / 0).amount.infinite?) assert((m3 / 0).amount.nan?) assert_equal BigDecimal.new("0.75"), (m2 / 2).amount assert_equal BigDecimal.new("0.75"), (m2 / 2.00).amount end def test_to_s assert_equal '1.00', BigMoney.new(1).to_s assert_equal '1.50', BigMoney.new(1.5).to_s assert_equal '-11.50', BigMoney.new(-11.5).to_s end def test_to_formatted_s assert_equal '1.00', BigMoney.new(1).to_formatted_s("%.2f") assert_equal '$1.00', BigMoney.new(1).to_formatted_s("$%.2f") assert_equal 'USD $1.00', BigMoney.new(1).to_formatted_s("%s $%.2f") assert_equal '$1.00 USD', BigMoney.new(1).to_formatted_s("$%.2f %s") assert_equal '$1 USD', BigMoney.new(1).to_formatted_s("$%.0f %s") assert_equal '$1.00 USD', BigMoney.new(1).to_formatted_s('$%.2f %s') end def test_to_i assert_equal(1, BigMoney.new(1).to_i) assert_equal(1, BigMoney.new(1.5).to_i) assert_equal(-11, BigMoney.new(-11.5).to_i) end def test_to_f assert_in_delta(1.0, BigMoney.new(1).to_f, 0.000001) assert_in_delta(1.5, BigMoney.new(1.5).to_f, 0.000001) assert_in_delta(-11.5, BigMoney.new(-11.5).to_f, 0.000001) end def test_neg assert_equal BigMoney.new(-1), -BigMoney.new(1) assert_equal BigMoney.new(1), -BigMoney.new(-1) assert_equal BigMoney.new(1), -BigMoney.new(-1) end def test_currency assert_equal BigMoney::Currency::AUD.instance, BigMoney.currency(:aud) end def test_exchange assert BigMoney.new(1.50).exchange(:aud) end end