/
refactoring.rb
176 lines (147 loc) · 5.34 KB
/
refactoring.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
class Filme
NORMAL = 0
LANCAMENTO = 1
INFANTIL = 2
attr_reader :titulo
attr_reader :codigo_de_preco
def initialize(titulo, codigo_de_preco)
@titulo, @codigo_de_preco = titulo, codigo_de_preco
end
end
class Aluguel
attr_reader :filme, :dias_aluguel
def initialize(filme, dias_aluguel)
@filme, @dias_aluguel = filme, dias_aluguel
end
end
class Cliente
attr_reader :nome
def initialize(nome)
@nome = nome
@alugueis = []
end
def insere_aluguel(arg)
@alugueis << arg
end
def recibo
valor_total, pontos_de_fidelidade = 0, 0
resultado = "Registro de Aluguel para #{@nome}\n"
@alugueis.each do |elemento|
este_valor = 0.0
# determina valores para cada item
case elemento.filme.codigo_de_preco
when Filme::NORMAL
este_valor += 2
este_valor += (elemento.dias_aluguel - 2) * 1.5 if elemento.dias_aluguel > 2
when Filme::LANCAMENTO
este_valor += elemento.dias_aluguel * 3
when Filme::INFANTIL
este_valor += 1.5
este_valor += (elemento.dias_aluguel - 3) * 1.5 if elemento.dias_aluguel > 3
end
# adiciona pontos de fidelidade
pontos_de_fidelidade += 1
# adiciona bonus para um aluguel de dois dias de lancamento
if elemento.filme.codigo_de_preco == Filme::LANCAMENTO && elemento.dias_aluguel > 1
pontos_de_fidelidade += 1
end
# exibe valor para este aluguel
resultado += "\t" + elemento.filme.titulo + "\t" + este_valor.to_s + "\n"
valor_total += este_valor
end
# adiciona rodape
resultado += "Valor devido: #{valor_total}\n"
resultado += "Voce ganhou #{pontos_de_fidelidade} pontos de fidelidade"
resultado
end
end
require "test/unit"
class AluguelDeFilmeTest < Test::Unit::TestCase
THE_HULK = Filme.new('The Hulk', Filme::INFANTIL);
IRON_MAN = Filme.new('Iron Man 4', Filme::LANCAMENTO);
SPIDER_MAN = Filme.new('Spiderman', Filme::NORMAL);
CLIENTE = Cliente.new('fred')
def setup
@cliente = Cliente.new('fred')
end
def test_aluguel_infantil_basico
@cliente.insere_aluguel(Aluguel.new(THE_HULK, 2));
assert_equal "Registro de Aluguel para fred\n" +
"\tThe Hulk\t1.5\n" +
"Valor devido: 1.5\n" +
"Voce ganhou 1 pontos de fidelidade", @cliente.recibo
end
def test_deve_descontar_aluguel_infantil
@cliente.insere_aluguel(Aluguel.new(THE_HULK, 4));
assert_equal "Registro de Aluguel para fred\n" +
"\tThe Hulk\t3.0\n" +
"Valor devido: 3.0\n" +
"Voce ganhou 1 pontos de fidelidade", @cliente.recibo
end
def test_aluguel_lancamento_basico
@cliente.insere_aluguel(Aluguel.new(IRON_MAN, 1));
assert_equal "Registro de Aluguel para fred\n" +
"\tIron Man 4\t3.0\n" +
"Valor devido: 3.0\n" +
"Voce ganhou 1 pontos de fidelidade", @cliente.recibo
end
def test_nao_deve_descontar_aluguel_lancamento_mas_dar_pontos_de_fidelidade
@cliente.insere_aluguel(Aluguel.new(IRON_MAN, 4));
assert_equal "Registro de Aluguel para fred\n" +
"\tIron Man 4\t12.0\n" +
"Valor devido: 12.0\n" +
"Voce ganhou 2 pontos de fidelidade", @cliente.recibo
end
def test_aluguel_normal_basico
@cliente.insere_aluguel(Aluguel.new(SPIDER_MAN, 2));
assert_equal "Registro de Aluguel para fred\n" +
"\tSpiderman\t2.0\n" +
"Valor devido: 2.0\n" +
"Voce ganhou 1 pontos de fidelidade", @cliente.recibo
end
def test_deve_descontar_aluguel_normal
@cliente.insere_aluguel(Aluguel.new(SPIDER_MAN, 4));
assert_equal "Registro de Aluguel para fred\n" +
"\tSpiderman\t5.0\n" +
"Valor devido: 5.0\n" +
"Voce ganhou 1 pontos de fidelidade", @cliente.recibo
end
def test_deve_somar_varios_alugueis
@cliente.insere_aluguel(Aluguel.new(THE_HULK, 2));
@cliente.insere_aluguel(Aluguel.new(SPIDER_MAN, 1));
@cliente.insere_aluguel(Aluguel.new(IRON_MAN, 3));
assert_equal "Registro de Aluguel para fred\n" +
"\tThe Hulk\t1.5\n" +
"\tSpiderman\t2.0\n" +
"\tIron Man 4\t9.0\n" +
"Valor devido: 12.5\n" +
"Voce ganhou 4 pontos de fidelidade", @cliente.recibo
end
def test_recibo_evolucao
cliente = Cliente.new('Chap')
filme1 = Filme.new('Joe Versus the Volcano', Filme::NORMAL)
aluguel1 = Aluguel.new(filme1, 5)
cliente.insere_aluguel(aluguel1)
assert_equal "Registro de Aluguel para Chap\n" +
"\tJoe Versus the Volcano\t6.5\n" +
"Valor devido: 6.5\n" +
"Voce ganhou 1 pontos de fidelidade", cliente.recibo
filme2 = Filme.new('Sleepless in Seattle', Filme::INFANTIL)
aluguel2 = Aluguel.new(filme2, 1)
cliente.insere_aluguel(aluguel2)
assert_equal "Registro de Aluguel para Chap\n" +
"\tJoe Versus the Volcano\t6.5\n" +
"\tSleepless in Seattle\t1.5\n" +
"Valor devido: 8.0\n" +
"Voce ganhou 2 pontos de fidelidade", cliente.recibo
filme3 = Filme.new('You\'ve Got Mail', Filme::LANCAMENTO)
aluguel3 = Aluguel.new(filme3, 15)
cliente.insere_aluguel(aluguel3)
assert_equal "Registro de Aluguel para Chap\n" +
"\tJoe Versus the Volcano\t6.5\n" +
"\tSleepless in Seattle\t1.5\n" +
"\tYou've Got Mail\t45.0\n" +
"Valor devido: 53.0\n" +
"Voce ganhou 4 pontos de fidelidade", cliente.recibo
end
end