react 0.2.3 → 0.3.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/README.md +15 -13
- package/{lib → dsl}/chain.js +5 -3
- package/{lib → dsl}/fstr.js +17 -6
- package/{lib → dsl}/pcode.js +19 -8
- package/examples/chain-events1.js +3 -3
- package/examples/chain1.js +2 -2
- package/examples/default-events1.js +2 -2
- package/examples/fstr-events1.js +4 -3
- package/examples/fstr1.js +3 -2
- package/examples/pcode1.js +2 -2
- package/lib/base-task.js +1 -0
- package/lib/cb-task.js +14 -1
- package/lib/core.js +36 -12
- package/lib/dsl.js +16 -5
- package/lib/event-manager.js +16 -4
- package/lib/finalcb-first-task.js +9 -6
- package/lib/finalcb-task.js +9 -6
- package/lib/input-parser.js +7 -3
- package/lib/parse.js +6 -3
- package/lib/promise-task.js +89 -0
- package/lib/ret-task.js +1 -1
- package/lib/task.js +23 -19
- package/lib/validate.js +14 -5
- package/lib/vcon.js +8 -3
- package/lib/when-task.js +81 -0
- package/package.json +4 -2
- package/promise-resolve.js +35 -0
- package/react.js +0 -4
- 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 +63 -4
- package/test/dsl.test.js +70 -5
- package/test/{chain.test.js → dsl/chain.test.js} +84 -1
- package/test/{fstr.test.js → dsl/fstr.test.js} +13 -1
- package/test/{pcode.test.js → dsl/pcode.test.js} +136 -1
- 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 +2 -190
- package/test/promise-auto-resolve.test.js +51 -0
- package/test/validate.test.js +30 -1
- package/test/vcon.test.js +13 -0
- 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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
Test core WhenTasks using promised-io
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
var test = require('tap').test;
|
|
8
|
+
//var when = require('promised-io/promise');
|
|
9
|
+
var Deferred = require('promised-io/promise').Deferred;
|
|
10
|
+
|
|
11
|
+
var react = require('../'); //require('react');
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
function multiply(x, y) {
|
|
15
|
+
var deferred = new Deferred();
|
|
16
|
+
setTimeout(function () {
|
|
17
|
+
deferred.resolve(x * y);
|
|
18
|
+
}, 10);
|
|
19
|
+
return deferred.promise;
|
|
20
|
+
}
|
|
21
|
+
function add(x, y) {
|
|
22
|
+
var deferred = new Deferred();
|
|
23
|
+
setTimeout(function () {
|
|
24
|
+
deferred.resolve(x + y);
|
|
25
|
+
}, 10);
|
|
26
|
+
return deferred.promise;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function badF2(a, b) {
|
|
30
|
+
var deferred = new Deferred();
|
|
31
|
+
setTimeout(function () {
|
|
32
|
+
deferred.reject(new Error('my-error'));
|
|
33
|
+
}, 10);
|
|
34
|
+
return deferred.promise;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
test('multi-step', function (t) {
|
|
39
|
+
t.plan(4);
|
|
40
|
+
var fn = react();
|
|
41
|
+
var errors = fn.setAndValidateAST({
|
|
42
|
+
inParams: ['pm', 'pa'],
|
|
43
|
+
tasks: [
|
|
44
|
+
{ a: ['pm'], out: ['m'], type: 'when' },
|
|
45
|
+
{ a: ['pa'], out: ['a'], type: 'when' }
|
|
46
|
+
],
|
|
47
|
+
outTask: { a: ['m', 'a'] }
|
|
48
|
+
});
|
|
49
|
+
t.deepEqual(errors, [], 'no validation errors');
|
|
50
|
+
|
|
51
|
+
var pm = multiply(2, 3);
|
|
52
|
+
var pa = add(4, 5);
|
|
53
|
+
|
|
54
|
+
fn(pm, pa, function (err, m, a) {
|
|
55
|
+
t.equal(err, null);
|
|
56
|
+
t.equal(m, 6);
|
|
57
|
+
t.equal(a, 9);
|
|
58
|
+
t.end();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
test('rejects with error', function (t) {
|
|
64
|
+
t.plan(2);
|
|
65
|
+
var fn = react();
|
|
66
|
+
var errors = fn.setAndValidateAST({
|
|
67
|
+
inParams: ['pm', 'pa'],
|
|
68
|
+
tasks: [
|
|
69
|
+
{ a: ['pm'], out: ['m'], type: 'when' },
|
|
70
|
+
{ a: ['pa'], out: ['a'], type: 'when' }
|
|
71
|
+
],
|
|
72
|
+
outTask: { a: ['m', 'a'] }
|
|
73
|
+
});
|
|
74
|
+
t.deepEqual(errors, [], 'no validation errors');
|
|
75
|
+
|
|
76
|
+
var pm = badF2(2, 3);
|
|
77
|
+
var pa = add(4, 5);
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
fn(pm, pa, function (err, m, a) {
|
|
81
|
+
t.equal(err.message, 'my-error');
|
|
82
|
+
t.end();
|
|
83
|
+
});
|
|
84
|
+
});
|
package/test/core.test.js
CHANGED
|
@@ -377,7 +377,66 @@ test('multi-step func cb err, cb with error', function (t) {
|
|
|
377
377
|
t.end();
|
|
378
378
|
});
|
|
379
379
|
});
|
|
380
|
+
|
|
381
|
+
test('using "this" in a cb function', function (t) {
|
|
382
|
+
t.plan(3);
|
|
383
|
+
function getA(cb) {
|
|
384
|
+
/*jshint validthis: true */
|
|
385
|
+
cb(null, this.a);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
var fn = react();
|
|
389
|
+
var errors = fn.setAndValidateAST({
|
|
390
|
+
inParams: [],
|
|
391
|
+
tasks: [
|
|
392
|
+
{ f: getA, a: [], out: ['a'] }
|
|
393
|
+
],
|
|
394
|
+
outTask: { a: ['a'] }
|
|
395
|
+
});
|
|
396
|
+
t.deepEqual(errors, [], 'no validation errors');
|
|
397
|
+
|
|
398
|
+
var obj = {
|
|
399
|
+
a: 100
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
fn.apply(obj, [function (err, a) {
|
|
403
|
+
t.equal(err, null);
|
|
404
|
+
t.equal(a, 100);
|
|
405
|
+
t.end();
|
|
406
|
+
}]);
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
test('using "this" in a sync function', function (t) {
|
|
410
|
+
t.plan(3);
|
|
411
|
+
function getA(cb) {
|
|
412
|
+
/*jshint validthis: true */
|
|
413
|
+
return this.a;
|
|
414
|
+
}
|
|
380
415
|
|
|
416
|
+
var fn = react();
|
|
417
|
+
var errors = fn.setAndValidateAST({
|
|
418
|
+
inParams: [],
|
|
419
|
+
tasks: [
|
|
420
|
+
{ f: getA, a: [], out: ['a'], type: 'ret' }
|
|
421
|
+
],
|
|
422
|
+
outTask: { a: ['a'] }
|
|
423
|
+
});
|
|
424
|
+
t.deepEqual(errors, [], 'no validation errors');
|
|
425
|
+
|
|
426
|
+
var obj = {
|
|
427
|
+
a: 100
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
fn.apply(obj, [function (err, a) {
|
|
431
|
+
t.equal(err, null);
|
|
432
|
+
t.equal(a, 100);
|
|
433
|
+
t.end();
|
|
434
|
+
}]);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
// Select first tests
|
|
439
|
+
|
|
381
440
|
|
|
382
441
|
test('selectFirst with first succeeding', function (t) {
|
|
383
442
|
t.plan(6);
|
|
@@ -398,7 +457,7 @@ test('selectFirst with first succeeding', function (t) {
|
|
|
398
457
|
}
|
|
399
458
|
fn.events.on('task.complete', accumEvents);
|
|
400
459
|
|
|
401
|
-
fn(2, 3, function (err, c
|
|
460
|
+
fn(2, 3, function (err, c) {
|
|
402
461
|
t.equal(err, null);
|
|
403
462
|
t.equal(c, 6);
|
|
404
463
|
t.equal(events.length, 1, 'should have seen one task compl events');
|
|
@@ -431,7 +490,7 @@ test('selectFirst with third succeeding', function (t) {
|
|
|
431
490
|
}
|
|
432
491
|
fn.events.on('task.complete', accumEvents);
|
|
433
492
|
|
|
434
|
-
fn(2, 3, function (err, c
|
|
493
|
+
fn(2, 3, function (err, c) {
|
|
435
494
|
t.equal(err, null);
|
|
436
495
|
t.equal(c, 5);
|
|
437
496
|
t.equal(events.length, 3, 'should have seen three task compl events');
|
|
@@ -468,7 +527,7 @@ test('selectFirst forces order with third succeeding', function (t) {
|
|
|
468
527
|
}
|
|
469
528
|
fn.events.on('task.complete', accumEvents);
|
|
470
529
|
|
|
471
|
-
fn(2, 3, function (err, c
|
|
530
|
+
fn(2, 3, function (err, c) {
|
|
472
531
|
t.equal(err, null);
|
|
473
532
|
t.equal(c, 5);
|
|
474
533
|
t.equal(events.length, 3, 'should have seen three task compl events');
|
|
@@ -507,7 +566,7 @@ test('selectFirst using direct returns', function (t) {
|
|
|
507
566
|
}
|
|
508
567
|
fn.events.on('task.complete', accumEvents);
|
|
509
568
|
|
|
510
|
-
fn(2, 3, function (err, c
|
|
569
|
+
fn(2, 3, function (err, c) {
|
|
511
570
|
t.equal(err, null);
|
|
512
571
|
t.equal(c, 5);
|
|
513
572
|
t.equal(events.length, 3, 'should have seen three task compl events');
|
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'
|
|
@@ -191,10 +203,62 @@ test('object prop task params', function (t) {
|
|
|
191
203
|
t.end();
|
|
192
204
|
});
|
|
193
205
|
|
|
206
|
+
// Errors
|
|
207
|
+
|
|
208
|
+
test('missing name, throws error', function (t) {
|
|
209
|
+
var fn = function () {
|
|
210
|
+
var r = react('cb -> err, c',
|
|
211
|
+
falpha, 'cb -> err, c'
|
|
212
|
+
);
|
|
213
|
+
};
|
|
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'));
|
|
245
|
+
t.end();
|
|
246
|
+
});
|
|
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
|
+
});
|
|
257
|
+
|
|
194
258
|
test('extra arg throws error', function (t) {
|
|
195
259
|
var fn = function () {
|
|
196
260
|
var r = react('myName', 'a, b, cb -> err, c, d',
|
|
197
|
-
falpha, 'a -> err, c', { after: fbeta },
|
|
261
|
+
falpha, 'a, cb -> err, c', { after: fbeta },
|
|
198
262
|
fbeta, 'a, b -> returns d',
|
|
199
263
|
'extraBadArg'
|
|
200
264
|
);
|
|
@@ -205,8 +269,8 @@ test('extra arg throws error', function (t) {
|
|
|
205
269
|
|
|
206
270
|
test('not enough args throws error', function (t) {
|
|
207
271
|
var fn = function () {
|
|
208
|
-
var r = react('myName', 'a, b, cb -> c, d',
|
|
209
|
-
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 },
|
|
210
274
|
fbeta
|
|
211
275
|
);
|
|
212
276
|
};
|
|
@@ -215,6 +279,7 @@ test('not enough args throws error', function (t) {
|
|
|
215
279
|
});
|
|
216
280
|
|
|
217
281
|
test('long example', function (t) {
|
|
282
|
+
/*jshint white: false */
|
|
218
283
|
t.plan(4);
|
|
219
284
|
function loadUser(uid, cb){ setTimeout(cb, 100, null, "User"+uid); }
|
|
220
285
|
function loadFile(filename, cb){ setTimeout(cb, 100, null, 'Filedata'+filename); }
|
|
@@ -247,7 +312,7 @@ test('long example', function (t) {
|
|
|
247
312
|
// selectFirst
|
|
248
313
|
|
|
249
314
|
test('selectFirst', function (t) {
|
|
250
|
-
var r = react.selectFirst('myName', 'a, b, cb -> c',
|
|
315
|
+
var r = react.selectFirst('myName', 'a, b, cb -> err, c',
|
|
251
316
|
{ otherOptFoo: 'foo'}, // main options
|
|
252
317
|
falpha, 'a, b, cb -> err, c',
|
|
253
318
|
fbeta, 'a, b -> c'
|
|
@@ -262,4 +327,4 @@ test('selectFirst', function (t) {
|
|
|
262
327
|
t.equal(r.ast.name, 'myName', 'name should match if supplied');
|
|
263
328
|
t.equal(r.ast.otherOptFoo, 'foo', 'other options should pass through');
|
|
264
329
|
t.end();
|
|
265
|
-
});
|
|
330
|
+
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var test = require('tap').test;
|
|
4
4
|
var sprintf = require('sprintf').sprintf;
|
|
5
5
|
|
|
6
|
-
var chainDefine = require('
|
|
6
|
+
var chainDefine = require('../../dsl/chain'); // require('react/dsl/chain');
|
|
7
7
|
|
|
8
8
|
function falpha() { }
|
|
9
9
|
function fbeta() { }
|
|
@@ -75,6 +75,19 @@ test('single task, single out params', function (t) {
|
|
|
75
75
|
t.end();
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
+
test('single task, err params', function (t) {
|
|
79
|
+
var fn = chainDefine()
|
|
80
|
+
.out('err')
|
|
81
|
+
.async(falpha).in().out('err', 'c')
|
|
82
|
+
.end();
|
|
83
|
+
t.deepEqual(fn.ast.inParams, []);
|
|
84
|
+
t.deepEqual(fn.ast.tasks, [
|
|
85
|
+
{ f: falpha, type: 'cb', a: [], out: ['c'], name: 'falpha' }
|
|
86
|
+
]);
|
|
87
|
+
t.deepEqual(fn.ast.outTask, { a: [], type: 'finalcb' });
|
|
88
|
+
t.end();
|
|
89
|
+
});
|
|
90
|
+
|
|
78
91
|
test('single task, err and out params', function (t) {
|
|
79
92
|
var fn = chainDefine()
|
|
80
93
|
.out('err', 'c')
|
|
@@ -238,3 +251,73 @@ test('selectFirst', function (t) {
|
|
|
238
251
|
});
|
|
239
252
|
|
|
240
253
|
|
|
254
|
+
// full integration tests
|
|
255
|
+
|
|
256
|
+
test('chainDefine use', function (t) {
|
|
257
|
+
t.plan(8);
|
|
258
|
+
function multiply(a, b, cb) { cb(null, a * b); }
|
|
259
|
+
function add(a, b, cb) { cb(null, a + b); }
|
|
260
|
+
|
|
261
|
+
var events = [];
|
|
262
|
+
function accumEvents(task) {
|
|
263
|
+
events.push(task);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
var fn = chainDefine()
|
|
267
|
+
.in('a', 'b', 'cb')
|
|
268
|
+
.out('err', 'm', 's')
|
|
269
|
+
.async(multiply).in('a', 'b', 'cb').out('err', 'm')
|
|
270
|
+
.async(add).in('m', 'a', 'cb').out('err', 's')
|
|
271
|
+
.end();
|
|
272
|
+
|
|
273
|
+
fn.events.on('task.complete', accumEvents);
|
|
274
|
+
|
|
275
|
+
fn(2, 3, function (err, m, s) {
|
|
276
|
+
t.deepEqual(err, null, 'should not be any error');
|
|
277
|
+
t.equal(m, 6);
|
|
278
|
+
t.equal(s, 8);
|
|
279
|
+
t.equal(events.length, 2, 'should have seen two task compl events');
|
|
280
|
+
t.equal(events[0].name, 'multiply', 'name matches');
|
|
281
|
+
t.deepEqual(events[0].results, [6], 'results match');
|
|
282
|
+
t.equal(events[1].name, 'add', 'name matches');
|
|
283
|
+
t.deepEqual(events[1].results, [8], 'results match');
|
|
284
|
+
t.end();
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test('use chainDefine selectFirst with events', function (t) {
|
|
289
|
+
t.plan(7);
|
|
290
|
+
function noSuccess(a, b, cb) {
|
|
291
|
+
setTimeout(function () { cb(null); }, 100); // returns undefined result
|
|
292
|
+
}
|
|
293
|
+
function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
|
|
294
|
+
function add(a, b, cb) { cb(null, a + b); }
|
|
295
|
+
|
|
296
|
+
var events = [];
|
|
297
|
+
function accumEvents(task) {
|
|
298
|
+
events.push(task);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
var fn = chainDefine()
|
|
302
|
+
.selectFirst()
|
|
303
|
+
.in('a', 'b', 'cb')
|
|
304
|
+
.out('err', 'c')
|
|
305
|
+
.async(noSuccess).in('a', 'b', 'cb').out('err', 'c')
|
|
306
|
+
.async(noSuccessNull).in('a', 'b', 'cb').out('err', 'c')
|
|
307
|
+
.async(add).in('a', 'b', 'cb').out('err', 'c')
|
|
308
|
+
.async(noSuccess).in('a', 'b', 'cb').out('err', 'c')
|
|
309
|
+
.end();
|
|
310
|
+
|
|
311
|
+
fn.events.on('task.complete', accumEvents);
|
|
312
|
+
|
|
313
|
+
fn(2, 3, function (err, c) {
|
|
314
|
+
t.deepEqual(err, null, 'should not be any error');
|
|
315
|
+
t.equal(c, 5);
|
|
316
|
+
t.equal(events.length, 3, 'should have seen two task compl events');
|
|
317
|
+
t.equal(events[0].name, 'noSuccess', 'name matches');
|
|
318
|
+
t.equal(events[1].name, 'noSuccessNull', 'name matches');
|
|
319
|
+
t.equal(events[2].name, 'add', 'name matches');
|
|
320
|
+
t.deepEqual(events[2].results, [5], 'results match');
|
|
321
|
+
t.end();
|
|
322
|
+
});
|
|
323
|
+
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var test = require('tap').test;
|
|
4
4
|
var sprintf = require('sprintf').sprintf;
|
|
5
5
|
|
|
6
|
-
var fstrDefine = require('
|
|
6
|
+
var fstrDefine = require('../../dsl/fstr'); // require('react/dsl/fstr');
|
|
7
7
|
|
|
8
8
|
function falpha() { }
|
|
9
9
|
function fbeta() { }
|
|
@@ -59,6 +59,18 @@ test('single task, single out params', function (t) {
|
|
|
59
59
|
t.end();
|
|
60
60
|
});
|
|
61
61
|
|
|
62
|
+
test('single task, err params', function (t) {
|
|
63
|
+
var r = fstrDefine('a, b', [
|
|
64
|
+
falpha, 'a, b -> err, c'
|
|
65
|
+
], 'err');
|
|
66
|
+
t.deepEqual(r.ast.inParams, ['a', 'b']);
|
|
67
|
+
t.deepEqual(r.ast.tasks, [
|
|
68
|
+
{ f: falpha, a: ['a', 'b'], out: ['c'], type: 'cb', name: 'falpha'}
|
|
69
|
+
]);
|
|
70
|
+
t.deepEqual(r.ast.outTask, { a: [], type: 'finalcb' });
|
|
71
|
+
t.end();
|
|
72
|
+
});
|
|
73
|
+
|
|
62
74
|
test('single task, err and out params', function (t) {
|
|
63
75
|
var r = fstrDefine('a, b', [
|
|
64
76
|
falpha, 'a, b -> err, c'
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var test = require('tap').test;
|
|
4
4
|
var sprintf = require('sprintf').sprintf;
|
|
5
5
|
|
|
6
|
-
var pcode = require('
|
|
6
|
+
var pcode = require('../../dsl/pcode'); // require('react/dsl/pcode');
|
|
7
7
|
|
|
8
8
|
function falpha() { }
|
|
9
9
|
function fbeta() { }
|
|
@@ -62,6 +62,20 @@ test('single task, single out params', function (t) {
|
|
|
62
62
|
t.end();
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
+
test('single task, single out params, cb(err)', function (t) {
|
|
66
|
+
var locals = { falpha: falpha };
|
|
67
|
+
var r = pcode('a, b', [
|
|
68
|
+
'c := falpha(a, b)',
|
|
69
|
+
'cb(err)'
|
|
70
|
+
], locals);
|
|
71
|
+
t.deepEqual(r.ast.inParams, ['a', 'b']);
|
|
72
|
+
t.deepEqual(r.ast.tasks, [
|
|
73
|
+
{ f: 'falpha', a: ['a', 'b'], out: ['c'], type: 'cb', name: 'falpha'}
|
|
74
|
+
]);
|
|
75
|
+
t.deepEqual(r.ast.outTask, { a: [], type: 'finalcb' });
|
|
76
|
+
t.end();
|
|
77
|
+
});
|
|
78
|
+
|
|
65
79
|
test('single task, err and out params', function (t) {
|
|
66
80
|
var locals = { falpha: falpha };
|
|
67
81
|
var r = pcode('a, b', [
|
|
@@ -319,3 +333,124 @@ test('selectFirst', function (t) {
|
|
|
319
333
|
t.end();
|
|
320
334
|
});
|
|
321
335
|
|
|
336
|
+
// full integration tests
|
|
337
|
+
|
|
338
|
+
test('use pcodeDefine from module', function (t) {
|
|
339
|
+
t.plan(3);
|
|
340
|
+
function multiply(a, b, cb) { cb(null, a * b); }
|
|
341
|
+
function add(a, b, cb) { cb(null, a + b); }
|
|
342
|
+
var locals = { multiply: multiply, add: add };
|
|
343
|
+
var fn = pcode('a, b, cb', [
|
|
344
|
+
'm := multiply(a, b)',
|
|
345
|
+
's := add(m, a)',
|
|
346
|
+
'cb(err, m, s)'
|
|
347
|
+
], locals);
|
|
348
|
+
|
|
349
|
+
fn(2, 3, function (err, m, s) {
|
|
350
|
+
t.deepEqual(err, null, 'should not be any error');
|
|
351
|
+
t.equal(m, 6);
|
|
352
|
+
t.equal(s, 8);
|
|
353
|
+
t.end();
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test('use pcodeDefine with events', function (t) {
|
|
358
|
+
t.plan(8);
|
|
359
|
+
function multiply(a, b, cb) { cb(null, a * b); }
|
|
360
|
+
function add(a, b, cb) { cb(null, a + b); }
|
|
361
|
+
|
|
362
|
+
var events = [];
|
|
363
|
+
function accumEvents(task) {
|
|
364
|
+
events.push(task);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
var locals = { multiply: multiply, add: add };
|
|
368
|
+
var fn = pcode('a, b, cb', [
|
|
369
|
+
'm := multiply(a, b)',
|
|
370
|
+
's := add(m, a)',
|
|
371
|
+
'cb(err, m, s)'
|
|
372
|
+
], locals);
|
|
373
|
+
|
|
374
|
+
fn.events.on('task.complete', accumEvents);
|
|
375
|
+
|
|
376
|
+
fn(2, 3, function (err, m, s) {
|
|
377
|
+
t.deepEqual(err, null, 'should not be any error');
|
|
378
|
+
t.equal(m, 6);
|
|
379
|
+
t.equal(s, 8);
|
|
380
|
+
t.equal(events.length, 2, 'should have seen two task compl events');
|
|
381
|
+
t.equal(events[0].name, 'multiply', 'name matches');
|
|
382
|
+
t.deepEqual(events[0].results, [6], 'results match');
|
|
383
|
+
t.equal(events[1].name, 'add', 'name matches');
|
|
384
|
+
t.deepEqual(events[1].results, [8], 'results match');
|
|
385
|
+
t.end();
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
test('use pcodeDefine.selectFirst with events', function (t) {
|
|
390
|
+
t.plan(7);
|
|
391
|
+
function noSuccess(a, b, cb) {
|
|
392
|
+
setTimeout(function () { cb(null); }, 100); // returns undefined result
|
|
393
|
+
}
|
|
394
|
+
function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
|
|
395
|
+
function add(a, b, cb) { cb(null, a + b); }
|
|
396
|
+
|
|
397
|
+
var events = [];
|
|
398
|
+
function accumEvents(task) {
|
|
399
|
+
events.push(task);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
var locals = { noSuccess: noSuccess, noSuccessNull: noSuccessNull, add: add };
|
|
403
|
+
var fn = pcode.selectFirst('a, b, cb', [
|
|
404
|
+
'c := noSuccess(a, b)',
|
|
405
|
+
'c := noSuccessNull(a, b)',
|
|
406
|
+
'c := add(a, b)',
|
|
407
|
+
'c := noSuccess(a, b)',
|
|
408
|
+
'cb(err, c)'
|
|
409
|
+
], locals);
|
|
410
|
+
|
|
411
|
+
fn.events.on('task.complete', accumEvents);
|
|
412
|
+
|
|
413
|
+
fn(2, 3, function (err, c) {
|
|
414
|
+
t.deepEqual(err, null, 'should not be any error');
|
|
415
|
+
t.equal(c, 5);
|
|
416
|
+
t.equal(events.length, 3, 'should have seen two task compl events');
|
|
417
|
+
t.equal(events[0].name, 'noSuccess', 'name matches');
|
|
418
|
+
t.equal(events[1].name, 'noSuccessNull', 'name matches');
|
|
419
|
+
t.equal(events[2].name, 'add', 'name matches');
|
|
420
|
+
t.deepEqual(events[2].results, [5], 'results match');
|
|
421
|
+
t.end();
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
test('use pcodeDefine events emit to global emitter', function (t) {
|
|
426
|
+
t.plan(8);
|
|
427
|
+
function multiply(a, b, cb) { cb(null, a * b); }
|
|
428
|
+
function add(a, b, cb) { cb(null, a + b); }
|
|
429
|
+
|
|
430
|
+
var events = [];
|
|
431
|
+
function accumEvents(task) {
|
|
432
|
+
events.push(task);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
var locals = { multiply: multiply, add: add };
|
|
436
|
+
var fn = pcode('a, b, cb', [
|
|
437
|
+
'm := multiply(a, b)',
|
|
438
|
+
's := add(m, a)',
|
|
439
|
+
'cb(err, m, s)'
|
|
440
|
+
], locals);
|
|
441
|
+
|
|
442
|
+
pcode.events.on('task.complete', accumEvents); // the global react emitter
|
|
443
|
+
|
|
444
|
+
fn(2, 3, function (err, m, s) {
|
|
445
|
+
t.deepEqual(err, null, 'should not be any error');
|
|
446
|
+
t.equal(m, 6);
|
|
447
|
+
t.equal(s, 8);
|
|
448
|
+
t.equal(events.length, 2, 'should have seen two task compl events');
|
|
449
|
+
t.equal(events[0].name, 'multiply', 'name matches');
|
|
450
|
+
t.deepEqual(events[0].results, [6], 'results match');
|
|
451
|
+
t.equal(events[1].name, 'add', 'name matches');
|
|
452
|
+
t.deepEqual(events[1].results, [8], 'results match');
|
|
453
|
+
t.end();
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
|