money 3.1.0.pre3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +196 -0
- data/README.md +217 -0
- data/lib/money/bank/base.rb +73 -32
- data/lib/money/bank/variable_exchange.rb +128 -27
- data/lib/money/core_extensions.rb +39 -18
- data/lib/money/currency.rb +146 -53
- data/lib/money/defaults.rb +8 -2
- data/lib/money/deprecations.rb +8 -5
- data/lib/money/money.rb +363 -170
- metadata +45 -54
- data/.document +0 -5
- data/.gitignore +0 -21
- data/CHANGELOG.rdoc +0 -68
- data/README.rdoc +0 -212
- data/Rakefile +0 -49
- data/VERSION +0 -1
- data/money.gemspec +0 -77
- data/spec/bank/base_spec.rb +0 -78
- data/spec/bank/variable_exchange_spec.rb +0 -311
- data/spec/core_extensions_spec.rb +0 -111
- data/spec/currency_spec.rb +0 -126
- data/spec/deprecations_spec.rb +0 -16
- data/spec/money_spec.rb +0 -799
- data/spec/spec_helper.rb +0 -8
@@ -1,111 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Money core extensions" do
|
4
|
-
specify "Numberic#to_money works" do
|
5
|
-
money = 1234.to_money
|
6
|
-
money.cents.should == 1234_00
|
7
|
-
money.currency.should == Money.default_currency
|
8
|
-
|
9
|
-
money = 100.37.to_money
|
10
|
-
money.cents.should == 100_37
|
11
|
-
money.currency.should == Money.default_currency
|
12
|
-
|
13
|
-
require 'bigdecimal'
|
14
|
-
money = BigDecimal.new('1234').to_money
|
15
|
-
money.cents.should == 1234_00
|
16
|
-
money.currency.should == Money.default_currency
|
17
|
-
end
|
18
|
-
|
19
|
-
specify "#issue/15" do
|
20
|
-
amount = 555.55.to_money
|
21
|
-
amount.should == Money.new(55555)
|
22
|
-
end
|
23
|
-
|
24
|
-
specify "Numeric#to_money accepts optional currency" do
|
25
|
-
1234.to_money('USD').should == Money.new(123400, 'USD')
|
26
|
-
1234.to_money('EUR').should == Money.new(123400, 'EUR')
|
27
|
-
end
|
28
|
-
|
29
|
-
specify "Numeric#to_money should respect :subunit_to_unit" do
|
30
|
-
10.to_money('USD').should == Money.new(10_00, 'USD')
|
31
|
-
10.to_money('TND').should == Money.new(10_000, 'TND')
|
32
|
-
10.to_money('CLP').should == Money.new(10, 'CLP')
|
33
|
-
end
|
34
|
-
|
35
|
-
specify "String#to_money works" do
|
36
|
-
"20.15".to_money.should == Money.new(20_15)
|
37
|
-
"100".to_money.should == Money.new(100_00)
|
38
|
-
"100.37".to_money.should == Money.new(100_37)
|
39
|
-
"100,37".to_money.should == Money.new(100_37)
|
40
|
-
"100 000".to_money.should == Money.new(100_000_00)
|
41
|
-
"100,000.00".to_money.should == Money.new(100_000_00)
|
42
|
-
"1,000".to_money.should == Money.new(1_000_00)
|
43
|
-
"-1,000".to_money.should == Money.new(-1_000_00)
|
44
|
-
"1,000.5".to_money.should == Money.new(1_000_50)
|
45
|
-
"1,000.51".to_money.should == Money.new(1_000_51)
|
46
|
-
"1,000.505".to_money.should == Money.new(1_000_51)
|
47
|
-
"1,000.504".to_money.should == Money.new(1_000_50)
|
48
|
-
"1,000.0000".to_money.should == Money.new(1_000_00)
|
49
|
-
"1,000.5000".to_money.should == Money.new(1_000_50)
|
50
|
-
"1,000.5099".to_money.should == Money.new(1_000_51)
|
51
|
-
"1.550".to_money.should == Money.new(1_55)
|
52
|
-
"25.".to_money.should == Money.new(25_00)
|
53
|
-
".75".to_money.should == Money.new(75)
|
54
|
-
|
55
|
-
"100 USD".to_money.should == Money.new(100_00, "USD")
|
56
|
-
"-100 USD".to_money.should == Money.new(-100_00, "USD")
|
57
|
-
"100 EUR".to_money.should == Money.new(100_00, "EUR")
|
58
|
-
"100.37 EUR".to_money.should == Money.new(100_37, "EUR")
|
59
|
-
"100,37 EUR".to_money.should == Money.new(100_37, "EUR")
|
60
|
-
"100,000.00 USD".to_money.should == Money.new(100_000_00, "USD")
|
61
|
-
"100.000,00 EUR".to_money.should == Money.new(100_000_00, "EUR")
|
62
|
-
"1,000 USD".to_money.should == Money.new(1_000_00, "USD")
|
63
|
-
"-1,000 USD".to_money.should == Money.new(-1_000_00, "USD")
|
64
|
-
"1,000.5500 USD".to_money.should == Money.new(1_000_55, "USD")
|
65
|
-
"-1,000.6500 USD".to_money.should == Money.new(-1_000_65, "USD")
|
66
|
-
"1.550 USD".to_money.should == Money.new(1_55, "USD")
|
67
|
-
|
68
|
-
"USD 100".to_money.should == Money.new(100_00, "USD")
|
69
|
-
"EUR 100".to_money.should == Money.new(100_00, "EUR")
|
70
|
-
"EUR 100.37".to_money.should == Money.new(100_37, "EUR")
|
71
|
-
"CAD -100.37".to_money.should == Money.new(-100_37, "CAD")
|
72
|
-
"EUR 100,37".to_money.should == Money.new(100_37, "EUR")
|
73
|
-
"EUR -100,37".to_money.should == Money.new(-100_37, "EUR")
|
74
|
-
"USD 100,000.00".to_money.should == Money.new(100_000_00, "USD")
|
75
|
-
"EUR 100.000,00".to_money.should == Money.new(100_000_00, "EUR")
|
76
|
-
"USD 1,000".to_money.should == Money.new(1_000_00, "USD")
|
77
|
-
"USD -1,000".to_money.should == Money.new(-1_000_00, "USD")
|
78
|
-
"USD 1,000.9000".to_money.should == Money.new(1_000_90, "USD")
|
79
|
-
"USD -1,000.090".to_money.should == Money.new(-1_000_09, "USD")
|
80
|
-
"USD 1.5500".to_money.should == Money.new(1_55, "USD")
|
81
|
-
|
82
|
-
"$100 USD".to_money.should == Money.new(100_00, "USD")
|
83
|
-
"$1,194.59 USD".to_money.should == Money.new(1_194_59, "USD")
|
84
|
-
"$-1,955 USD".to_money.should == Money.new(-1_955_00, "USD")
|
85
|
-
"$1,194.5900 USD".to_money.should == Money.new(1_194_59, "USD")
|
86
|
-
"$-1,955.000 USD".to_money.should == Money.new(-1_955_00, "USD")
|
87
|
-
"$1.99000 USD".to_money.should == Money.new(1_99, "USD")
|
88
|
-
end
|
89
|
-
|
90
|
-
specify "String#to_money should accept optional currency" do
|
91
|
-
"10.10".to_money('USD').should == Money.new(1010, 'USD')
|
92
|
-
"10.10".to_money('EUR').should == Money.new(1010, 'EUR')
|
93
|
-
"10.10 USD".to_money('USD').should == Money.new(1010, 'USD')
|
94
|
-
lambda{"10.10 USD".to_money('EUR')}.should raise_error
|
95
|
-
end
|
96
|
-
|
97
|
-
specify "String#to_money ignores unrecognized data" do
|
98
|
-
"hello 2000 world".to_money.should == Money.new(2000_00)
|
99
|
-
end
|
100
|
-
|
101
|
-
specify "String#to_currency convert string to Currency" do
|
102
|
-
"USD".to_currency.should == Money::Currency.new(:usd)
|
103
|
-
"EUR".to_currency.should == Money::Currency.new(:eur)
|
104
|
-
end
|
105
|
-
|
106
|
-
specify "String#to_currency should raise Currency::UnknownCurrency with unkwnown Currency" do
|
107
|
-
lambda { "XXX".to_currency }.should raise_error(Money::Currency::UnknownCurrency)
|
108
|
-
lambda { " ".to_currency }.should raise_error(Money::Currency::UnknownCurrency)
|
109
|
-
end
|
110
|
-
|
111
|
-
end
|
data/spec/currency_spec.rb
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Money::Currency do
|
6
|
-
|
7
|
-
specify "#initialize should lookup data from TABLE" do
|
8
|
-
with_custom_definitions do
|
9
|
-
Money::Currency::TABLE[:usd] = { :priority => 1, :iso_code => "USD", :name => "United States Dollar", :symbol => "$", :subunit => "Cent", :subunit_to_unit => 100, :separator => ".", :delimiter => "," }
|
10
|
-
Money::Currency::TABLE[:eur] = { :priority => 2, :iso_code => "EUR", :name => "Euro", :symbol => "€", :subunit => "Cent", :subunit_to_unit => 100, :separator => ".", :delimiter => "," }
|
11
|
-
|
12
|
-
currency = Money::Currency.new("USD")
|
13
|
-
currency.id.should == :usd
|
14
|
-
currency.priority.should == 1
|
15
|
-
currency.iso_code.should == "USD"
|
16
|
-
currency.name.should == "United States Dollar"
|
17
|
-
currency.separator.should == "."
|
18
|
-
currency.delimiter.should == ","
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
specify "#initialize should raise UnknownMoney::Currency with unknown currency" do
|
23
|
-
lambda { Money::Currency.new("xxx") }.should raise_error(Money::Currency::UnknownCurrency, /xxx/)
|
24
|
-
end
|
25
|
-
|
26
|
-
specify "#== should return true if self === other" do
|
27
|
-
currency = Money::Currency.new(:eur)
|
28
|
-
currency.should == currency
|
29
|
-
end
|
30
|
-
|
31
|
-
specify "#== should return true if the id is equal" do
|
32
|
-
Money::Currency.new(:eur).should == Money::Currency.new(:eur)
|
33
|
-
Money::Currency.new(:eur).should_not == Money::Currency.new(:usd)
|
34
|
-
end
|
35
|
-
|
36
|
-
specify "#eql? should return true if #== returns true" do
|
37
|
-
Money::Currency.new(:eur).eql?(Money::Currency.new(:eur)).should be true
|
38
|
-
Money::Currency.new(:eur).eql?(Money::Currency.new(:usd)).should be false
|
39
|
-
end
|
40
|
-
|
41
|
-
specify "#hash should return the same value for equal objects" do
|
42
|
-
Money::Currency.new(:eur).hash.should == Money::Currency.new(:eur).hash
|
43
|
-
Money::Currency.new(:eur).hash.should_not == Money::Currency.new(:usd).hash
|
44
|
-
end
|
45
|
-
|
46
|
-
specify "#hash can be used to return the intersection of Currency object arrays" do
|
47
|
-
intersection = [Money::Currency.new(:eur), Money::Currency.new(:usd)] & [Money::Currency.new(:eur)]
|
48
|
-
intersection.should == [Money::Currency.new(:eur)]
|
49
|
-
end
|
50
|
-
|
51
|
-
specify "#<=> should compare objects by priority" do
|
52
|
-
Money::Currency.new(:cad).should > Money::Currency.new(:usd)
|
53
|
-
Money::Currency.new(:usd).should < Money::Currency.new(:eur)
|
54
|
-
end
|
55
|
-
|
56
|
-
specify "#to_s" do
|
57
|
-
Money::Currency.new(:usd).to_s.should == "USD"
|
58
|
-
Money::Currency.new(:eur).to_s.should == "EUR"
|
59
|
-
end
|
60
|
-
|
61
|
-
specify "#inspect" do
|
62
|
-
Money::Currency.new(:usd).inspect.should ==
|
63
|
-
%Q{#<Money::Currency id: usd priority: 1, iso_code: USD, name: United States Dollar, symbol: $, subunit: Cent, subunit_to_unit: 100, separator: ., delimiter: ,>}
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
specify "#self.find should return currency matching given id" do
|
68
|
-
with_custom_definitions do
|
69
|
-
Money::Currency::TABLE[:usd] = { :priority => 1, :iso_code => "USD", :name => "United States Dollar", :symbol => "$", :subunit => "Cent", :subunit_to_unit => 100, :separator => ".", :delimiter => "," }
|
70
|
-
Money::Currency::TABLE[:eur] = { :priority => 2, :iso_code => "EUR", :name => "Euro", :symbol => "€", :subunit => "Cent", :subunit_to_unit => 100, :separator => ".", :delimiter => "," }
|
71
|
-
|
72
|
-
expected = Money::Currency.new(:eur)
|
73
|
-
Money::Currency.find(:eur).should == expected
|
74
|
-
Money::Currency.find(:EUR).should == expected
|
75
|
-
Money::Currency.find("eur").should == expected
|
76
|
-
Money::Currency.find("EUR").should == expected
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
specify "#self.find should return nil unless currency matching given id" do
|
81
|
-
with_custom_definitions do
|
82
|
-
Money::Currency::TABLE[:usd] = { :position => 1, :iso_code => "USD", :name => "United States Dollar", :symbol => "$", :subunit => "Cent", :subunit_to_unit => 100, :separator => ".", :delimiter => "," }
|
83
|
-
Money::Currency::TABLE[:eur] = { :position => 2, :iso_code => "EUR", :name => "Euro", :symbol => "€", :subunit => "Cent", :subunit_to_unit => 100, :separator => ".", :delimiter => "," }
|
84
|
-
|
85
|
-
expected = Money::Currency.new(:eur)
|
86
|
-
Money::Currency.find(:eur).should == expected
|
87
|
-
Money::Currency.find(:EUR).should == expected
|
88
|
-
Money::Currency.find("eur").should == expected
|
89
|
-
Money::Currency.find("EUR").should == expected
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
specify "#self.wrap should return nil if object is nil" do
|
94
|
-
Money::Currency.wrap(nil).should == nil
|
95
|
-
Money::Currency.wrap(Money::Currency.new(:usd)).should == Money::Currency.new(:usd)
|
96
|
-
Money::Currency.wrap(:usd).should == Money::Currency.new(:usd)
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
def with_custom_definitions(&block)
|
101
|
-
begin
|
102
|
-
old = Money::Currency::TABLE.dup
|
103
|
-
Money::Currency::TABLE.clear
|
104
|
-
yield
|
105
|
-
ensure
|
106
|
-
silence_warnings do
|
107
|
-
Money::Currency.const_set("TABLE", old)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
# Sets $VERBOSE to nil for the duration of the block and back to its original value afterwards.
|
113
|
-
#
|
114
|
-
# silence_warnings do
|
115
|
-
# value = noisy_call # no warning voiced
|
116
|
-
# end
|
117
|
-
#
|
118
|
-
# noisy_call # warning voiced
|
119
|
-
def silence_warnings
|
120
|
-
old_verbose, $VERBOSE = $VERBOSE, nil
|
121
|
-
yield
|
122
|
-
ensure
|
123
|
-
$VERBOSE = old_verbose
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
data/spec/deprecations_spec.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Money deprecations" do
|
4
|
-
|
5
|
-
describe Money::VariableExchangeBank do
|
6
|
-
it "should be deprecated" do
|
7
|
-
Money.should_receive(:deprecate)
|
8
|
-
Money::VariableExchangeBank.new.should_not be_nil
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should extend Money::Bank::VariableExchange" do
|
12
|
-
Money::VariableExchangeBank.new.should be_kind_of Money::Bank::VariableExchange
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
data/spec/money_spec.rb
DELETED
@@ -1,799 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Money do
|
6
|
-
it "is associated to the singleton instance of Bank::VariableExchange by default" do
|
7
|
-
Money.new(0).bank.should be_equal Money::Bank::VariableExchange.instance
|
8
|
-
end
|
9
|
-
|
10
|
-
specify "#cents returns the amount of cents passed to the constructor" do
|
11
|
-
Money.new(200_00, "USD").cents.should == 200_00
|
12
|
-
end
|
13
|
-
|
14
|
-
it "rounds the given cents to an integer" do
|
15
|
-
Money.new(1.00, "USD").cents.should == 1
|
16
|
-
Money.new(1.01, "USD").cents.should == 1
|
17
|
-
Money.new(1.50, "USD").cents.should == 2
|
18
|
-
end
|
19
|
-
|
20
|
-
specify "#currency returns the currency passed to the constructor" do
|
21
|
-
Money.new(200_00, "USD").currency.should == Money::Currency.new("USD")
|
22
|
-
end
|
23
|
-
|
24
|
-
specify "#currency_string returns the iso_code of the currency object" do
|
25
|
-
Money.new(200_00, "USD").currency_as_string.should == Money::Currency.new("USD").to_s
|
26
|
-
Money.new(200_00, "USD").currency_as_string.should == "USD"
|
27
|
-
Money.new(200_00, "EUR").currency_as_string.should == "EUR"
|
28
|
-
Money.new(200_00, "YEN").currency_as_string.should == "YEN"
|
29
|
-
end
|
30
|
-
|
31
|
-
specify "#currency_string= set the currency object using the provided string" do
|
32
|
-
obj = Money.new(200_00, "USD")
|
33
|
-
obj.currency_as_string = "EUR"
|
34
|
-
obj.currency.should == Money::Currency.new("EUR")
|
35
|
-
obj.currency_as_string = "YEN"
|
36
|
-
obj.currency.should == Money::Currency.new("YEN")
|
37
|
-
obj.currency_as_string = "USD"
|
38
|
-
obj.currency.should == Money::Currency.new("USD")
|
39
|
-
end
|
40
|
-
|
41
|
-
specify "#zero? returns whether the amount is 0" do
|
42
|
-
Money.new(0, "USD").should be_zero
|
43
|
-
Money.new(0, "EUR").should be_zero
|
44
|
-
Money.new(1, "USD").should_not be_zero
|
45
|
-
Money.new(10, "YEN").should_not be_zero
|
46
|
-
Money.new(-1, "EUR").should_not be_zero
|
47
|
-
end
|
48
|
-
|
49
|
-
specify "#nonzero? returns whether the amount is not 0" do
|
50
|
-
Money.new(0, "USD").should_not be_nonzero
|
51
|
-
Money.new(0, "EUR").should_not be_nonzero
|
52
|
-
Money.new(1, "USD").should be_nonzero
|
53
|
-
Money.new(10, "YEN").should be_nonzero
|
54
|
-
Money.new(-1, "EUR").should be_nonzero
|
55
|
-
end
|
56
|
-
|
57
|
-
specify "#nonzero? has the same return-value semantics as Numeric#nonzero?" do
|
58
|
-
Money.new(0, "USD").nonzero?.should be_nil
|
59
|
-
|
60
|
-
money = Money.new(1, "USD")
|
61
|
-
money.nonzero?.should be_equal(money)
|
62
|
-
end
|
63
|
-
|
64
|
-
specify "#exchange_to exchanges the amount via its exchange bank" do
|
65
|
-
money = Money.new(100_00, "USD")
|
66
|
-
money.bank.should_receive(:exchange_with).with(Money.new(100_00, Money::Currency.new("USD")), Money::Currency.new("EUR")).and_return(Money.new(200_00, Money::Currency.new('EUR')))
|
67
|
-
money.exchange_to("EUR")
|
68
|
-
end
|
69
|
-
|
70
|
-
specify "#exchange_to exchanges the amount properly" do
|
71
|
-
money = Money.new(100_00, "USD")
|
72
|
-
money.bank.should_receive(:exchange_with).with(Money.new(100_00, Money::Currency.new("USD")), Money::Currency.new("EUR")).and_return(Money.new(200_00, Money::Currency.new('EUR')))
|
73
|
-
money.exchange_to("EUR").should == Money.new(200_00, "EUR")
|
74
|
-
end
|
75
|
-
|
76
|
-
specify "#== returns true if and only if their amount and currency are equal" do
|
77
|
-
Money.new(1_00, "USD").should == Money.new(1_00, "USD")
|
78
|
-
Money.new(1_00, "USD").should_not == Money.new(1_00, "EUR")
|
79
|
-
Money.new(1_00, "USD").should_not == Money.new(2_00, "USD")
|
80
|
-
Money.new(1_00, "USD").should_not == Money.new(99_00, "EUR")
|
81
|
-
end
|
82
|
-
|
83
|
-
specify "#== can be used to compare with a String money value" do
|
84
|
-
Money.new(1_00, "USD").should == "1.00"
|
85
|
-
Money.new(1_00, "USD").should_not == "2.00"
|
86
|
-
Money.new(1_00, "GBP").should_not == "1.00"
|
87
|
-
end
|
88
|
-
|
89
|
-
specify "#== can be used to compare with a Numeric money value" do
|
90
|
-
Money.new(1_00, "USD").should == 1
|
91
|
-
Money.new(1_57, "USD").should == 1.57
|
92
|
-
Money.new(1_00, "USD").should_not == 2
|
93
|
-
Money.new(1_00, "GBP").should_not == 1
|
94
|
-
end
|
95
|
-
|
96
|
-
specify "#== can be used to compare with an object that responds to #to_money" do
|
97
|
-
klass = Class.new do
|
98
|
-
def initialize(money)
|
99
|
-
@money = money
|
100
|
-
end
|
101
|
-
|
102
|
-
def to_money
|
103
|
-
@money
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
Money.new(1_00, "USD").should == klass.new(Money.new(1_00, "USD"))
|
108
|
-
Money.new(2_50, "USD").should == klass.new(Money.new(2_50, "USD"))
|
109
|
-
Money.new(2_50, "USD").should_not == klass.new(Money.new(3_00, "USD"))
|
110
|
-
Money.new(1_00, "GBP").should_not == klass.new(Money.new(1_00, "USD"))
|
111
|
-
end
|
112
|
-
|
113
|
-
specify "#== returns false if used to compare with an object that doesn't respond to #to_money" do
|
114
|
-
Money.new(1_00, "USD").should_not == Object.new
|
115
|
-
Money.new(1_00, "USD").should_not == Class
|
116
|
-
Money.new(1_00, "USD").should_not == Kernel
|
117
|
-
Money.new(1_00, "USD").should_not == /foo/
|
118
|
-
Money.new(1_00, "USD").should_not == nil
|
119
|
-
end
|
120
|
-
|
121
|
-
specify "#eql? returns true if and only if their amount and currency are equal" do
|
122
|
-
Money.new(1_00, "USD").eql?(Money.new(1_00, "USD")).should be true
|
123
|
-
Money.new(1_00, "USD").eql?(Money.new(1_00, "EUR")).should be false
|
124
|
-
Money.new(1_00, "USD").eql?(Money.new(2_00, "USD")).should be false
|
125
|
-
Money.new(1_00, "USD").eql?(Money.new(99_00, "EUR")).should be false
|
126
|
-
end
|
127
|
-
|
128
|
-
specify "#eql? can be used to compare with a String money value" do
|
129
|
-
Money.new(1_00, "USD").eql?("1.00").should be true
|
130
|
-
Money.new(1_00, "USD").eql?("2.00").should be false
|
131
|
-
Money.new(1_00, "GBP").eql?("1.00").should be false
|
132
|
-
end
|
133
|
-
|
134
|
-
specify "#eql? can be used to compare with a Numeric money value" do
|
135
|
-
Money.new(1_00, "USD").eql?(1).should be true
|
136
|
-
Money.new(1_57, "USD").eql?(1.57).should be true
|
137
|
-
Money.new(1_00, "USD").eql?(2).should be false
|
138
|
-
Money.new(1_00, "GBP").eql?(1).should be false
|
139
|
-
end
|
140
|
-
|
141
|
-
specify "#eql? can be used to compare with an object that responds to #to_money" do
|
142
|
-
klass = Class.new do
|
143
|
-
def initialize(money)
|
144
|
-
@money = money
|
145
|
-
end
|
146
|
-
|
147
|
-
def to_money
|
148
|
-
@money
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
Money.new(1_00, "USD").eql?(klass.new(Money.new(1_00, "USD"))).should be true
|
153
|
-
Money.new(2_50, "USD").eql?(klass.new(Money.new(2_50, "USD"))).should be true
|
154
|
-
Money.new(2_50, "USD").eql?(klass.new(Money.new(3_00, "USD"))).should be false
|
155
|
-
Money.new(1_00, "GBP").eql?(klass.new(Money.new(1_00, "USD"))).should be false
|
156
|
-
end
|
157
|
-
|
158
|
-
specify "#eql? returns false if used to compare with an object that doesn't respond to #to_money" do
|
159
|
-
Money.new(1_00, "USD").eql?(Object.new).should be false
|
160
|
-
Money.new(1_00, "USD").eql?(Class).should be false
|
161
|
-
Money.new(1_00, "USD").eql?(Kernel).should be false
|
162
|
-
Money.new(1_00, "USD").eql?(/foo/).should be false
|
163
|
-
Money.new(1_00, "USD").eql?(nil).should be false
|
164
|
-
end
|
165
|
-
|
166
|
-
specify "#hash should return the same value for equal objects" do
|
167
|
-
Money.new(1_00, :eur).hash.should == Money.new(1_00, :eur).hash
|
168
|
-
Money.new(2_00, :usd).hash.should == Money.new(2_00, :usd).hash
|
169
|
-
Money.new(1_00, :eur).hash.should_not == Money.new(2_00, :eur).hash
|
170
|
-
Money.new(1_00, :eur).hash.should_not == Money.new(1_00, :usd).hash
|
171
|
-
Money.new(1_00, :eur).hash.should_not == Money.new(2_00, :usd).hash
|
172
|
-
end
|
173
|
-
|
174
|
-
specify "#hash can be used to return the intersection of Money object arrays" do
|
175
|
-
intersection = [Money.new(1_00, :eur), Money.new(1_00, :usd)] & [Money.new(1_00, :eur)]
|
176
|
-
intersection.should == [Money.new(1_00, :eur)]
|
177
|
-
end
|
178
|
-
|
179
|
-
specify "#<=> can be used to compare with a String money value" do
|
180
|
-
(Money.new(1_00) <=> "1.00").should == 0
|
181
|
-
(Money.new(1_00) <=> ".99").should > 0
|
182
|
-
(Money.new(1_00) <=> "2.00").should < 0
|
183
|
-
end
|
184
|
-
|
185
|
-
specify "#<=> can be used to compare with a Numeric money value" do
|
186
|
-
(Money.new(1_00) <=> 1).should == 0
|
187
|
-
(Money.new(1_00) <=> 0.99).should > 0
|
188
|
-
(Money.new(1_00) <=> 2.00).should < 0
|
189
|
-
end
|
190
|
-
|
191
|
-
specify "#<=> can be used to compare with an object that responds to #to_money" do
|
192
|
-
klass = Class.new do
|
193
|
-
def initialize(money)
|
194
|
-
@money = money
|
195
|
-
end
|
196
|
-
|
197
|
-
def to_money
|
198
|
-
@money
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
(Money.new(1_00) <=> klass.new(Money.new(1_00))).should == 0
|
203
|
-
(Money.new(1_00) <=> klass.new(Money.new(99))).should > 0
|
204
|
-
(Money.new(1_00) <=> klass.new(Money.new(2_00))).should < 0
|
205
|
-
end
|
206
|
-
|
207
|
-
specify "#<=> raises ArgumentError when used to compare with an object that doesn't respond to #to_money" do
|
208
|
-
expected_message = /comparison .+ failed/
|
209
|
-
lambda{ Money.new(1_00) <=> Object.new }.should raise_error(ArgumentError, expected_message)
|
210
|
-
lambda{ Money.new(1_00) <=> Class }.should raise_error(ArgumentError, expected_message)
|
211
|
-
lambda{ Money.new(1_00) <=> Kernel }.should raise_error(ArgumentError, expected_message)
|
212
|
-
lambda{ Money.new(1_00) <=> /foo/ }.should raise_error(ArgumentError, expected_message)
|
213
|
-
end
|
214
|
-
|
215
|
-
specify "#* multiplies the money's amount by the multiplier while retaining the currency" do
|
216
|
-
(Money.new(1_00, "USD") * 10).should == Money.new(10_00, "USD")
|
217
|
-
end
|
218
|
-
|
219
|
-
specify "#/ divides the money's amount by the divisor while retaining the currency" do
|
220
|
-
(Money.new(10_00, "USD") / 10).should == Money.new(1_00, "USD")
|
221
|
-
end
|
222
|
-
|
223
|
-
specify "#/ -> money / fixnum" do
|
224
|
-
ts = [
|
225
|
-
{:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 3, :USD)},
|
226
|
-
{:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-4, :USD)},
|
227
|
-
{:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-4, :USD)},
|
228
|
-
{:a => Money.new(-13, :USD), :b => -4, :c => Money.new( 3, :USD)},
|
229
|
-
]
|
230
|
-
ts.each do |t|
|
231
|
-
(t[:a] / t[:b]).should == t[:c]
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
specify "#/ -> money / money (same currency)" do
|
236
|
-
ts = [
|
237
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => 3.25},
|
238
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => -3.25},
|
239
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => -3.25},
|
240
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => 3.25},
|
241
|
-
]
|
242
|
-
ts.each do |t|
|
243
|
-
(t[:a] / t[:b]).should == t[:c]
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
specify "#/ -> money / money (difference currency)" do
|
248
|
-
ts = [
|
249
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => 1.625},
|
250
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => -1.625},
|
251
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => -1.625},
|
252
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => 1.625},
|
253
|
-
]
|
254
|
-
ts.each do |t|
|
255
|
-
t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
256
|
-
(t[:a] / t[:b]).should == t[:c]
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
specify "#div -> money / fixnum" do
|
261
|
-
ts = [
|
262
|
-
{:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 3, :USD)},
|
263
|
-
{:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-4, :USD)},
|
264
|
-
{:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-4, :USD)},
|
265
|
-
{:a => Money.new(-13, :USD), :b => -4, :c => Money.new( 3, :USD)},
|
266
|
-
]
|
267
|
-
ts.each do |t|
|
268
|
-
t[:a].div(t[:b]).should == t[:c]
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
specify "#div -> money / money (same currency)" do
|
273
|
-
ts = [
|
274
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => 3.25},
|
275
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => -3.25},
|
276
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => -3.25},
|
277
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => 3.25},
|
278
|
-
]
|
279
|
-
ts.each do |t|
|
280
|
-
t[:a].div(t[:b]).should == t[:c]
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
specify "#div -> money / money (different currency)" do
|
285
|
-
ts = [
|
286
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => 1.625},
|
287
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => -1.625},
|
288
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => -1.625},
|
289
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => 1.625},
|
290
|
-
]
|
291
|
-
ts.each do |t|
|
292
|
-
t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
293
|
-
t[:a].div(t[:b]).should == t[:c]
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
specify "#divmod -> money `divmod` fixnum" do
|
298
|
-
ts = [
|
299
|
-
{:a => Money.new( 13, :USD), :b => 4, :c => [Money.new( 3, :USD), Money.new( 1, :USD)]},
|
300
|
-
{:a => Money.new( 13, :USD), :b => -4, :c => [Money.new(-4, :USD), Money.new(-3, :USD)]},
|
301
|
-
{:a => Money.new(-13, :USD), :b => 4, :c => [Money.new(-4, :USD), Money.new( 3, :USD)]},
|
302
|
-
{:a => Money.new(-13, :USD), :b => -4, :c => [Money.new( 3, :USD), Money.new(-1, :USD)]},
|
303
|
-
]
|
304
|
-
ts.each do |t|
|
305
|
-
t[:a].divmod(t[:b]).should == t[:c]
|
306
|
-
end
|
307
|
-
end
|
308
|
-
|
309
|
-
specify "#divmod -> money `divmod` money (same currency)" do
|
310
|
-
ts = [
|
311
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => [ 3, Money.new( 1, :USD)]},
|
312
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => [-4, Money.new(-3, :USD)]},
|
313
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => [-4, Money.new( 3, :USD)]},
|
314
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => [ 3, Money.new(-1, :USD)]},
|
315
|
-
]
|
316
|
-
ts.each do |t|
|
317
|
-
t[:a].divmod(t[:b]).should == t[:c]
|
318
|
-
end
|
319
|
-
end
|
320
|
-
|
321
|
-
specify "#divmod -> money `divmod` money (different currency)" do
|
322
|
-
ts = [
|
323
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => [ 1, Money.new( 5, :USD)]},
|
324
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => [-2, Money.new(-3, :USD)]},
|
325
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => [-2, Money.new( 3, :USD)]},
|
326
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => [ 1, Money.new(-5, :USD)]},
|
327
|
-
]
|
328
|
-
ts.each do |t|
|
329
|
-
t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
330
|
-
t[:a].divmod(t[:b]).should == t[:c]
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
specify "#modulo -> money `modulo` fixnum" do
|
335
|
-
ts = [
|
336
|
-
{:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
|
337
|
-
{:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-3, :USD)},
|
338
|
-
{:a => Money.new(-13, :USD), :b => 4, :c => Money.new( 3, :USD)},
|
339
|
-
{:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
|
340
|
-
]
|
341
|
-
ts.each do |t|
|
342
|
-
t[:a].modulo(t[:b]).should == t[:c]
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
specify "#modulo -> money `modulo` money (same currency)" do
|
347
|
-
ts = [
|
348
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
|
349
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-3, :USD)},
|
350
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 3, :USD)},
|
351
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
|
352
|
-
]
|
353
|
-
ts.each do |t|
|
354
|
-
t[:a].modulo(t[:b]).should == t[:c]
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
specify "#modulo -> money `modulo` money (different currency)" do
|
359
|
-
ts = [
|
360
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
|
361
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-3, :USD)},
|
362
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 3, :USD)},
|
363
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
|
364
|
-
]
|
365
|
-
ts.each do |t|
|
366
|
-
t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
367
|
-
t[:a].modulo(t[:b]).should == t[:c]
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
|
-
specify "#% -> money % fixnum" do
|
372
|
-
ts = [
|
373
|
-
{:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
|
374
|
-
{:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-3, :USD)},
|
375
|
-
{:a => Money.new(-13, :USD), :b => 4, :c => Money.new( 3, :USD)},
|
376
|
-
{:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
|
377
|
-
]
|
378
|
-
ts.each do |t|
|
379
|
-
(t[:a] % t[:b]).should == t[:c]
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
specify "#% -> money % money (same currency)" do
|
384
|
-
ts = [
|
385
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
|
386
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-3, :USD)},
|
387
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 3, :USD)},
|
388
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
|
389
|
-
]
|
390
|
-
ts.each do |t|
|
391
|
-
(t[:a] % t[:b]).should == t[:c]
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
specify "#% -> money % money (different currency)" do
|
396
|
-
ts = [
|
397
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
|
398
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-3, :USD)},
|
399
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 3, :USD)},
|
400
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
|
401
|
-
]
|
402
|
-
ts.each do |t|
|
403
|
-
t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
404
|
-
(t[:a] % t[:b]).should == t[:c]
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
specify "#remainder -> money `remainder` fixnum" do
|
409
|
-
ts = [
|
410
|
-
{:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
|
411
|
-
{:a => Money.new( 13, :USD), :b => -4, :c => Money.new( 1, :USD)},
|
412
|
-
{:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-1, :USD)},
|
413
|
-
{:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
|
414
|
-
]
|
415
|
-
ts.each do |t|
|
416
|
-
t[:a].remainder(t[:b]).should == t[:c]
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
specify "#remainder -> money `remainder` money (same currency)" do
|
421
|
-
ts = [
|
422
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
|
423
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new( 1, :USD)},
|
424
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => Money.new(-1, :USD)},
|
425
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
|
426
|
-
]
|
427
|
-
ts.each do |t|
|
428
|
-
t[:a].remainder(t[:b]).should == t[:c]
|
429
|
-
end
|
430
|
-
end
|
431
|
-
|
432
|
-
specify "#remainder -> money `remainder` money (different currency)" do
|
433
|
-
ts = [
|
434
|
-
{:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
|
435
|
-
{:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new( 5, :USD)},
|
436
|
-
{:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => Money.new(-5, :USD)},
|
437
|
-
{:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
|
438
|
-
]
|
439
|
-
ts.each do |t|
|
440
|
-
t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
441
|
-
t[:a].remainder(t[:b]).should == t[:c]
|
442
|
-
end
|
443
|
-
end
|
444
|
-
|
445
|
-
specify "#abs correctly returns the absolute value as a new Money object" do
|
446
|
-
n = Money.new(-1, :USD)
|
447
|
-
n.abs.should == Money.new( 1, :USD)
|
448
|
-
n.should == Money.new(-1, :USD)
|
449
|
-
end
|
450
|
-
|
451
|
-
specify "Money.empty creates a new Money object of 0 cents" do
|
452
|
-
Money.empty.should == Money.new(0)
|
453
|
-
end
|
454
|
-
|
455
|
-
specify "Money.ca_dollar creates a new Money object of the given value in CAD" do
|
456
|
-
Money.ca_dollar(50).should == Money.new(50, "CAD")
|
457
|
-
end
|
458
|
-
|
459
|
-
specify "Money.ca_dollar creates a new Money object of the given value in USD" do
|
460
|
-
Money.us_dollar(50).should == Money.new(50, "USD")
|
461
|
-
end
|
462
|
-
|
463
|
-
specify "Money.ca_dollar creates a new Money object of the given value in EUR" do
|
464
|
-
Money.euro(50).should == Money.new(50, "EUR")
|
465
|
-
end
|
466
|
-
|
467
|
-
specify "Money.new accepts { :currency => 'foo' } as the value for the 'currency' argument" do
|
468
|
-
money = Money.new(20, :currency => "EUR")
|
469
|
-
money.currency.should == Money::Currency.new("EUR")
|
470
|
-
|
471
|
-
money = Money.new(20, :currency => nil)
|
472
|
-
money.currency.should == Money.default_currency
|
473
|
-
end
|
474
|
-
|
475
|
-
specify "Money.add_rate works" do
|
476
|
-
Money.add_rate("EUR", "USD", 10)
|
477
|
-
Money.new(10_00, "EUR").exchange_to("USD").should == Money.new(100_00, "USD")
|
478
|
-
end
|
479
|
-
|
480
|
-
specify "Money.to_s works" do
|
481
|
-
Money.new(10_00).to_s.should == "10.00"
|
482
|
-
end
|
483
|
-
|
484
|
-
specify "Money.to_s works with :subunit_to_unit other than 100" do
|
485
|
-
Money.new(10_00, "BHD").to_s.should == "1.00"
|
486
|
-
end
|
487
|
-
|
488
|
-
specify "Money.to_s shouldn't have decimal when :subunit_to_unit is 1" do
|
489
|
-
Money.new(10_00, "CLP").to_s.should == "1000"
|
490
|
-
end
|
491
|
-
|
492
|
-
specify "Money.to_f works" do
|
493
|
-
Money.new(10_00).to_f.should == 10.0
|
494
|
-
end
|
495
|
-
|
496
|
-
specify "Money.to_f works with :subunit_to_unit other than 100" do
|
497
|
-
Money.new(10_00, "BHD").to_f.should == 1.0
|
498
|
-
end
|
499
|
-
|
500
|
-
describe "#format" do
|
501
|
-
it "returns the monetary value as a string" do
|
502
|
-
Money.ca_dollar(100).format.should == "$1.00"
|
503
|
-
end
|
504
|
-
|
505
|
-
it "uses the correct :subunit_to_unit" do
|
506
|
-
Money.new(10_00, "BHD").format.should == "ب.د1.00"
|
507
|
-
end
|
508
|
-
|
509
|
-
it "doesn't display a decimal when :subunit_to_unit is 1" do
|
510
|
-
Money.new(10_00, "CLP").format.should == "$1.000"
|
511
|
-
end
|
512
|
-
|
513
|
-
specify "respects the delimiter and separator defaults" do
|
514
|
-
one_thousand = Proc.new do |currency|
|
515
|
-
Money.new(1000_00, currency).format
|
516
|
-
end
|
517
|
-
|
518
|
-
# Pounds
|
519
|
-
one_thousand["GBP"].should == "£1,000.00"
|
520
|
-
|
521
|
-
# Dollars
|
522
|
-
one_thousand["USD"].should == "$1,000.00"
|
523
|
-
one_thousand["CAD"].should == "$1,000.00"
|
524
|
-
one_thousand["AUD"].should == "$1,000.00"
|
525
|
-
one_thousand["NZD"].should == "$1,000.00"
|
526
|
-
one_thousand["ZWD"].should == "$1,000.00"
|
527
|
-
|
528
|
-
# Yen
|
529
|
-
one_thousand["JPY"].should == "¥1,000.00"
|
530
|
-
one_thousand["CNY"].should == "¥10,000.00"
|
531
|
-
|
532
|
-
# Euro
|
533
|
-
one_thousand["EUR"].should == "€1,000.00"
|
534
|
-
|
535
|
-
# Rupees
|
536
|
-
one_thousand["INR"].should == "₨1,000.00"
|
537
|
-
one_thousand["NPR"].should == "₨1,000.00"
|
538
|
-
one_thousand["SCR"].should == "₨1,000.00"
|
539
|
-
one_thousand["LKR"].should == "₨1,000.00"
|
540
|
-
|
541
|
-
# Brazilian Real
|
542
|
-
one_thousand["BRL"].should == "R$ 1.000,00"
|
543
|
-
|
544
|
-
# Other
|
545
|
-
one_thousand["SEK"].should == "kr1,000.00"
|
546
|
-
one_thousand["GHC"].should == "₵1,000.00"
|
547
|
-
end
|
548
|
-
|
549
|
-
describe "if the monetary value is 0" do
|
550
|
-
before :each do
|
551
|
-
@money = Money.us_dollar(0)
|
552
|
-
end
|
553
|
-
|
554
|
-
it "returns 'free' when :display_free is true" do
|
555
|
-
@money.format(:display_free => true).should == 'free'
|
556
|
-
end
|
557
|
-
|
558
|
-
it "returns '$0.00' when :display_free is false or not given" do
|
559
|
-
@money.format.should == '$0.00'
|
560
|
-
@money.format(:display_free => false).should == '$0.00'
|
561
|
-
@money.format(:display_free => nil).should == '$0.00'
|
562
|
-
end
|
563
|
-
|
564
|
-
it "returns the value specified by :display_free if it's a string-like object" do
|
565
|
-
@money.format(:display_free => 'gratis').should == 'gratis'
|
566
|
-
end
|
567
|
-
end
|
568
|
-
|
569
|
-
|
570
|
-
specify "#symbol works as documented" do
|
571
|
-
currency = Money::Currency.new("EUR")
|
572
|
-
currency.should_receive(:symbol).and_return("€")
|
573
|
-
Money.empty(currency).symbol.should == "€"
|
574
|
-
|
575
|
-
currency = Money::Currency.new("EUR")
|
576
|
-
currency.should_receive(:symbol).and_return(nil)
|
577
|
-
Money.empty(currency).symbol.should == "¤"
|
578
|
-
end
|
579
|
-
|
580
|
-
specify "#delimiter works as documented" do
|
581
|
-
Money.empty("USD").delimiter.should == ","
|
582
|
-
Money.empty("EUR").delimiter.should == ","
|
583
|
-
Money.empty("BRL").delimiter.should == "."
|
584
|
-
end
|
585
|
-
|
586
|
-
specify "#separator works as documented" do
|
587
|
-
Money.empty("USD").separator.should == "."
|
588
|
-
Money.empty("EUR").separator.should == "."
|
589
|
-
Money.empty("BRL").separator.should == ","
|
590
|
-
end
|
591
|
-
|
592
|
-
specify "#format(:with_currency => true) works as documented" do
|
593
|
-
Money.ca_dollar(100).format(:with_currency => true).should == "$1.00 CAD"
|
594
|
-
Money.us_dollar(85).format(:with_currency => true).should == "$0.85 USD"
|
595
|
-
Money.us_dollar(85).format(:with_currency).should == "$0.85 USD"
|
596
|
-
end
|
597
|
-
|
598
|
-
specify "#format(:with_currency) works as documented" do
|
599
|
-
Money.ca_dollar(100).format(:with_currency).should == "$1.00 CAD"
|
600
|
-
Money.us_dollar(85).format(:with_currency).should == "$0.85 USD"
|
601
|
-
end
|
602
|
-
|
603
|
-
specify "#format(:no_cents => true) works as documented" do
|
604
|
-
Money.ca_dollar(100).format(:no_cents => true).should == "$1"
|
605
|
-
Money.ca_dollar(599).format(:no_cents => true).should == "$5"
|
606
|
-
Money.ca_dollar(570).format(:no_cents => true, :with_currency => true).should == "$5 CAD"
|
607
|
-
Money.ca_dollar(39000).format(:no_cents => true).should == "$390"
|
608
|
-
end
|
609
|
-
|
610
|
-
specify "#format(:no_cents => true) uses correct :subunit_to_unit" do
|
611
|
-
Money.new(10_00, "BHD").format(:no_cents => true).should == "ب.د1"
|
612
|
-
end
|
613
|
-
|
614
|
-
specify "#format(:no_cents) works as documented" do
|
615
|
-
Money.ca_dollar(100).format(:no_cents).should == "$1"
|
616
|
-
Money.ca_dollar(599).format(:no_cents).should == "$5"
|
617
|
-
Money.ca_dollar(570).format(:no_cents, :with_currency).should == "$5 CAD"
|
618
|
-
Money.ca_dollar(39000).format(:no_cents).should == "$390"
|
619
|
-
end
|
620
|
-
|
621
|
-
specify "#format(:no_cents) uses correct :subunit_to_unit" do
|
622
|
-
Money.new(10_00, "BHD").format(:no_cents).should == "ب.د1"
|
623
|
-
end
|
624
|
-
|
625
|
-
specify "#format(:symbol => a symbol string) uses the given value as the money symbol" do
|
626
|
-
Money.new(100, "GBP").format(:symbol => "£").should == "£1.00"
|
627
|
-
end
|
628
|
-
|
629
|
-
specify "#format(:symbol => true) returns symbol based on the given currency code" do
|
630
|
-
one = Proc.new do |currency|
|
631
|
-
Money.new(100, currency).format(:symbol => true)
|
632
|
-
end
|
633
|
-
|
634
|
-
# Pounds
|
635
|
-
one["GBP"].should == "£1.00"
|
636
|
-
|
637
|
-
# Dollars
|
638
|
-
one["USD"].should == "$1.00"
|
639
|
-
one["CAD"].should == "$1.00"
|
640
|
-
one["AUD"].should == "$1.00"
|
641
|
-
one["NZD"].should == "$1.00"
|
642
|
-
one["ZWD"].should == "$1.00"
|
643
|
-
|
644
|
-
# Yen
|
645
|
-
one["JPY"].should == "¥1.00"
|
646
|
-
one["CNY"].should == "¥10.00"
|
647
|
-
|
648
|
-
# Euro
|
649
|
-
one["EUR"].should == "€1.00"
|
650
|
-
|
651
|
-
# Rupees
|
652
|
-
one["INR"].should == "₨1.00"
|
653
|
-
one["NPR"].should == "₨1.00"
|
654
|
-
one["SCR"].should == "₨1.00"
|
655
|
-
one["LKR"].should == "₨1.00"
|
656
|
-
|
657
|
-
# Brazilian Real
|
658
|
-
one["BRL"].should == "R$ 1,00"
|
659
|
-
|
660
|
-
# Other
|
661
|
-
one["SEK"].should == "kr1.00"
|
662
|
-
one["GHC"].should == "₵1.00"
|
663
|
-
end
|
664
|
-
|
665
|
-
specify "#format(:symbol => true) returns $ when currency code is not recognized" do
|
666
|
-
currency = Money::Currency.new("EUR")
|
667
|
-
currency.should_receive(:symbol).and_return(nil)
|
668
|
-
Money.new(100, currency).format(:symbol => true).should == "¤1.00"
|
669
|
-
end
|
670
|
-
|
671
|
-
specify "#format(:symbol => some non-Boolean value that evaluates to true) returs symbol based on the given currency code" do
|
672
|
-
Money.new(100, "GBP").format(:symbol => true).should == "£1.00"
|
673
|
-
Money.new(100, "EUR").format(:symbol => true).should == "€1.00"
|
674
|
-
Money.new(100, "SEK").format(:symbol => true).should == "kr1.00"
|
675
|
-
end
|
676
|
-
|
677
|
-
specify "#format with :symbol == "", nil or false returns the amount without a symbol" do
|
678
|
-
money = Money.new(100, "GBP")
|
679
|
-
money.format(:symbol => "").should == "1.00"
|
680
|
-
money.format(:symbol => nil).should == "1.00"
|
681
|
-
money.format(:symbol => false).should == "1.00"
|
682
|
-
end
|
683
|
-
|
684
|
-
specify "#format without :symbol assumes that :symbol is set to true" do
|
685
|
-
money = Money.new(100)
|
686
|
-
money.format.should == "$1.00"
|
687
|
-
|
688
|
-
money = Money.new(100, "GBP")
|
689
|
-
money.format.should == "£1.00"
|
690
|
-
|
691
|
-
money = Money.new(100, "EUR")
|
692
|
-
money.format.should == "€1.00"
|
693
|
-
end
|
694
|
-
|
695
|
-
specify "#format(:separator => a separator string) works as documented" do
|
696
|
-
Money.us_dollar(100).format(:separator => ",").should == "$1,00"
|
697
|
-
end
|
698
|
-
|
699
|
-
specify "#format will default separator to '.' if currency isn't recognized" do
|
700
|
-
Money.new(100, "ZWD").format.should == "$1.00"
|
701
|
-
end
|
702
|
-
|
703
|
-
specify "#format(:delimiter => a delimiter string) works as documented" do
|
704
|
-
Money.us_dollar(100000).format(:delimiter => ".").should == "$1.000.00"
|
705
|
-
Money.us_dollar(200000).format(:delimiter => "").should == "$2000.00"
|
706
|
-
end
|
707
|
-
|
708
|
-
specify "#format(:delimiter => false or nil) works as documented" do
|
709
|
-
Money.us_dollar(100000).format(:delimiter => false).should == "$1000.00"
|
710
|
-
Money.us_dollar(200000).format(:delimiter => nil).should == "$2000.00"
|
711
|
-
end
|
712
|
-
|
713
|
-
specify "#format will default delimiter to ',' if currency isn't recognized" do
|
714
|
-
Money.new(100000, "ZWD").format.should == "$1,000.00"
|
715
|
-
end
|
716
|
-
|
717
|
-
specify "#format(:html => true) works as documented" do
|
718
|
-
string = Money.ca_dollar(570).format(:html => true, :with_currency => true)
|
719
|
-
string.should == "$5.70 <span class=\"currency\">CAD</span>"
|
720
|
-
end
|
721
|
-
|
722
|
-
it "should insert commas into the result if the amount is sufficiently large" do
|
723
|
-
Money.us_dollar(1_000_000_000_12).format.should == "$1,000,000,000.12"
|
724
|
-
Money.us_dollar(1_000_000_000_12).format(:no_cents => true).should == "$1,000,000,000"
|
725
|
-
end
|
726
|
-
end
|
727
|
-
|
728
|
-
|
729
|
-
# Sets $VERBOSE to nil for the duration of the block and back to its original value afterwards.
|
730
|
-
#
|
731
|
-
# silence_warnings do
|
732
|
-
# value = noisy_call # no warning voiced
|
733
|
-
# end
|
734
|
-
#
|
735
|
-
# noisy_call # warning voiced
|
736
|
-
def silence_warnings
|
737
|
-
old_verbose, $VERBOSE = $VERBOSE, nil
|
738
|
-
yield
|
739
|
-
ensure
|
740
|
-
$VERBOSE = old_verbose
|
741
|
-
end
|
742
|
-
|
743
|
-
end
|
744
|
-
|
745
|
-
describe "Actions involving two Money objects" do
|
746
|
-
describe "if the other Money object has the same currency" do
|
747
|
-
specify "#<=> compares the two objects' amounts" do
|
748
|
-
(Money.new(1_00, "USD") <=> Money.new(1_00, "USD")).should == 0
|
749
|
-
(Money.new(1_00, "USD") <=> Money.new(99, "USD")).should > 0
|
750
|
-
(Money.new(1_00, "USD") <=> Money.new(2_00, "USD")).should < 0
|
751
|
-
end
|
752
|
-
|
753
|
-
specify "#+ adds the other object's amount to the current object's amount while retaining the currency" do
|
754
|
-
(Money.new(10_00, "USD") + Money.new(90, "USD")).should == Money.new(10_90, "USD")
|
755
|
-
end
|
756
|
-
|
757
|
-
specify "#- substracts the other object's amount from the current object's amount while retaining the currency" do
|
758
|
-
(Money.new(10_00, "USD") - Money.new(90, "USD")).should == Money.new(9_10, "USD")
|
759
|
-
end
|
760
|
-
|
761
|
-
specify "#/ divides the current object's amount by the other object's amount resulting in a float" do
|
762
|
-
(Money.new(10_00, "USD") / Money.new(100_00, "USD")).should == 0.1
|
763
|
-
end
|
764
|
-
end
|
765
|
-
|
766
|
-
describe "if the other Money object has a different currency" do
|
767
|
-
specify "#<=> compares the two objects' amount after converting the other object's amount to its own currency" do
|
768
|
-
target = Money.new(200_00, "EUR")
|
769
|
-
target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(300_00, "USD"))
|
770
|
-
(Money.new(100_00, "USD") <=> target).should < 0
|
771
|
-
|
772
|
-
target = Money.new(200_00, "EUR")
|
773
|
-
target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(100_00, "USD"))
|
774
|
-
(Money.new(100_00, "USD") <=> target).should == 0
|
775
|
-
|
776
|
-
target = Money.new(200_00, "EUR")
|
777
|
-
target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(99_00, "USD"))
|
778
|
-
(Money.new(100_00, "USD") <=> target).should > 0
|
779
|
-
end
|
780
|
-
|
781
|
-
specify "#+ adds the other object's amount, converted to this object's currency, to this object's amount while retaining its currency" do
|
782
|
-
other = Money.new(90, "EUR")
|
783
|
-
other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(9_00, "USD"))
|
784
|
-
(Money.new(10_00, "USD") + other).should == Money.new(19_00, "USD")
|
785
|
-
end
|
786
|
-
|
787
|
-
specify "#- substracts the other object's amount, converted to this object's currency, from this object's amount while retaining its currency" do
|
788
|
-
other = Money.new(90, "EUR")
|
789
|
-
other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(9_00, "USD"))
|
790
|
-
(Money.new(10_00, "USD") - other).should == Money.new(1_00, "USD")
|
791
|
-
end
|
792
|
-
|
793
|
-
specify "#/ divides the this object's amount by the other objects's amount, converted to this object's currency, resulting in a float" do
|
794
|
-
other = Money.new(1000, "EUR")
|
795
|
-
other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(100_00, "USD"))
|
796
|
-
(Money.new(10_00, "USD") / other).should == 0.1
|
797
|
-
end
|
798
|
-
end
|
799
|
-
end
|