UNPKG

werewolf-core

Version:

Are you a WEREWOLF?

564 lines (563 loc) 20.4 kB
"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', }]); }); }); }); });