Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: new nodes -- Predicate, SideEffect, and Success #97

Merged
merged 2 commits into from Mar 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions lib/index.ts
Expand Up @@ -3,6 +3,9 @@ export {Composite} from './nodes/Composite';
export {Decorator} from './nodes/Decorator';
export {Sequence} from './nodes/Sequence';
export {Selector} from './nodes/Selector';
export {Predicate} from './nodes/Predicate';
export {SideEffect} from './nodes/SideEffect';
export {Success} from './nodes/Success';
export {LatchedSelector} from './nodes/LatchedSelector';
export {LatchedSequence} from './nodes/LatchedSequence';
export {IfElse} from './nodes/IfElse';
Expand Down
2 changes: 1 addition & 1 deletion lib/nodes/LatchedSequence.ts
Expand Up @@ -15,6 +15,6 @@ export class LatchedSequence<S extends BlueshellState, E> extends Sequence<S, E>
}

get symbol(): string {
return `⍈`;
return '⍈';
}
}
12 changes: 12 additions & 0 deletions lib/nodes/Predicate.ts
@@ -0,0 +1,12 @@
import {BlueshellState} from './BlueshellState';
import {Base} from './Base';
import {resultCodes} from '..';

export class Predicate<S extends BlueshellState, E> extends Base<S, E> {
constructor(name: string, private readonly predicate: (state: S, event: E) => boolean) {
super(name);
}
onEvent(state: S, event: E) {
return this.predicate(state, event) ? resultCodes.SUCCESS : resultCodes.FAILURE;
}
}
14 changes: 14 additions & 0 deletions lib/nodes/SideEffect.ts
@@ -0,0 +1,14 @@
import {BlueshellState} from './BlueshellState';
import {resultCodes as rc} from '../utils/resultCodes';
import {Base} from './Base';

export class SideEffect<S extends BlueshellState, E> extends Base<S, E> {
constructor(public readonly name: string, private sideEffect: (state: S, event: E) => void) {
super(name);
}

onEvent(state: S, event: E) {
this.sideEffect(state, event);
return rc.SUCCESS;
}
}
15 changes: 15 additions & 0 deletions lib/nodes/Success.ts
@@ -0,0 +1,15 @@
import {BlueshellState} from './BlueshellState';
import {Base} from './Base';
import {resultCodes as rc} from '../utils/resultCodes';

export class Success<S extends BlueshellState, E> extends Base<S, E> {
constructor(
name = 'Success'
) {
super(name);
}

onEvent() {
return rc.SUCCESS;
}
}
16 changes: 16 additions & 0 deletions test/nodes/Predicate.test.ts
@@ -0,0 +1,16 @@
import {assert} from 'chai';

import {resultCodes as rc} from '../../lib/utils/resultCodes';

import * as Behavior from '../../lib';

describe('Predicate', function() {
it('Turns truth into success', function() {
const p = new Behavior.Predicate('test', () => true);
assert.strictEqual(p.handleEvent({__blueshell: {}}, {}), rc.SUCCESS);
});
it('Turns false into failure', function() {
const p = new Behavior.Predicate('test', () => false);
assert.strictEqual(p.handleEvent({__blueshell: {}}, {}), rc.FAILURE);
});
});
20 changes: 20 additions & 0 deletions test/nodes/SideEffect.test.ts
@@ -0,0 +1,20 @@
import {assert} from 'chai';

import {resultCodes as rc} from '../../lib/utils/resultCodes';

import * as Behavior from '../../lib';

describe('SideEffect', function() {
it('Runs the side effect', function() {
let x = 1;
const s = new Behavior.SideEffect('set X', () => {
x = 3;
});
s.handleEvent({__blueshell: {}}, {});
assert.strictEqual(x, 3);
});
it('Always succeeds if it completes', function() {
const s = new Behavior.SideEffect('set X', () => ({}));
assert.strictEqual(s.handleEvent({__blueshell: {}}, {}), rc.SUCCESS);
});
});
12 changes: 12 additions & 0 deletions test/nodes/Success.test.ts
@@ -0,0 +1,12 @@
import {assert} from 'chai';

import {resultCodes as rc} from '../../lib/utils/resultCodes';

import * as Behavior from '../../lib';

describe('Success', function() {
it('Returns success', function() {
const success = new Behavior.Success();
assert.strictEqual(success.handleEvent({__blueshell: {}}, {}), rc.SUCCESS);
});
});