2017-02-06 21:46:55 +00:00
|
|
|
/// <reference path="effects/BaseEffect.ts" />
|
|
|
|
|
2017-02-09 00:00:35 +00:00
|
|
|
module TS.SpaceTac {
|
2017-02-06 21:46:55 +00:00
|
|
|
/**
|
|
|
|
* Fake effect to capture apply requests
|
|
|
|
*/
|
|
|
|
class FakeEffect extends BaseEffect {
|
|
|
|
applied: Ship[] = []
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
super("fake");
|
|
|
|
}
|
|
|
|
|
|
|
|
applyOnShip(ship: Ship): boolean {
|
|
|
|
this.applied.push(ship);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
getApplyCalls() {
|
|
|
|
let result = acopy(this.applied);
|
|
|
|
this.applied = [];
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function newTestDrone(x: number, y: number, radius: number, owner: Ship): [Drone, FakeEffect] {
|
|
|
|
let drone = new Drone(owner);
|
|
|
|
drone.x = x;
|
|
|
|
drone.y = y;
|
|
|
|
drone.radius = radius;
|
|
|
|
let effect = new FakeEffect();
|
|
|
|
drone.effects.push(effect);
|
|
|
|
return [drone, effect];
|
|
|
|
}
|
|
|
|
|
|
|
|
describe("Drone", function () {
|
|
|
|
it("applies effects on deployment", function () {
|
|
|
|
let ship1 = new Ship(null, "ship1");
|
|
|
|
ship1.setArenaPosition(0, 0);
|
|
|
|
let ship2 = new Ship(null, "ship2");
|
|
|
|
ship2.setArenaPosition(5, 5);
|
|
|
|
let ship3 = new Ship(null, "ship3");
|
|
|
|
ship3.setArenaPosition(10, 10);
|
|
|
|
let [drone, effect] = newTestDrone(2, 2, 8, ship1);
|
|
|
|
|
|
|
|
expect(effect.getApplyCalls()).toEqual([]);
|
|
|
|
|
|
|
|
drone.onDeploy([ship1, ship2, ship3]);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([ship1, ship2]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("applies effects on ships entering the radius", function () {
|
|
|
|
let owner = new Ship(null, "owner");
|
|
|
|
let target = new Ship(null, "target");
|
|
|
|
target.setArenaPosition(10, 10);
|
|
|
|
let [drone, effect] = newTestDrone(0, 0, 5, owner);
|
|
|
|
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "initial");
|
|
|
|
|
|
|
|
drone.onTurnStart(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "turn start");
|
|
|
|
|
|
|
|
target.setArenaPosition(2, 3);
|
|
|
|
drone.onShipMove(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([target], "enter");
|
|
|
|
|
|
|
|
target.setArenaPosition(1, 1);
|
|
|
|
drone.onShipMove(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "move inside");
|
|
|
|
|
|
|
|
target.setArenaPosition(12, 12);
|
|
|
|
drone.onShipMove(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "exit");
|
|
|
|
|
|
|
|
target.setArenaPosition(1, 1);
|
|
|
|
drone.onShipMove(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([target], "re-enter");
|
|
|
|
});
|
|
|
|
|
|
|
|
it("applies effects on ships remaining in the radius", function () {
|
|
|
|
let owner = new Ship(null, "owner");
|
|
|
|
let target = new Ship(null, "target");
|
|
|
|
let [drone, effect] = newTestDrone(0, 0, 5, owner);
|
|
|
|
|
|
|
|
target.setArenaPosition(1, 2);
|
|
|
|
drone.onTurnStart(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "start inside");
|
|
|
|
|
|
|
|
target.setArenaPosition(2, 2);
|
|
|
|
drone.onShipMove(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "move inside");
|
|
|
|
|
|
|
|
drone.onTurnEnd(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([target], "turn end");
|
|
|
|
|
|
|
|
drone.onTurnStart(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "second turn start");
|
|
|
|
|
|
|
|
target.setArenaPosition(12, 12);
|
|
|
|
drone.onShipMove(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "move out");
|
|
|
|
|
|
|
|
drone.onTurnEnd(target);
|
|
|
|
expect(effect.getApplyCalls()).toEqual([], "second turn end");
|
|
|
|
});
|
|
|
|
|
|
|
|
it("signals the need for destruction after its lifetime", function () {
|
|
|
|
let owner = new Ship(null, "owner");
|
|
|
|
let other = new Ship(null, "other");
|
|
|
|
let [drone, effect] = newTestDrone(0, 0, 5, owner);
|
|
|
|
drone.duration = 2;
|
|
|
|
|
2017-02-08 18:54:02 +00:00
|
|
|
let battle = new Battle();
|
|
|
|
spyOn(owner, "getBattle").and.returnValue(battle);
|
|
|
|
let removeDrone = spyOn(battle, "removeDrone").and.callThrough();
|
|
|
|
|
|
|
|
drone.onTurnStart(other);
|
|
|
|
expect(removeDrone).not.toHaveBeenCalled();
|
|
|
|
drone.onTurnStart(owner);
|
|
|
|
expect(removeDrone).not.toHaveBeenCalled();
|
|
|
|
drone.onTurnStart(other);
|
|
|
|
expect(removeDrone).not.toHaveBeenCalled();
|
|
|
|
drone.onTurnStart(owner);
|
|
|
|
expect(removeDrone).toHaveBeenCalledWith(drone);
|
2017-02-06 21:46:55 +00:00
|
|
|
});
|
2017-02-15 21:15:31 +00:00
|
|
|
|
|
|
|
it("logs each activation", function () {
|
|
|
|
let battle = new Battle();
|
|
|
|
let ship = new Ship();
|
|
|
|
ship.fleet.setBattle(battle);
|
|
|
|
let other = new Ship();
|
|
|
|
|
|
|
|
let drone = new Drone(ship);
|
|
|
|
drone.apply([ship, other]);
|
|
|
|
drone.apply([]);
|
|
|
|
drone.apply([other]);
|
|
|
|
|
|
|
|
expect(battle.log.events).toEqual([
|
|
|
|
new DroneAppliedEvent(drone, [ship, other]),
|
|
|
|
new DroneAppliedEvent(drone, [other])
|
|
|
|
]);
|
|
|
|
});
|
2017-02-06 21:46:55 +00:00
|
|
|
});
|
|
|
|
}
|