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.
- data/CHANGELOG.md +405 -391
- data/LICENSE +21 -21
- data/README.md +249 -243
- data/Rakefile +52 -49
- data/config/currency.json +2068 -2068
- data/config/currency_bc.json +41 -41
- data/lib/money.rb +28 -28
- data/lib/money/bank/base.rb +130 -131
- data/lib/money/bank/variable_exchange.rb +253 -252
- data/lib/money/core_extensions.rb +82 -82
- data/lib/money/currency.rb +280 -263
- data/lib/money/currency_loader.rb +21 -19
- data/lib/money/money.rb +411 -405
- data/lib/money/money/arithmetic.rb +257 -246
- data/lib/money/money/formatting.rb +251 -260
- data/lib/money/money/parsing.rb +350 -350
- data/money.gemspec +29 -29
- data/spec/bank/base_spec.rb +69 -72
- data/spec/bank/variable_exchange_spec.rb +233 -238
- data/spec/core_extensions_spec.rb +160 -158
- data/spec/currency_spec.rb +139 -120
- data/spec/money/arithmetic_spec.rb +482 -479
- data/spec/money/formatting_spec.rb +402 -383
- data/spec/money/parsing_spec.rb +210 -197
- data/spec/money_spec.rb +312 -292
- data/spec/spec_helper.rb +32 -28
- metadata +14 -14
@@ -1,479 +1,482 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Money do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
Money.new(1_00, "USD").
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
end
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
end
|
171
|
-
|
172
|
-
it "
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
ts
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
ts
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
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
|