money 4.0.1 → 4.0.2

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.
@@ -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