brdinheiro 3.0.4 → 3.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,7 +1,7 @@
1
1
  == Como usar o Dinheiro em seu ActiveRecord?
2
-
2
+
3
3
  * Arquivo 001_create_lancamentos.rb:
4
-
4
+
5
5
  class CreateLancamentos < ActiveRecord::Migration
6
6
  def self.up
7
7
  create_table :lancamentos do |t|
@@ -15,20 +15,20 @@
15
15
  drop_table :lancamentos
16
16
  end
17
17
  end
18
-
18
+
19
19
  * Arquivo lancamento.rb:
20
-
20
+
21
21
  class Lancamento < ActiveRecord::Base
22
22
  usar_como_dinheiro :valor, :mensalidade
23
23
  end
24
24
 
25
25
  * No console (script/console):
26
-
26
+
27
27
  Loading development environment.
28
28
  >> lancamento = Lancamento.new
29
- => #<Lancamento:0x9652cd8 @attributes={"descricao"=>nil,
30
- "valor"=>#<BigDecimal:9657008,'0.0',4(4)>,
31
- "mensalidade"=>#<BigDecimal:9656e8c,'0.0',4(4)>},
29
+ => #<Lancamento:0x9652cd8 @attributes={"descricao"=>nil,
30
+ "valor"=>#<BigDecimal:9657008,'0.0',4(4)>,
31
+ "mensalidade"=>#<BigDecimal:9656e8c,'0.0',4(4)>},
32
32
  @new_record=true>
33
33
  >> lancamento.valor = 100
34
34
  => 100
@@ -49,4 +49,4 @@
49
49
  >> lancamento.valor.real
50
50
  => "R$ 354,58"
51
51
  >> exit
52
-
52
+
data/Rakefile CHANGED
@@ -2,7 +2,7 @@
2
2
  require "rubygems"
3
3
  require "rake"
4
4
  require "rake/testtask"
5
- require "rake/rdoctask"
5
+ require "rdoc/task"
6
6
  require "rake/packagetask"
7
7
  require "rake/gempackagetask"
8
8
 
@@ -1,19 +1,19 @@
1
1
  class Dinheiro
2
2
  include Comparable
3
-
3
+
4
4
  attr_reader :quantia
5
-
5
+
6
6
  FORMATO_VALIDO_BR = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\.?\d{3})*))?(\,\d{0,2})?$/
7
7
  FORMATO_VALIDO_EUA = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\,?\d{3})*))?(\.\d{0,2})?$/
8
8
  SEPARADOR_MILHAR = "."
9
9
  SEPARADOR_FRACIONARIO = ","
10
10
  QUANTIDADE_DIGITOS = 3
11
11
  PRECISAO_DECIMAL = 100
12
-
12
+
13
13
  def initialize(quantia)
14
14
  self.quantia = quantia
15
15
  end
16
-
16
+
17
17
  # Retorna o valor armazenado em string.
18
18
  #
19
19
  # Exemplo:
@@ -21,7 +21,7 @@ class Dinheiro
21
21
  def to_s
22
22
  inteiro_com_milhar(parte_inteira) + parte_decimal
23
23
  end
24
-
24
+
25
25
  # Compara com outro dinheiro se eh igual.
26
26
  #
27
27
  # Exemplo:
@@ -29,14 +29,14 @@ class Dinheiro
29
29
  # um_real == Dinheiro.new(1) ==> true
30
30
  # um_real == Dinheiro.new(2) ==> false
31
31
  def ==(outro_dinheiro)
32
- begin
32
+ begin
33
33
  outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
34
34
  rescue
35
35
  return false
36
36
  end
37
37
  @quantia == outro_dinheiro.quantia
38
38
  end
39
-
39
+
40
40
  # Compara com outro dinheiro se eh maior ou menor.
41
41
  #
42
42
  # Exemplo:
@@ -48,25 +48,25 @@ class Dinheiro
48
48
  outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
49
49
  @quantia <=> outro_dinheiro.quantia
50
50
  end
51
-
51
+
52
52
  # Retorna a adicao entre dinheiros.
53
53
  #
54
54
  # Exemplo:
55
- # 1.real + 1.real == 2.reais
56
- # 1.real + 1 == 2.reais
55
+ # 1.real + 1.real == 2.reais
56
+ # 1.real + 1 == 2.reais
57
57
  def +(outro)
58
58
  Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia + quantia_de(outro)))
59
59
  end
60
-
60
+
61
61
  # Retorna a subtracao entre dinheiros.
62
62
  #
63
63
  # Exemplo:
64
- # 10.reais - 2.reais == 8.reais
65
- # 10.reais - 2 == 8.reais
64
+ # 10.reais - 2.reais == 8.reais
65
+ # 10.reais - 2 == 8.reais
66
66
  def -(outro)
67
67
  Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia - quantia_de(outro)))
68
68
  end
69
-
69
+
70
70
  # Retorna a multiplicacao entre dinheiros.
71
71
  #
72
72
  # Exemplo:
@@ -76,7 +76,7 @@ class Dinheiro
76
76
  return Dinheiro.new(to_f * outro) unless outro.kind_of? Dinheiro
77
77
  outro * to_f
78
78
  end
79
-
79
+
80
80
  # Retorna a divisao entre dinheiros.
81
81
  #
82
82
  # Exemplo:
@@ -104,44 +104,44 @@ class Dinheiro
104
104
  valor_maior = Dinheiro.new((@quantia/numero_de_parcelar+1)/100.0)
105
105
  [valor_menor] * (numero_de_parcelar - resto) + [valor_maior] * resto
106
106
  end
107
-
107
+
108
108
  # Escreve o valor por extenso.
109
- #
109
+ #
110
110
  # Exemplo:
111
111
  # 1.real.to_extenso ==> 'um real'
112
112
  # (100.58).to_extenso ==> 'cem reais e cinquenta e oito centavos'
113
113
  def to_extenso
114
114
  (@quantia/100.0).por_extenso_em_reais
115
115
  end
116
-
116
+
117
117
  # Alias para o metodo to_extenso.
118
118
  alias_method :por_extenso, :to_extenso
119
-
119
+
120
120
  # Alias para o metodo to_extenso.
121
121
  alias_method :por_extenso_em_reais, :to_extenso
122
-
122
+
123
123
  # Verifica se o valor é zero.
124
124
  def zero?
125
125
  to_f.zero?
126
126
  end
127
-
127
+
128
128
  # Retorna um Float.
129
129
  def to_f
130
130
  to_s.gsub('.', '').gsub(',', '.').to_f
131
131
  end
132
-
132
+
133
133
  def coerce(outro)#:nodoc:
134
134
  [ Dinheiro.new(outro), self ]
135
135
  end
136
-
136
+
137
137
  # Retorna a própria instância/
138
138
  def real
139
139
  self
140
140
  end
141
-
141
+
142
142
  # Alias para real.
143
143
  alias_method :reais, :real
144
-
144
+
145
145
  # Retorna uma string formatada com sigla em valor monetário.
146
146
  # Exemplo:
147
147
  # Dinheiro.new(1).real_formatado ==> 'R$ 1,00'
@@ -149,10 +149,10 @@ class Dinheiro
149
149
  def real_formatado
150
150
  "R$ #{to_s}"
151
151
  end
152
-
152
+
153
153
  # Alias para real_formatado.
154
154
  alias_method :reais_formatado, :real_formatado
155
-
155
+
156
156
  # Retorna uma string formatada com sigla em valor contábil.
157
157
  #
158
158
  # Exemplo:
@@ -161,10 +161,10 @@ class Dinheiro
161
161
  def real_contabil
162
162
  "R$ " + contabil
163
163
  end
164
-
164
+
165
165
  # Alias para real_contabil.
166
166
  alias_method :reais_contabeis, :real_contabil
167
-
167
+
168
168
  # Retorna uma string formatada sem sigla.
169
169
  #
170
170
  # Exemplo:
@@ -172,15 +172,15 @@ class Dinheiro
172
172
  # Dinheiro.new(-1).contabil ==> '(1,00)'
173
173
  def contabil
174
174
  if @quantia >= 0
175
- to_s
176
- else
177
- "(" + to_s[1..-1] + ")"
178
- end
175
+ to_s
176
+ else
177
+ "(" + to_s[1..-1] + ")"
178
+ end
179
179
  end
180
-
180
+
181
181
  # Method missing para retorna um BigDecinal quando chamada .
182
182
  def method_missing(symbol, *args) #:nodoc:
183
- #Ex: Chama ao método valor_decimal()
183
+ #Ex: Chama ao método valor_decimal()
184
184
  if (symbol.to_s =~ /^(.*)_decimal$/) && args.size == 0
185
185
  BigDecimal.new quantia_sem_separacao_milhares.gsub(',','.')
186
186
  else
@@ -194,7 +194,7 @@ class Dinheiro
194
194
  return outro.quantia if outro.kind_of?(Dinheiro)
195
195
  (outro * 100).round
196
196
  end
197
-
197
+
198
198
  def transforma_em_string_que_represente_a_quantia(quantia)
199
199
  if /^([+-]?)(\d)$/ =~ quantia.to_s
200
200
  return "#{$1}0.0#{$2}"
@@ -202,69 +202,69 @@ class Dinheiro
202
202
  /^([+-]?)(\d*)(\d\d)$/ =~ quantia.to_s
203
203
  "#{$1}#{$2.to_i}.#{$3}"
204
204
  end
205
-
205
+
206
206
  def quantia=(quantia)
207
207
  raise DinheiroInvalidoError unless quantia_valida?(quantia)
208
208
  quantia = quantia.to_f if quantia.kind_of?(BigDecimal)
209
209
  @quantia = (quantia * 100).round if quantia.kind_of?(Numeric)
210
210
  @quantia = extrai_quantia_como_inteiro(quantia) if quantia.kind_of?(String)
211
211
  end
212
-
212
+
213
213
  def parte_inteira
214
214
  quantia_sem_separacao_milhares[0,quantia_sem_separacao_milhares.length-QUANTIDADE_DIGITOS]
215
215
  end
216
-
216
+
217
217
  def parte_decimal
218
218
  quantia_sem_separacao_milhares[-QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS]
219
219
  end
220
-
220
+
221
221
  def inteiro_com_milhar(inteiro)
222
222
  return inteiro if quantidade_de_passos(inteiro) == 0
223
223
  resultado = ""
224
- quantidade_de_passos(inteiro).times do |passo|
225
- resultado = "." + inteiro[-QUANTIDADE_DIGITOS + passo * -QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS] + resultado
224
+ quantidade_de_passos(inteiro).times do |passo|
225
+ resultado = "." + inteiro[-QUANTIDADE_DIGITOS + passo * -QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS] + resultado
226
226
  end
227
227
  resultado = inteiro[0, digitos_que_sobraram(inteiro)] + resultado
228
228
  resultado.gsub(/^(-?)\./, '\1')
229
229
  end
230
-
230
+
231
231
  def quantia_sem_separacao_milhares
232
232
  sprintf("%.2f", (@quantia.to_f / PRECISAO_DECIMAL)).gsub(SEPARADOR_MILHAR, SEPARADOR_FRACIONARIO)
233
- end
234
-
233
+ end
234
+
235
235
  def quantidade_de_passos(inteiro)
236
236
  resultado = inteiro.length / QUANTIDADE_DIGITOS
237
237
  resultado = (resultado - 1) if inteiro.length % QUANTIDADE_DIGITOS == 0
238
238
  resultado
239
239
  end
240
-
240
+
241
241
  def digitos_que_sobraram(inteiro)
242
242
  inteiro.length - (quantidade_de_passos(inteiro) * QUANTIDADE_DIGITOS)
243
243
  end
244
-
244
+
245
245
  def quantia_valida?(quantia)
246
246
  return false if quantia.kind_of?(String) && !quantia_respeita_formato?(quantia)
247
247
  quantia.kind_of?(String) || quantia.kind_of?(Numeric)
248
248
  end
249
-
249
+
250
250
  def extrai_quantia_como_inteiro(quantia)
251
251
  if FORMATO_VALIDO_BR =~ quantia
252
252
  return sem_milhar($2, $5, '.')
253
253
  end
254
- if FORMATO_VALIDO_EUA =~ quantia
254
+ if FORMATO_VALIDO_EUA =~ quantia
255
255
  return sem_milhar($2, $5, ',')
256
256
  end
257
257
  end
258
-
258
+
259
259
  def sem_milhar(parte_inteira, parte_decimal, delimitador_de_milhar)
260
260
  (inteiro(parte_inteira, delimitador_de_milhar) + decimal(parte_decimal)).to_i
261
261
  end
262
-
262
+
263
263
  def inteiro(inteiro_com_separador_milhar, separador)
264
264
  return inteiro_com_separador_milhar.gsub(separador, '') unless inteiro_com_separador_milhar.blank?
265
265
  ""
266
266
  end
267
-
267
+
268
268
  def decimal(parte_fracionaria)
269
269
  unless parte_fracionaria.blank?
270
270
  return sem_delimitador_decimal(parte_fracionaria) if parte_fracionaria.length == 3
@@ -272,15 +272,15 @@ class Dinheiro
272
272
  end
273
273
  "00"
274
274
  end
275
-
275
+
276
276
  def sem_delimitador_decimal(parte_fracionaria)
277
277
  "#{parte_fracionaria}".gsub(/[.|,]/, '')
278
278
  end
279
-
280
-
279
+
280
+
281
281
  def quantia_respeita_formato?(quantia)
282
282
  return true if FORMATO_VALIDO_BR.match(quantia) || FORMATO_VALIDO_EUA.match(quantia)
283
283
  false
284
284
  end
285
-
285
+
286
286
  end
@@ -33,6 +33,10 @@ module DinheiroActiveRecord#:nodoc:
33
33
  end
34
34
  end
35
35
  end
36
+
37
+ def #{name}
38
+ read_attribute(:#{name})
39
+ end
36
40
  ADICIONANDO_METODO
37
41
  end
38
42
  end
@@ -27,7 +27,7 @@ module DinheiroUtil
27
27
  def real_contabil
28
28
  Dinheiro.new(self).real_contabil
29
29
  end
30
-
30
+
31
31
  # Retorna string formatada com simbolo monetario
32
32
  #
33
33
  # Exemplo:
@@ -36,7 +36,7 @@ module DinheiroUtil
36
36
  def reais_contabeis
37
37
  Dinheiro.new(self).reais_contabeis
38
38
  end
39
-
39
+
40
40
  # Retorna string formatada com simbolo monetario
41
41
  #
42
42
  # Exemplo:
@@ -1,6 +1,6 @@
1
1
  def cria_excecao(classe, mensagem)
2
2
  eval "class #{classe}; def initialize; super('#{mensagem}'); end; end"
3
3
  end
4
-
4
+
5
5
  cria_excecao("DinheiroInvalidoError < ArgumentError", "O valor deve estar preenchido e no formato correto. Ex.: 100.00 .")
6
6
  cria_excecao("DivisaPorNaoEscalarError < ArgumentError", "So eh possivel dividir dinheiro por numeros.")
@@ -7,7 +7,7 @@ class NilClass
7
7
  def contabil
8
8
  0.contabil
9
9
  end
10
-
10
+
11
11
  def para_dinheiro
12
12
  0.real
13
13
  end
@@ -18,7 +18,7 @@ class NilClass
18
18
 
19
19
  def real
20
20
  0.real
21
- end
21
+ end
22
22
 
23
23
  end
24
24
 
@@ -2,7 +2,7 @@ module BrDinheiro
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 3
4
4
  MINOR = 0
5
- TINY = 4
5
+ TINY = 5
6
6
 
7
7
  STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
8
8
  end
@@ -11,7 +11,11 @@ module ActiveRecord
11
11
  def save
12
12
  self.valid?
13
13
  end
14
-
14
+
15
+ def column_for_attribute(name)
16
+ self.class.columns_hash[name.to_s]
17
+ end
18
+
15
19
  class << self
16
20
  def columns()
17
21
  @columns ||= []
@@ -27,7 +31,29 @@ module ActiveRecord
27
31
  undefine_attribute_methods
28
32
  @column_names = @columns_hash = @content_columns = @dynamic_methods_hash = @read_methods = nil
29
33
  end
34
+
35
+ def columns_hash
36
+ hash = {}
37
+ columns.each do |column|
38
+ hash[column.name] = column
39
+ end
40
+ hash
41
+ end
42
+
43
+ def column_defaults
44
+ defaults = {}
45
+ columns.each do |column|
46
+ defaults[column.name.to_sym] = nil
47
+ end
48
+ defaults
49
+ end
30
50
  end
51
+
52
+ private
53
+ def self.attributes_protected_by_default
54
+ []
55
+ end
56
+
31
57
  end
32
58
  end
33
59
 
@@ -5,7 +5,7 @@ class TestBrDinheiro < Test::Unit::TestCase
5
5
 
6
6
  def setup
7
7
  end
8
-
8
+
9
9
  def test_truth
10
10
  assert true
11
11
  end
@@ -44,6 +44,12 @@ class DinheiroActiveRecordTest < Test::Unit::TestCase
44
44
  carteira = Carteira.new(:saldo => "1")
45
45
  assert_equal 1.real, carteira.saldo
46
46
  end
47
+
48
+ def test_se_atualiza_valor_inicializado
49
+ carteira = Carteira.new(:saldo => 10.reais)
50
+ carteira.saldo += 5.reais
51
+ assert_equal 15.reais, carteira.saldo
52
+ end
47
53
 
48
54
  end
49
55
 
@@ -3,11 +3,11 @@ require File.dirname(__FILE__) + '/test_helper'
3
3
  class DinheiroTest < Test::Unit::TestCase
4
4
 
5
5
  CONTABIL = { "(2,00)" => -2,
6
- "2,00" => 2,
6
+ "2,00" => 2,
7
7
  "0,00" => 0,
8
8
  "0,32" => 0.32,
9
9
  "(0,01)" => -0.01 }
10
-
10
+
11
11
  REAL_CONTABIL = { "R$ (1,00)" => -1,
12
12
  "R$ (0,12)" => -0.12,
13
13
  "R$ 1,00" => 1,
@@ -26,7 +26,7 @@ class DinheiroTest < Test::Unit::TestCase
26
26
  0.3.real => 0.real + 0.3.real,
27
27
  -0.3.real => 0.real + -0.3.real,
28
28
  -0.03.real => 0 + -0.03.real,
29
- -0.03.real => 0.real + -0.03,
29
+ -0.03.real => 0.real + -0.03,
30
30
  -1.03.real => -1.real + -0.03,
31
31
  -1.03.real => -1.real + BigDecimal.new("-0.03") }
32
32
 
@@ -41,10 +41,10 @@ class DinheiroTest < Test::Unit::TestCase
41
41
  0.03.real => 0.03.real - 0.real,
42
42
  0.03.real => 0.06.real - 0.03.real,
43
43
  -0.03.real => 0 - 0.03.real,
44
- -0.03.real => 0.real - 0.03,
45
- -1.03.real => -1.real - 0.03,
44
+ -0.03.real => 0.real - 0.03,
45
+ -1.03.real => -1.real - 0.03,
46
46
  -1.03.real => -1.real - BigDecimal.new("0.03") }
47
-
47
+
48
48
  MULTIPLICACAO = { 0.real => 0.real * 0,
49
49
  0.real => 0.real * 1,
50
50
  0.real => 0.real * -1,
@@ -76,8 +76,8 @@ class DinheiroTest < Test::Unit::TestCase
76
76
  0.01.real => 0.01 * 1.real,
77
77
  0.01.real => 1.real * BigDecimal("0.01"),
78
78
  0.01.real => BigDecimal("0.01") * 1.real }
79
-
80
- DIVISAO = {
79
+
80
+ DIVISAO = {
81
81
  Dinheiro.new(0.33) => Dinheiro.new(1) / 3,
82
82
  Dinheiro.new(33.33) => Dinheiro.new(100) / 3,
83
83
  Dinheiro.new(50.00) => Dinheiro.new(100) / 2,
@@ -85,8 +85,8 @@ class DinheiroTest < Test::Unit::TestCase
85
85
  Dinheiro.new(0.17) => Dinheiro.new(0.5) / 3,
86
86
  Dinheiro.new(0.33) => Dinheiro.new(0.33) / 1
87
87
  }
88
-
89
- PARCELAS = {
88
+
89
+ PARCELAS = {
90
90
  [Dinheiro.new(0.33), Dinheiro.new(0.33), Dinheiro.new(0.34)] => Dinheiro.new(1).parcelar(3),
91
91
  [Dinheiro.new(33.33), Dinheiro.new(33.33), Dinheiro.new(33.34)] => Dinheiro.new(100).parcelar(3),
92
92
  [Dinheiro.new(50.00), Dinheiro.new(50)] => Dinheiro.new(100).parcelar(2),
@@ -94,9 +94,9 @@ class DinheiroTest < Test::Unit::TestCase
94
94
  [Dinheiro.new(0.16), Dinheiro.new(0.17),Dinheiro.new(0.17)] => Dinheiro.new(0.5).parcelar(3),
95
95
  [Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
96
96
  [Dinheiro.new(0.33)] => Dinheiro.new(0.33).parcelar(1),
97
- }
98
-
99
-
97
+ }
98
+
99
+
100
100
  QUANTIA_COM_FORMATO_VALIDO = [ "1211",
101
101
  "1211.",
102
102
  "1211.0",
@@ -138,7 +138,7 @@ class DinheiroTest < Test::Unit::TestCase
138
138
  '12.123.99',
139
139
  '1,123,99',
140
140
  '1212,39.90' ]
141
-
141
+
142
142
  COMPARACAO = [ 1.real < 2.reais,
143
143
  1.real <= 2.reais,
144
144
  2.real > 1.real,
@@ -154,11 +154,11 @@ class DinheiroTest < Test::Unit::TestCase
154
154
  1.real == 1.00,
155
155
  1.real >= 1.00,
156
156
  1.real <= 1.00 ]
157
-
158
- ARREDONDAMENTO = { 23049 => 230.49,
157
+
158
+ ARREDONDAMENTO = { 23049 => 230.49,
159
159
  23049 => 230.4949999999,
160
160
  23050 => 230.495 }
161
-
161
+
162
162
  PONTO_NO_MILHAR = { "234.175.211" => "234175211",
163
163
  "" => "",
164
164
  "1" => "1",
@@ -192,103 +192,103 @@ class DinheiroTest < Test::Unit::TestCase
192
192
  "2,30" => "2,30" ,
193
193
  "2,30" => 2.30 ,
194
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," ,
195
+ "1.211,00" => "1211,00" ,
196
+ "1.211,01" => "1211,01" ,
197
+ "1.211,50" => "1211,5" ,
198
+ "1.211,00" => "1211," ,
199
199
  "1.211,00" => "1211" ,
200
- "1.211,00" => "1211.00" ,
201
- "1.211,01" => "1211.01" ,
202
- "1.211,20" => "1211.2" ,
200
+ "1.211,00" => "1211.00" ,
201
+ "1.211,01" => "1211.01" ,
202
+ "1.211,20" => "1211.2" ,
203
203
  "1.211,00" => "1211." ,
204
204
  "1.211,00" => "1211" ,
205
205
  "1.211,00" => "1.211" ,
206
- "123.112.211,35" => "123112211,35" ,
207
- "-123.112.211,35" => "-123112211,35" ,
206
+ "123.112.211,35" => "123112211,35" ,
207
+ "-123.112.211,35" => "-123112211,35" ,
208
208
  "123.112.211,35" => "+123112211,35" }
209
-
209
+
210
210
  PARTE_INTEIRA = [ -1, -123112211, 0, 1, 12344545 ]
211
-
212
-
211
+
212
+
213
213
  def setup
214
214
  tornar_metodos_publicos Dinheiro
215
215
  @dinheiro = 1.real
216
216
  end
217
217
 
218
218
  def testa_se_cria_dinheiro_a_partir_de_quantias_validos
219
- QUANTIA_VALIDA.each do |esperado, quantia|
219
+ QUANTIA_VALIDA.each do |esperado, quantia|
220
220
  assert_equal esperado, Dinheiro.new(quantia).to_s, "Deveria ter vindo o quantia: #{esperado} quando recebeu #{quantia}"
221
221
  end
222
222
  end
223
-
223
+
224
224
  # coloca_ponto_no_milhar
225
225
  def testa_se_coloca_ponto_no_milhar
226
- PONTO_NO_MILHAR.each do |esperado, quantia|
226
+ PONTO_NO_MILHAR.each do |esperado, quantia|
227
227
  { esperado => quantia,
228
- "-#{esperado}" => "-#{quantia}" }.each do |esperado, quantia|
229
- assert_equal esperado, @dinheiro.inteiro_com_milhar(quantia)
228
+ "-#{esperado}" => "-#{quantia}" }.each do |esperado, quantia|
229
+ assert_equal esperado, @dinheiro.inteiro_com_milhar(quantia)
230
230
  end
231
231
  end
232
232
  end
233
-
233
+
234
234
  def testa_to_s
235
235
  assert_equal "1,00", Dinheiro.new(1).to_s
236
236
  assert_equal "1.000,00", Dinheiro.new(1000).to_s
237
237
  end
238
-
238
+
239
239
  # real
240
240
  def testa_real_nao_eh_dinheiro
241
241
  assert_kind_of(Dinheiro, 1.real)
242
242
  end
243
-
243
+
244
244
  def testa_real_eh_dinheiro
245
245
  assert_kind_of(Dinheiro, Dinheiro.new(1).real)
246
246
  end
247
-
247
+
248
248
  def testa_real_contabil
249
249
  REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).real_contabil }
250
- end
251
-
250
+ end
251
+
252
252
  def testa_reais_contabeis
253
253
  REAL_CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).reais_contabeis }
254
- end
255
-
254
+ end
255
+
256
256
  # reais
257
257
  def testa_reais
258
258
  assert_equal Dinheiro.new("2,00"), Dinheiro.new(2).reais
259
259
  end
260
-
260
+
261
261
  def testa_contabil
262
262
  CONTABIL.each { |esperado, quantia| assert_equal esperado, Dinheiro.new(quantia).contabil }
263
- end
263
+ end
264
264
 
265
265
  # real_formatado
266
266
  def test_real_formatado
267
267
  assert_equal "R$ 2,00", Dinheiro.new(2).real_formatado
268
268
  end
269
-
269
+
270
270
  # ==
271
271
  def testa_igualdade
272
272
  assert_equal Dinheiro.new(1), Dinheiro.new(1)
273
273
  end
274
-
274
+
275
275
  def testa_igualdade_quando_passa_possivel_dinheiro
276
276
  assert_equal Dinheiro.new(1), 1.0
277
277
  end
278
-
278
+
279
279
  def testa_igualdade_quando_passa_algo_que_nao_seja_dinheiro
280
280
  assert_equal false, Dinheiro.new(1) == 'salario'
281
281
  end
282
-
282
+
283
283
  # / (divisao)
284
284
  def testa_divisao
285
285
  DIVISAO.each { |parcelas, divisao| assert_equal parcelas, divisao }
286
286
  end
287
-
287
+
288
288
  def testa_divisao_por_zero
289
289
  assert_raise(ZeroDivisionError) { 1.real / 0 }
290
290
  end
291
-
291
+
292
292
  def testa_divisao_por_algo_que_nao_seja_um_escalar
293
293
  assert_raise(DivisaPorNaoEscalarError) { 10.reais / 2.reais }
294
294
  end
@@ -297,55 +297,55 @@ class DinheiroTest < Test::Unit::TestCase
297
297
  def testa_parcelar
298
298
  PARCELAS.each { |parcelas, divisao| assert_equal parcelas, divisao }
299
299
  end
300
-
300
+
301
301
  def testa_parcelar_por_zero
302
302
  assert_raise(ZeroDivisionError) { 1.real.parcelar 0 }
303
303
  end
304
-
304
+
305
305
  def testa_parcelar_por_algo_que_nao_seja_um_escalar
306
306
  assert_raise(DivisaPorNaoEscalarError) { 10.reais.parcelar(2.reais) }
307
307
  end
308
-
308
+
309
309
  # initialize
310
310
  def testa_se_cria_dinheiro_a_partir_de_float
311
311
  verifica_se_cria_dinheiro_para 1.0
312
- end
313
-
312
+ end
313
+
314
314
  def testa_se_cria_dinheiro_a_partir_de_fixnum
315
315
  verifica_se_cria_dinheiro_para 1
316
- end
317
-
316
+ end
317
+
318
318
  def testa_se_cria_dinheiro_a_partir_de_bigdecimal
319
319
  verifica_se_cria_dinheiro_para BigDecimal.new("1")
320
- end
320
+ end
321
321
 
322
322
  def testa_se_cria_dinheiro_a_partir_de_string
323
323
  verifica_se_cria_dinheiro_para "1"
324
- end
325
-
324
+ end
325
+
326
326
  def testa_se_rejeita_criacao_de_dinheiro_a_partir_de_string_invalida
327
- QUANTIA_COM_FORMATO_INVALIDO.each do |quantia|
327
+ QUANTIA_COM_FORMATO_INVALIDO.each do |quantia|
328
328
  assert_raise DinheiroInvalidoError, "Deveria ter rejeitado [#{quantia}]" do
329
329
  Dinheiro.new quantia
330
330
  end
331
331
  end
332
332
  end
333
-
333
+
334
334
  # + (soma)
335
335
  def testa_soma
336
336
  SOMA.each{ |esperado, soma| assert_equal esperado, soma }
337
- end
338
-
337
+ end
338
+
339
339
  # - (subtracao)
340
340
  def testa_subtracao
341
341
  SUBTRACAO.each { |esperado, subtracao| assert_equal esperado, subtracao }
342
342
  end
343
-
343
+
344
344
  # * (multiplicacao)
345
345
  def testa_multiplicacao
346
- MULTIPLICACAO.each { |esperado, multiplicacao| assert_equal esperado, multiplicacao }
346
+ MULTIPLICACAO.each { |esperado, multiplicacao| assert_equal esperado, multiplicacao }
347
347
  end
348
-
348
+
349
349
  # quantia_de
350
350
  def testa_quantia_de
351
351
  assert_equal 0, @dinheiro.quantia_de(0.real)
@@ -384,39 +384,39 @@ class DinheiroTest < Test::Unit::TestCase
384
384
  assert_equal 2.30, 2.30.real.to_f
385
385
  assert_equal 1000, 1000.real.to_f
386
386
  end
387
-
387
+
388
388
  # quantia_respeita_formato?
389
389
  def testa_se_quantia_respeita_formato
390
390
  QUANTIA_COM_FORMATO_VALIDO.each { |quantia| verifica_se_quantia_respeita_formato quantia }
391
391
  end
392
-
392
+
393
393
  # >, <, == (ordenacao)
394
394
  def testa_comparacao_entre_dinheiro
395
395
  COMPARACAO.each { |comparacao| assert comparacao }
396
396
  end
397
-
397
+
398
398
  def testa_comparacao_entre_possivel_dinheiro
399
399
  COMPARACAO_COM_ESCALAR.each { |comparacao_com_escalar| assert comparacao_com_escalar }
400
400
  end
401
-
401
+
402
402
  # decimal
403
403
  def testa_decimal_quando_todas_as_casas_estao_preenchidas
404
404
  verifica_decimal("12")
405
405
  end
406
-
406
+
407
407
  def testa_decimal_quando_apenas_uma_das_casas_esta_preenchida
408
408
  verifica_decimal("10", "1")
409
409
  end
410
-
410
+
411
411
  def testa_decimal_quando_nenhuma_das_casas_esta_preenchida
412
412
  verifica_decimal("00", "")
413
413
  end
414
-
414
+
415
415
  def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_tres_digitos
416
416
  verifica_se_transforma_em_string_corretamente "1.23", 123
417
417
  end
418
418
 
419
- def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_dois_digitos
419
+ def testa_se_transforma_em_string_que_represente_a_quantia_quando_tem_dois_digitos
420
420
  verifica_se_transforma_em_string_corretamente "0.12", 12
421
421
  end
422
422
 
@@ -425,20 +425,20 @@ class DinheiroTest < Test::Unit::TestCase
425
425
  end
426
426
 
427
427
  def testa_se_transforma_em_string_para_valores_especiais
428
- verifica_se_transforma_em_string_corretamente "-123112211.00", -12311221100
428
+ verifica_se_transforma_em_string_corretamente "-123112211.00", -12311221100
429
429
  end
430
430
 
431
431
  # parte_inteira
432
432
  def testa_parte_inteira
433
433
  PARTE_INTEIRA.each { |quantia| assert_equal "#{quantia}", Dinheiro.new(quantia).parte_inteira }
434
434
  end
435
-
435
+
436
436
  def testa_se_arredonda_valores_corretamente
437
- ARREDONDAMENTO.each do |esperado, quantia|
437
+ ARREDONDAMENTO.each do |esperado, quantia|
438
438
  assert_equal esperado, Dinheiro.new(quantia).quantia, "Deveria retornar #{esperado} para #{quantia}"
439
439
  end
440
440
  end
441
-
441
+
442
442
  def testa_se_valor_decimal_cria_o_big_decimal_corretamente
443
443
  assert_equal BigDecimal.new("1234.56"), Dinheiro.new("1234,56").valor_decimal
444
444
  end
@@ -446,33 +446,33 @@ class DinheiroTest < Test::Unit::TestCase
446
446
  def testa_soma_de_dinheiro_com_big_decimal
447
447
  assert_equal Dinheiro.new(200), BigDecimal.new("100").reais + "100".reais
448
448
  end
449
-
449
+
450
450
  def testa_zero_quando_eh_zero
451
451
  assert Dinheiro.new(0).zero?
452
452
  end
453
-
453
+
454
454
  def testa_zero_quando_nao_eh_zero
455
455
  assert !Dinheiro.new(1).zero?
456
456
  end
457
-
457
+
458
458
  private
459
-
459
+
460
460
  def verifica_se_transforma_em_string_corretamente(quantia_esperada, quantia)
461
461
  assert_equal quantia_esperada, @dinheiro.transforma_em_string_que_represente_a_quantia(quantia)
462
462
  end
463
-
463
+
464
464
  def verifica_decimal(esperado, quantia = esperado)
465
465
  assert_equal esperado, @dinheiro.decimal("." + quantia)
466
466
  assert_equal esperado, @dinheiro.decimal("," + quantia)
467
467
  assert_equal esperado, @dinheiro.decimal(quantia) if quantia.blank?
468
468
  end
469
-
469
+
470
470
  def verifica_se_quantia_respeita_formato(quantia)
471
- formatos_validos(quantia).each do |quantia_str|
471
+ formatos_validos(quantia).each do |quantia_str|
472
472
  assert 1.real.quantia_respeita_formato?(quantia_str), "O sistema deveria considerar o quantia '#{quantia_str}' dentro do formato valido."
473
473
  end
474
474
  end
475
-
475
+
476
476
  def formatos_validos(quantia)
477
477
  formatos_validos = []
478
478
  quantias_validas(quantia).each do |quantia|
@@ -485,14 +485,14 @@ class DinheiroTest < Test::Unit::TestCase
485
485
  end
486
486
  formatos_validos
487
487
  end
488
-
488
+
489
489
  def quantias_validas(quantia)
490
490
  return [quantia] if [ ".", "," ].include?(quantia[0..0])
491
491
  [ quantia, "-#{quantia}" ]
492
492
  end
493
-
493
+
494
494
  def verifica_se_cria_dinheiro_para(quantia)
495
495
  assert quantia.para_dinheiro.kind_of?(Dinheiro)
496
496
  end
497
-
497
+
498
498
  end
@@ -1,29 +1,29 @@
1
1
  require File.dirname(__FILE__) + '/test_helper'
2
2
 
3
3
  class NilClassTest < Test::Unit::TestCase
4
-
4
+
5
5
  def test_real
6
6
  assert_equal Dinheiro.new(0), nil.real
7
7
  end
8
-
8
+
9
9
  def test_reais
10
10
  assert_equal Dinheiro.new(0), nil.reais
11
11
  end
12
-
12
+
13
13
  def test_para_dinheiro
14
14
  assert_equal Dinheiro.new(0), nil.para_dinheiro
15
15
  end
16
-
16
+
17
17
  def test_valor
18
18
  assert_equal Dinheiro.new(0), nil.valor
19
19
  end
20
-
20
+
21
21
  def test_contabil
22
22
  assert_equal "0,00", nil.contabil
23
23
  end
24
-
25
-
26
-
27
-
28
-
24
+
25
+
26
+
27
+
28
+
29
29
  end
metadata CHANGED
@@ -1,8 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brdinheiro
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 3.0.4
4
+ prerelease: false
5
+ segments:
6
+ - 3
7
+ - 0
8
+ - 5
9
+ version: 3.0.5
6
10
  platform: ruby
7
11
  authors:
8
12
  - "Marcos Tapaj\xC3\xB3s"
@@ -16,52 +20,66 @@ autorequire:
16
20
  bindir: bin
17
21
  cert_chain: []
18
22
 
19
- date: 2011-03-01 00:00:00 -03:00
23
+ date: 2012-01-02 00:00:00 -02:00
20
24
  default_executable:
21
25
  dependencies:
22
26
  - !ruby/object:Gem::Dependency
23
27
  name: actionpack
24
- prerelease: false
25
28
  requirement: &id001 !ruby/object:Gem::Requirement
26
29
  none: false
27
30
  requirements:
28
31
  - - ">="
29
32
  - !ruby/object:Gem::Version
33
+ segments:
34
+ - 3
35
+ - 0
36
+ - 0
30
37
  version: 3.0.0
31
38
  type: :runtime
39
+ prerelease: false
32
40
  version_requirements: *id001
33
41
  - !ruby/object:Gem::Dependency
34
42
  name: activerecord
35
- prerelease: false
36
43
  requirement: &id002 !ruby/object:Gem::Requirement
37
44
  none: false
38
45
  requirements:
39
46
  - - ">="
40
47
  - !ruby/object:Gem::Version
48
+ segments:
49
+ - 3
50
+ - 0
51
+ - 0
41
52
  version: 3.0.0
42
53
  type: :runtime
54
+ prerelease: false
43
55
  version_requirements: *id002
44
56
  - !ruby/object:Gem::Dependency
45
57
  name: brnumeros
46
- prerelease: false
47
58
  requirement: &id003 !ruby/object:Gem::Requirement
48
59
  none: false
49
60
  requirements:
50
61
  - - "="
51
62
  - !ruby/object:Gem::Version
52
- version: 3.0.4
63
+ segments:
64
+ - 3
65
+ - 0
66
+ - 5
67
+ version: 3.0.5
53
68
  type: :runtime
69
+ prerelease: false
54
70
  version_requirements: *id003
55
71
  - !ruby/object:Gem::Dependency
56
72
  name: rake
57
- prerelease: false
58
73
  requirement: &id004 !ruby/object:Gem::Requirement
59
74
  none: false
60
75
  requirements:
61
76
  - - ">="
62
77
  - !ruby/object:Gem::Version
78
+ segments:
79
+ - 0
63
80
  version: "0"
64
81
  type: :development
82
+ prerelease: false
65
83
  version_requirements: *id004
66
84
  description: "brdinheiro \xC3\xA9 uma das gems que compoem o Brazilian Rails"
67
85
  email:
@@ -110,17 +128,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
128
  requirements:
111
129
  - - ">="
112
130
  - !ruby/object:Gem::Version
131
+ hash: -3233565507204023944
132
+ segments:
133
+ - 0
113
134
  version: "0"
114
135
  required_rubygems_version: !ruby/object:Gem::Requirement
115
136
  none: false
116
137
  requirements:
117
138
  - - ">="
118
139
  - !ruby/object:Gem::Version
140
+ hash: -3233565507204023944
141
+ segments:
142
+ - 0
119
143
  version: "0"
120
144
  requirements:
121
145
  - brnumeros
122
146
  rubyforge_project: brdinheiro
123
- rubygems_version: 1.5.2
147
+ rubygems_version: 1.3.7
124
148
  signing_key:
125
149
  specification_version: 3
126
150
  summary: "brdinheiro \xC3\xA9 uma das gems que compoem o Brazilian Rails"