money 4.0.1 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,479 +1,482 @@
1
- # encoding: utf-8
2
-
3
- require "spec_helper"
4
-
5
- describe Money do
6
- specify "#zero? returns whether the amount is 0" do
7
- Money.new(0, "USD").should be_zero
8
- Money.new(0, "EUR").should be_zero
9
- Money.new(1, "USD").should_not be_zero
10
- Money.new(10, "YEN").should_not be_zero
11
- Money.new(-1, "EUR").should_not be_zero
12
- end
13
-
14
- specify "#nonzero? returns whether the amount is not 0" do
15
- Money.new(0, "USD").should_not be_nonzero
16
- Money.new(0, "EUR").should_not be_nonzero
17
- Money.new(1, "USD").should be_nonzero
18
- Money.new(10, "YEN").should be_nonzero
19
- Money.new(-1, "EUR").should be_nonzero
20
- end
21
-
22
- specify "#nonzero? has the same return-value semantics as Numeric#nonzero?" do
23
- Money.new(0, "USD").nonzero?.should be_nil
24
-
25
- money = Money.new(1, "USD")
26
- money.nonzero?.should be_equal(money)
27
- end
28
-
29
- specify "#== returns true if and only if their amount and currency are equal" do
30
- Money.new(1_00, "USD").should == Money.new(1_00, "USD")
31
- Money.new(1_00, "USD").should_not == Money.new(1_00, "EUR")
32
- Money.new(1_00, "USD").should_not == Money.new(2_00, "USD")
33
- Money.new(1_00, "USD").should_not == Money.new(99_00, "EUR")
34
- end
35
-
36
- specify "#== can be used to compare with a String money value" do
37
- Money.new(1_00, "USD").should == "1.00"
38
- Money.new(1_00, "USD").should_not == "2.00"
39
- Money.new(1_00, "GBP").should_not == "1.00"
40
- end
41
-
42
- specify "#== can be used to compare with a Numeric money value" do
43
- Money.new(1_00, "USD").should == 1
44
- Money.new(1_57, "USD").should == 1.57
45
- Money.new(1_00, "USD").should_not == 2
46
- Money.new(1_00, "GBP").should_not == 1
47
- end
48
-
49
- specify "#== can be used to compare with an object that responds to #to_money" do
50
- klass = Class.new do
51
- def initialize(money)
52
- @money = money
53
- end
54
-
55
- def to_money
56
- @money
57
- end
58
- end
59
-
60
- Money.new(1_00, "USD").should == klass.new(Money.new(1_00, "USD"))
61
- Money.new(2_50, "USD").should == klass.new(Money.new(2_50, "USD"))
62
- Money.new(2_50, "USD").should_not == klass.new(Money.new(3_00, "USD"))
63
- Money.new(1_00, "GBP").should_not == klass.new(Money.new(1_00, "USD"))
64
- end
65
-
66
- specify "#== returns false if used to compare with an object that doesn't respond to #to_money" do
67
- Money.new(1_00, "USD").should_not == Object.new
68
- Money.new(1_00, "USD").should_not == Class
69
- Money.new(1_00, "USD").should_not == Kernel
70
- Money.new(1_00, "USD").should_not == /foo/
71
- Money.new(1_00, "USD").should_not == nil
72
- end
73
-
74
- specify "#eql? returns true if and only if their amount and currency are equal" do
75
- Money.new(1_00, "USD").eql?(Money.new(1_00, "USD")).should be true
76
- Money.new(1_00, "USD").eql?(Money.new(1_00, "EUR")).should be false
77
- Money.new(1_00, "USD").eql?(Money.new(2_00, "USD")).should be false
78
- Money.new(1_00, "USD").eql?(Money.new(99_00, "EUR")).should be false
79
- end
80
-
81
- specify "#eql? can be used to compare with a String money value" do
82
- Money.new(1_00, "USD").eql?("1.00").should be true
83
- Money.new(1_00, "USD").eql?("2.00").should be false
84
- Money.new(1_00, "GBP").eql?("1.00").should be false
85
- end
86
-
87
- specify "#eql? can be used to compare with a Numeric money value" do
88
- Money.new(1_00, "USD").eql?(1).should be true
89
- Money.new(1_57, "USD").eql?(1.57).should be true
90
- Money.new(1_00, "USD").eql?(2).should be false
91
- Money.new(1_00, "GBP").eql?(1).should be false
92
- end
93
-
94
- specify "#eql? can be used to compare with an object that responds to #to_money" do
95
- klass = Class.new do
96
- def initialize(money)
97
- @money = money
98
- end
99
-
100
- def to_money
101
- @money
102
- end
103
- end
104
-
105
- Money.new(1_00, "USD").eql?(klass.new(Money.new(1_00, "USD"))).should be true
106
- Money.new(2_50, "USD").eql?(klass.new(Money.new(2_50, "USD"))).should be true
107
- Money.new(2_50, "USD").eql?(klass.new(Money.new(3_00, "USD"))).should be false
108
- Money.new(1_00, "GBP").eql?(klass.new(Money.new(1_00, "USD"))).should be false
109
- end
110
-
111
- specify "#eql? returns false if used to compare with an object that doesn't respond to #to_money" do
112
- Money.new(1_00, "USD").eql?(Object.new).should be false
113
- Money.new(1_00, "USD").eql?(Class).should be false
114
- Money.new(1_00, "USD").eql?(Kernel).should be false
115
- Money.new(1_00, "USD").eql?(/foo/).should be false
116
- Money.new(1_00, "USD").eql?(nil).should be false
117
- end
118
-
119
- specify "#<=> can be used to compare with a String money value" do
120
- (Money.new(1_00) <=> "1.00").should == 0
121
- (Money.new(1_00) <=> ".99").should > 0
122
- (Money.new(1_00) <=> "2.00").should < 0
123
- end
124
-
125
- specify "#<=> can be used to compare with a Numeric money value" do
126
- (Money.new(1_00) <=> 1).should == 0
127
- (Money.new(1_00) <=> 0.99).should > 0
128
- (Money.new(1_00) <=> 2.00).should < 0
129
- end
130
-
131
- specify "#<=> can be used to compare with an object that responds to #to_money" do
132
- klass = Class.new do
133
- def initialize(money)
134
- @money = money
135
- end
136
-
137
- def to_money
138
- @money
139
- end
140
- end
141
-
142
- (Money.new(1_00) <=> klass.new(Money.new(1_00))).should == 0
143
- (Money.new(1_00) <=> klass.new(Money.new(99))).should > 0
144
- (Money.new(1_00) <=> klass.new(Money.new(2_00))).should < 0
145
- end
146
-
147
- specify "#<=> raises ArgumentError when used to compare with an object that doesn't respond to #to_money" do
148
- expected_message = /Comparison .+ failed/
149
- lambda{ Money.new(1_00) <=> Object.new }.should raise_error(ArgumentError, expected_message)
150
- lambda{ Money.new(1_00) <=> Class }.should raise_error(ArgumentError, expected_message)
151
- lambda{ Money.new(1_00) <=> Kernel }.should raise_error(ArgumentError, expected_message)
152
- lambda{ Money.new(1_00) <=> /foo/ }.should raise_error(ArgumentError, expected_message)
153
- end
154
-
155
- describe "#*" do
156
- it "should multiply current money amount by the multiplier while retaining the currency" do
157
- (Money.new(1_00, "USD") * 10).should == Money.new(10_00, "USD")
158
- end
159
-
160
- it "should multiply Money by Fixnum and returns Money" do
161
- ts = [
162
- {:a => Money.new( 10, :USD), :b => 4, :c => Money.new( 40, :USD)},
163
- {:a => Money.new( 10, :USD), :b => -4, :c => Money.new(-40, :USD)},
164
- {:a => Money.new(-10, :USD), :b => 4, :c => Money.new(-40, :USD)},
165
- {:a => Money.new(-10, :USD), :b => -4, :c => Money.new( 40, :USD)},
166
- ]
167
- ts.each do |t|
168
- (t[:a] * t[:b]).should == t[:c]
169
- end
170
- end
171
-
172
- it "should not multiply Money by Money (same currency)" do
173
- lambda { Money.new( 10, :USD) * Money.new( 4, :USD) }.should raise_error(ArgumentError)
174
- end
175
-
176
- it "should not multiply Money by Money (different currency)" do
177
- lambda { Money.new( 10, :USD) * Money.new( 4, :EUR) }.should raise_error(ArgumentError)
178
- end
179
- end
180
-
181
- describe "#/" do
182
- it "divides current money amount by the divisor while retaining the currency" do
183
- (Money.new(10_00, "USD") / 10).should == Money.new(1_00, "USD")
184
- end
185
-
186
- it "divides Money by Fixnum and returns Money" do
187
- ts = [
188
- {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 3, :USD)},
189
- {:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-4, :USD)},
190
- {:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-4, :USD)},
191
- {:a => Money.new(-13, :USD), :b => -4, :c => Money.new( 3, :USD)},
192
- ]
193
- ts.each do |t|
194
- (t[:a] / t[:b]).should == t[:c]
195
- end
196
- end
197
-
198
- it "divides Money by Money (same currency) and returns Float" do
199
- ts = [
200
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => 3.25},
201
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => -3.25},
202
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => -3.25},
203
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => 3.25},
204
- ]
205
- ts.each do |t|
206
- (t[:a] / t[:b]).should == t[:c]
207
- end
208
- end
209
-
210
- it "divides Money by Money (different currency) and returns Float" do
211
- ts = [
212
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => 1.625},
213
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => -1.625},
214
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => -1.625},
215
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => 1.625},
216
- ]
217
- ts.each do |t|
218
- t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
219
- (t[:a] / t[:b]).should == t[:c]
220
- end
221
- end
222
- end
223
-
224
- specify "#div -> money / fixnum" do
225
- ts = [
226
- {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 3, :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(-4, :USD)},
229
- {:a => Money.new(-13, :USD), :b => -4, :c => Money.new( 3, :USD)},
230
- ]
231
- ts.each do |t|
232
- t[:a].div(t[:b]).should == t[:c]
233
- end
234
- end
235
-
236
- specify "#div -> money / money (same currency)" do
237
- ts = [
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
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => 3.25},
242
- ]
243
- ts.each do |t|
244
- t[:a].div(t[:b]).should == t[:c]
245
- end
246
- end
247
-
248
- specify "#div -> money / money (different currency)" do
249
- ts = [
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
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => 1.625},
254
- ]
255
- ts.each do |t|
256
- t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
257
- t[:a].div(t[:b]).should == t[:c]
258
- end
259
- end
260
-
261
- specify "#divmod -> money `divmod` fixnum" do
262
- ts = [
263
- {:a => Money.new( 13, :USD), :b => 4, :c => [Money.new( 3, :USD), Money.new( 1, :USD)]},
264
- {:a => Money.new( 13, :USD), :b => -4, :c => [Money.new(-4, :USD), Money.new(-3, :USD)]},
265
- {:a => Money.new(-13, :USD), :b => 4, :c => [Money.new(-4, :USD), Money.new( 3, :USD)]},
266
- {:a => Money.new(-13, :USD), :b => -4, :c => [Money.new( 3, :USD), Money.new(-1, :USD)]},
267
- ]
268
- ts.each do |t|
269
- t[:a].divmod(t[:b]).should == t[:c]
270
- end
271
- end
272
-
273
- specify "#divmod -> money `divmod` money (same currency)" do
274
- ts = [
275
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => [ 3, Money.new( 1, :USD)]},
276
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => [-4, Money.new(-3, :USD)]},
277
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => [-4, Money.new( 3, :USD)]},
278
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => [ 3, Money.new(-1, :USD)]},
279
- ]
280
- ts.each do |t|
281
- t[:a].divmod(t[:b]).should == t[:c]
282
- end
283
- end
284
-
285
- specify "#divmod -> money `divmod` money (different currency)" do
286
- ts = [
287
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => [ 1, Money.new( 5, :USD)]},
288
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => [-2, Money.new(-3, :USD)]},
289
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => [-2, Money.new( 3, :USD)]},
290
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => [ 1, Money.new(-5, :USD)]},
291
- ]
292
- ts.each do |t|
293
- t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
294
- t[:a].divmod(t[:b]).should == t[:c]
295
- end
296
- end
297
-
298
- specify "#modulo -> money `modulo` fixnum" do
299
- ts = [
300
- {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
301
- {:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-3, :USD)},
302
- {:a => Money.new(-13, :USD), :b => 4, :c => Money.new( 3, :USD)},
303
- {:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
304
- ]
305
- ts.each do |t|
306
- t[:a].modulo(t[:b]).should == t[:c]
307
- end
308
- end
309
-
310
- specify "#modulo -> money `modulo` money (same currency)" do
311
- ts = [
312
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
313
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-3, :USD)},
314
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 3, :USD)},
315
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
316
- ]
317
- ts.each do |t|
318
- t[:a].modulo(t[:b]).should == t[:c]
319
- end
320
- end
321
-
322
- specify "#modulo -> money `modulo` money (different currency)" do
323
- ts = [
324
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
325
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-3, :USD)},
326
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 3, :USD)},
327
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
328
- ]
329
- ts.each do |t|
330
- t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
331
- t[:a].modulo(t[:b]).should == t[:c]
332
- end
333
- end
334
-
335
- specify "#% -> money % fixnum" do
336
- ts = [
337
- {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :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( 3, :USD)},
340
- {:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
341
- ]
342
- ts.each do |t|
343
- (t[:a] % t[:b]).should == t[:c]
344
- end
345
- end
346
-
347
- specify "#% -> money % money (same currency)" do
348
- ts = [
349
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :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( 3, :USD)},
352
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
353
- ]
354
- ts.each do |t|
355
- (t[:a] % t[:b]).should == t[:c]
356
- end
357
- end
358
-
359
- specify "#% -> money % money (different currency)" do
360
- ts = [
361
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :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( 3, :USD)},
364
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
365
- ]
366
- ts.each do |t|
367
- t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
368
- (t[:a] % t[:b]).should == t[:c]
369
- end
370
- end
371
-
372
- specify "#remainder -> money `remainder` fixnum" do
373
- ts = [
374
- {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
375
- {:a => Money.new( 13, :USD), :b => -4, :c => Money.new( 1, :USD)},
376
- {:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-1, :USD)},
377
- {:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
378
- ]
379
- ts.each do |t|
380
- t[:a].remainder(t[:b]).should == t[:c]
381
- end
382
- end
383
-
384
- specify "#remainder -> money `remainder` money (same currency)" do
385
- ts = [
386
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
387
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new( 1, :USD)},
388
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => Money.new(-1, :USD)},
389
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
390
- ]
391
- ts.each do |t|
392
- t[:a].remainder(t[:b]).should == t[:c]
393
- end
394
- end
395
-
396
- specify "#remainder -> money `remainder` money (different currency)" do
397
- ts = [
398
- {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
399
- {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new( 5, :USD)},
400
- {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => Money.new(-5, :USD)},
401
- {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
402
- ]
403
- ts.each do |t|
404
- t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
405
- t[:a].remainder(t[:b]).should == t[:c]
406
- end
407
- end
408
-
409
- specify "#abs correctly returns the absolute value as a new Money object" do
410
- n = Money.new(-1, :USD)
411
- n.abs.should == Money.new( 1, :USD)
412
- n.should == Money.new(-1, :USD)
413
- end
414
-
415
- describe "Actions involving two Money objects" do
416
- describe "if the other Money object has the same currency" do
417
- specify "#<=> compares the two object amounts" do
418
- (Money.new(1_00, "USD") <=> Money.new(1_00, "USD")).should == 0
419
- (Money.new(1_00, "USD") <=> Money.new(99, "USD")).should > 0
420
- (Money.new(1_00, "USD") <=> Money.new(2_00, "USD")).should < 0
421
- end
422
-
423
- specify "#+ adds other amount to current amount and returns a Money while retaining the currency" do
424
- (Money.new(10_00, "USD") + Money.new(90, "USD")).should == Money.new(10_90, "USD")
425
- end
426
-
427
- specify "#- subtracts other amount from current amount and returns a Money while retaining the currency" do
428
- (Money.new(10_00, "USD") - Money.new(90, "USD")).should == Money.new(9_10, "USD")
429
- end
430
-
431
- specify "#* should raise ArgumentError" do
432
- lambda { Money.new(10_00, "USD") * Money.new(2, "USD") }.should raise_error(ArgumentError)
433
- end
434
-
435
- specify "#/ divides current amount by other amount and returns a Float" do
436
- (Money.new(10_00, "USD") / Money.new(100_00, "USD")).should == 0.1
437
- end
438
- end
439
-
440
- describe "if the other Money object has a different currency" do
441
- specify "#<=> converts other object amount to current currency, then compares the two object amounts" do
442
- target = Money.new(200_00, "EUR")
443
- target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(300_00, "USD"))
444
- (Money.new(100_00, "USD") <=> target).should < 0
445
-
446
- target = Money.new(200_00, "EUR")
447
- target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(100_00, "USD"))
448
- (Money.new(100_00, "USD") <=> target).should == 0
449
-
450
- target = Money.new(200_00, "EUR")
451
- target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(99_00, "USD"))
452
- (Money.new(100_00, "USD") <=> target).should > 0
453
- end
454
-
455
- specify "#+ converts other object amount to current currency, then adds other amount to current amount and returns a Money" do
456
- other = Money.new(90, "EUR")
457
- other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(9_00, "USD"))
458
- (Money.new(10_00, "USD") + other).should == Money.new(19_00, "USD")
459
- end
460
-
461
- specify "#- converts other object amount to current currency, then subtracts other amount from current amount and returns a Money" do
462
- other = Money.new(90, "EUR")
463
- other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(9_00, "USD"))
464
- (Money.new(10_00, "USD") - other).should == Money.new(1_00, "USD")
465
- end
466
-
467
- specify "#* should raise ArgumentError" do
468
- lambda { Money.new(10_00, "USD") * Money.new(10, "EUR") }.should raise_error(ArgumentError)
469
- end
470
-
471
- specify "#/ converts other object amount to current currency, then divides current amount by other amount and returns a Float" do
472
- other = Money.new(1000, "EUR")
473
- other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(100_00, "USD"))
474
- (Money.new(10_00, "USD") / other).should == 0.1
475
- end
476
- end
477
- end
478
-
479
- end
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Money do
6
+
7
+ describe "-@" do
8
+ it "changes the sign of a number" do
9
+ (- Money.new(0)).should == Money.new(0)
10
+ (- Money.new(1)).should == Money.new(-1)
11
+ (- Money.new(-1)).should == Money.new(1)
12
+ end
13
+ end
14
+
15
+ describe "#==" do
16
+ it "returns true if and only if their amount and currency are equal" do
17
+ Money.new(1_00, "USD").should == Money.new(1_00, "USD")
18
+ Money.new(1_00, "USD").should_not == Money.new(1_00, "EUR")
19
+ Money.new(1_00, "USD").should_not == Money.new(2_00, "USD")
20
+ Money.new(1_00, "USD").should_not == Money.new(99_00, "EUR")
21
+ end
22
+
23
+ it "returns false if used to compare with an object that doesn't respond to #to_money" do
24
+ Money.new(1_00, "USD").should_not == Object.new
25
+ Money.new(1_00, "USD").should_not == Class
26
+ Money.new(1_00, "USD").should_not == Kernel
27
+ Money.new(1_00, "USD").should_not == /foo/
28
+ Money.new(1_00, "USD").should_not == nil
29
+ end
30
+
31
+ it "can be used to compare with a String money value" do
32
+ Money.new(1_00, "USD").should == "1.00"
33
+ Money.new(1_00, "USD").should_not == "2.00"
34
+ Money.new(1_00, "GBP").should_not == "1.00"
35
+ end
36
+
37
+ it "can be used to compare with a Numeric money value" do
38
+ Money.new(1_00, "USD").should == 1
39
+ Money.new(1_57, "USD").should == 1.57
40
+ Money.new(1_00, "USD").should_not == 2
41
+ Money.new(1_00, "GBP").should_not == 1
42
+ end
43
+
44
+ it "can be used to compare with an object that responds to #to_money" do
45
+ klass = Class.new do
46
+ def initialize(money)
47
+ @money = money
48
+ end
49
+
50
+ def to_money
51
+ @money
52
+ end
53
+ end
54
+
55
+ Money.new(1_00, "USD").should == klass.new(Money.new(1_00, "USD"))
56
+ Money.new(2_50, "USD").should == klass.new(Money.new(2_50, "USD"))
57
+ Money.new(2_50, "USD").should_not == klass.new(Money.new(3_00, "USD"))
58
+ Money.new(1_00, "GBP").should_not == klass.new(Money.new(1_00, "USD"))
59
+ end
60
+ end
61
+
62
+ describe "#eql?" do
63
+ it "returns true if and only if their amount and currency are equal" do
64
+ Money.new(1_00, "USD").eql?(Money.new(1_00, "USD")).should be true
65
+ Money.new(1_00, "USD").eql?(Money.new(1_00, "EUR")).should be false
66
+ Money.new(1_00, "USD").eql?(Money.new(2_00, "USD")).should be false
67
+ Money.new(1_00, "USD").eql?(Money.new(99_00, "EUR")).should be false
68
+ end
69
+
70
+ it "returns false if used to compare with an object that doesn't respond to #to_money" do
71
+ Money.new(1_00, "USD").eql?(Object.new).should be false
72
+ Money.new(1_00, "USD").eql?(Class).should be false
73
+ Money.new(1_00, "USD").eql?(Kernel).should be false
74
+ Money.new(1_00, "USD").eql?(/foo/).should be false
75
+ Money.new(1_00, "USD").eql?(nil).should be false
76
+ end
77
+
78
+ it "can be used to compare with a String money value" do
79
+ Money.new(1_00, "USD").eql?("1.00").should be true
80
+ Money.new(1_00, "USD").eql?("2.00").should be false
81
+ Money.new(1_00, "GBP").eql?("1.00").should be false
82
+ end
83
+
84
+ it "can be used to compare with a Numeric money value" do
85
+ Money.new(1_00, "USD").eql?(1).should be true
86
+ Money.new(1_57, "USD").eql?(1.57).should be true
87
+ Money.new(1_00, "USD").eql?(2).should be false
88
+ Money.new(1_00, "GBP").eql?(1).should be false
89
+ end
90
+
91
+ it "can be used to compare with an object that responds to #to_money" do
92
+ klass = Class.new do
93
+ def initialize(money)
94
+ @money = money
95
+ end
96
+
97
+ def to_money
98
+ @money
99
+ end
100
+ end
101
+
102
+ Money.new(1_00, "USD").eql?(klass.new(Money.new(1_00, "USD"))).should be true
103
+ Money.new(2_50, "USD").eql?(klass.new(Money.new(2_50, "USD"))).should be true
104
+ Money.new(2_50, "USD").eql?(klass.new(Money.new(3_00, "USD"))).should be false
105
+ Money.new(1_00, "GBP").eql?(klass.new(Money.new(1_00, "USD"))).should be false
106
+ end
107
+ end
108
+
109
+ describe "#<=>" do
110
+ it "compares the two object amounts (same currency)" do
111
+ (Money.new(1_00, "USD") <=> Money.new(1_00, "USD")).should == 0
112
+ (Money.new(1_00, "USD") <=> Money.new(99, "USD")).should > 0
113
+ (Money.new(1_00, "USD") <=> Money.new(2_00, "USD")).should < 0
114
+ end
115
+
116
+ it "converts other object amount to current currency, then compares the two object amounts (different currency)" do
117
+ target = Money.new(200_00, "EUR")
118
+ target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(300_00, "USD"))
119
+ (Money.new(100_00, "USD") <=> target).should < 0
120
+
121
+ target = Money.new(200_00, "EUR")
122
+ target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(100_00, "USD"))
123
+ (Money.new(100_00, "USD") <=> target).should == 0
124
+
125
+ target = Money.new(200_00, "EUR")
126
+ target.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(99_00, "USD"))
127
+ (Money.new(100_00, "USD") <=> target).should > 0
128
+ end
129
+
130
+ it "can be used to compare with a String money value" do
131
+ (Money.new(1_00) <=> "1.00").should == 0
132
+ (Money.new(1_00) <=> ".99").should > 0
133
+ (Money.new(1_00) <=> "2.00").should < 0
134
+ end
135
+
136
+ it "can be used to compare with a Numeric money value" do
137
+ (Money.new(1_00) <=> 1).should == 0
138
+ (Money.new(1_00) <=> 0.99).should > 0
139
+ (Money.new(1_00) <=> 2.00).should < 0
140
+ end
141
+
142
+ it "can be used to compare with an object that responds to #to_money" do
143
+ klass = Class.new do
144
+ def initialize(money)
145
+ @money = money
146
+ end
147
+
148
+ def to_money
149
+ @money
150
+ end
151
+ end
152
+
153
+ (Money.new(1_00) <=> klass.new(Money.new(1_00))).should == 0
154
+ (Money.new(1_00) <=> klass.new(Money.new(99))).should > 0
155
+ (Money.new(1_00) <=> klass.new(Money.new(2_00))).should < 0
156
+ end
157
+
158
+ it "raises ArgumentError when used to compare with an object that doesn't respond to #to_money" do
159
+ expected_message = /Comparison .+ failed/
160
+ lambda{ Money.new(1_00) <=> Object.new }.should raise_error(ArgumentError, expected_message)
161
+ lambda{ Money.new(1_00) <=> Class }.should raise_error(ArgumentError, expected_message)
162
+ lambda{ Money.new(1_00) <=> Kernel }.should raise_error(ArgumentError, expected_message)
163
+ lambda{ Money.new(1_00) <=> /foo/ }.should raise_error(ArgumentError, expected_message)
164
+ end
165
+ end
166
+
167
+ describe "#+" do
168
+ it "adds other amount to current amount (same currency)" do
169
+ (Money.new(10_00, "USD") + Money.new(90, "USD")).should == Money.new(10_90, "USD")
170
+ end
171
+
172
+ it "converts other object amount to current currency and adds other amount to current amount (different currency)" do
173
+ other = Money.new(90, "EUR")
174
+ other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(9_00, "USD"))
175
+ (Money.new(10_00, "USD") + other).should == Money.new(19_00, "USD")
176
+ end
177
+ end
178
+
179
+ describe "#-" do
180
+ it "subtracts other amount from current amount (same currency)" do
181
+ (Money.new(10_00, "USD") - Money.new(90, "USD")).should == Money.new(9_10, "USD")
182
+ end
183
+
184
+ it "converts other object amount to current currency and subtracts other amount from current amount (different currency)" do
185
+ other = Money.new(90, "EUR")
186
+ other.should_receive(:exchange_to).with(Money::Currency.new("USD")).and_return(Money.new(9_00, "USD"))
187
+ (Money.new(10_00, "USD") - other).should == Money.new(1_00, "USD")
188
+ end
189
+ end
190
+
191
+ describe "#*" do
192
+ it "multiplies Money by Fixnum and returns Money" do
193
+ ts = [
194
+ {:a => Money.new( 10, :USD), :b => 4, :c => Money.new( 40, :USD)},
195
+ {:a => Money.new( 10, :USD), :b => -4, :c => Money.new(-40, :USD)},
196
+ {:a => Money.new(-10, :USD), :b => 4, :c => Money.new(-40, :USD)},
197
+ {:a => Money.new(-10, :USD), :b => -4, :c => Money.new( 40, :USD)},
198
+ ]
199
+ ts.each do |t|
200
+ (t[:a] * t[:b]).should == t[:c]
201
+ end
202
+ end
203
+
204
+ it "does not multiply Money by Money (same currency)" do
205
+ lambda { Money.new( 10, :USD) * Money.new( 4, :USD) }.should raise_error(ArgumentError)
206
+ end
207
+
208
+ it "does not multiply Money by Money (different currency)" do
209
+ lambda { Money.new( 10, :USD) * Money.new( 4, :EUR) }.should raise_error(ArgumentError)
210
+ end
211
+ end
212
+
213
+ describe "#/" do
214
+ it "divides Money by Fixnum and returns Money" do
215
+ ts = [
216
+ {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 3, :USD)},
217
+ {:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-4, :USD)},
218
+ {:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-4, :USD)},
219
+ {:a => Money.new(-13, :USD), :b => -4, :c => Money.new( 3, :USD)},
220
+ ]
221
+ ts.each do |t|
222
+ (t[:a] / t[:b]).should == t[:c]
223
+ end
224
+ end
225
+
226
+ it "divides Money by Money (same currency) and returns Float" do
227
+ ts = [
228
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => 3.25},
229
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => -3.25},
230
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => -3.25},
231
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => 3.25},
232
+ ]
233
+ ts.each do |t|
234
+ (t[:a] / t[:b]).should == t[:c]
235
+ end
236
+ end
237
+
238
+ it "divides Money by Money (different currency) and returns Float" do
239
+ ts = [
240
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => 1.625},
241
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => -1.625},
242
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => -1.625},
243
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => 1.625},
244
+ ]
245
+ ts.each do |t|
246
+ t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
247
+ (t[:a] / t[:b]).should == t[:c]
248
+ end
249
+ end
250
+ end
251
+
252
+ describe "#div" do
253
+ it "divides Money by Fixnum and returns Money" do
254
+ ts = [
255
+ {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 3, :USD)},
256
+ {:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-4, :USD)},
257
+ {:a => Money.new(-13, :USD), :b => 4, :c => Money.new(-4, :USD)},
258
+ {:a => Money.new(-13, :USD), :b => -4, :c => Money.new( 3, :USD)},
259
+ ]
260
+ ts.each do |t|
261
+ t[:a].div(t[:b]).should == t[:c]
262
+ end
263
+ end
264
+
265
+ it "divides Money by Money (same currency) and returns Float" do
266
+ ts = [
267
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => 3.25},
268
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => -3.25},
269
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => -3.25},
270
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => 3.25},
271
+ ]
272
+ ts.each do |t|
273
+ t[:a].div(t[:b]).should == t[:c]
274
+ end
275
+ end
276
+
277
+ it "divides Money by Money (different currency) and returns Float" do
278
+ ts = [
279
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => 1.625},
280
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => -1.625},
281
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => -1.625},
282
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => 1.625},
283
+ ]
284
+ ts.each do |t|
285
+ t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
286
+ t[:a].div(t[:b]).should == t[:c]
287
+ end
288
+ end
289
+ end
290
+
291
+ describe "#divmod" do
292
+ it "calculates division and modulo with Fixnum" do
293
+ ts = [
294
+ {:a => Money.new( 13, :USD), :b => 4, :c => [Money.new( 3, :USD), Money.new( 1, :USD)]},
295
+ {:a => Money.new( 13, :USD), :b => -4, :c => [Money.new(-4, :USD), Money.new(-3, :USD)]},
296
+ {:a => Money.new(-13, :USD), :b => 4, :c => [Money.new(-4, :USD), Money.new( 3, :USD)]},
297
+ {:a => Money.new(-13, :USD), :b => -4, :c => [Money.new( 3, :USD), Money.new(-1, :USD)]},
298
+ ]
299
+ ts.each do |t|
300
+ t[:a].divmod(t[:b]).should == t[:c]
301
+ end
302
+ end
303
+
304
+ it "calculates division and modulo with Money (same currency)" do
305
+ ts = [
306
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => [ 3, Money.new( 1, :USD)]},
307
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => [-4, Money.new(-3, :USD)]},
308
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => [-4, Money.new( 3, :USD)]},
309
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => [ 3, Money.new(-1, :USD)]},
310
+ ]
311
+ ts.each do |t|
312
+ t[:a].divmod(t[:b]).should == t[:c]
313
+ end
314
+ end
315
+
316
+ it "calculates division and modulo with Money (different currency)" do
317
+ ts = [
318
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => [ 1, Money.new( 5, :USD)]},
319
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => [-2, Money.new(-3, :USD)]},
320
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => [-2, Money.new( 3, :USD)]},
321
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => [ 1, Money.new(-5, :USD)]},
322
+ ]
323
+ ts.each do |t|
324
+ t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
325
+ t[:a].divmod(t[:b]).should == t[:c]
326
+ end
327
+ end
328
+ end
329
+
330
+ describe "#modulo" do
331
+ it "calculates modulo with Fixnum" do
332
+ ts = [
333
+ {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
334
+ {:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-3, :USD)},
335
+ {:a => Money.new(-13, :USD), :b => 4, :c => Money.new( 3, :USD)},
336
+ {:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
337
+ ]
338
+ ts.each do |t|
339
+ t[:a].modulo(t[:b]).should == t[:c]
340
+ end
341
+ end
342
+
343
+ it "calculates modulo with Money (same currency)" do
344
+ ts = [
345
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
346
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-3, :USD)},
347
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 3, :USD)},
348
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
349
+ ]
350
+ ts.each do |t|
351
+ t[:a].modulo(t[:b]).should == t[:c]
352
+ end
353
+ end
354
+
355
+ it "calculates modulo with Money (different currency)" do
356
+ ts = [
357
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
358
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-3, :USD)},
359
+ {:a => Money.new(-13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 3, :USD)},
360
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
361
+ ]
362
+ ts.each do |t|
363
+ t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
364
+ t[:a].modulo(t[:b]).should == t[:c]
365
+ end
366
+ end
367
+ end
368
+
369
+ describe "#%" do
370
+ it "calculates modulo with Fixnum" do
371
+ ts = [
372
+ {:a => Money.new( 13, :USD), :b => 4, :c => Money.new( 1, :USD)},
373
+ {:a => Money.new( 13, :USD), :b => -4, :c => Money.new(-3, :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(-1, :USD)},
376
+ ]
377
+ ts.each do |t|
378
+ (t[:a] % t[:b]).should == t[:c]
379
+ end
380
+ end
381
+
382
+ it "calculates modulo with Money (same currency)" do
383
+ ts = [
384
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :USD), :c => Money.new( 1, :USD)},
385
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-3, :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(-1, :USD)},
388
+ ]
389
+ ts.each do |t|
390
+ (t[:a] % t[:b]).should == t[:c]
391
+ end
392
+ end
393
+
394
+ it "calculates modulo with Money (different currency)" do
395
+ ts = [
396
+ {:a => Money.new( 13, :USD), :b => Money.new( 4, :EUR), :c => Money.new( 5, :USD)},
397
+ {:a => Money.new( 13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-3, :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(-5, :USD)},
400
+ ]
401
+ ts.each do |t|
402
+ t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
403
+ (t[:a] % t[:b]).should == t[:c]
404
+ end
405
+ end
406
+ end
407
+
408
+ describe "#remainder" do
409
+ it "calculates remainder with Fixnum" do
410
+ ts = [
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
+ {:a => Money.new(-13, :USD), :b => -4, :c => Money.new(-1, :USD)},
415
+ ]
416
+ ts.each do |t|
417
+ t[:a].remainder(t[:b]).should == t[:c]
418
+ end
419
+ end
420
+
421
+ it "calculates remainder with Money (same currency)" do
422
+ ts = [
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
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :USD), :c => Money.new(-1, :USD)},
427
+ ]
428
+ ts.each do |t|
429
+ t[:a].remainder(t[:b]).should == t[:c]
430
+ end
431
+ end
432
+
433
+ it "calculates remainder with Money (different currency)" do
434
+ ts = [
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
+ {:a => Money.new(-13, :USD), :b => Money.new(-4, :EUR), :c => Money.new(-5, :USD)},
439
+ ]
440
+ ts.each do |t|
441
+ t[:b].should_receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
442
+ t[:a].remainder(t[:b]).should == t[:c]
443
+ end
444
+ end
445
+ end
446
+
447
+ describe "#abs" do
448
+ it "returns the absolute value as a new Money object" do
449
+ n = Money.new(-1, :USD)
450
+ n.abs.should == Money.new( 1, :USD)
451
+ n.should == Money.new(-1, :USD)
452
+ end
453
+ end
454
+
455
+ describe "#zero?" do
456
+ it "returns whether the amount is 0" do
457
+ Money.new(0, "USD").should be_zero
458
+ Money.new(0, "EUR").should be_zero
459
+ Money.new(1, "USD").should_not be_zero
460
+ Money.new(10, "YEN").should_not be_zero
461
+ Money.new(-1, "EUR").should_not be_zero
462
+ end
463
+ end
464
+
465
+ describe "#nonzero?" do
466
+ it "returns whether the amount is not 0" do
467
+ Money.new(0, "USD").should_not be_nonzero
468
+ Money.new(0, "EUR").should_not be_nonzero
469
+ Money.new(1, "USD").should be_nonzero
470
+ Money.new(10, "YEN").should be_nonzero
471
+ Money.new(-1, "EUR").should be_nonzero
472
+ end
473
+
474
+ it "has the same return-value semantics as Numeric#nonzero?" do
475
+ Money.new(0, "USD").nonzero?.should be_nil
476
+
477
+ money = Money.new(1, "USD")
478
+ money.nonzero?.should be_equal(money)
479
+ end
480
+ end
481
+
482
+ end