PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/brdinheiro/test/dinheiro_test.rb

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