blueshell
Version:
A Behavior Tree implementation in modern Javascript
100 lines • 4.04 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, sequence = [{ rc: lib_1.rc.SUCCESS, inc: true }]) {
super(name);
this.sequence = sequence;
this.eventCount = 0;
this.currentSequenceIdx = 0;
}
onEvent(state, event) {
this.eventCount++;
const sequenceEntry = this.sequence[this.currentSequenceIdx];
if (sequenceEntry.inc) {
state.counter++;
}
this.incrementCurrentResultSequenceIdx();
return sequenceEntry.rc;
}
incrementCurrentResultSequenceIdx() {
if (++this.currentSequenceIdx >= this.sequence.length) {
this.currentSequenceIdx = 0;
}
}
}
describe('While', function () {
it('executes the child action until condition is met and returns the child result', function () {
const testAction = new TestAction('testAction', [{ rc: lib_1.rc.FAILURE, inc: true }]);
const uut = new lib_1.decorators.While('uut', (state, event) => {
return state.counter < 1;
}, testAction);
const state = {
__blueshell: {},
counter: 0,
};
const result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.FAILURE, result);
chai_1.assert.strictEqual(state.counter, 1);
chai_1.assert.strictEqual(testAction.eventCount, 1);
});
it('returns defaultResult when the condition is already met', function () {
const testAction = new TestAction();
const uut = new lib_1.decorators.While('uut', (state, event) => {
return state.counter < 1;
}, testAction, lib_1.rc.FAILURE);
const state = {
__blueshell: {},
counter: 1,
};
const result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.FAILURE, result);
chai_1.assert.strictEqual(state.counter, 1);
chai_1.assert.strictEqual(testAction.eventCount, 0);
});
it('defaults defaultResult to SUCCESS', function () {
const testAction = new TestAction();
const uut = new lib_1.decorators.While('uut', (state, event) => {
return state.counter < 1;
}, testAction);
const state = {
__blueshell: {},
counter: 1,
};
const result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.SUCCESS, result);
chai_1.assert.strictEqual(state.counter, 1);
chai_1.assert.strictEqual(testAction.eventCount, 0);
});
it('latches', function () {
const testAction = new TestAction('testAction', [
{ rc: lib_1.rc.RUNNING, inc: true },
{ rc: lib_1.rc.SUCCESS, inc: false },
]);
const uut = new lib_1.decorators.While('uut', (state, event) => {
return state.counter < 3;
}, testAction);
const state = {
__blueshell: {},
counter: 0,
};
let result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.RUNNING, result);
chai_1.assert.strictEqual(state.counter, 1);
chai_1.assert.strictEqual(testAction.eventCount, 1);
result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.RUNNING, result);
chai_1.assert.strictEqual(state.counter, 2);
chai_1.assert.strictEqual(testAction.eventCount, 3);
result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.RUNNING, result);
chai_1.assert.strictEqual(state.counter, 3);
chai_1.assert.strictEqual(testAction.eventCount, 5);
result = uut.handleEvent(state, 0);
chai_1.assert.strictEqual(lib_1.rc.SUCCESS, result);
chai_1.assert.strictEqual(state.counter, 3);
chai_1.assert.strictEqual(testAction.eventCount, 6);
});
});
//# sourceMappingURL=While.test.js.map