react 0.2.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +2 -1
- package/README.md +94 -149
- package/doc/advanced.md +161 -0
- package/doc/color-def.graffle +938 -0
- package/doc/color-def.png +0 -0
- package/doc/default-simple.dot +19 -0
- package/doc/default-simple.dot.png +0 -0
- package/examples/default-events1.js +33 -6
- package/examples/{fstr1.js → default-log-events.js} +20 -13
- package/examples/default-simple.js +45 -0
- package/lib/base-task.js +8 -6
- package/lib/cb-task.js +14 -1
- package/lib/core.js +43 -12
- package/lib/dsl.js +14 -6
- package/lib/event-collector.js +65 -0
- package/lib/event-manager.js +29 -16
- package/lib/finalcb-first-task.js +16 -10
- package/lib/finalcb-task.js +17 -10
- package/lib/input-parser.js +7 -3
- package/lib/log-events.js +86 -0
- package/lib/parse.js +6 -3
- package/lib/promise-resolve.js +35 -0
- package/lib/promise-task.js +89 -0
- package/lib/ret-task.js +1 -1
- package/lib/task.js +32 -23
- package/lib/track-tasks.js +60 -0
- package/lib/validate.js +3 -3
- package/lib/vcon.js +6 -3
- package/lib/when-task.js +81 -0
- package/package.json +5 -3
- package/react.js +33 -5
- package/test/core-deferred.test.js +134 -0
- package/test/core-promised.test.js +132 -0
- package/test/core-when.test.js +84 -0
- package/test/core.test.js +108 -60
- package/test/dsl.test.js +58 -6
- package/test/exec-options.test.js +2 -1
- package/test/finalcb-task.test.js +6 -5
- package/test/input-parser.test.js +10 -6
- package/test/module-use.test.js +16 -199
- package/test/promise-auto-resolve.test.js +52 -0
- package/test/validate.test.js +4 -2
- package/test/vcon.test.js +13 -0
- package/Jakefile.js +0 -8
- package/examples/chain-events1.js +0 -34
- package/examples/chain1.js +0 -19
- package/examples/fstr-events1.js +0 -51
- package/examples/pcode1.js +0 -22
- package/jake-tasks/jake-test.js +0 -64
- package/lib/chain.js +0 -148
- package/lib/fstr.js +0 -119
- package/lib/pcode.js +0 -173
- package/oldExamples/analyze.js +0 -29
- package/oldExamples/analyze2.js +0 -29
- package/oldExamples/example10-dsl.js +0 -63
- package/oldExamples/example11.js +0 -62
- package/oldExamples/example12.js +0 -63
- package/oldExamples/example13.js +0 -63
- package/oldExamples/example14.js +0 -63
- package/oldExamples/example15.js +0 -75
- package/oldExamples/example6-ast.js +0 -47
- package/oldExamples/example6-dsl.js +0 -49
- package/oldExamples/example8-ast.js +0 -55
- package/oldExamples/example8-dsl.js +0 -53
- package/oldExamples/example9-ast.js +0 -58
- package/oldExamples/example9-dsl.js +0 -57
- package/oldExamples/function-str-ex1.js +0 -33
- package/oldExamples/function-str-ex2.js +0 -67
- package/oldExamples/trait1.js +0 -41
- package/oldExamples/trait2.js +0 -44
- package/test/chain.test.js +0 -253
- package/test/fstr.test.js +0 -300
- package/test/pcode.test.js +0 -335
package/test/dsl.test.js
CHANGED
|
@@ -77,6 +77,18 @@ test('single task, err and out params', function (t) {
|
|
|
77
77
|
t.end();
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
+
test('using - with literal string', function (t) {
|
|
81
|
+
var r = react('myName', '"hello-world", cb -> err, c',
|
|
82
|
+
falpha, '"another-string", cb -> err, c'
|
|
83
|
+
);
|
|
84
|
+
t.deepEqual(r.ast.inParams, ['"hello-world"']);
|
|
85
|
+
t.deepEqual(r.ast.tasks, [
|
|
86
|
+
{ f: falpha, a: ['"another-string"'], out: ['c'], type: 'cb', name: 'falpha'}
|
|
87
|
+
]);
|
|
88
|
+
t.deepEqual(r.ast.outTask, { a: ['c'], type: 'finalcb' });
|
|
89
|
+
t.end();
|
|
90
|
+
});
|
|
91
|
+
|
|
80
92
|
test('single task, ERR and out params', function (t) {
|
|
81
93
|
var r = react('myName', 'cb -> ERR, c',
|
|
82
94
|
falpha, 'cb -> ERR, c'
|
|
@@ -199,15 +211,54 @@ test('missing name, throws error', function (t) {
|
|
|
199
211
|
falpha, 'cb -> err, c'
|
|
200
212
|
);
|
|
201
213
|
};
|
|
202
|
-
t.throws(fn, new Error('
|
|
214
|
+
t.throws(fn, new Error('first flow parameter should be the flow name, but found in/out def: cb -> err, c'));
|
|
215
|
+
t.end();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('missing err in flow in/out - force for consistency, throw error', function (t) {
|
|
219
|
+
var fn = function () {
|
|
220
|
+
var r = react('myname', 'cb -> c', // missing err
|
|
221
|
+
falpha, 'cb -> err, c'
|
|
222
|
+
);
|
|
223
|
+
};
|
|
224
|
+
t.throws(fn, new Error('callback specified, but first out param was not "err", use for clarity. Found in/out def: cb -> c'));
|
|
225
|
+
t.end();
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test('missing err in task in/out - force for consistency, throw error', function (t) {
|
|
229
|
+
var fn = function () {
|
|
230
|
+
var r = react('myname', 'cb -> err, c',
|
|
231
|
+
falpha, 'cb -> c' // missing err
|
|
232
|
+
);
|
|
233
|
+
};
|
|
234
|
+
t.throws(fn, new Error('callback specified, but first out param was not "err", use for clarity. Found in/out def: cb -> c'));
|
|
235
|
+
t.end();
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test('found err, but missing cb/callback in flow in/out - force for consistency, throw error', function (t) {
|
|
239
|
+
var fn = function () {
|
|
240
|
+
var r = react('myname', 'a -> err, c', // missing cb
|
|
241
|
+
falpha, 'cb -> err, c'
|
|
242
|
+
);
|
|
243
|
+
};
|
|
244
|
+
t.throws(fn, new Error('found err param, but cb/callback is not specified, is this cb-style async or sync function? Found in/out def: a -> err, c'));
|
|
203
245
|
t.end();
|
|
204
246
|
});
|
|
205
247
|
|
|
248
|
+
test('found err, but missing cb/callback in task in/out - force for consistency, throw error', function (t) {
|
|
249
|
+
var fn = function () {
|
|
250
|
+
var r = react('myname', 'cb -> err, c',
|
|
251
|
+
falpha, 'a -> err, c' // missing cb
|
|
252
|
+
);
|
|
253
|
+
};
|
|
254
|
+
t.throws(fn, new Error('found err param, but cb/callback is not specified, is this cb-style async or sync function? Found in/out def: a -> err, c'));
|
|
255
|
+
t.end();
|
|
256
|
+
});
|
|
206
257
|
|
|
207
258
|
test('extra arg throws error', function (t) {
|
|
208
259
|
var fn = function () {
|
|
209
260
|
var r = react('myName', 'a, b, cb -> err, c, d',
|
|
210
|
-
falpha, 'a -> err, c', { after: fbeta },
|
|
261
|
+
falpha, 'a, cb -> err, c', { after: fbeta },
|
|
211
262
|
fbeta, 'a, b -> returns d',
|
|
212
263
|
'extraBadArg'
|
|
213
264
|
);
|
|
@@ -218,8 +269,8 @@ test('extra arg throws error', function (t) {
|
|
|
218
269
|
|
|
219
270
|
test('not enough args throws error', function (t) {
|
|
220
271
|
var fn = function () {
|
|
221
|
-
var r = react('myName', 'a, b, cb -> c, d',
|
|
222
|
-
falpha, 'a -> err, c', { after: fbeta },
|
|
272
|
+
var r = react('myName', 'a, b, cb -> err, c, d',
|
|
273
|
+
falpha, 'a, cb -> err, c', { after: fbeta },
|
|
223
274
|
fbeta
|
|
224
275
|
);
|
|
225
276
|
};
|
|
@@ -228,6 +279,7 @@ test('not enough args throws error', function (t) {
|
|
|
228
279
|
});
|
|
229
280
|
|
|
230
281
|
test('long example', function (t) {
|
|
282
|
+
/*jshint white: false */
|
|
231
283
|
t.plan(4);
|
|
232
284
|
function loadUser(uid, cb){ setTimeout(cb, 100, null, "User"+uid); }
|
|
233
285
|
function loadFile(filename, cb){ setTimeout(cb, 100, null, 'Filedata'+filename); }
|
|
@@ -260,7 +312,7 @@ test('long example', function (t) {
|
|
|
260
312
|
// selectFirst
|
|
261
313
|
|
|
262
314
|
test('selectFirst', function (t) {
|
|
263
|
-
var r = react.selectFirst('myName', 'a, b, cb -> c',
|
|
315
|
+
var r = react.selectFirst('myName', 'a, b, cb -> err, c',
|
|
264
316
|
{ otherOptFoo: 'foo'}, // main options
|
|
265
317
|
falpha, 'a, b, cb -> err, c',
|
|
266
318
|
fbeta, 'a, b -> c'
|
|
@@ -275,4 +327,4 @@ test('selectFirst', function (t) {
|
|
|
275
327
|
t.equal(r.ast.name, 'myName', 'name should match if supplied');
|
|
276
328
|
t.equal(r.ast.otherOptFoo, 'foo', 'other options should pass through');
|
|
277
329
|
t.end();
|
|
278
|
-
});
|
|
330
|
+
});
|
|
@@ -20,7 +20,7 @@ test('execOptions as first param', function (t) {
|
|
|
20
20
|
|
|
21
21
|
var execOptions = {
|
|
22
22
|
reactExecOptions: true,
|
|
23
|
-
outputStyle: '
|
|
23
|
+
outputStyle: 'cb'
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
fn(execOptions, 2, 3, function (err, c) {
|
|
@@ -30,3 +30,4 @@ test('execOptions as first param', function (t) {
|
|
|
30
30
|
});
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
+
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
var test = require('tap').test;
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var tskutil = require('../lib/task.js');
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
test('undefined cb throws exception', function (t) {
|
|
8
9
|
var fn = function () {
|
|
9
|
-
var finalTask =
|
|
10
|
+
var finalTask = tskutil.createOutTask({}, undefined);
|
|
10
11
|
};
|
|
11
12
|
t.throws(fn, new Error('callback is not a function'));
|
|
12
13
|
t.end();
|
|
@@ -14,7 +15,7 @@ test('undefined cb throws exception', function (t) {
|
|
|
14
15
|
|
|
15
16
|
test('null cb throws exception', function (t) {
|
|
16
17
|
var fn = function () {
|
|
17
|
-
var finalTask =
|
|
18
|
+
var finalTask = tskutil.createOutTask({}, null);
|
|
18
19
|
};
|
|
19
20
|
t.throws(fn, new Error('callback is not a function'));
|
|
20
21
|
t.end();
|
|
@@ -22,7 +23,7 @@ test('null cb throws exception', function (t) {
|
|
|
22
23
|
|
|
23
24
|
test('cb needs to be a function or throws exception', function (t) {
|
|
24
25
|
var fn = function () {
|
|
25
|
-
var finalTask =
|
|
26
|
+
var finalTask = tskutil.createOutTask({}, 'foo');
|
|
26
27
|
};
|
|
27
28
|
t.throws(fn, new Error('callback is not a function'));
|
|
28
29
|
t.end();
|
|
@@ -30,7 +31,7 @@ test('cb needs to be a function or throws exception', function (t) {
|
|
|
30
31
|
|
|
31
32
|
test('valid fn creates outTask', function (t) {
|
|
32
33
|
function foo() { }
|
|
33
|
-
var finalTask =
|
|
34
|
+
var finalTask = tskutil.createOutTask({ a: ['bar', 'baz']}, foo);
|
|
34
35
|
t.equal(finalTask.f, foo);
|
|
35
36
|
t.deepEqual(finalTask.a, ['bar', 'baz']);
|
|
36
37
|
t.end();
|
|
@@ -5,8 +5,9 @@ var test = require('tap').test;
|
|
|
5
5
|
var inputParser = require('../lib/input-parser.js');
|
|
6
6
|
|
|
7
7
|
test('parser parses input args', function (t) {
|
|
8
|
+
function myCb() { }
|
|
8
9
|
var ast = { inParams: ['a', 'b'] };
|
|
9
|
-
var parsedInput = inputParser([10, 20], ast);
|
|
10
|
+
var parsedInput = inputParser([10, 20, myCb], ast);
|
|
10
11
|
t.deepEqual(parsedInput.args, [10, 20]);
|
|
11
12
|
t.deepEqual(parsedInput.options, inputParser.defaultExecOptions);
|
|
12
13
|
t.end();
|
|
@@ -43,20 +44,23 @@ test('parser parses input args with extra args', function (t) {
|
|
|
43
44
|
});
|
|
44
45
|
|
|
45
46
|
test('parser pulls react exec option off arg list', function (t) {
|
|
47
|
+
function myCb() { }
|
|
46
48
|
var ast = { inParams: ['a', 'b'] };
|
|
47
49
|
var execOptions = { reactExecOptions: true, foo: 10 };
|
|
48
|
-
var parsedInput = inputParser([execOptions, 10, 20], ast);
|
|
50
|
+
var parsedInput = inputParser([execOptions, 10, 20, myCb], ast);
|
|
49
51
|
t.deepEqual(parsedInput.args, [10, 20]);
|
|
50
|
-
t.deepEqual(parsedInput.options, { reactExecOptions: true, outputStyle: '
|
|
52
|
+
t.deepEqual(parsedInput.options, { reactExecOptions: true, outputStyle: 'cb', foo: 10 });
|
|
51
53
|
t.end();
|
|
52
54
|
});
|
|
53
55
|
|
|
54
56
|
test('parser pulls react exec options off arg list and merges from left to right', function (t) {
|
|
57
|
+
function myCb() { }
|
|
55
58
|
var ast = { inParams: ['a', 'b'] };
|
|
56
59
|
var execOptions = { reactExecOptions: true, foo: 12, bar: 24 };
|
|
57
60
|
var execOptions2 = { reactExecOptions: true, bar: 36, baz: 'hello' };
|
|
58
|
-
var parsedInput = inputParser([execOptions, execOptions2, 10, 20], ast);
|
|
61
|
+
var parsedInput = inputParser([execOptions, execOptions2, 10, 20, myCb], ast);
|
|
59
62
|
t.deepEqual(parsedInput.args, [10, 20]);
|
|
60
|
-
t.deepEqual(parsedInput.options, { reactExecOptions: true, outputStyle: '
|
|
63
|
+
t.deepEqual(parsedInput.options, { reactExecOptions: true, outputStyle: 'cb', foo: 12, bar: 36, baz: 'hello' });
|
|
61
64
|
t.end();
|
|
62
|
-
});
|
|
65
|
+
});
|
|
66
|
+
|
package/test/module-use.test.js
CHANGED
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
var test = require('tap').test;
|
|
4
4
|
var BaseTask = require('../lib/base-task.js');
|
|
5
5
|
|
|
6
|
-
var react = require('../react');
|
|
6
|
+
var react = require('../'); // require('react');
|
|
7
|
+
// turn on tracking, obtain EventCollector
|
|
8
|
+
var EventCollector = require('../lib/event-collector'); // require('react/lib/event-collector');
|
|
9
|
+
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
12
|
@example
|
|
@@ -35,9 +38,10 @@ var react = require('../react');
|
|
|
35
38
|
test('module exports an function object with properties', function (t) {
|
|
36
39
|
t.type(react, 'function', 'is a core constructor and default dsl function');
|
|
37
40
|
t.type(react.options, 'object', 'has property for global react options');
|
|
38
|
-
t.type(react.
|
|
39
|
-
t.type(react.
|
|
40
|
-
t.type(react.
|
|
41
|
+
t.type(react.events, 'object', 'has global react event manager');
|
|
42
|
+
t.type(react.logEvents, 'function', 'has function to enable event logging');
|
|
43
|
+
t.type(react.trackTasks, 'function', 'has function to enable task and flow tracking');
|
|
44
|
+
t.type(react.resolvePromises, 'function', 'has fn to enable promise detection & resolution');
|
|
41
45
|
t.end();
|
|
42
46
|
});
|
|
43
47
|
|
|
@@ -81,6 +85,7 @@ test('use react() default DSL from module', function (t) {
|
|
|
81
85
|
multiply, 'a, b, cb -> err, m',
|
|
82
86
|
add, 'm, a, cb -> err, s'
|
|
83
87
|
);
|
|
88
|
+
|
|
84
89
|
|
|
85
90
|
fn(2, 3, function (err, m, s) {
|
|
86
91
|
t.deepEqual(err, null, 'should not be any error');
|
|
@@ -98,10 +103,6 @@ test('use react.selectFirst() default DSL with events', function (t) {
|
|
|
98
103
|
function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
|
|
99
104
|
function add(a, b, cb) { cb(null, a + b); }
|
|
100
105
|
|
|
101
|
-
var events = [];
|
|
102
|
-
function accumEvents(task) {
|
|
103
|
-
events.push(task);
|
|
104
|
-
}
|
|
105
106
|
|
|
106
107
|
var fn = react.selectFirst('mySelectFirst', 'a, b, cb -> err, c',
|
|
107
108
|
noSuccess, 'a, b, cb -> err, c',
|
|
@@ -110,208 +111,24 @@ test('use react.selectFirst() default DSL with events', function (t) {
|
|
|
110
111
|
noSuccess, 'a, b, cb -> err, c'
|
|
111
112
|
);
|
|
112
113
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
fn(2, 3, function (err, c) {
|
|
116
|
-
t.deepEqual(err, null, 'should not be any error');
|
|
117
|
-
t.equal(c, 5);
|
|
118
|
-
t.equal(events.length, 3, 'should have seen two task compl events');
|
|
119
|
-
t.equal(events[0].name, 'noSuccess', 'name matches');
|
|
120
|
-
t.equal(events[1].name, 'noSuccessNull', 'name matches');
|
|
121
|
-
t.equal(events[2].name, 'add', 'name matches');
|
|
122
|
-
t.deepEqual(events[2].results, [5], 'results match');
|
|
123
|
-
t.end();
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
test('use pcodeDefine from module', function (t) {
|
|
129
|
-
t.plan(3);
|
|
130
|
-
function multiply(a, b, cb) { cb(null, a * b); }
|
|
131
|
-
function add(a, b, cb) { cb(null, a + b); }
|
|
132
|
-
var locals = { multiply: multiply, add: add };
|
|
133
|
-
var fn = react.pcodeDefine('a, b, cb', [
|
|
134
|
-
'm := multiply(a, b)',
|
|
135
|
-
's := add(m, a)',
|
|
136
|
-
'cb(err, m, s)'
|
|
137
|
-
], locals);
|
|
138
|
-
|
|
139
|
-
fn(2, 3, function (err, m, s) {
|
|
140
|
-
t.deepEqual(err, null, 'should not be any error');
|
|
141
|
-
t.equal(m, 6);
|
|
142
|
-
t.equal(s, 8);
|
|
143
|
-
t.end();
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
test('use pcodeDefine with events', function (t) {
|
|
148
|
-
t.plan(8);
|
|
149
|
-
function multiply(a, b, cb) { cb(null, a * b); }
|
|
150
|
-
function add(a, b, cb) { cb(null, a + b); }
|
|
151
|
-
|
|
152
|
-
var events = [];
|
|
153
|
-
function accumEvents(task) {
|
|
154
|
-
events.push(task);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
var locals = { multiply: multiply, add: add };
|
|
158
|
-
var fn = react.pcodeDefine('a, b, cb', [
|
|
159
|
-
'm := multiply(a, b)',
|
|
160
|
-
's := add(m, a)',
|
|
161
|
-
'cb(err, m, s)'
|
|
162
|
-
], locals);
|
|
163
|
-
|
|
164
|
-
fn.events.on('task.complete', accumEvents);
|
|
165
|
-
|
|
166
|
-
fn(2, 3, function (err, m, s) {
|
|
167
|
-
t.deepEqual(err, null, 'should not be any error');
|
|
168
|
-
t.equal(m, 6);
|
|
169
|
-
t.equal(s, 8);
|
|
170
|
-
t.equal(events.length, 2, 'should have seen two task compl events');
|
|
171
|
-
t.equal(events[0].name, 'multiply', 'name matches');
|
|
172
|
-
t.deepEqual(events[0].results, [6], 'results match');
|
|
173
|
-
t.equal(events[1].name, 'add', 'name matches');
|
|
174
|
-
t.deepEqual(events[1].results, [8], 'results match');
|
|
175
|
-
t.end();
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test('use pcodeDefine.selectFirst with events', function (t) {
|
|
180
|
-
t.plan(7);
|
|
181
|
-
function noSuccess(a, b, cb) {
|
|
182
|
-
setTimeout(function () { cb(null); }, 100); // returns undefined result
|
|
183
|
-
}
|
|
184
|
-
function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
|
|
185
|
-
function add(a, b, cb) { cb(null, a + b); }
|
|
186
|
-
|
|
187
|
-
var events = [];
|
|
188
|
-
function accumEvents(task) {
|
|
189
|
-
events.push(task);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
var locals = { noSuccess: noSuccess, noSuccessNull: noSuccessNull, add: add };
|
|
193
|
-
var fn = react.pcodeDefine.selectFirst('a, b, cb', [
|
|
194
|
-
'c := noSuccess(a, b)',
|
|
195
|
-
'c := noSuccessNull(a, b)',
|
|
196
|
-
'c := add(a, b)',
|
|
197
|
-
'c := noSuccess(a, b)',
|
|
198
|
-
'cb(err, c)'
|
|
199
|
-
], locals);
|
|
200
|
-
|
|
201
|
-
fn.events.on('task.complete', accumEvents);
|
|
114
|
+
var collector = new EventCollector();
|
|
115
|
+
collector.capture(fn, 'task.complete');
|
|
202
116
|
|
|
203
117
|
fn(2, 3, function (err, c) {
|
|
204
118
|
t.deepEqual(err, null, 'should not be any error');
|
|
205
119
|
t.equal(c, 5);
|
|
120
|
+
var events = collector.list();
|
|
206
121
|
t.equal(events.length, 3, 'should have seen two task compl events');
|
|
207
|
-
t.equal(events[0].name, 'noSuccess', 'name matches');
|
|
208
|
-
t.equal(events[1].name, 'noSuccessNull', 'name matches');
|
|
209
|
-
t.equal(events[2].name, 'add', 'name matches');
|
|
210
|
-
t.deepEqual(events[2].results, [5], 'results match');
|
|
211
|
-
t.end();
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
test('use pcodeDefine events emit to global emitter', function (t) {
|
|
216
|
-
t.plan(8);
|
|
217
|
-
function multiply(a, b, cb) { cb(null, a * b); }
|
|
218
|
-
function add(a, b, cb) { cb(null, a + b); }
|
|
219
|
-
|
|
220
|
-
var events = [];
|
|
221
|
-
function accumEvents(task) {
|
|
222
|
-
events.push(task);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
var locals = { multiply: multiply, add: add };
|
|
226
|
-
var fn = react.pcodeDefine('a, b, cb', [
|
|
227
|
-
'm := multiply(a, b)',
|
|
228
|
-
's := add(m, a)',
|
|
229
|
-
'cb(err, m, s)'
|
|
230
|
-
], locals);
|
|
231
|
-
|
|
232
|
-
react.events.on('task.complete', accumEvents); // the global react emitter
|
|
233
|
-
|
|
234
|
-
fn(2, 3, function (err, m, s) {
|
|
235
|
-
t.deepEqual(err, null, 'should not be any error');
|
|
236
|
-
t.equal(m, 6);
|
|
237
|
-
t.equal(s, 8);
|
|
238
|
-
t.equal(events.length, 2, 'should have seen two task compl events');
|
|
239
|
-
t.equal(events[0].name, 'multiply', 'name matches');
|
|
240
|
-
t.deepEqual(events[0].results, [6], 'results match');
|
|
241
|
-
t.equal(events[1].name, 'add', 'name matches');
|
|
242
|
-
t.deepEqual(events[1].results, [8], 'results match');
|
|
122
|
+
t.equal(events[0].task.name, 'noSuccess', 'name matches');
|
|
123
|
+
t.equal(events[1].task.name, 'noSuccessNull', 'name matches');
|
|
124
|
+
t.equal(events[2].task.name, 'add', 'name matches');
|
|
125
|
+
t.deepEqual(events[2].task.results, [5], 'results match');
|
|
243
126
|
t.end();
|
|
244
127
|
});
|
|
245
128
|
});
|
|
246
129
|
|
|
247
130
|
|
|
248
131
|
|
|
249
|
-
test('chainDefine use', function (t) {
|
|
250
|
-
t.plan(8);
|
|
251
|
-
function multiply(a, b, cb) { cb(null, a * b); }
|
|
252
|
-
function add(a, b, cb) { cb(null, a + b); }
|
|
253
|
-
|
|
254
|
-
var events = [];
|
|
255
|
-
function accumEvents(task) {
|
|
256
|
-
events.push(task);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
var fn = react.chainDefine()
|
|
260
|
-
.in('a', 'b', 'cb')
|
|
261
|
-
.out('err', 'm', 's')
|
|
262
|
-
.async(multiply).in('a', 'b', 'cb').out('err', 'm')
|
|
263
|
-
.async(add).in('m', 'a', 'cb').out('err', 's')
|
|
264
|
-
.end();
|
|
265
|
-
|
|
266
|
-
fn.events.on('task.complete', accumEvents);
|
|
267
|
-
|
|
268
|
-
fn(2, 3, function (err, m, s) {
|
|
269
|
-
t.deepEqual(err, null, 'should not be any error');
|
|
270
|
-
t.equal(m, 6);
|
|
271
|
-
t.equal(s, 8);
|
|
272
|
-
t.equal(events.length, 2, 'should have seen two task compl events');
|
|
273
|
-
t.equal(events[0].name, 'multiply', 'name matches');
|
|
274
|
-
t.deepEqual(events[0].results, [6], 'results match');
|
|
275
|
-
t.equal(events[1].name, 'add', 'name matches');
|
|
276
|
-
t.deepEqual(events[1].results, [8], 'results match');
|
|
277
|
-
t.end();
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
test('use chainDefine selectFirst with events', function (t) {
|
|
282
|
-
t.plan(7);
|
|
283
|
-
function noSuccess(a, b, cb) {
|
|
284
|
-
setTimeout(function () { cb(null); }, 100); // returns undefined result
|
|
285
|
-
}
|
|
286
|
-
function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
|
|
287
|
-
function add(a, b, cb) { cb(null, a + b); }
|
|
288
132
|
|
|
289
|
-
var events = [];
|
|
290
|
-
function accumEvents(task) {
|
|
291
|
-
events.push(task);
|
|
292
|
-
}
|
|
293
133
|
|
|
294
|
-
var fn = react.chainDefine()
|
|
295
|
-
.selectFirst()
|
|
296
|
-
.in('a', 'b', 'cb')
|
|
297
|
-
.out('err', 'c')
|
|
298
|
-
.async(noSuccess).in('a', 'b', 'cb').out('err', 'c')
|
|
299
|
-
.async(noSuccessNull).in('a', 'b', 'cb').out('err', 'c')
|
|
300
|
-
.async(add).in('a', 'b', 'cb').out('err', 'c')
|
|
301
|
-
.async(noSuccess).in('a', 'b', 'cb').out('err', 'c')
|
|
302
|
-
.end();
|
|
303
|
-
|
|
304
|
-
fn.events.on('task.complete', accumEvents);
|
|
305
|
-
|
|
306
|
-
fn(2, 3, function (err, c) {
|
|
307
|
-
t.deepEqual(err, null, 'should not be any error');
|
|
308
|
-
t.equal(c, 5);
|
|
309
|
-
t.equal(events.length, 3, 'should have seen two task compl events');
|
|
310
|
-
t.equal(events[0].name, 'noSuccess', 'name matches');
|
|
311
|
-
t.equal(events[1].name, 'noSuccessNull', 'name matches');
|
|
312
|
-
t.equal(events[2].name, 'add', 'name matches');
|
|
313
|
-
t.deepEqual(events[2].results, [5], 'results match');
|
|
314
|
-
t.end();
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
134
|
|