UNPKG

behaviortree

Version:

A JavaScript implementation of Behavior Trees. They are useful for implementing AIs. For Browsers and NodeJS.

93 lines (92 loc) 4.05 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-env jest */ const sinon_1 = __importDefault(require("sinon")); const constants_1 = require("../constants"); const CooldownDecorator_1 = __importDefault(require("./CooldownDecorator")); const Task_1 = __importDefault(require("../Task")); describe('CooldownDecorator', () => { const task = new Task_1.default({ run(blackboard) { ++blackboard.count; return constants_1.SUCCESS; } }); const switchTask = new Task_1.default({ run(blackboard) { ++blackboard.count; return blackboard.switchResult; } }); let decoratedTask; let decoratedTask5sec; let decoratedSwitchTask; let blackboard; let clock; beforeEach(() => { clock = sinon_1.default.useFakeTimers(); blackboard = { count: 0 }; decoratedTask = new CooldownDecorator_1.default({ config: { cooldown: 3 }, node: task }); decoratedTask5sec = new CooldownDecorator_1.default({ config: { cooldown: 5 }, node: task }); decoratedSwitchTask = new CooldownDecorator_1.default({ config: { cooldown: 5 }, node: switchTask }); }); afterEach(() => { clock.restore(); }); it('has a nodeType', () => { expect(decoratedTask.nodeType).toEqual('CooldownDecorator'); }); it('calls the task on first call', () => { decoratedTask.run(blackboard); expect(blackboard.count).toEqual(1); }); it('needs cooldown seconds before task will be called again and returns FAILURE in the meantime', () => { expect(decoratedTask.run(blackboard)).toEqual(constants_1.SUCCESS); expect(blackboard.count).toEqual(1); expect(decoratedTask.run(blackboard)).toEqual(constants_1.FAILURE); expect(blackboard.count).toEqual(1); clock.tick(2999); expect(decoratedTask.run(blackboard)).toEqual(constants_1.FAILURE); expect(blackboard.count).toEqual(1); clock.tick(1); expect(decoratedTask.run(blackboard)).toEqual(constants_1.SUCCESS); expect(blackboard.count).toEqual(2); }); it('different cooldown tasks dont interfer with each other', () => { expect(decoratedTask.run(blackboard)).toEqual(constants_1.SUCCESS); expect(decoratedTask5sec.run(blackboard)).toEqual(constants_1.SUCCESS); expect(blackboard.count).toEqual(2); clock.tick(3000); expect(decoratedTask.run(blackboard)).toEqual(constants_1.SUCCESS); expect(decoratedTask5sec.run(blackboard)).toEqual(constants_1.FAILURE); expect(blackboard.count).toEqual(3); clock.tick(2000); expect(decoratedTask.run(blackboard)).toEqual(constants_1.FAILURE); expect(decoratedTask5sec.run(blackboard)).toEqual(constants_1.SUCCESS); expect(blackboard.count).toEqual(4); }); it('does not start cooldown as long as task is running', () => { blackboard.switchResult = constants_1.RUNNING; expect(decoratedSwitchTask.run(blackboard)).toEqual(constants_1.RUNNING); expect(blackboard.count).toEqual(1); clock.tick(100); expect(decoratedSwitchTask.run(blackboard)).toEqual(constants_1.RUNNING); expect(blackboard.count).toEqual(2); clock.tick(100); blackboard.switchResult = constants_1.SUCCESS; expect(decoratedSwitchTask.run(blackboard)).toEqual(constants_1.SUCCESS); expect(blackboard.count).toEqual(3); clock.tick(4900); blackboard.switchResult = constants_1.RUNNING; expect(decoratedSwitchTask.run(blackboard)).toEqual(constants_1.FAILURE); expect(blackboard.count).toEqual(3); clock.tick(100); expect(decoratedSwitchTask.run(blackboard)).toEqual(constants_1.RUNNING); expect(blackboard.count).toEqual(4); }); });