behaviortree
Version:
A JavaScript implementation of Behavior Trees. They are useful for implementing AIs. For Browsers and NodeJS.
98 lines (97 loc) • 4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("./constants");
const Random_1 = __importDefault(require("./Random"));
const Task_1 = __importDefault(require("./Task"));
describe('Random', () => {
const task1 = new Task_1.default({
run: function (blackboard) {
blackboard.callStack.push('task1');
++blackboard.count;
return blackboard.result;
}
});
const task2 = new Task_1.default({
run: function (blackboard) {
blackboard.callStack.push('task2');
++blackboard.count;
return blackboard.result;
}
});
const task3 = new Task_1.default({
run: function (blackboard) {
blackboard.callStack.push('task3');
++blackboard.count;
return blackboard.result;
}
});
let blackboard;
beforeEach(() => {
blackboard = {
callStack: [],
count: 0,
result: constants_1.SUCCESS
};
});
it('chooses one node per random and runs that', () => {
const random = new Random_1.default({
nodes: [task1, task2, task3]
});
random.run(blackboard);
expect(blackboard.count).toEqual(1);
});
it('returns the value of the called task', () => {
const random = new Random_1.default({
nodes: [task1, task2, task3]
});
blackboard.result = constants_1.SUCCESS;
expect(random.run(blackboard)).toEqual(constants_1.SUCCESS);
blackboard.result = constants_1.FAILURE;
expect(random.run(blackboard)).toEqual(constants_1.FAILURE);
blackboard.result = constants_1.RUNNING;
const result = random.run(blackboard);
expect(result.total).toEqual(constants_1.RUNNING);
expect(result.state.reduce((acc, state) => (state === constants_1.RUNNING ? acc + 1 : acc), 0)).toEqual(1);
expect(result.state.reduce((acc, state) => (state === undefined ? acc + 1 : acc), 0)).toEqual(2);
});
it('calls the the same task all over again when it is running', () => {
const random = new Random_1.default({
nodes: [task1, task2, task3]
});
blackboard.result = constants_1.RUNNING;
const lastRun = { total: constants_1.RUNNING, state: [undefined, undefined, constants_1.RUNNING] };
random.run(blackboard, { lastRun, rerun: true });
random.run(blackboard, { lastRun, rerun: true });
random.run(blackboard, { lastRun, rerun: true });
expect(blackboard.callStack[0]).toEqual('task3');
expect(blackboard.callStack[1]).toEqual('task3');
expect(blackboard.callStack[2]).toEqual('task3');
});
it('does not call start on rerunning running task', () => {
blackboard.start = 0;
blackboard.end = 0;
const random = new Random_1.default({
start: function (blackboard) {
++blackboard.start;
},
end: function (blackboard) {
++blackboard.end;
},
nodes: [task1, task2, task3]
});
blackboard.result = constants_1.RUNNING;
random.run(blackboard);
expect(blackboard.start).toEqual(1);
expect(blackboard.end).toEqual(0);
random.run(blackboard, { lastRun: { total: constants_1.RUNNING, state: [undefined, undefined, constants_1.RUNNING] }, rerun: true });
expect(blackboard.start).toEqual(1);
expect(blackboard.end).toEqual(0);
blackboard.result = constants_1.FAILURE;
random.run(blackboard, { lastRun: { total: constants_1.RUNNING, state: [undefined, undefined, constants_1.RUNNING] }, rerun: true });
expect(blackboard.start).toEqual(1);
expect(blackboard.end).toEqual(1);
});
});