money 6.11.0 → 6.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -3
- data/Gemfile +2 -2
- data/README.md +27 -21
- data/lib/money/bank/variable_exchange.rb +1 -1
- data/lib/money/currency/loader.rb +1 -1
- data/lib/money/money.rb +6 -41
- data/lib/money/money/arithmetic.rb +1 -1
- data/lib/money/money/formatter.rb +49 -49
- data/lib/money/money/formatting_rules.rb +1 -1
- data/lib/money/version.rb +1 -1
- data/spec/bank/variable_exchange_spec.rb +3 -3
- data/spec/currency_spec.rb +3 -3
- data/spec/money/arithmetic_spec.rb +85 -80
- data/spec/money/formatting_spec.rb +192 -182
- data/spec/rates_store/memory_spec.rb +3 -3
- metadata +2 -2
@@ -52,7 +52,7 @@ class Money
|
|
52
52
|
|
53
53
|
def translate_formatting_rules(rules)
|
54
54
|
begin
|
55
|
-
rules[:symbol] = I18n.t currency.iso_code, :
|
55
|
+
rules[:symbol] = I18n.t currency.iso_code, scope: "number.currency.symbol", raise: true
|
56
56
|
rescue I18n::MissingTranslationData
|
57
57
|
# Do nothing
|
58
58
|
end
|
data/lib/money/version.rb
CHANGED
@@ -151,7 +151,7 @@ class Money
|
|
151
151
|
|
152
152
|
it "delegates options to store, options are a no-op" do
|
153
153
|
expect(subject.store).to receive(:get_rate).with('USD', 'EUR')
|
154
|
-
subject.get_rate('USD', 'EUR', :
|
154
|
+
subject.get_rate('USD', 'EUR', without_mutex: true)
|
155
155
|
end
|
156
156
|
end
|
157
157
|
|
@@ -201,7 +201,7 @@ class Money
|
|
201
201
|
|
202
202
|
it "delegates execution to store, options are a no-op" do
|
203
203
|
expect(subject.store).to receive(:transaction)
|
204
|
-
subject.export_rates(:yaml, nil, :
|
204
|
+
subject.export_rates(:yaml, nil, foo: 1)
|
205
205
|
end
|
206
206
|
|
207
207
|
end
|
@@ -243,7 +243,7 @@ class Money
|
|
243
243
|
it "delegates execution to store#transaction" do
|
244
244
|
expect(subject.store).to receive(:transaction)
|
245
245
|
s = "--- \nUSD_TO_EUR: 1.25\nUSD_TO_JPY: 2.55\n"
|
246
|
-
subject.import_rates(:yaml, s, :
|
246
|
+
subject.import_rates(:yaml, s, foo: 1)
|
247
247
|
end
|
248
248
|
|
249
249
|
end
|
data/spec/currency_spec.rb
CHANGED
@@ -6,7 +6,7 @@ class Money
|
|
6
6
|
FOO = '{ "priority": 1, "iso_code": "FOO", "iso_numeric": "840", "name": "United States Dollar", "symbol": "$", "subunit": "Cent", "subunit_to_unit": 1000, "symbol_first": true, "html_entity": "$", "decimal_mark": ".", "thousands_separator": ",", "smallest_denomination": 1 }'
|
7
7
|
|
8
8
|
def register_foo(opts={})
|
9
|
-
foo_attrs = JSON.parse(FOO, :
|
9
|
+
foo_attrs = JSON.parse(FOO, symbolize_names: true)
|
10
10
|
# Pass an array of attribute names to 'skip' to remove them from the 'FOO'
|
11
11
|
# json before registering foo as a currency.
|
12
12
|
Array(opts[:skip]).each { |attr| foo_attrs.delete(attr) }
|
@@ -14,7 +14,7 @@ class Money
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def unregister_foo
|
17
|
-
Currency.unregister(JSON.parse(FOO, :
|
17
|
+
Currency.unregister(JSON.parse(FOO, symbolize_names: true))
|
18
18
|
end
|
19
19
|
|
20
20
|
describe "UnknownCurrency" do
|
@@ -82,7 +82,7 @@ class Money
|
|
82
82
|
expect(Currency.all.first.priority).to eq 1
|
83
83
|
end
|
84
84
|
it "raises a MissingAttributeError if any currency has no priority" do
|
85
|
-
register_foo(:
|
85
|
+
register_foo(skip: :priority)
|
86
86
|
|
87
87
|
expect{Money::Currency.all}.to \
|
88
88
|
raise_error(Money::Currency::MissingAttributeError, /foo.*priority/)
|
@@ -247,10 +247,10 @@ describe Money do
|
|
247
247
|
describe "#*" do
|
248
248
|
it "multiplies Money by Integer and returns Money" do
|
249
249
|
ts = [
|
250
|
-
{:
|
251
|
-
{:
|
252
|
-
{:
|
253
|
-
{:
|
250
|
+
{a: Money.new( 10, :USD), b: 4, c: Money.new( 40, :USD)},
|
251
|
+
{a: Money.new( 10, :USD), b: -4, c: Money.new(-40, :USD)},
|
252
|
+
{a: Money.new(-10, :USD), b: 4, c: Money.new(-40, :USD)},
|
253
|
+
{a: Money.new(-10, :USD), b: -4, c: Money.new( 40, :USD)},
|
254
254
|
]
|
255
255
|
ts.each do |t|
|
256
256
|
expect(t[:a] * t[:b]).to eq t[:c]
|
@@ -280,10 +280,10 @@ describe Money do
|
|
280
280
|
describe "#/" do
|
281
281
|
it "divides Money by Integer and returns Money" do
|
282
282
|
ts = [
|
283
|
-
{:
|
284
|
-
{:
|
285
|
-
{:
|
286
|
-
{:
|
283
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 3, :USD)},
|
284
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new(-3, :USD)},
|
285
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new(-3, :USD)},
|
286
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new( 3, :USD)},
|
287
287
|
]
|
288
288
|
ts.each do |t|
|
289
289
|
expect(t[:a] / t[:b]).to eq t[:c]
|
@@ -335,10 +335,10 @@ describe Money do
|
|
335
335
|
|
336
336
|
it "divides Money by Money (same currency) and returns Float" do
|
337
337
|
ts = [
|
338
|
-
{:
|
339
|
-
{:
|
340
|
-
{:
|
341
|
-
{:
|
338
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :USD), c: 3.25},
|
339
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :USD), c: -3.25},
|
340
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :USD), c: -3.25},
|
341
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :USD), c: 3.25},
|
342
342
|
]
|
343
343
|
ts.each do |t|
|
344
344
|
expect(t[:a] / t[:b]).to eq t[:c]
|
@@ -347,10 +347,10 @@ describe Money do
|
|
347
347
|
|
348
348
|
it "divides Money by Money (different currency) and returns Float" do
|
349
349
|
ts = [
|
350
|
-
{:
|
351
|
-
{:
|
352
|
-
{:
|
353
|
-
{:
|
350
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :EUR), c: 1.625},
|
351
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :EUR), c: -1.625},
|
352
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :EUR), c: -1.625},
|
353
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :EUR), c: 1.625},
|
354
354
|
]
|
355
355
|
ts.each do |t|
|
356
356
|
expect(t[:b]).to receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
@@ -361,10 +361,10 @@ describe Money do
|
|
361
361
|
context "with infinite_precision", :infinite_precision do
|
362
362
|
it "uses BigDecimal division" do
|
363
363
|
ts = [
|
364
|
-
{:
|
365
|
-
{:
|
366
|
-
{:
|
367
|
-
{:
|
364
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 3.25, :USD)},
|
365
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new(-3.25, :USD)},
|
366
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new(-3.25, :USD)},
|
367
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new( 3.25, :USD)},
|
368
368
|
]
|
369
369
|
ts.each do |t|
|
370
370
|
expect(t[:a] / t[:b]).to eq t[:c]
|
@@ -378,10 +378,10 @@ describe Money do
|
|
378
378
|
describe "#div" do
|
379
379
|
it "divides Money by Integer and returns Money" do
|
380
380
|
ts = [
|
381
|
-
{:
|
382
|
-
{:
|
383
|
-
{:
|
384
|
-
{:
|
381
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 3, :USD)},
|
382
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new(-3, :USD)},
|
383
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new(-3, :USD)},
|
384
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new( 3, :USD)},
|
385
385
|
]
|
386
386
|
ts.each do |t|
|
387
387
|
expect(t[:a].div(t[:b])).to eq t[:c]
|
@@ -390,10 +390,10 @@ describe Money do
|
|
390
390
|
|
391
391
|
it "divides Money by Money (same currency) and returns Float" do
|
392
392
|
ts = [
|
393
|
-
{:
|
394
|
-
{:
|
395
|
-
{:
|
396
|
-
{:
|
393
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :USD), c: 3.25},
|
394
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :USD), c: -3.25},
|
395
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :USD), c: -3.25},
|
396
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :USD), c: 3.25},
|
397
397
|
]
|
398
398
|
ts.each do |t|
|
399
399
|
expect(t[:a].div(t[:b])).to eq t[:c]
|
@@ -402,10 +402,10 @@ describe Money do
|
|
402
402
|
|
403
403
|
it "divides Money by Money (different currency) and returns Float" do
|
404
404
|
ts = [
|
405
|
-
{:
|
406
|
-
{:
|
407
|
-
{:
|
408
|
-
{:
|
405
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :EUR), c: 1.625},
|
406
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :EUR), c: -1.625},
|
407
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :EUR), c: -1.625},
|
408
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :EUR), c: 1.625},
|
409
409
|
]
|
410
410
|
ts.each do |t|
|
411
411
|
expect(t[:b]).to receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
@@ -416,10 +416,10 @@ describe Money do
|
|
416
416
|
context "with infinite_precision", :infinite_precision do
|
417
417
|
it "uses BigDecimal division" do
|
418
418
|
ts = [
|
419
|
-
{:
|
420
|
-
{:
|
421
|
-
{:
|
422
|
-
{:
|
419
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 3.25, :USD)},
|
420
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new(-3.25, :USD)},
|
421
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new(-3.25, :USD)},
|
422
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new( 3.25, :USD)},
|
423
423
|
]
|
424
424
|
ts.each do |t|
|
425
425
|
expect(t[:a].div(t[:b])).to eq t[:c]
|
@@ -431,10 +431,10 @@ describe Money do
|
|
431
431
|
describe "#divmod" do
|
432
432
|
it "calculates division and modulo with Integer" do
|
433
433
|
ts = [
|
434
|
-
{:
|
435
|
-
{:
|
436
|
-
{:
|
437
|
-
{:
|
434
|
+
{a: Money.new( 13, :USD), b: 4, c: [Money.new( 3, :USD), Money.new( 1, :USD)]},
|
435
|
+
{a: Money.new( 13, :USD), b: -4, c: [Money.new(-4, :USD), Money.new(-3, :USD)]},
|
436
|
+
{a: Money.new(-13, :USD), b: 4, c: [Money.new(-4, :USD), Money.new( 3, :USD)]},
|
437
|
+
{a: Money.new(-13, :USD), b: -4, c: [Money.new( 3, :USD), Money.new(-1, :USD)]},
|
438
438
|
]
|
439
439
|
ts.each do |t|
|
440
440
|
expect(t[:a].divmod(t[:b])).to eq t[:c]
|
@@ -443,10 +443,10 @@ describe Money do
|
|
443
443
|
|
444
444
|
it "calculates division and modulo with Money (same currency)" do
|
445
445
|
ts = [
|
446
|
-
{:
|
447
|
-
{:
|
448
|
-
{:
|
449
|
-
{:
|
446
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :USD), c: [ 3, Money.new( 1, :USD)]},
|
447
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :USD), c: [-4, Money.new(-3, :USD)]},
|
448
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :USD), c: [-4, Money.new( 3, :USD)]},
|
449
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :USD), c: [ 3, Money.new(-1, :USD)]},
|
450
450
|
]
|
451
451
|
ts.each do |t|
|
452
452
|
expect(t[:a].divmod(t[:b])).to eq t[:c]
|
@@ -455,10 +455,10 @@ describe Money do
|
|
455
455
|
|
456
456
|
it "calculates division and modulo with Money (different currency)" do
|
457
457
|
ts = [
|
458
|
-
{:
|
459
|
-
{:
|
460
|
-
{:
|
461
|
-
{:
|
458
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :EUR), c: [ 1, Money.new( 5, :USD)]},
|
459
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :EUR), c: [-2, Money.new(-3, :USD)]},
|
460
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :EUR), c: [-2, Money.new( 3, :USD)]},
|
461
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :EUR), c: [ 1, Money.new(-5, :USD)]},
|
462
462
|
]
|
463
463
|
ts.each do |t|
|
464
464
|
expect(t[:b]).to receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
@@ -469,10 +469,10 @@ describe Money do
|
|
469
469
|
context "with infinite_precision", :infinite_precision do
|
470
470
|
it "uses BigDecimal division" do
|
471
471
|
ts = [
|
472
|
-
{:
|
473
|
-
{:
|
474
|
-
{:
|
475
|
-
{:
|
472
|
+
{a: Money.new( 13, :USD), b: 4, c: [Money.new( 3, :USD), Money.new( 1, :USD)]},
|
473
|
+
{a: Money.new( 13, :USD), b: -4, c: [Money.new(-4, :USD), Money.new(-3, :USD)]},
|
474
|
+
{a: Money.new(-13, :USD), b: 4, c: [Money.new(-4, :USD), Money.new( 3, :USD)]},
|
475
|
+
{a: Money.new(-13, :USD), b: -4, c: [Money.new( 3, :USD), Money.new(-1, :USD)]},
|
476
476
|
]
|
477
477
|
ts.each do |t|
|
478
478
|
expect(t[:a].divmod(t[:b])).to eq t[:c]
|
@@ -497,10 +497,10 @@ describe Money do
|
|
497
497
|
describe "#modulo" do
|
498
498
|
it "calculates modulo with Integer" do
|
499
499
|
ts = [
|
500
|
-
{:
|
501
|
-
{:
|
502
|
-
{:
|
503
|
-
{:
|
500
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 1, :USD)},
|
501
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new(-3, :USD)},
|
502
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new( 3, :USD)},
|
503
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new(-1, :USD)},
|
504
504
|
]
|
505
505
|
ts.each do |t|
|
506
506
|
expect(t[:a].modulo(t[:b])).to eq t[:c]
|
@@ -509,10 +509,10 @@ describe Money do
|
|
509
509
|
|
510
510
|
it "calculates modulo with Money (same currency)" do
|
511
511
|
ts = [
|
512
|
-
{:
|
513
|
-
{:
|
514
|
-
{:
|
515
|
-
{:
|
512
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :USD), c: Money.new( 1, :USD)},
|
513
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :USD), c: Money.new(-3, :USD)},
|
514
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :USD), c: Money.new( 3, :USD)},
|
515
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :USD), c: Money.new(-1, :USD)},
|
516
516
|
]
|
517
517
|
ts.each do |t|
|
518
518
|
expect(t[:a].modulo(t[:b])).to eq t[:c]
|
@@ -521,10 +521,10 @@ describe Money do
|
|
521
521
|
|
522
522
|
it "calculates modulo with Money (different currency)" do
|
523
523
|
ts = [
|
524
|
-
{:
|
525
|
-
{:
|
526
|
-
{:
|
527
|
-
{:
|
524
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :EUR), c: Money.new( 5, :USD)},
|
525
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :EUR), c: Money.new(-3, :USD)},
|
526
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :EUR), c: Money.new( 3, :USD)},
|
527
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :EUR), c: Money.new(-5, :USD)},
|
528
528
|
]
|
529
529
|
ts.each do |t|
|
530
530
|
expect(t[:b]).to receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
@@ -536,10 +536,10 @@ describe Money do
|
|
536
536
|
describe "#%" do
|
537
537
|
it "calculates modulo with Integer" do
|
538
538
|
ts = [
|
539
|
-
{:
|
540
|
-
{:
|
541
|
-
{:
|
542
|
-
{:
|
539
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 1, :USD)},
|
540
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new(-3, :USD)},
|
541
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new( 3, :USD)},
|
542
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new(-1, :USD)},
|
543
543
|
]
|
544
544
|
ts.each do |t|
|
545
545
|
expect(t[:a] % t[:b]).to eq t[:c]
|
@@ -548,10 +548,10 @@ describe Money do
|
|
548
548
|
|
549
549
|
it "calculates modulo with Money (same currency)" do
|
550
550
|
ts = [
|
551
|
-
{:
|
552
|
-
{:
|
553
|
-
{:
|
554
|
-
{:
|
551
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :USD), c: Money.new( 1, :USD)},
|
552
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :USD), c: Money.new(-3, :USD)},
|
553
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :USD), c: Money.new( 3, :USD)},
|
554
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :USD), c: Money.new(-1, :USD)},
|
555
555
|
]
|
556
556
|
ts.each do |t|
|
557
557
|
expect(t[:a] % t[:b]).to eq t[:c]
|
@@ -560,10 +560,10 @@ describe Money do
|
|
560
560
|
|
561
561
|
it "calculates modulo with Money (different currency)" do
|
562
562
|
ts = [
|
563
|
-
{:
|
564
|
-
{:
|
565
|
-
{:
|
566
|
-
{:
|
563
|
+
{a: Money.new( 13, :USD), b: Money.new( 4, :EUR), c: Money.new( 5, :USD)},
|
564
|
+
{a: Money.new( 13, :USD), b: Money.new(-4, :EUR), c: Money.new(-3, :USD)},
|
565
|
+
{a: Money.new(-13, :USD), b: Money.new( 4, :EUR), c: Money.new( 3, :USD)},
|
566
|
+
{a: Money.new(-13, :USD), b: Money.new(-4, :EUR), c: Money.new(-5, :USD)},
|
567
567
|
]
|
568
568
|
ts.each do |t|
|
569
569
|
expect(t[:b]).to receive(:exchange_to).once.with(t[:a].currency).and_return(Money.new(t[:b].cents * 2, :USD))
|
@@ -575,10 +575,10 @@ describe Money do
|
|
575
575
|
describe "#remainder" do
|
576
576
|
it "calculates remainder with Integer" do
|
577
577
|
ts = [
|
578
|
-
{:
|
579
|
-
{:
|
580
|
-
{:
|
581
|
-
{:
|
578
|
+
{a: Money.new( 13, :USD), b: 4, c: Money.new( 1, :USD)},
|
579
|
+
{a: Money.new( 13, :USD), b: -4, c: Money.new( 1, :USD)},
|
580
|
+
{a: Money.new(-13, :USD), b: 4, c: Money.new(-1, :USD)},
|
581
|
+
{a: Money.new(-13, :USD), b: -4, c: Money.new(-1, :USD)},
|
582
582
|
]
|
583
583
|
ts.each do |t|
|
584
584
|
expect(t[:a].remainder(t[:b])).to eq t[:c]
|
@@ -631,6 +631,11 @@ describe Money do
|
|
631
631
|
end
|
632
632
|
|
633
633
|
describe "#coerce" do
|
634
|
+
it 'allows non-default currency money objects to be summed' do
|
635
|
+
result = 0 + Money.new(4, 'EUR') + Money.new(5, 'EUR')
|
636
|
+
expect(result).to eq Money.new(9, 'EUR')
|
637
|
+
end
|
638
|
+
|
634
639
|
it "allows mathematical operations by coercing arguments" do
|
635
640
|
result = 2 * Money.new(4, 'USD')
|
636
641
|
expect(result).to eq Money.new(8, 'USD')
|
@@ -24,7 +24,7 @@ describe Money, "formatting" do
|
|
24
24
|
I18n.locale = :de
|
25
25
|
I18n.backend.store_translations(
|
26
26
|
:de,
|
27
|
-
:
|
27
|
+
number: { currency: { format: { delimiter: ".", separator: "," } } }
|
28
28
|
)
|
29
29
|
Money.use_i18n = false
|
30
30
|
end
|
@@ -58,7 +58,7 @@ describe Money, "formatting" do
|
|
58
58
|
I18n.locale = :de
|
59
59
|
I18n.backend.store_translations(
|
60
60
|
:de,
|
61
|
-
:
|
61
|
+
number: { format: { delimiter: ".", separator: "," } }
|
62
62
|
)
|
63
63
|
end
|
64
64
|
|
@@ -79,7 +79,7 @@ describe Money, "formatting" do
|
|
79
79
|
I18n.locale = :de
|
80
80
|
I18n.backend.store_translations(
|
81
81
|
:de,
|
82
|
-
:
|
82
|
+
number: { currency: { format: { delimiter: ".", separator: "," } } }
|
83
83
|
)
|
84
84
|
end
|
85
85
|
|
@@ -100,24 +100,24 @@ describe Money, "formatting" do
|
|
100
100
|
I18n.locale = :de
|
101
101
|
I18n.backend.store_translations(
|
102
102
|
:de,
|
103
|
-
:
|
103
|
+
number: { currency: { symbol: { CAD: "CAD$" } } }
|
104
104
|
)
|
105
105
|
end
|
106
106
|
|
107
107
|
subject(:money) { Money.empty("CAD") }
|
108
108
|
|
109
109
|
it "should use 'CAD$' as the currency symbol" do
|
110
|
-
expect(money.format(:
|
110
|
+
expect(money.format(translate: true)).to eq("CAD$0.00")
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
114
|
context "with overridden i18n settings" do
|
115
115
|
it "should respect explicit overriding of thousands_separator/delimiter when decimal_mark/separator collide and there’s no decimal component for currencies that have no subunit" do
|
116
|
-
expect(Money.new(300_000, 'ISK').format(:
|
116
|
+
expect(Money.new(300_000, 'ISK').format(thousands_separator: ".", decimal_mark: ',')).to eq "kr300.000"
|
117
117
|
end
|
118
118
|
|
119
119
|
it "should respect explicit overriding of thousands_separator/delimiter when decimal_mark/separator collide and there’s no decimal component for currencies with subunits that drop_trailing_zeros" do
|
120
|
-
expect(Money.new(300_000, 'USD').format(:
|
120
|
+
expect(Money.new(300_000, 'USD').format(thousands_separator: ".", decimal_mark: ',', drop_trailing_zeros: true)).to eq "$3.000"
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
@@ -129,7 +129,7 @@ describe Money, "formatting" do
|
|
129
129
|
it "formats Japanese currency in Japanese properly" do
|
130
130
|
money = Money.new(1000, "JPY")
|
131
131
|
expect(money.format).to eq "1,000円"
|
132
|
-
expect(money.format(:
|
132
|
+
expect(money.format(symbol: false)).to eq "1,000"
|
133
133
|
end
|
134
134
|
|
135
135
|
after { I18n.locale = @_locale }
|
@@ -144,8 +144,18 @@ describe Money, "formatting" do
|
|
144
144
|
expect(Money.new(10_00, "BHD").format).to eq "ب.د1.000"
|
145
145
|
end
|
146
146
|
|
147
|
-
|
148
|
-
|
147
|
+
context "when :subunit_to_unit is 1" do
|
148
|
+
it "does not display a decimal part" do
|
149
|
+
expect(Money.new(10_00, "VUV").format).to eq "Vt1,000"
|
150
|
+
end
|
151
|
+
|
152
|
+
it "does not displays a decimal part when infinite_precision is false" do
|
153
|
+
expect(Money.new(10_00.1, "VUV").format).to eq "Vt1,000"
|
154
|
+
end
|
155
|
+
|
156
|
+
it "displays a decimal part when infinite_precision is true", :infinite_precision do
|
157
|
+
expect(Money.new(10_00.1, "VUV").format).to eq "Vt1,000.1"
|
158
|
+
end
|
149
159
|
end
|
150
160
|
|
151
161
|
it "respects the thousands_separator and decimal_mark defaults" do
|
@@ -186,17 +196,17 @@ describe Money, "formatting" do
|
|
186
196
|
|
187
197
|
it "inserts commas into the result if the amount is sufficiently large" do
|
188
198
|
expect(Money.us_dollar(1_000_000_000_12).format).to eq "$1,000,000,000.12"
|
189
|
-
expect(Money.us_dollar(1_000_000_000_12).format(:
|
199
|
+
expect(Money.us_dollar(1_000_000_000_12).format(no_cents: true)).to eq "$1,000,000,000"
|
190
200
|
end
|
191
201
|
|
192
202
|
it "inserts thousands separator into the result if the amount is sufficiently large and the currency symbol is at the end" do
|
193
203
|
expect(Money.euro(1_234_567_12).format).to eq "€1.234.567,12"
|
194
|
-
expect(Money.euro(1_234_567_12).format(:
|
204
|
+
expect(Money.euro(1_234_567_12).format(no_cents: true)).to eq "€1.234.567"
|
195
205
|
end
|
196
206
|
|
197
207
|
context 'when default_formatting_rules defines (display_free: true)' do
|
198
208
|
before do
|
199
|
-
Money.default_formatting_rules = { :
|
209
|
+
Money.default_formatting_rules = { display_free: "you won't pay a thing" }
|
200
210
|
end
|
201
211
|
|
202
212
|
after do
|
@@ -211,7 +221,7 @@ describe Money, "formatting" do
|
|
211
221
|
|
212
222
|
context 'with rule (display_free: false) provided' do
|
213
223
|
it 'acknowledges provided rule' do
|
214
|
-
expect(Money.new(0, 'USD').format(:
|
224
|
+
expect(Money.new(0, 'USD').format(display_free: false)).to eq '$0.00'
|
215
225
|
end
|
216
226
|
end
|
217
227
|
end
|
@@ -223,79 +233,79 @@ describe Money, "formatting" do
|
|
223
233
|
|
224
234
|
context 'acknowledges provided rule' do
|
225
235
|
it 'acknowledges provided rule' do
|
226
|
-
expect(Money.new(100, 'USD').format(:
|
236
|
+
expect(Money.new(100, 'USD').format(with_currency: true)).to eq '$1.00 USD'
|
227
237
|
end
|
228
238
|
end
|
229
239
|
end
|
230
240
|
|
231
241
|
describe ":with_currency option" do
|
232
242
|
specify "(:with_currency option => true) works as documented" do
|
233
|
-
expect(Money.ca_dollar(100).format(:
|
234
|
-
expect(Money.us_dollar(85).format(:
|
243
|
+
expect(Money.ca_dollar(100).format(with_currency: true)).to eq "$1.00 CAD"
|
244
|
+
expect(Money.us_dollar(85).format(with_currency: true)).to eq "$0.85 USD"
|
235
245
|
end
|
236
246
|
end
|
237
247
|
|
238
248
|
describe ":no_cents option" do
|
239
249
|
specify "(:with_currency option => true) works as documented" do
|
240
|
-
expect(Money.ca_dollar(100).format(:
|
241
|
-
expect(Money.ca_dollar(599).format(:
|
242
|
-
expect(Money.ca_dollar(570).format(:
|
243
|
-
expect(Money.ca_dollar(39000).format(:
|
250
|
+
expect(Money.ca_dollar(100).format(no_cents: true)).to eq "$1"
|
251
|
+
expect(Money.ca_dollar(599).format(no_cents: true)).to eq "$5"
|
252
|
+
expect(Money.ca_dollar(570).format(no_cents: true, with_currency: true)).to eq "$5 CAD"
|
253
|
+
expect(Money.ca_dollar(39000).format(no_cents: true)).to eq "$390"
|
244
254
|
end
|
245
255
|
|
246
256
|
it "respects :subunit_to_unit currency property" do
|
247
|
-
expect(Money.new(10_00, "BHD").format(:
|
257
|
+
expect(Money.new(10_00, "BHD").format(no_cents: true)).to eq "ب.د1"
|
248
258
|
end
|
249
259
|
|
250
260
|
it "inserts thousand separators if symbol contains decimal mark and no_cents is true" do
|
251
|
-
expect(Money.new(100000000, "AMD").format(:
|
252
|
-
expect(Money.new(100000000, "USD").format(:
|
253
|
-
expect(Money.new(100000000, "RUB").format(:
|
261
|
+
expect(Money.new(100000000, "AMD").format(no_cents: true)).to eq "1,000,000 դր."
|
262
|
+
expect(Money.new(100000000, "USD").format(no_cents: true)).to eq "$1,000,000"
|
263
|
+
expect(Money.new(100000000, "RUB").format(no_cents: true)).to eq "1.000.000 ₽"
|
254
264
|
end
|
255
265
|
|
256
266
|
it "doesn't incorrectly format HTML" do
|
257
267
|
money = ::Money.new(1999, "RUB")
|
258
|
-
output = money.format(:
|
268
|
+
output = money.format(html: true, no_cents: true)
|
259
269
|
expect(output).to eq "19 ₽"
|
260
270
|
end
|
261
271
|
end
|
262
272
|
|
263
273
|
describe ":no_cents_if_whole option" do
|
264
|
-
specify "(:
|
265
|
-
expect(Money.new(10000, "VUV").format(:
|
266
|
-
expect(Money.new(10034, "VUV").format(:
|
267
|
-
expect(Money.new(10000, "MGA").format(:
|
268
|
-
expect(Money.new(10034, "MGA").format(:
|
269
|
-
expect(Money.new(10000, "VND").format(:
|
270
|
-
expect(Money.new(10034, "VND").format(:
|
271
|
-
expect(Money.new(10000, "USD").format(:
|
272
|
-
expect(Money.new(10034, "USD").format(:
|
273
|
-
expect(Money.new(10000, "IQD").format(:
|
274
|
-
expect(Money.new(10034, "IQD").format(:
|
275
|
-
end
|
276
|
-
|
277
|
-
specify "(:
|
278
|
-
expect(Money.new(10000, "VUV").format(:
|
279
|
-
expect(Money.new(10034, "VUV").format(:
|
280
|
-
expect(Money.new(10000, "MGA").format(:
|
281
|
-
expect(Money.new(10034, "MGA").format(:
|
282
|
-
expect(Money.new(10000, "VND").format(:
|
283
|
-
expect(Money.new(10034, "VND").format(:
|
284
|
-
expect(Money.new(10000, "USD").format(:
|
285
|
-
expect(Money.new(10034, "USD").format(:
|
286
|
-
expect(Money.new(10000, "IQD").format(:
|
287
|
-
expect(Money.new(10034, "IQD").format(:
|
274
|
+
specify "(no_cents_if_whole: true) works as documented" do
|
275
|
+
expect(Money.new(10000, "VUV").format(no_cents_if_whole: true, symbol: false)).to eq "10,000"
|
276
|
+
expect(Money.new(10034, "VUV").format(no_cents_if_whole: true, symbol: false)).to eq "10,034"
|
277
|
+
expect(Money.new(10000, "MGA").format(no_cents_if_whole: true, symbol: false)).to eq "2,000"
|
278
|
+
expect(Money.new(10034, "MGA").format(no_cents_if_whole: true, symbol: false)).to eq "2,006.8"
|
279
|
+
expect(Money.new(10000, "VND").format(no_cents_if_whole: true, symbol: false)).to eq "10.000"
|
280
|
+
expect(Money.new(10034, "VND").format(no_cents_if_whole: true, symbol: false)).to eq "10.034"
|
281
|
+
expect(Money.new(10000, "USD").format(no_cents_if_whole: true, symbol: false)).to eq "100"
|
282
|
+
expect(Money.new(10034, "USD").format(no_cents_if_whole: true, symbol: false)).to eq "100.34"
|
283
|
+
expect(Money.new(10000, "IQD").format(no_cents_if_whole: true, symbol: false)).to eq "10"
|
284
|
+
expect(Money.new(10034, "IQD").format(no_cents_if_whole: true, symbol: false)).to eq "10.034"
|
285
|
+
end
|
286
|
+
|
287
|
+
specify "(no_cents_if_whole: false) works as documented" do
|
288
|
+
expect(Money.new(10000, "VUV").format(no_cents_if_whole: false, symbol: false)).to eq "10,000"
|
289
|
+
expect(Money.new(10034, "VUV").format(no_cents_if_whole: false, symbol: false)).to eq "10,034"
|
290
|
+
expect(Money.new(10000, "MGA").format(no_cents_if_whole: false, symbol: false)).to eq "2,000.0"
|
291
|
+
expect(Money.new(10034, "MGA").format(no_cents_if_whole: false, symbol: false)).to eq "2,006.8"
|
292
|
+
expect(Money.new(10000, "VND").format(no_cents_if_whole: false, symbol: false)).to eq "10.000"
|
293
|
+
expect(Money.new(10034, "VND").format(no_cents_if_whole: false, symbol: false)).to eq "10.034"
|
294
|
+
expect(Money.new(10000, "USD").format(no_cents_if_whole: false, symbol: false)).to eq "100.00"
|
295
|
+
expect(Money.new(10034, "USD").format(no_cents_if_whole: false, symbol: false)).to eq "100.34"
|
296
|
+
expect(Money.new(10000, "IQD").format(no_cents_if_whole: false, symbol: false)).to eq "10.000"
|
297
|
+
expect(Money.new(10034, "IQD").format(no_cents_if_whole: false, symbol: false)).to eq "10.034"
|
288
298
|
end
|
289
299
|
end
|
290
300
|
|
291
301
|
describe ":symbol option" do
|
292
|
-
specify "(:
|
293
|
-
expect(Money.new(100, "GBP").format(:
|
302
|
+
specify "(symbol: a symbol string) uses the given value as the money symbol" do
|
303
|
+
expect(Money.new(100, "GBP").format(symbol: "£")).to eq "£1.00"
|
294
304
|
end
|
295
305
|
|
296
|
-
specify "(:
|
306
|
+
specify "(symbol: true) returns symbol based on the given currency code" do
|
297
307
|
one = Proc.new do |currency|
|
298
|
-
Money.new(100, currency).format(:
|
308
|
+
Money.new(100, currency).format(symbol: true)
|
299
309
|
end
|
300
310
|
|
301
311
|
# Pounds
|
@@ -332,26 +342,26 @@ describe Money, "formatting" do
|
|
332
342
|
expect(one["GHC"]).to eq "₵1.00"
|
333
343
|
end
|
334
344
|
|
335
|
-
specify "(:
|
345
|
+
specify "(symbol: true) returns $ when currency code is not recognized" do
|
336
346
|
currency = Money::Currency.new("EUR")
|
337
347
|
expect(currency).to receive(:symbol).and_return(nil)
|
338
|
-
expect(Money.new(100, currency).format(:
|
348
|
+
expect(Money.new(100, currency).format(symbol: true)).to eq "¤1,00"
|
339
349
|
end
|
340
350
|
|
341
|
-
specify "(:
|
342
|
-
expect(Money.new(100, "GBP").format(:
|
343
|
-
expect(Money.new(100, "EUR").format(:
|
344
|
-
expect(Money.new(100, "SEK").format(:
|
351
|
+
specify "(symbol: some non-Boolean value that evaluates to true) returns symbol based on the given currency code" do
|
352
|
+
expect(Money.new(100, "GBP").format(symbol: true)).to eq "£1.00"
|
353
|
+
expect(Money.new(100, "EUR").format(symbol: true)).to eq "€1,00"
|
354
|
+
expect(Money.new(100, "SEK").format(symbol: true)).to eq "1,00 kr"
|
345
355
|
end
|
346
356
|
|
347
|
-
specify "(:
|
357
|
+
specify "(symbol: "", nil or false) returns the amount without a symbol" do
|
348
358
|
money = Money.new(100, "GBP")
|
349
|
-
expect(money.format(:
|
350
|
-
expect(money.format(:
|
351
|
-
expect(money.format(:
|
359
|
+
expect(money.format(symbol: "")).to eq "1.00"
|
360
|
+
expect(money.format(symbol: nil)).to eq "1.00"
|
361
|
+
expect(money.format(symbol: false)).to eq "1.00"
|
352
362
|
|
353
363
|
money = Money.new(100, "JPY")
|
354
|
-
expect(money.format(:
|
364
|
+
expect(money.format(symbol: false)).to eq "100"
|
355
365
|
end
|
356
366
|
|
357
367
|
it "defaults :symbol to true" do
|
@@ -365,19 +375,19 @@ describe Money, "formatting" do
|
|
365
375
|
expect(money.format).to eq "€1,00"
|
366
376
|
end
|
367
377
|
|
368
|
-
specify "(:
|
378
|
+
specify "(symbol: false) returns a signed amount without a symbol" do
|
369
379
|
money = Money.new(-100, "EUR")
|
370
|
-
expect(money.format(:
|
380
|
+
expect(money.format(symbol: false)).to eq "-1,00"
|
371
381
|
|
372
382
|
money = Money.new(100, "EUR")
|
373
|
-
expect(money.format(:
|
374
|
-
:
|
383
|
+
expect(money.format(symbol: false,
|
384
|
+
sign_positive: true)).to eq "+1,00"
|
375
385
|
end
|
376
386
|
end
|
377
387
|
|
378
388
|
describe ":decimal_mark option" do
|
379
|
-
specify "(:
|
380
|
-
expect(Money.us_dollar(100).format(:
|
389
|
+
specify "(decimal_mark: a decimal_mark string) works as documented" do
|
390
|
+
expect(Money.us_dollar(100).format(decimal_mark: ",")).to eq "$1,00"
|
381
391
|
end
|
382
392
|
|
383
393
|
it "defaults to '.' if currency isn't recognized" do
|
@@ -386,51 +396,51 @@ describe Money, "formatting" do
|
|
386
396
|
end
|
387
397
|
|
388
398
|
describe ":separator option" do
|
389
|
-
specify "(:
|
390
|
-
expect(Money.us_dollar(100).format(:
|
399
|
+
specify "(separator: a separator string) works as documented" do
|
400
|
+
expect(Money.us_dollar(100).format(separator: ",")).to eq "$1,00"
|
391
401
|
end
|
392
402
|
end
|
393
403
|
|
394
404
|
describe ":south_asian_number_formatting delimiter" do
|
395
405
|
before(:each) do
|
396
|
-
Money::Currency.register(JSON.parse(INDIAN_BAR, :
|
406
|
+
Money::Currency.register(JSON.parse(INDIAN_BAR, symbolize_names: true))
|
397
407
|
end
|
398
408
|
|
399
409
|
after(:each) do
|
400
|
-
Money::Currency.unregister(JSON.parse(INDIAN_BAR, :
|
410
|
+
Money::Currency.unregister(JSON.parse(INDIAN_BAR, symbolize_names: true))
|
401
411
|
end
|
402
412
|
|
403
|
-
specify "(:
|
404
|
-
expect(Money.new(10000000, 'INR').format(:
|
405
|
-
expect(Money.new(1000000000, 'INDIAN_BAR').format(:
|
406
|
-
expect(Money.new(10000000).format(:
|
413
|
+
specify "(south_asian_number_formatting: true) works as documented" do
|
414
|
+
expect(Money.new(10000000, 'INR').format(south_asian_number_formatting: true, symbol: false)).to eq "1,00,000.00"
|
415
|
+
expect(Money.new(1000000000, 'INDIAN_BAR').format(south_asian_number_formatting: true, symbol: false)).to eq "1,00,000.0000"
|
416
|
+
expect(Money.new(10000000).format(south_asian_number_formatting: true)).to eq "$1,00,000.00"
|
407
417
|
end
|
408
418
|
|
409
|
-
specify "(:
|
410
|
-
expect(Money.new(10000000, 'INR').format(:
|
411
|
-
expect(Money.new(1000000000, 'INDIAN_BAR').format(:
|
419
|
+
specify "(south_asian_number_formatting: true and no_cents_if_whole => true) works as documented" do
|
420
|
+
expect(Money.new(10000000, 'INR').format(south_asian_number_formatting: true, symbol: false, no_cents_if_whole: true)).to eq "1,00,000"
|
421
|
+
expect(Money.new(1000000000, 'INDIAN_BAR').format(south_asian_number_formatting: true, symbol: false, no_cents_if_whole: true)).to eq "1,00,000"
|
412
422
|
end
|
413
423
|
end
|
414
424
|
|
415
425
|
describe ":thousands_separator option" do
|
416
|
-
specify "(:
|
417
|
-
expect(Money.us_dollar(100000).format(:
|
418
|
-
expect(Money.us_dollar(200000).format(:
|
426
|
+
specify "(thousands_separator: a thousands_separator string) works as documented" do
|
427
|
+
expect(Money.us_dollar(100000).format(thousands_separator: ".")).to eq "$1.000.00"
|
428
|
+
expect(Money.us_dollar(200000).format(thousands_separator: "")).to eq "$2000.00"
|
419
429
|
end
|
420
430
|
|
421
|
-
specify "(:
|
422
|
-
expect(Money.us_dollar(100000).format(:
|
423
|
-
expect(Money.us_dollar(200000).format(:
|
431
|
+
specify "(thousands_separator: false or nil) works as documented" do
|
432
|
+
expect(Money.us_dollar(100000).format(thousands_separator: false)).to eq "$1000.00"
|
433
|
+
expect(Money.us_dollar(200000).format(thousands_separator: nil)).to eq "$2000.00"
|
424
434
|
end
|
425
435
|
|
426
|
-
specify "(:
|
427
|
-
expect(Money.us_dollar(100000).format(:
|
428
|
-
expect(Money.us_dollar(200000).format(:
|
436
|
+
specify "(delimiter: a delimiter string) works as documented" do
|
437
|
+
expect(Money.us_dollar(100000).format(delimiter: ".")).to eq "$1.000.00"
|
438
|
+
expect(Money.us_dollar(200000).format(delimiter: "")).to eq "$2000.00"
|
429
439
|
end
|
430
440
|
|
431
|
-
specify "(:
|
432
|
-
expect(Money.us_dollar(100000).format(:
|
433
|
-
expect(Money.us_dollar(200000).format(:
|
441
|
+
specify "(delimiter: false or nil) works as documented" do
|
442
|
+
expect(Money.us_dollar(100000).format(delimiter: false)).to eq "$1000.00"
|
443
|
+
expect(Money.us_dollar(200000).format(delimiter: nil)).to eq "$2000.00"
|
434
444
|
end
|
435
445
|
|
436
446
|
it "defaults to ',' if currency isn't recognized" do
|
@@ -441,11 +451,11 @@ describe Money, "formatting" do
|
|
441
451
|
before { Money.use_i18n = false }
|
442
452
|
|
443
453
|
it "should respect explicit overriding of thousands_separator/delimiter when decimal_mark/separator collide and there’s no decimal component for currencies that have no subunit" do
|
444
|
-
expect(Money.new(300_000, 'ISK').format(:
|
454
|
+
expect(Money.new(300_000, 'ISK').format(thousands_separator: ",", decimal_mark: '.')).to eq "kr300,000"
|
445
455
|
end
|
446
456
|
|
447
457
|
it "should respect explicit overriding of thousands_separator/delimiter when decimal_mark/separator collide and there’s no decimal component for currencies with subunits that drop_trailing_zeros" do
|
448
|
-
expect(Money.new(300_000, 'USD').format(:
|
458
|
+
expect(Money.new(300_000, 'USD').format(thousands_separator: ".", decimal_mark: ',', drop_trailing_zeros: true)).to eq "$3.000"
|
449
459
|
end
|
450
460
|
|
451
461
|
after { Money.use_i18n = true}
|
@@ -453,131 +463,131 @@ describe Money, "formatting" do
|
|
453
463
|
end
|
454
464
|
|
455
465
|
describe ":thousands_separator and :decimal_mark option" do
|
456
|
-
specify "(:
|
466
|
+
specify "(thousands_separator: a thousands_separator string, decimal_mark: a decimal_mark string) works as documented" do
|
457
467
|
expect(Money.new(123_456_789, "USD").format(thousands_separator: ".", decimal_mark: ",")).to eq("$1.234.567,89")
|
458
468
|
expect(Money.new(987_654_321, "USD").format(thousands_separator: " ", decimal_mark: ".")).to eq("$9 876 543.21")
|
459
469
|
end
|
460
470
|
end
|
461
471
|
|
462
472
|
describe ":html option" do
|
463
|
-
specify "(:
|
464
|
-
string = Money.ca_dollar(570).format(:
|
473
|
+
specify "(html: true) works as documented" do
|
474
|
+
string = Money.ca_dollar(570).format(html: true, with_currency: true)
|
465
475
|
expect(string).to eq "$5.70 <span class=\"currency\">CAD</span>"
|
466
476
|
end
|
467
477
|
|
468
478
|
specify "should fallback to symbol if entity is not available" do
|
469
|
-
string = Money.new(570, 'DKK').format(:
|
479
|
+
string = Money.new(570, 'DKK').format(html: true)
|
470
480
|
expect(string).to eq "5,70 kr."
|
471
481
|
end
|
472
482
|
end
|
473
483
|
|
474
484
|
describe ":html_wrap_symbol option" do
|
475
|
-
specify "(:
|
476
|
-
string = Money.ca_dollar(570).format(:
|
485
|
+
specify "(html_wrap_symbol: true) works as documented" do
|
486
|
+
string = Money.ca_dollar(570).format(html_wrap_symbol: true)
|
477
487
|
expect(string).to eq "<span class=\"currency_symbol\">$</span>5.70"
|
478
488
|
end
|
479
489
|
end
|
480
490
|
|
481
491
|
describe ":symbol_position option" do
|
482
492
|
it "inserts currency symbol before the amount when set to :before" do
|
483
|
-
expect(Money.euro(1_234_567_12).format(:
|
493
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :before)).to eq "€1.234.567,12"
|
484
494
|
end
|
485
495
|
|
486
496
|
it "inserts currency symbol after the amount when set to :after" do
|
487
|
-
expect(Money.us_dollar(1_000_000_000_12).format(:
|
497
|
+
expect(Money.us_dollar(1_000_000_000_12).format(symbol_position: :after)).to eq "1,000,000,000.12 $"
|
488
498
|
end
|
489
499
|
|
490
500
|
it "raises an ArgumentError when passed an invalid option" do
|
491
|
-
expect{Money.euro(0).format(:
|
501
|
+
expect{Money.euro(0).format(symbol_position: :befor)}.to raise_error(ArgumentError)
|
492
502
|
end
|
493
503
|
end
|
494
504
|
|
495
505
|
describe ":sign_before_symbol option" do
|
496
|
-
specify "(:
|
497
|
-
expect(Money.us_dollar(-100000).format(:
|
506
|
+
specify "(sign_before_symbol: true) works as documented" do
|
507
|
+
expect(Money.us_dollar(-100000).format(sign_before_symbol: true)).to eq "-$1,000.00"
|
498
508
|
end
|
499
509
|
|
500
|
-
specify "(:
|
501
|
-
expect(Money.us_dollar(-100000).format(:
|
502
|
-
expect(Money.us_dollar(-100000).format(:
|
510
|
+
specify "(sign_before_symbol: false) works as documented" do
|
511
|
+
expect(Money.us_dollar(-100000).format(sign_before_symbol: false)).to eq "$-1,000.00"
|
512
|
+
expect(Money.us_dollar(-100000).format(sign_before_symbol: nil)).to eq "$-1,000.00"
|
503
513
|
end
|
504
514
|
end
|
505
515
|
|
506
516
|
describe ":symbol_before_without_space option" do
|
507
517
|
it "does not insert space between currency symbol and amount when set to true" do
|
508
|
-
expect(Money.euro(1_234_567_12).format(:
|
518
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :before, symbol_before_without_space: true)).to eq "€1.234.567,12"
|
509
519
|
end
|
510
520
|
|
511
521
|
it "inserts space between currency symbol and amount when set to false" do
|
512
|
-
expect(Money.euro(1_234_567_12).format(:
|
522
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :before, symbol_before_without_space: false)).to eq "€ 1.234.567,12"
|
513
523
|
end
|
514
524
|
|
515
525
|
it "defaults to true" do
|
516
|
-
expect(Money.euro(1_234_567_12).format(:
|
526
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :before)).to eq "€1.234.567,12"
|
517
527
|
end
|
518
528
|
end
|
519
529
|
|
520
530
|
describe ":symbol_after_without_space option" do
|
521
531
|
it "does not insert space between amount and currency symbol when set to true" do
|
522
|
-
expect(Money.euro(1_234_567_12).format(:
|
532
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :after, symbol_after_without_space: true)).to eq "1.234.567,12€"
|
523
533
|
end
|
524
534
|
|
525
535
|
it "inserts space between amount and currency symbol when set to false" do
|
526
|
-
expect(Money.euro(1_234_567_12).format(:
|
536
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :after, symbol_after_without_space: false)).to eq "1.234.567,12 €"
|
527
537
|
end
|
528
538
|
|
529
539
|
it "defaults to false" do
|
530
|
-
expect(Money.euro(1_234_567_12).format(:
|
540
|
+
expect(Money.euro(1_234_567_12).format(symbol_position: :after)).to eq "1.234.567,12 €"
|
531
541
|
end
|
532
542
|
end
|
533
543
|
|
534
544
|
describe ":sign_positive option" do
|
535
|
-
specify "(:
|
536
|
-
expect(Money.us_dollar( 0).format(:
|
537
|
-
expect(Money.us_dollar( 100000).format(:
|
538
|
-
expect(Money.us_dollar(-100000).format(:
|
545
|
+
specify "(sign_positive: true, sign_before_symbol: true) works as documented" do
|
546
|
+
expect(Money.us_dollar( 0).format(sign_positive: true, sign_before_symbol: true)).to eq "$0.00"
|
547
|
+
expect(Money.us_dollar( 100000).format(sign_positive: true, sign_before_symbol: true)).to eq "+$1,000.00"
|
548
|
+
expect(Money.us_dollar(-100000).format(sign_positive: true, sign_before_symbol: true)).to eq "-$1,000.00"
|
539
549
|
end
|
540
550
|
|
541
|
-
specify "(:
|
542
|
-
expect(Money.us_dollar( 0).format(:
|
543
|
-
expect(Money.us_dollar( 100000).format(:
|
544
|
-
expect(Money.us_dollar( 100000).format(:
|
545
|
-
expect(Money.us_dollar(-100000).format(:
|
546
|
-
expect(Money.us_dollar(-100000).format(:
|
551
|
+
specify "(sign_positive: true, sign_before_symbol: false) works as documented" do
|
552
|
+
expect(Money.us_dollar( 0).format(sign_positive: true, sign_before_symbol: false)).to eq "$0.00"
|
553
|
+
expect(Money.us_dollar( 100000).format(sign_positive: true, sign_before_symbol: false)).to eq "$+1,000.00"
|
554
|
+
expect(Money.us_dollar( 100000).format(sign_positive: true, sign_before_symbol: nil)).to eq "$+1,000.00"
|
555
|
+
expect(Money.us_dollar(-100000).format(sign_positive: true, sign_before_symbol: false)).to eq "$-1,000.00"
|
556
|
+
expect(Money.us_dollar(-100000).format(sign_positive: true, sign_before_symbol: nil)).to eq "$-1,000.00"
|
547
557
|
end
|
548
558
|
|
549
|
-
specify "(:
|
550
|
-
expect(Money.us_dollar( 100000).format(:
|
551
|
-
expect(Money.us_dollar(-100000).format(:
|
559
|
+
specify "(sign_positive: false, sign_before_symbol: true) works as documented" do
|
560
|
+
expect(Money.us_dollar( 100000).format(sign_positive: false, sign_before_symbol: true)).to eq "$1,000.00"
|
561
|
+
expect(Money.us_dollar(-100000).format(sign_positive: false, sign_before_symbol: true)).to eq "-$1,000.00"
|
552
562
|
end
|
553
563
|
|
554
|
-
specify "(:
|
555
|
-
expect(Money.us_dollar( 100000).format(:
|
556
|
-
expect(Money.us_dollar( 100000).format(:
|
557
|
-
expect(Money.us_dollar(-100000).format(:
|
558
|
-
expect(Money.us_dollar(-100000).format(:
|
564
|
+
specify "(sign_positive: false, sign_before_symbol: false) works as documented" do
|
565
|
+
expect(Money.us_dollar( 100000).format(sign_positive: false, sign_before_symbol: false)).to eq "$1,000.00"
|
566
|
+
expect(Money.us_dollar( 100000).format(sign_positive: false, sign_before_symbol: nil)).to eq "$1,000.00"
|
567
|
+
expect(Money.us_dollar(-100000).format(sign_positive: false, sign_before_symbol: false)).to eq "$-1,000.00"
|
568
|
+
expect(Money.us_dollar(-100000).format(sign_positive: false, sign_before_symbol: nil)).to eq "$-1,000.00"
|
559
569
|
end
|
560
570
|
end
|
561
571
|
|
562
572
|
describe ":rounded_infinite_precision option", :infinite_precision do
|
563
573
|
it "does round fractional when set to true" do
|
564
|
-
expect(Money.new(BigDecimal('12.1'), "USD").format(:
|
565
|
-
expect(Money.new(BigDecimal('12.5'), "USD").format(:
|
566
|
-
expect(Money.new(BigDecimal('123.1'), "BHD").format(:
|
567
|
-
expect(Money.new(BigDecimal('123.5'), "BHD").format(:
|
568
|
-
expect(Money.new(BigDecimal('100.1'), "USD").format(:
|
569
|
-
expect(Money.new(BigDecimal('109.5'), "USD").format(:
|
570
|
-
expect(Money.new(BigDecimal('1.7'), "MGA").format(:
|
574
|
+
expect(Money.new(BigDecimal('12.1'), "USD").format(rounded_infinite_precision: true)).to eq "$0.12"
|
575
|
+
expect(Money.new(BigDecimal('12.5'), "USD").format(rounded_infinite_precision: true)).to eq "$0.13"
|
576
|
+
expect(Money.new(BigDecimal('123.1'), "BHD").format(rounded_infinite_precision: true)).to eq "ب.د0.123"
|
577
|
+
expect(Money.new(BigDecimal('123.5'), "BHD").format(rounded_infinite_precision: true)).to eq "ب.د0.124"
|
578
|
+
expect(Money.new(BigDecimal('100.1'), "USD").format(rounded_infinite_precision: true)).to eq "$1.00"
|
579
|
+
expect(Money.new(BigDecimal('109.5'), "USD").format(rounded_infinite_precision: true)).to eq "$1.10"
|
580
|
+
expect(Money.new(BigDecimal('1.7'), "MGA").format(rounded_infinite_precision: true)).to eq "Ar0.4"
|
571
581
|
end
|
572
582
|
|
573
583
|
it "does not round fractional when set to false" do
|
574
|
-
expect(Money.new(BigDecimal('12.1'), "USD").format(:
|
575
|
-
expect(Money.new(BigDecimal('12.5'), "USD").format(:
|
576
|
-
expect(Money.new(BigDecimal('123.1'), "BHD").format(:
|
577
|
-
expect(Money.new(BigDecimal('123.5'), "BHD").format(:
|
578
|
-
expect(Money.new(BigDecimal('100.1'), "USD").format(:
|
579
|
-
expect(Money.new(BigDecimal('109.5'), "USD").format(:
|
580
|
-
expect(Money.new(BigDecimal('1.7'), "MGA").format(:
|
584
|
+
expect(Money.new(BigDecimal('12.1'), "USD").format(rounded_infinite_precision: false)).to eq "$0.121"
|
585
|
+
expect(Money.new(BigDecimal('12.5'), "USD").format(rounded_infinite_precision: false)).to eq "$0.125"
|
586
|
+
expect(Money.new(BigDecimal('123.1'), "BHD").format(rounded_infinite_precision: false)).to eq "ب.د0.1231"
|
587
|
+
expect(Money.new(BigDecimal('123.5'), "BHD").format(rounded_infinite_precision: false)).to eq "ب.د0.1235"
|
588
|
+
expect(Money.new(BigDecimal('100.1'), "USD").format(rounded_infinite_precision: false)).to eq "$1.001"
|
589
|
+
expect(Money.new(BigDecimal('109.5'), "USD").format(rounded_infinite_precision: false)).to eq "$1.095"
|
590
|
+
expect(Money.new(BigDecimal('1.7'), "MGA").format(rounded_infinite_precision: false)).to eq "Ar0.34"
|
581
591
|
end
|
582
592
|
|
583
593
|
describe "with i18n = false" do
|
@@ -590,13 +600,13 @@ describe Money, "formatting" do
|
|
590
600
|
end
|
591
601
|
|
592
602
|
it 'does round fractional when set to true' do
|
593
|
-
expect(Money.new(BigDecimal('12.1'), "EUR").format(:
|
594
|
-
expect(Money.new(BigDecimal('12.5'), "EUR").format(:
|
595
|
-
expect(Money.new(BigDecimal('100.1'), "EUR").format(:
|
596
|
-
expect(Money.new(BigDecimal('109.5'), "EUR").format(:
|
603
|
+
expect(Money.new(BigDecimal('12.1'), "EUR").format(rounded_infinite_precision: true)).to eq "€0,12"
|
604
|
+
expect(Money.new(BigDecimal('12.5'), "EUR").format(rounded_infinite_precision: true)).to eq "€0,13"
|
605
|
+
expect(Money.new(BigDecimal('100.1'), "EUR").format(rounded_infinite_precision: true)).to eq "€1,00"
|
606
|
+
expect(Money.new(BigDecimal('109.5'), "EUR").format(rounded_infinite_precision: true)).to eq "€1,10"
|
597
607
|
|
598
|
-
expect(Money.new(BigDecimal('100012.1'), "EUR").format(:
|
599
|
-
expect(Money.new(BigDecimal('100012.5'), "EUR").format(:
|
608
|
+
expect(Money.new(BigDecimal('100012.1'), "EUR").format(rounded_infinite_precision: true)).to eq "€1.000,12"
|
609
|
+
expect(Money.new(BigDecimal('100012.5'), "EUR").format(rounded_infinite_precision: true)).to eq "€1.000,13"
|
600
610
|
end
|
601
611
|
end
|
602
612
|
|
@@ -607,7 +617,7 @@ describe Money, "formatting" do
|
|
607
617
|
I18n.locale = :de
|
608
618
|
I18n.backend.store_translations(
|
609
619
|
:de,
|
610
|
-
:
|
620
|
+
number: { currency: { format: { delimiter: ".", separator: "," } } }
|
611
621
|
)
|
612
622
|
end
|
613
623
|
|
@@ -617,13 +627,13 @@ describe Money, "formatting" do
|
|
617
627
|
end
|
618
628
|
|
619
629
|
it 'does round fractional when set to true' do
|
620
|
-
expect(Money.new(BigDecimal('12.1'), "USD").format(:
|
621
|
-
expect(Money.new(BigDecimal('12.5'), "USD").format(:
|
622
|
-
expect(Money.new(BigDecimal('123.1'), "BHD").format(:
|
623
|
-
expect(Money.new(BigDecimal('123.5'), "BHD").format(:
|
624
|
-
expect(Money.new(BigDecimal('100.1'), "USD").format(:
|
625
|
-
expect(Money.new(BigDecimal('109.5'), "USD").format(:
|
626
|
-
expect(Money.new(BigDecimal('1'), "MGA").format(:
|
630
|
+
expect(Money.new(BigDecimal('12.1'), "USD").format(rounded_infinite_precision: true)).to eq "$0,12"
|
631
|
+
expect(Money.new(BigDecimal('12.5'), "USD").format(rounded_infinite_precision: true)).to eq "$0,13"
|
632
|
+
expect(Money.new(BigDecimal('123.1'), "BHD").format(rounded_infinite_precision: true)).to eq "ب.د0,123"
|
633
|
+
expect(Money.new(BigDecimal('123.5'), "BHD").format(rounded_infinite_precision: true)).to eq "ب.د0,124"
|
634
|
+
expect(Money.new(BigDecimal('100.1'), "USD").format(rounded_infinite_precision: true)).to eq "$1,00"
|
635
|
+
expect(Money.new(BigDecimal('109.5'), "USD").format(rounded_infinite_precision: true)).to eq "$1,10"
|
636
|
+
expect(Money.new(BigDecimal('1'), "MGA").format(rounded_infinite_precision: true)).to eq "Ar0,2"
|
627
637
|
end
|
628
638
|
end
|
629
639
|
end
|
@@ -632,30 +642,30 @@ describe Money, "formatting" do
|
|
632
642
|
let(:money) { Money.us_dollar(0) }
|
633
643
|
|
634
644
|
it "returns 'free' when :display_free is true" do
|
635
|
-
expect(money.format(:
|
645
|
+
expect(money.format(display_free: true)).to eq 'free'
|
636
646
|
end
|
637
647
|
|
638
648
|
it "returns '$0.00' when :display_free is false or not given" do
|
639
649
|
expect(money.format).to eq '$0.00'
|
640
|
-
expect(money.format(:
|
641
|
-
expect(money.format(:
|
650
|
+
expect(money.format(display_free: false)).to eq '$0.00'
|
651
|
+
expect(money.format(display_free: nil)).to eq '$0.00'
|
642
652
|
end
|
643
653
|
|
644
654
|
it "returns the value specified by :display_free if it's a string-like object" do
|
645
|
-
expect(money.format(:
|
655
|
+
expect(money.format(display_free: 'gratis')).to eq 'gratis'
|
646
656
|
end
|
647
657
|
end
|
648
658
|
end
|
649
659
|
|
650
660
|
context "custom currencies with 4 decimal places" do
|
651
661
|
before :each do
|
652
|
-
Money::Currency.register(JSON.parse(BAR, :
|
653
|
-
Money::Currency.register(JSON.parse(EU4, :
|
662
|
+
Money::Currency.register(JSON.parse(BAR, symbolize_names: true))
|
663
|
+
Money::Currency.register(JSON.parse(EU4, symbolize_names: true))
|
654
664
|
end
|
655
665
|
|
656
666
|
after :each do
|
657
|
-
Money::Currency.unregister(JSON.parse(BAR, :
|
658
|
-
Money::Currency.unregister(JSON.parse(EU4, :
|
667
|
+
Money::Currency.unregister(JSON.parse(BAR, symbolize_names: true))
|
668
|
+
Money::Currency.unregister(JSON.parse(EU4, symbolize_names: true))
|
659
669
|
end
|
660
670
|
|
661
671
|
it "respects custom subunit to unit, decimal and thousands separator" do
|
@@ -744,18 +754,18 @@ describe Money, "formatting" do
|
|
744
754
|
end
|
745
755
|
|
746
756
|
describe ":drop_trailing_zeros option" do
|
747
|
-
specify "(:
|
748
|
-
expect(Money.new(89000, "BTC").format(:
|
749
|
-
expect(Money.new(100089000, "BTC").format(:
|
750
|
-
expect(Money.new(100000000, "BTC").format(:
|
751
|
-
expect(Money.new(110, "AUD").format(:
|
752
|
-
end
|
753
|
-
|
754
|
-
specify "(:
|
755
|
-
expect(Money.new(89000, "BTC").format(:
|
756
|
-
expect(Money.new(100089000, "BTC").format(:
|
757
|
-
expect(Money.new(100000000, "BTC").format(:
|
758
|
-
expect(Money.new(110, "AUD").format(:
|
757
|
+
specify "(drop_trailing_zeros: true) works as documented" do
|
758
|
+
expect(Money.new(89000, "BTC").format(drop_trailing_zeros: true, symbol: false)).to eq "0.00089"
|
759
|
+
expect(Money.new(100089000, "BTC").format(drop_trailing_zeros: true, symbol: false)).to eq "1.00089"
|
760
|
+
expect(Money.new(100000000, "BTC").format(drop_trailing_zeros: true, symbol: false)).to eq "1"
|
761
|
+
expect(Money.new(110, "AUD").format(drop_trailing_zeros: true, symbol: false)).to eq "1.1"
|
762
|
+
end
|
763
|
+
|
764
|
+
specify "(drop_trailing_zeros: false) works as documented" do
|
765
|
+
expect(Money.new(89000, "BTC").format(drop_trailing_zeros: false, symbol: false)).to eq "0.00089000"
|
766
|
+
expect(Money.new(100089000, "BTC").format(drop_trailing_zeros: false, symbol: false)).to eq "1.00089000"
|
767
|
+
expect(Money.new(100000000, "BTC").format(drop_trailing_zeros: false, symbol: false)).to eq "1.00000000"
|
768
|
+
expect(Money.new(110, "AUD").format(drop_trailing_zeros: false, symbol: false)).to eq "1.10"
|
759
769
|
end
|
760
770
|
end
|
761
771
|
end
|