money 3.1.0.pre3 → 3.1.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.
- 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
|