UNPKG

behaviortree

Version:

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

98 lines (97 loc) 4 kB
"use strict"; 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); }); });