brdinheiro-lite 0.0.1

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.
@@ -0,0 +1,496 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class DinheiroTest < Test::Unit::TestCase
4
+
5
+ CONTABIL = { "(2,00)" => -2,
6
+ "2,00" => 2,
7
+ "0,00" => 0,
8
+ "0,32" => 0.32,
9
+ "(0,01)" => -0.01 }
10
+
11
+ REAL_CONTABIL = { "R$ (1,00)" => -1,
12
+ "R$ (0,12)" => -0.12,
13
+ "R$ 1,00" => 1,
14
+ "R$ 1,00" => 1,
15
+ "R$ 1,00" => 1,
16
+ "R$ 0,00" => 0 }
17
+
18
+ SOMA = { 0.real => 0.real + 0.real,
19
+ 1.real => 0.real + 1.real,
20
+ 1.real => 1.real + 0.real,
21
+ 2.reais => 1.real + 1.real,
22
+ 2.reais => 0.real + 2.reais,
23
+ 2.reais => 2.reais + 0.real,
24
+ 0.real => 2.real + -2.real,
25
+ 0.real => 0.real + BigDecimal.new("0"),
26
+ 0.3.real => 0.real + 0.3.real,
27
+ -0.3.real => 0.real + -0.3.real,
28
+ -0.03.real => 0 + -0.03.real,
29
+ -0.03.real => 0.real + -0.03,
30
+ -1.03.real => -1.real + -0.03,
31
+ -1.03.real => -1.real + BigDecimal.new("-0.03") }
32
+
33
+ SUBTRACAO = { 0.real => 0.real - 0.real,
34
+ -1.real => 0.real - 1.real,
35
+ 1.real => 1.real - 0.real,
36
+ 0.real => 1.real - 1.real,
37
+ -2.reais => 0.real - 2.reais,
38
+ 2.reais => 2.reais - 0.real,
39
+ -4.reais => -2.reais - 2.reais,
40
+ 0.3.real => 0.3.real - 0.real,
41
+ 0.03.real => 0.03.real - 0.real,
42
+ 0.03.real => 0.06.real - 0.03.real,
43
+ -0.03.real => 0 - 0.03.real,
44
+ -0.03.real => 0.real - 0.03,
45
+ -1.03.real => -1.real - 0.03,
46
+ -1.03.real => -1.real - BigDecimal.new("0.03") }
47
+
48
+ MULTIPLICACAO = { 0.real => 0.real * 0,
49
+ 0.real => 0.real * 1,
50
+ 0.real => 0.real * -1,
51
+ 1.real => 1.real * 1,
52
+ 10.real => 10.real * 1,
53
+ 100.real => 100.real * 1,
54
+ 1000.real => 1000.real * 1,
55
+ 1.real => -1.real * -1,
56
+ -1.real => 1.real * -1,
57
+ -1.real => -1.real * 1,
58
+ 0.1.real => 1.real * 0.1,
59
+ 0.01.real => 1.real * 0.01,
60
+ 0.01.real => 1.real * 0.009,
61
+ 0.01.real => 1.real * 0.005,
62
+ 0.00.real => 1.real * 0.0049,
63
+ 0.1.real => 0.1.real * 1,
64
+ 0.01.real => 0.01.real * 1,
65
+ 0.01.real => 0.009.real * 1,
66
+ 0.00.real => 0.00049.real * 1,
67
+ 0.real => 0.real * 0.real,
68
+ 0.real => 0.real * BigDecimal("0"),
69
+ 1.real => 1.real * 1.real,
70
+ 1.real => 1.real * BigDecimal("1"),
71
+ 1.real => 0.5.real * 2.real,
72
+ 1.real => 0.5.real * BigDecimal("2"),
73
+ 1.real => 1 * 1.real,
74
+ -1.real => -1 * 1.real,
75
+ 1.real => -1 * -1.real,
76
+ 0.01.real => 0.01 * 1.real,
77
+ 0.01.real => 1.real * BigDecimal("0.01"),
78
+ 0.01.real => BigDecimal("0.01") * 1.real }
79
+
80
+ DIVISAO = {
81
+ Dinheiro.new(0.33) => Dinheiro.new(1) / 3,
82
+ Dinheiro.new(33.33) => Dinheiro.new(100) / 3,
83
+ Dinheiro.new(50.00) => Dinheiro.new(100) / 2,
84
+ Dinheiro.new(0.25) => Dinheiro.new(0.5) / 2,
85
+ Dinheiro.new(0.17) => Dinheiro.new(0.5) / 3,
86
+ Dinheiro.new(0.33) => Dinheiro.new(0.33) / 1
87
+ }
88
+
89
+ PARCELAS = {
90
+ [Dinheiro.new(0.33), Dinheiro.new(0.33), Dinheiro.new(0.34)] => Dinheiro.new(1).parcelar(3),
91
+ [Dinheiro.new(33.33), Dinheiro.new(33.33), Dinheiro.new(33.34)] => Dinheiro.new(100).parcelar(3),
92
+ [Dinheiro.new(50.00), Dinheiro.new(50)] => Dinheiro.new(100).parcelar(2),
93
+ [Dinheiro.new(0.25), Dinheiro.new(0.25)] => Dinheiro.new(0.5).parcelar(2),
94
+ [Dinheiro.new(0.16), Dinheiro.new(0.17),Dinheiro.new(0.17)] => Dinheiro.new(0.5).parcelar(3),
95
+ [Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
96
+ [Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
97
+ }
98
+
99
+
100
+ QUANTIA_COM_FORMATO_VALIDO = [ "1211",
101
+ "1211.",
102
+ "1211.0",
103
+ "1211.23",
104
+ "1211,23",
105
+ "1.211",
106
+ "1.211,00",
107
+ "1.211,01",
108
+ "1.211,1",
109
+ "1.211,",
110
+ "1,",
111
+ "12,",
112
+ "32349898989912,",
113
+ "32.349.898.989.912,",
114
+ "32.349.898.989.912,1",
115
+ "32.349.898.989.912,12",
116
+ "1",
117
+ "1.00",
118
+ "1.01",
119
+ "1.1",
120
+ "1.",
121
+ ".1",
122
+ ".12",
123
+ "0.12",
124
+ "1.12",
125
+ "12.12",
126
+ "12.12",
127
+ "123.12",
128
+ "1,234.12",
129
+ "12,234.12",
130
+ "123,234.12",
131
+ "2,123,234.12",
132
+ ",1",
133
+ ",11",
134
+ ",01",
135
+ "0,01" ]
136
+ QUANTIA_COM_FORMATO_INVALIDO = [ 'teste',
137
+ '12,123,99',
138
+ '12.123.99',
139
+ '1,123,99',
140
+ '1212,39.90' ]
141
+
142
+ COMPARACAO = [ 1.real < 2.reais,
143
+ 1.real <= 2.reais,
144
+ 2.real > 1.real,
145
+ 2.real >= 1.real,
146
+ 1.real == 1.real,
147
+ 1.real >= 1.real,
148
+ 1.real <= 1.real ]
149
+
150
+ COMPARACAO_COM_ESCALAR = [ 1.real < 2.00,
151
+ 1.real <= 2.00,
152
+ 2.real > 1.00,
153
+ 2.real >= 1.00,
154
+ 1.real == 1.00,
155
+ 1.real >= 1.00,
156
+ 1.real <= 1.00 ]
157
+
158
+ ARREDONDAMENTO = { 23049 => 230.49,
159
+ 23049 => 230.4949999999,
160
+ 23050 => 230.495 }
161
+
162
+ PONTO_NO_MILHAR = { "234.175.211" => "234175211",
163
+ "" => "",
164
+ "1" => "1",
165
+ "12" => "12",
166
+ "123" => "123",
167
+ "1.234" => "1234",
168
+ "12.345" => "12345",
169
+ "123.456" => "123456",
170
+ "123.112.211" => "123112211",
171
+ "1.234.567" => "1234567" }
172
+
173
+ QUANTIA_VALIDA = { "0,00" => 0 ,
174
+ "0,00" => 0.0 ,
175
+ "0,00" => "0" ,
176
+ "0,00" => "0,00" ,
177
+ "1,00" => 1 ,
178
+ "1,03" => 1.03 ,
179
+ "1,03" => "1,03" ,
180
+ "0,03" => ",03" ,
181
+ "0,30" => ",3" ,
182
+ "0,03" => ".03" ,
183
+ "0,30" => ".3" ,
184
+ "-0,30" => -0.3 ,
185
+ "-0,03" => -0.03 ,
186
+ "1,00" => "1,00" ,
187
+ "-1,00" => -1 ,
188
+ "-1,00" => -1.0 ,
189
+ "-1,00" => "-1" ,
190
+ "-1,00" => "-1,00" ,
191
+ "-2,30" => "-2,30" ,
192
+ "2,30" => "2,30" ,
193
+ "2,30" => 2.30 ,
194
+ "2,30" => 2.3 ,
195
+ "1.211,00" => "1211,00" ,
196
+ "1.211,01" => "1211,01" ,
197
+ "1.211,50" => "1211,5" ,
198
+ "1.211,00" => "1211," ,
199
+ "1.211,00" => "1211" ,
200
+ "1.211,00" => "1211.00" ,
201
+ "1.211,01" => "1211.01" ,
202
+ "1.211,20" => "1211.2" ,
203
+ "1.211,00" => "1211." ,
204
+ "1.211,00" => "1211" ,
205
+ "1.211,00" => "1.211" ,
206
+ "123.112.211,35" => "123112211,35" ,
207
+ "-123.112.211,35" => "-123112211,35" ,
208
+ "123.112.211,35" => "+123112211,35" }
209
+
210
+ PARTE_INTEIRA = [ -1, -123112211, 0, 1, 12344545 ]
211
+
212
+ def setup
213
+ tornar_metodos_publicos Dinheiro
214
+ @dinheiro = 1.real
215
+ end
216
+
217
+ def testa_se_cria_dinheiro_a_partir_de_quantias_validos
218
+ QUANTIA_VALIDA.each do |esperado, quantia|
219
+ assert_equal esperado, Dinheiro.new(quantia).to_s, "Deveria ter vindo o quantia: #{esperado} quando recebeu #{quantia}"
220
+ end
221
+ end
222
+
223
+ # coloca_ponto_no_milhar
224
+ def testa_se_coloca_ponto_no_milhar
225
+ PONTO_NO_MILHAR.each do |esperado, quantia|
226
+ { esperado => quantia,
227
+ "-#{esperado}" => "-#{quantia}" }.each do |esperado, quantia|
228
+ assert_equal esperado, @dinheiro.inteiro_com_milhar(quantia)
229
+ end
230
+ end
231
+ end
232
+
233
+ def testa_to_s
234
+ assert_equal "1,00", Dinheiro.new(1).to_s
235
+ assert_equal "1.000,00", Dinheiro.new(1000).to_s
236
+ end
237
+
238
+ # real
239
+ def testa_real_nao_eh_dinheiro
240
+ assert_kind_of(Dinheiro, 1.real)
241
+ end
242
+
243
+ def testa_real_eh_dinheiro
244
+ assert_kind_of(Dinheiro, Dinheiro.new(1).real)
245
+ end
246
+
247
+ def testa_real_contabil
248
+ REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).real_contabil }
249
+ end
250
+
251
+ def testa_reais_contabeis
252
+ REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).reais_contabeis }
253
+ end
254
+
255
+ # reais
256
+ def testa_reais
257
+ assert_equal Dinheiro.new("2,00"), Dinheiro.new(2).reais
258
+ end
259
+
260
+ def testa_contabil
261
+ CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).contabil }
262
+ end
263
+
264
+ # real_formatado
265
+ def test_real_formatado
266
+ assert_equal "R$ 2,00", Dinheiro.new(2).real_formatado
267
+ end
268
+
269
+ # ==
270
+ def testa_igualdade
271
+ assert_equal Dinheiro.new(1), Dinheiro.new(1)
272
+ end
273
+
274
+ def testa_igualdade_quando_passa_possivel_dinheiro
275
+ assert_equal Dinheiro.new(1), 1.0
276
+ end
277
+
278
+ def testa_igualdade_quando_passa_algo_que_nao_seja_dinheiro
279
+ assert_equal false, Dinheiro.new(1) == 'salario'
280
+ end
281
+
282
+ # / (divisao)
283
+ def testa_divisao
284
+ DIVISAO.each { |parcelas, divisao| assert_equal parcelas, divisao }
285
+ end
286
+
287
+ def testa_divisao_por_zero
288
+ assert_raise(ZeroDivisionError) { 1.real / 0 }
289
+ end
290
+
291
+ def testa_divisao_por_algo_que_nao_seja_um_escalar
292
+ assert_raise(DivisaPorNaoEscalarError) { 10.reais / 2.reais }
293
+ end
294
+
295
+ # parcelar
296
+ def testa_parcelar
297
+ PARCELAS.each { |parcelas, divisao| assert_equal parcelas, divisao }
298
+ end
299
+
300
+ def testa_parcelar_por_zero
301
+ assert_raise(ZeroDivisionError) { 1.real.parcelar 0 }
302
+ end
303
+
304
+ def testa_parcelar_por_algo_que_nao_seja_um_escalar
305
+ assert_raise(DivisaPorNaoEscalarError) { 10.reais.parcelar(2.reais) }
306
+ end
307
+
308
+ # initialize
309
+ def testa_se_cria_dinheiro_a_partir_de_float
310
+ verifica_se_cria_dinheiro_para 1.0
311
+ end
312
+
313
+ def testa_se_cria_dinheiro_a_partir_de_fixnum
314
+ verifica_se_cria_dinheiro_para 1
315
+ end
316
+
317
+ def testa_se_cria_dinheiro_a_partir_de_bigdecimal
318
+ verifica_se_cria_dinheiro_para BigDecimal.new("1")
319
+ end
320
+
321
+ def testa_se_cria_dinheiro_a_partir_de_string
322
+ verifica_se_cria_dinheiro_para "1"
323
+ end
324
+
325
+ def testa_se_rejeita_criacao_de_dinheiro_a_partir_de_string_invalida
326
+ QUANTIA_COM_FORMATO_INVALIDO.each do |quantia|
327
+ assert_raise DinheiroInvalidoError, "Deveria ter rejeitado [#{quantia}]" do
328
+ Dinheiro.new quantia
329
+ end
330
+ end
331
+ end
332
+
333
+ # + (soma)
334
+ def testa_soma
335
+ SOMA.each{ |esperado, soma| assert_equal esperado, soma }
336
+ end
337
+
338
+ # - (subtracao)
339
+ def testa_subtracao
340
+ SUBTRACAO.each { |esperado, subtracao| assert_equal esperado, subtracao }
341
+ end
342
+
343
+ # * (multiplicacao)
344
+ def testa_multiplicacao
345
+ MULTIPLICACAO.each { |esperado, multiplicacao| assert_equal esperado, multiplicacao }
346
+ end
347
+
348
+ # quantia_de
349
+ def testa_quantia_de
350
+ assert_equal 0, @dinheiro.quantia_de(0.real)
351
+ assert_equal 0, @dinheiro.quantia_de(0)
352
+ end
353
+
354
+ #por_extenso
355
+ def testa_por_extenso
356
+ assert_equal 'um real', 1.real.por_extenso
357
+ assert_equal 'um centavo', (0.01).real.por_extenso
358
+ assert_equal 'cem reais', 100.real.por_extenso
359
+ assert_equal 'cem reais e um centavo', (100.01).real.por_extenso
360
+ end
361
+
362
+ #por_extenso_em_reais
363
+ def testa_por_extenso_em_reais
364
+ assert_equal 'um real', 1.real.por_extenso_em_reais
365
+ assert_equal 'um centavo', (0.01).real.por_extenso_em_reais
366
+ assert_equal 'cem reais', 100.real.por_extenso_em_reais
367
+ assert_equal 'cem reais e um centavo', (100.01).real.por_extenso_em_reais
368
+ end
369
+
370
+ def testa_por_extenso_negativo
371
+ assert_equal 'um real negativo', -1.real.por_extenso_em_reais
372
+ assert_equal 'um centavo negativo', (-0.01).real.por_extenso_em_reais
373
+ assert_equal 'cem reais negativos', -100.real.por_extenso_em_reais
374
+ assert_equal 'cem reais e um centavo negativos', (-100.01).real.por_extenso_em_reais
375
+ assert_equal 'cento e dez reais negativos', (-110).real.por_extenso_em_reais
376
+ assert_equal 'vinte e dois reais negativos', -22.reais.por_extenso
377
+ assert_not_equal 'vinte e dois centavos negativos', -22.reais.por_extenso
378
+ assert_not_equal 'vinte e dois centavos', -22.reais.por_extenso
379
+ end
380
+
381
+ # to_f
382
+ def testa_to_f
383
+ assert_equal 2.30, 2.30.real.to_f
384
+ assert_equal 1000, 1000.real.to_f
385
+ end
386
+
387
+ # quantia_respeita_formato?
388
+ def testa_se_quantia_respeita_formato
389
+ QUANTIA_COM_FORMATO_VALIDO.each { |quantia| verifica_se_quantia_respeita_formato quantia }
390
+ end
391
+
392
+ # >, <, == (ordenacao)
393
+ def testa_comparacao_entre_dinheiro
394
+ COMPARACAO.each { |comparacao| assert comparacao }
395
+ end
396
+
397
+ def testa_comparacao_entre_possivel_dinheiro
398
+ COMPARACAO_COM_ESCALAR.each { |comparacao_com_escalar| assert comparacao_com_escalar }
399
+ end
400
+
401
+ # decimal
402
+ def testa_decimal_quando_todas_as_casas_estao_preenchidas
403
+ verifica_decimal("12")
404
+ end
405
+
406
+ def testa_decimal_quando_apenas_uma_das_casas_esta_preenchida
407
+ verifica_decimal("10", "1")
408
+ end
409
+
410
+ def testa_decimal_quando_nenhuma_das_casas_esta_preenchida
411
+ verifica_decimal("00", "")
412
+ end
413
+
414
+ def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_tres_digitos
415
+ verifica_se_transforma_em_string_corretamente "1.23", 123
416
+ end
417
+
418
+ def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_dois_digitos
419
+ verifica_se_transforma_em_string_corretamente "0.12", 12
420
+ end
421
+
422
+ def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_um_digito
423
+ verifica_se_transforma_em_string_corretamente "0.03", 3
424
+ end
425
+
426
+ def testa_se_transforma_em_string_para_valores_especiais
427
+ verifica_se_transforma_em_string_corretamente "-123112211.00", -12311221100
428
+ end
429
+
430
+ # parte_inteira
431
+ def testa_parte_inteira
432
+ PARTE_INTEIRA.each { |quantia| assert_equal "#{quantia}", Dinheiro.new(quantia).parte_inteira }
433
+ end
434
+
435
+ def testa_se_arredonda_valores_corretamente
436
+ ARREDONDAMENTO.each do |esperado, quantia|
437
+ assert_equal esperado, Dinheiro.new(quantia).quantia, "Deveria retornar #{esperado} para #{quantia}"
438
+ end
439
+ end
440
+
441
+ def testa_se_valor_decimal_cria_o_big_decimal_corretamente
442
+ assert_equal BigDecimal.new("1234.56"), Dinheiro.new("1234,56").valor_decimal
443
+ end
444
+
445
+ def testa_soma_de_dinheiro_com_big_decimal
446
+ assert_equal Dinheiro.new(200), BigDecimal.new("100").reais + "100".reais
447
+ end
448
+
449
+ def testa_zero_quando_eh_zero
450
+ assert Dinheiro.new(0).zero?
451
+ end
452
+
453
+ def testa_zero_quando_nao_eh_zero
454
+ assert !Dinheiro.new(1).zero?
455
+ end
456
+
457
+ private
458
+
459
+ def verifica_se_transforma_em_string_corretamente(quantia_esperada, quantia)
460
+ assert_equal quantia_esperada, @dinheiro.transforma_em_string_que_represente_a_quantia(quantia)
461
+ end
462
+
463
+ def verifica_decimal(esperado, quantia = esperado)
464
+ assert_equal esperado, @dinheiro.decimal("." + quantia)
465
+ assert_equal esperado, @dinheiro.decimal("," + quantia)
466
+ assert_equal esperado, @dinheiro.decimal(quantia) if quantia.blank?
467
+ end
468
+
469
+ def verifica_se_quantia_respeita_formato(quantia)
470
+ formatos_validos(quantia).each do |quantia_str|
471
+ assert 1.real.quantia_respeita_formato?(quantia_str), "O sistema deveria considerar o quantia '#{quantia_str}' dentro do formato valido."
472
+ end
473
+ end
474
+
475
+ def formatos_validos(quantia)
476
+ formatos_validos = []
477
+ quantias_validas(quantia).each do |quantia|
478
+ formatos_validos << quantia
479
+ [ "R$", "r$" ].each do |simbolo|
480
+ [ "", " ", " " ].each do |espacos|
481
+ formatos_validos << "#{simbolo}#{espacos}#{quantia}"
482
+ end
483
+ end
484
+ end
485
+ formatos_validos
486
+ end
487
+
488
+ def quantias_validas(quantia)
489
+ return [quantia] if [ ".", "," ].include?(quantia[0..0])
490
+ [ quantia, "-#{quantia}" ]
491
+ end
492
+
493
+ def verifica_se_cria_dinheiro_para(quantia)
494
+ assert quantia.para_dinheiro.kind_of?(Dinheiro)
495
+ end
496
+ end