blueshell
Version:
A Behavior Tree implementation in modern Javascript
124 lines • 4.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const lib_1 = require("../../lib");
class TestAction extends lib_1.Action {
constructor(name, result = lib_1.rc.SUCCESS) {
super(name);
this.result = result;
this.eventCount = 0;
}
onEvent(state, event) {
this.eventCount++;
return this.result;
}
}
describe('LatchedSwitch', function () {
it('executes the child of the first matching switch entry', function () {
const testAction0 = new TestAction('0');
const testAction1 = new TestAction('1');
const testAction2 = new TestAction('2');
const switchEntries = [
{
conditional: (state, event) => state.switchEntryIndex === 0,
child: testAction0,
},
{
conditional: (state, event) => state.switchEntryIndex === 1,
child: testAction1,
},
{
conditional: (state, event) => state.switchEntryIndex === 2,
child: testAction2,
},
];
const uut = new lib_1.LatchedSwitch('uut', switchEntries);
const state = {
__blueshell: {},
switchEntryIndex: 1,
};
const result = uut.handleEvent(state, 1);
chai_1.assert.strictEqual(result, lib_1.rc.SUCCESS);
chai_1.assert.strictEqual(testAction0.eventCount, 0);
chai_1.assert.strictEqual(testAction1.eventCount, 1);
chai_1.assert.strictEqual(testAction2.eventCount, 0);
});
it('assumes that a switchEntry with a missing condition always matches', function () {
const testAction0 = new TestAction('0');
const testAction1 = new TestAction('1');
const switchEntries = [
{
conditional: (state, event) => false,
child: testAction0,
},
{
child: testAction1,
},
];
const uut = new lib_1.LatchedSwitch('uut', switchEntries);
const state = {
__blueshell: {},
switchEntryIndex: 1,
};
const result = uut.handleEvent(state, 1);
chai_1.assert.strictEqual(result, lib_1.rc.SUCCESS);
chai_1.assert.strictEqual(testAction0.eventCount, 0);
chai_1.assert.strictEqual(testAction1.eventCount, 1);
});
it('returns the defaultResult when there are no matching switch entries', function () {
const switchEntries = [];
const uut = new lib_1.LatchedSwitch('uut', switchEntries, lib_1.rc.FAILURE);
const state = {
__blueshell: {},
switchEntryIndex: 1,
};
const result = uut.handleEvent(state, 1);
chai_1.assert.strictEqual(result, lib_1.rc.FAILURE);
});
it('defaults defaultResult to SUCCESS', function () {
const switchEntries = [];
const uut = new lib_1.LatchedSwitch('uut', switchEntries);
const state = {
__blueshell: {},
switchEntryIndex: 1,
};
const result = uut.handleEvent(state, 1);
chai_1.assert.strictEqual(result, lib_1.rc.SUCCESS);
});
it('latches', function () {
const testAction0 = new TestAction('0', lib_1.rc.RUNNING);
const testAction1 = new TestAction('1', lib_1.rc.RUNNING);
const testAction2 = new TestAction('2', lib_1.rc.RUNNING);
const switchEntries = [
{
conditional: (state, event) => state.switchEntryIndex === 0,
child: testAction0,
},
{
conditional: (state, event) => state.switchEntryIndex === 1,
child: testAction1,
},
{
conditional: (state, event) => state.switchEntryIndex === 2,
child: testAction2,
},
];
const uut = new lib_1.LatchedSwitch('uut', switchEntries);
const state = {
__blueshell: {},
switchEntryIndex: 1,
};
let result = uut.handleEvent(state, 1);
chai_1.assert.strictEqual(result, lib_1.rc.RUNNING);
chai_1.assert.strictEqual(testAction0.eventCount, 0);
chai_1.assert.strictEqual(testAction1.eventCount, 1);
chai_1.assert.strictEqual(testAction2.eventCount, 0);
state.switchEntryIndex = 0;
result = uut.handleEvent(state, 1);
chai_1.assert.strictEqual(result, lib_1.rc.RUNNING);
chai_1.assert.strictEqual(testAction0.eventCount, 0);
chai_1.assert.strictEqual(testAction1.eventCount, 2);
chai_1.assert.strictEqual(testAction2.eventCount, 0);
});
});
//# sourceMappingURL=LatchedSwitch.test.js.map