werewolf-core
Version:
Are you a WEREWOLF?
564 lines (563 loc) • 20.4 kB
JavaScript
"use strict";
var init_game_1 = require('./init-game');
var field_1 = require('../../core/field');
var effect = require('../../core/effect');
var log = require('../../core/log');
var events = require('../../core/event');
var votebox = require('../../core/lib/votebox');
var count = require('../../core/lib/count');
var diereason = require('../../core/lib/diereason');
var team = require('../../core/lib/team');
describe('Events', function () {
var game;
var pi;
var rule = init_game_1.makeRule();
var initPlayer = function (obj) { return pi.initPlayer(obj); };
var eventMonitor = function (game, ev, handler) {
game.loadRuleProducers([(_a = {},
_a[ev] = [{
priority: 1e6,
handler: handler,
}],
_a
)]);
var _a;
};
var getModifiableField = function (game) { return game.field; };
var getModifiablePlayer = function (game, id) { return game.players.get(id); };
var getModifiableEffects = function (game) { return game.effects; };
beforeEach(function () {
game = init_game_1.initGame(field_1.initField(rule));
pi = init_game_1.getPlayerInitiator();
});
describe('Choice Events', function () {
it('EVENT_OPENCHOICE', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.runEvent(events.initOpenChoiceEvent({
on: 'id1',
kind: 'foooo',
options: [{
label: 'あいう',
label_kind: 'string',
value: 'aiu',
}, {
label: '吉野家',
label_kind: 'string',
value: 'yoshinoya',
}],
}));
var efs = game.getEffects();
expect(efs.length).toBe(1);
var e = efs.get(0);
expect(e.type).toBe(effect.EFFECT_CHOICE);
expect('string' === typeof e.id).toBe(true);
expect(e.choice_kind).toBe('foooo');
expect(e.options).toEqual([{
label: 'あいう',
label_kind: 'string',
value: 'aiu',
}, {
label: '吉野家',
label_kind: 'string',
value: 'yoshinoya',
}]);
expect(e.value).toBe(undefined);
});
it('EVENT_CHOICE', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id2',
type: 'TODO',
}));
var ef = effect.initChoiceEffect('id1', 'foo.kind', [{
label: 'あいう',
label_kind: 'string',
value: 'aiu',
}, {
label: '吉野家',
label_kind: 'string',
value: 'yoshinoya',
}]);
game.addEffect(ef);
var efid = ef.id;
game.runEvent(events.initChoiceEvent({
from: 'id1',
choice_id: efid,
value: 'yoshinoya',
}));
expect(game.getEffects().get(efid).value).toBe('yoshinoya');
});
});
describe('Pull logs', function () {
it('initPullLogsEvent', function () {
expect(events.initPullLogsEvent()).toEqual({
type: events.EVENT_PULL_LOGS,
logs: [],
});
});
it('EVENT_PULL_LOGS deletes remaining logs', function () {
var f = getModifiableField(game);
var l = log.initLogPhaseTransition(1, 'day');
f.logs.push(l);
game.runEvent(events.initPullLogsEvent());
var f2 = game.getField();
expect(f2.logs).toEqual([]);
});
it('EVENT_PULL_LOGS gets logs', function () {
var f = getModifiableField(game);
var l = log.initLogPhaseTransition(1, 'day');
f.logs.push(l);
var e = game.runEvent(events.initPullLogsEvent());
expect(e.logs).toEqual([l]);
});
});
describe('Phase Events', function () {
it('initNextPhaseEvent', function () {
expect(events.initNextPhaseEvent()).toEqual({
type: events.EVENT_NEXTPHASE,
});
});
it('initPhaseDayEvent', function () {
expect(events.initPhaseDayEvent()).toEqual({
type: events.EVENT_PHASE_DAY,
});
});
it('initPhaseNightEvent', function () {
expect(events.initPhaseNightEvent()).toEqual({
type: events.EVENT_PHASE_NIGHT,
});
});
it('EVENT_PHASE_DAY', function () {
game.runEvent(events.initPhaseDayEvent());
var f = game.getField();
expect(f.phase).toBe(field_1.PHASE_DAY);
expect(f.day).toBe(1);
expect(f.votebox).toEqual({});
expect(f.logs).toEqual([
{
type: log.LOG_PHASE_TRANSITION,
day: 1,
phase: 'day',
},
]);
});
it('EVENT_PHASE_NIGHT', function () {
game.runEvent(events.initPhaseNightEvent());
var f = game.getField();
expect(f.phase).toBe(field_1.PHASE_NIGHT);
expect(f.day).toBe(0);
expect(f.werewolfRemains).toBe(1);
expect(f.werewolfTarget).toEqual([]);
expect(f.logs).toEqual([
{
type: log.LOG_PHASE_TRANSITION,
day: 0,
phase: 'night',
},
]);
});
describe('EVENT_NEXTPHASE', function () {
it('start -> night', function () {
var flag = false;
eventMonitor(game, events.EVENT_PHASE_NIGHT, function () {
flag = true;
});
game.runEvent(events.initNextPhaseEvent());
expect(flag).toBe(true);
});
it('night -> day', function () {
var f = getModifiableField(game);
f.phase = field_1.PHASE_NIGHT;
f.day = 2;
var flag = 0;
eventMonitor(game, events.EVENT_PHASE_DAY, function () {
flag++;
});
eventMonitor(game, events.EVENT_MIDNIGHT, function () {
flag++;
});
game.runEvent(events.initNextPhaseEvent());
expect(flag).toBe(2);
});
it('day -> night', function () {
var f = getModifiableField(game);
f.phase = field_1.PHASE_DAY;
f.day = 2;
var flag = 0;
eventMonitor(game, events.EVENT_PHASE_NIGHT, function () {
flag++;
});
eventMonitor(game, events.EVENT_LYNCH, function () {
flag++;
});
game.runEvent(events.initNextPhaseEvent());
expect(flag).toBe(2);
});
});
});
describe('Voting Events', function () {
it('initVoteEvent', function () {
expect(events.initVoteEvent({
from: 'id1',
to: 'id2',
num: 2,
priority: 0,
})).toEqual({
type: events.EVENT_VOTE,
from: 'id1',
to: 'id2',
num: 2,
priority: 0,
});
});
it('EVENT_VOTE', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id2',
type: 'TODO',
}));
game.runEvent(events.initVoteEvent({
from: 'id1',
to: 'id2',
num: 1,
priority: 0,
}));
var v = game.getField().votebox;
expect(v).toEqual({
id1: {
from: 'id1',
to: 'id2',
num: 1,
priority: 0,
},
});
});
it('initChoiceEvent', function () {
expect(events.initChoiceEvent({
from: 'id1',
choice_id: 'foooo',
value: 'id2',
})).toEqual({
type: events.EVENT_CHOICE,
choice_id: 'foooo',
from: 'id1',
value: 'id2',
});
});
});
describe('Die Event', function () {
it('initDieEvent', function () {
expect(events.initDieEvent({
on: 'id1',
reason: 'foo',
})).toEqual({
type: events.EVENT_DIE,
on: 'id1',
reason: 'foo',
});
});
it('EVENT_DIE', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id2',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id3',
type: 'TODO',
}));
game.runEvent(events.initDieEvent({
on: 'id1',
reason: 'foo',
}));
expect(game.getPlayers().get('id1').dead).toBe(true);
expect(game.getPlayers().get('id1').dead_reason).toBe('foo');
expect(game.getPlayers().get('id2').dead).toBe(false);
expect(game.getPlayers().get('id3').dead).toBe(false);
});
it("EVENT_DIE don't override reason", function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.runEvent(events.initDieEvent({
on: 'id1',
reason: 'foo',
}));
game.runEvent(events.initDieEvent({
on: 'id1',
reason: 'bar',
}));
expect(game.getPlayers().get('id1').dead_reason).toBe('foo');
});
});
describe('Lynch Events', function () {
it('initLynchEvent', function () {
expect(events.initLynchEvent()).toEqual({
type: events.EVENT_LYNCH,
voteResult: undefined,
});
});
describe('EVENT_LYNCH', function () {
beforeEach(function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id2',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id3',
type: 'TODO',
}));
});
it('Lynch result is NONE', function () {
var e = game.runEvent(events.initLynchEvent());
expect(e.voteResult).toBe(votebox.VOTERESULT_NONE);
});
it('Lynch result is CHOSEN', function () {
game.runEvent(events.initVoteEvent({
from: 'id1',
to: 'id2',
num: 1,
priority: 0,
}));
game.runEvent(events.initVoteEvent({
from: 'id2',
to: 'id1',
num: 1,
priority: 0,
}));
game.runEvent(events.initVoteEvent({
from: 'id3',
to: 'id2',
num: 1,
priority: 0,
}));
var e = game.runEvent(events.initLynchEvent());
expect(e.voteResult).toBe(votebox.VOTERESULT_CHOSEN);
var p = game.getPlayers().get('id2');
expect(p.dead).toBe(true);
expect(p.dead_reason).toBe(diereason.LYNCH);
});
});
});
describe('Judge Event', function () {
beforeEach(function () {
game.loadPlayerProducers({
'Role1': (_a = {},
_a[events.EVENT_QUERY_COUNT] = [{
priority: 1,
handler: function (_a) {
var players = _a.players, ev = _a.event;
var ev2 = ev;
var pl = players.get(ev2.on);
if (pl && pl.type === 'Role1') {
ev2.count = count.COUNT_WEREWOLF;
}
},
}],
_a
),
});
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id2',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id3',
type: 'Role1',
}));
var _a;
});
it('JudgeEvent defaults to non-end', function () {
expect(events.initJudgeEvent()).toEqual({
type: events.EVENT_JUDGE,
end: false,
draw: false,
result: undefined,
});
});
it('no end', function () {
var e = game.runEvent(events.initJudgeEvent());
expect(e.end).toBe(false);
});
it('Human wins', function () {
game.runEvent(events.initDieEvent({
on: 'id3',
reason: 'TODO',
}));
var e = game.runEvent(events.initJudgeEvent());
expect(e.end).toBe(true);
expect(e.draw).toBe(false);
expect(e.result).toBe(team.TEAM_HUMAN);
});
it('Werewolf wins', function () {
game.runEvent(events.initDieEvent({
on: 'id1',
reason: 'TODO',
}));
var e = game.runEvent(events.initJudgeEvent());
expect(e.end).toBe(true);
expect(e.draw).toBe(false);
expect(e.result).toBe(team.TEAM_WEREWOLF);
});
});
describe('Query Events', function () {
it('EVENT_QUERY_COUNT defaults to human', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
var e = game.runEvent(events.initQueryCountEvent('id1'));
expect(e.count).toBe(count.COUNT_HUMAN);
});
describe('EVENT_QUERY_VOTEDONE', function () {
beforeEach(function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addPlayer(initPlayer({
id: 'id2',
type: 'TODO',
}));
game.runEvent(events.initPhaseDayEvent());
});
it('result defaults to false', function () {
expect(events.initQueryVotedoneEvent('id1').result).toBe(false);
});
it('results false if not voted', function () {
var e = game.runEvent(events.initQueryVotedoneEvent('id1'));
expect(e.result).toBe(false);
});
it('result true if voted', function () {
game.runEvent(events.initVoteEvent({
from: 'id1',
to: 'id2',
num: 1,
priority: 0,
}));
var e = game.runEvent(events.initQueryVotedoneEvent('id1'));
expect(e.result).toBe(true);
});
});
});
describe('PlayerInfo', function () {
it('EVENT_QUERY_PLAYERINFO', function () {
expect(events.initQueryPlayerInfoEvent('id1')).toEqual({
type: events.EVENT_QUERY_PLAYERINFO,
on: 'id1',
result: {
id: 'id1',
roleDisp: undefined,
dead: undefined,
choices: [],
data: {},
},
});
});
it('Basic query result', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
var ev = game.runEvent(events.initQueryPlayerInfoEvent('id1'));
var i = ev.result;
expect(i.id).toBe('id1');
expect(i.roleDisp).toBe('TODO');
expect(i.dead).toBe(false);
expect(i.choices).toEqual([]);
});
it('deadness', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
var pl = getModifiablePlayer(game, 'id1');
pl.dead = true;
var ev = game.runEvent(events.initQueryPlayerInfoEvent('id1'));
var i = ev.result;
expect(i.dead).toBe(true);
});
describe('open choices', function () {
it('no choice', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addEffect(effect.initChoiceEffect('id1', 'foooo', [{
value: 'id1',
label: 'id1',
label_kind: 'player',
}, {
value: '吉野家',
label: '吉野家',
label_kind: 'string',
}]));
var result = game.runEvent(events.initQueryPlayerInfoEvent('id1')).result;
expect(result.choices).toEqual([{
kind: 'foooo',
options: [{
value: 'id1',
label: 'id1',
label_kind: 'player',
}, {
value: '吉野家',
label: '吉野家',
label_kind: 'string',
}],
value: undefined,
}]);
});
it('yes choice', function () {
game.addPlayer(initPlayer({
id: 'id1',
type: 'TODO',
}));
game.addEffect(effect.initChoiceEffect('id1', 'foooo', [{
value: 'id1',
label: 'id1',
label_kind: 'player',
}, {
value: '吉野家',
label: '吉野家',
label_kind: 'string',
}]));
getModifiableEffects(game).ofType(effect.EFFECT_CHOICE)[0].value = 'id1';
var result = game.runEvent(events.initQueryPlayerInfoEvent('id1')).result;
expect(result.choices).toEqual([{
kind: 'foooo',
options: [{
value: 'id1',
label: 'id1',
label_kind: 'player',
}, {
value: '吉野家',
label: '吉野家',
label_kind: 'string',
}],
value: 'id1',
}]);
});
});
});
});