-
Notifications
You must be signed in to change notification settings - Fork 1
/
clase_spec.rb
333 lines (247 loc) · 5.79 KB
/
clase_spec.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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
require 'rspec'
module Descansador
def descansar
self.energia += 10
end
end
#mixin Defensor
module Defensor
attr_accessor :energia, :potencial_defensivo
attr_accessor :interesados
def reducir_energia(energia_a_reducir)
self.energia = self.energia - energia_a_reducir
self.avisar_interesados
end
def add_interesado(interesado)
self.interesados << interesado
end
def interesados
@interesados = @interesados || []
@interesados
end
def avisar_interesados
self.interesados.each do |interesado|
interesado.call(self)
end
end
end
#mixin Atacante
module Atacante
def ataca_a(defensor)
if self.puede_atacar_a defensor
defensor.reducir_energia (self.potencial_ofensivo_efectivo -
defensor.potencial_defensivo)
end
end
def puede_atacar_a(guerrero)
self.potencial_ofensivo_efectivo > guerrero.potencial_defensivo
end
def potencial_ofensivo_efectivo
self.potencial_ofensivo
end
def potencial_ofensivo
raise 'mixin_self_requirement'
end
end
module DobleAtaque
include Atacante
attr_accessor :esta_descansado
def descansar
self.esta_descansado = true
end
def ataca_a(defensor)
super
self.esta_descansado = false
end
def potencial_ofensivo_efectivo
super * (self.esta_descansado ? 2 : 1)
end
end
class Muralla
include Descansador
include Defensor
def initialize
self.energia = 200
self.potencial_defensivo= 20
end
end
class Misil
include DobleAtaque
def potencial_ofensivo
100
end
end
#Defensor
# ^
# |
#Atacante
# ^
# |
#Guerrero
class Guerrero
include Defensor
include DobleAtaque
alias :descansar_atacar :descansar
include Descansador
alias :descansar_defensor :descansar
attr_accessor :potencial_ofensivo
def initialize
self.energia = 100
self.potencial_ofensivo= 30
self.potencial_defensivo= 20
end
def descansar
self.descansar_defensor
self.descansar_atacar
end
end
class Espadachin < Guerrero
attr_accessor :habilidad, :potencial_ofensivo_espada
def initialize
super
self.habilidad = 1
self.potencial_ofensivo_espada= 20
end
def potencial_ofensivo
super + self.potencial_ofensivo_espada * self.habilidad
end
end
class Ejercito
attr_accessor :unidades, :estrategia_defensiva
attr_accessor :se_retira
def self.new_ejercito_cagon
ejercito = Ejercito.new
ejercito.estrategia_defensiva = lambda {
|unidad, ejercito|
ejercito.se_retira = true
}
ejercito
end
def self.new_ejercito_protector
ejercito = Ejercito.new
ejercito.estrategia_defensiva = proc {
|unidad, ejercito|
unidad.descansar
}
ejercito
end
def initialize
self.unidades = []
self.se_retira = false
end
def me_lastimaron(unidad)
estrategia_defensiva.call unidad, self
end
def add_unidad(unidad)
self.unidades << unidad
unidad.add_interesado(lambda {|unidad|
self.me_lastimaron(unidad)
})
end
end
class Mago
def curar(unidad)
end
def teletransportar(unidad)
end
end
describe 'Age of empires' do
it 'un defensor avisa al ejercito cuando es lastimado' do
ejercito = Ejercito.new_ejercito_protector
atila = Guerrero.new
conan = Guerrero.new
ejercito.add_unidad atila
conan.ataca_a atila
atila.esta_descansado.should == true
end
it 'quiero que un mago pueda curar tambien a una unidad' do
atila = Guerrero.new
conan = Guerrero.new
mago = Mago.new
atila.add_interesado(lambda {|unidad|
mago.curar(unidad)
}) # Curar
conan.add_interesado(lambda {|unidad|
mago.teletransportar(unidad)
}) # Teletransportar
conan.ataca_a atila
end
it 'el ejercito cagon se retira cuando lo atacan' do
ejercito = Ejercito.new_ejercito_cagon
ejercito.se_retira.should == false
atila = Guerrero.new
conan = Guerrero.new
ejercito.add_unidad atila
conan.ataca_a atila
ejercito.se_retira.should == true
end
it 'cuando la muralla descansa recupera energia' do
muralla = Muralla.new
energia_original = muralla.energia
muralla.descansar
muralla.energia.should == energia_original + 10
end
it 'misil ataca a atila descansado' do
#Un defensor empezo con 100 de energia
misil = Misil.new
atila = Guerrero.new
#
misil.descansar
misil.ataca_a atila
atila.energia.should == -80
misil.ataca_a atila
# Perdio 80 y no 180
atila.energia.should == -160
end
#Esto es un test
it 'conan ataca a atila' do
#Un defensor empezo con 100 de energia
atila = Guerrero.new
conan = Guerrero.new
#
conan.ataca_a atila
atila.energia.should == 90
end
it 'un guerrero ataca a otro descansado y hace las 2 cosas' do
#Un defensor empezo con 100 de energia
atila = Guerrero.new
conan = Guerrero.new
energia_original = conan.energia
conan.descansar
conan.ataca_a atila
conan.energia.should == energia_original + 10
atila.energia.should == 60
end
it 'espadachin ataca a atila' do
zorro = Espadachin.new
atila = Guerrero.new
zorro.ataca_a atila
atila.energia.should == 70
end
it 'atila ataca a muralla' do
atila = Guerrero.new
muralla = Muralla.new
atila.ataca_a muralla
muralla.energia.should == 190
end
it 'Muralla no deberia atacar a atila' do
muralla = Muralla.new
atila = Guerrero.new
expect {
muralla.ataca_a atila
}.to raise_error NoMethodError #DoesNotUnderstand ataca_a
end
it 'misil ataca a muralla' do
misil = Misil.new
muralla = Muralla.new
misil.ataca_a muralla
muralla.energia.should == 120
end
it 'misil no se puede defender' do
misil = Misil.new
atila = Guerrero.new
expect {
atila.ataca_a misil
}.to raise_error NoMethodError
end
end