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
JavaScript
;
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);
});
});