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 Soldiery añade dos métodos attack() y receiveDamage().
- debe recibir 2 argumentos (health & strength)
- debe recibir la propiedad
healthcomo 1er argumento - debe recibir la propiedad
strengthcomo 2nd argumento
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strengthdelSoldier
- 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().
Vikingdebe extender de la claseSoldier
- debe recibir 3 argumentos (name, health & strength)
- debe recibir la propiedad
namecomo 1er argumento - debe recibir la propiedad
healthcomo 2nd argumento - debe recibir la propiedad
strengthcomo 3er argumento
(Se hereda de Soldier, no necesita reimplementación.)
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strengthdelViking
(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
Vikingtodavía está vivo, debería devolver "NAME has received DAMAGE points of damage" - si el
Vikingmuere, 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().
Saxondebe extender deSoldier
- debe recibir 2 argumentos (health & strength)
- debe recibir la propiedad
healthcomo 1er argumento - debe recibir la propiedad
strengthcomo 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
strengthdelSoldier
- should be a function
- should receive 1 argument (the damage)
- should remove the received damage from the
healthproperty
(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
Vikingrecibido 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
Saxonrecibido 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()deSaxonsea igual astrengthde unViking - debe eliminar los saxones muertos del ejército.
- debe retornar el resultado de llamar a
receiveDamage()deSaxonconstrengthdeViking
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()deVikingsea igual astrengthde unSaxon - debe eliminar los vikingos muertos del ejército.
- debe retornar el resultado de llamar a
receiveDamage()deVikingconstrengthdeSaxon
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
Saxonestá vacío, devolverá "Vikings have won the war of the century!" - Si el array de
Vikingestá vacío, devolverá "Saxons have fought for their lives and survive another day..." - Si hay al menos 1
Vikingy 1Saxon, devolverá "Vikings and Saxons are still in the thick of battle."

