En este ejercicio tendrás que aplicar los conceptos de programación orientada a objetos y herencia con TypeScript a nuestros amigos vikingos.
- Fork del repositorio
- Clonado a tu repositorio
- Asegurate de utilizar las herramientas de desarrollo de OOP y herencia
- Una vez completado el ejercicio ejecuta los siguientes comandos:
git add .
git commit -m "done"
git push origin master
- Desde tu navegador crea un Pull Request
Trabajaremos con tests. Para ello ejecuta desde la consola npm test
Ejecuta los tests
Verás que no se ejecuta ninguno de los tests construidos. Abre el fichero tests/soldier.spec.ts
y descomenta la función test()
de las líneas 17-19:
describe("constructor function", function () {
test("should receive 2 arguments (health & strength)", function () {
expect(Soldier.length).toEqual(2);
});
// test("should receive the health property as its 1st argument", function () {
// expect(soldier.health).toEqual(health);
// });
// test("should receive the strength property as its 2nd argument", function () {
// expect(soldier.strength).toEqual(strength);
// });
});
Ahora el test (should receive 2 arguments (health & strength)) está fallando!!
Escribe el código
Ahora tienes que escribir el código correcto en el fichero src/soldier.ts
para pasar el test. El código que encontrarás es el siguiente:
// Soldier
class Soldier {}
En este caso, el test dice que Soldier constructor function should receive 2 arguments (health & strength), así que tienes que escribir el código correcto que pase el test. Implementa la función constructora de la clase Soldier
que reciba dos parámetros:
// Soldier
class Soldier{
constructor(healthArg, strengthArg) {}
}
Ejecuta todos los tests
Ahora que ya has pasado el primer test, descomenta el siguiente y sigue codificando para pasar los tests.
Haz lo mismo para el resto de ficheros de test: viking.spec.ts
, saxon.spec.ts
y war.spec.ts
, codificando en los ficheros viking.ts
, saxon.ts
y war.ts
respectivamente.
Modifica la clase Soldier
y añade dos métodos attack()
y receiveDamage()
.
- debe recibir 2 argumentos (health & strength)
- debe recibir la propiedad
health
como 1er argumento - debe recibir la propiedad
strength
como 2nd argumento
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strength
delSoldier
- debe ser una función
- debe recibir 1 argumento (-damage-)
- debe substraer el daño recibido de la propiedad
health
- no debe retornar nada
Un Viking
es un Soldier
con una propiedad adicional, su nombre (name
). Además tiene implementado el método receiveDamage()
de manera distinta y tiene un nuevo método: battleCry()
.
Modifica el constructor de la clase Viking
para que herede de la clase Soldier
, reimplementa el método receiveDamage()
dentro del Viking
, y añade el nuevo método battleCry()
.
Viking
debe extender de la claseSoldier
- debe recibir 3 argumentos (name, health & strength)
- debe recibir la propiedad
name
como 1er argumento - debe recibir la propiedad
health
como 2nd argumento - debe recibir la propiedad
strength
como 3er argumento
(Se hereda de Soldier
, no necesita reimplementación.)
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strength
delViking
(Este método necesita ser reimplementado para Viking
porque la versión Viking
devuelve valores diferentes.)
- debe ser una función
- debe recibir 1 argumento (-damage-)
- debe substraer el daño recibido de la propiedad
health
- no debe retornar nada
- si el
Viking
todavía está vivo, debería devolver "NAME has received DAMAGE points of damage" - si el
Viking
muere, debe devolver "NAME has died in act of combat"
Puedes informarte sobre gritos de guerra, aquí.
- debe ser una función
- debe recibir 0 argumentos
- debe devolver "Odin Owns You All!"
Un Saxon
es una versión más débil de un Soldier
. Al contrario de un Viking
, el Saxon
no tiene nombre. Su método receiveDamage()
también es diferente de la versión de Soldier
.
Modifica el constructor de Saxon
, hazlo que extienda de Soldier
y reimplementa el método receiveDamage()
.
Saxon
debe extender deSoldier
- debe recibir 2 argumentos (health & strength)
- debe recibir la propiedad
health
como 1er argumento - debe recibir la propiedad
strength
como 2nd argumento
(Este método se hereda de Soldier
, no es necesario reimplementarlo)
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strength
delSoldier
- should be a function
- should receive 1 argument (the damage)
- should remove the received damage from the
health
property
(Este método necesita ser reimplementado porque la versión Saxon
necesita devolver valores diferentes.)
- debe ser una función
- debe recibir 1 argumento (-damage-)
- debe substraer el daño recibido de la propiedad
health
- si el Saxon está todavía vivo, debe devolver "A Saxon has received DAMAGE points of damage"
- si el Saxon muere, debe devolver "A Saxon has died in combat"
Ahora vamos al lío: la GUERRA. la clase War
debe servir para montar una batalla entre el ejército de Viking
y el ejército de Saxon
.
Modifica la clase War
y añade estos 5 métodos:
addViking()
addSaxon()
vikingAttack()
saxonAttack()
showStatus()
Cuando se cree War
, los ejércitos (armies) deben estar vacíos. Los soldados se añadirán a los ejercitos con posterioridad
- debe recibir 0 argumentos
- debe asignar un array vacío a la propiedad
vikingArmy
- debe asignar un array vacío a la propiedad
saxonArmy
Añade 1 Viking
al vikingArmy
. Si quieres un ejercito de 10 Viking
, necesitarás llamar al método 10 veces.
- debe ser una función
- debe recibir 1 argumento (un objeto
Viking
) - debe añadir el
Viking
recibido al ejército - no devuelve nada
Es la versión Saxon
de addViking()
.
- debe ser una función
- debe recibir 1 argumento (un objeto
Saxon
) - debe añadir el
Saxon
recibido al ejército - no devuelve nada
Se invoca el método receiveDamage()
del Saxon
(elegido al azar) con un daño igual a la strength
de un Viking
(también elegido al azar). Sólo debe realizar un ataque y el Saxon
no debe contraatacar.
- debe ser una función
- debe recibir 0 argumentos
- debe hacer que
receiveDamage()
deSaxon
sea igual astrength
de unViking
- debe eliminar los saxones muertos del ejército.
- debe retornar el resultado de llamar a
receiveDamage()
deSaxon
constrength
deViking
La version Saxon
de vikingAttack()
. Un Viking
recibe daño igual a strength
de un Saxon
.
- debe ser una función
- debe recibir 0 argumentos
- debe hacer que
receiveDamage()
deViking
sea igual astrength
de unSaxon
- debe eliminar los vikingos muertos del ejército.
- debe retornar el resultado de llamar a
receiveDamage()
deViking
constrength
deSaxon
Devuelve el estado actual de la guerra (War
) basado en el tamaño de los ejércitos.
- debe ser una función
- debe recibir 0 arguments
- Si el array de
Saxon
está vacío, devolverá "Vikings have won the war of the century!" - Si el array de
Viking
está vacío, devolverá "Saxons have fought for their lives and survive another day..." - Si hay al menos 1
Viking
y 1Saxon
, devolverá "Vikings and Saxons are still in the thick of battle."