react 0.6.3 → 0.7.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.
Files changed (55) hide show
  1. package/.travis.yml +5 -3
  2. package/README.md +10 -1
  3. package/dist/react.js +179 -145
  4. package/dist/react.min.js +1 -1
  5. package/doc/advanced.md +1 -1
  6. package/lib/base-task.js +16 -19
  7. package/lib/cb-task.js +5 -5
  8. package/lib/core.js +5 -5
  9. package/lib/dsl.js +29 -29
  10. package/lib/error.js +4 -4
  11. package/lib/event-collector.js +6 -6
  12. package/lib/event-manager.js +1 -1
  13. package/lib/eventemitter.js +3 -3
  14. package/lib/finalcb-first-task.js +4 -4
  15. package/lib/finalcb-task.js +4 -4
  16. package/lib/id.js +3 -3
  17. package/lib/input-parser.js +10 -10
  18. package/lib/log-events.js +1 -1
  19. package/lib/parse.js +3 -3
  20. package/lib/promise-resolve.js +4 -4
  21. package/lib/promise-task.js +4 -4
  22. package/lib/react.js +1 -1
  23. package/lib/ret-task.js +4 -4
  24. package/lib/sprintf.js +4 -4
  25. package/lib/status.js +3 -3
  26. package/lib/task.js +12 -12
  27. package/lib/track-tasks.js +4 -4
  28. package/lib/validate.js +8 -8
  29. package/lib/vcon.js +28 -5
  30. package/lib/when-task.js +7 -8
  31. package/package.json +7 -7
  32. package/test/ast.mocha.js +4 -4
  33. package/test/cb-task.mocha.js +17 -17
  34. package/test/core-deferred.mocha.js +8 -8
  35. package/test/core-when.mocha.js +7 -7
  36. package/test/core.mocha.js +52 -52
  37. package/test/dsl.mocha.js +14 -12
  38. package/test/event-manager.mocha.js +2 -2
  39. package/test/exec-options.mocha.js +4 -4
  40. package/test/finalcb-task.mocha.js +1 -1
  41. package/test/input-parser.mocha.js +1 -1
  42. package/test/log-events.mocha.js +1 -1
  43. package/test/module-use.mocha.js +24 -7
  44. package/test/promise-auto-resolve.mocha.js +4 -4
  45. package/test/ret-task.mocha.js +18 -18
  46. package/test/task.mocha.js +3 -3
  47. package/test/validate-cb-task.mocha.js +11 -11
  48. package/test/validate-ret-task.mocha.js +14 -14
  49. package/test/validate.mocha.js +57 -57
  50. package/test/vcon.mocha.js +13 -13
  51. package/vendor/chai/chai.js +3371 -1158
  52. package/vendor/requirejs/require.js +1447 -1455
  53. package/vendor/requirejs/require.min.js +31 -28
  54. package/vendor/mocha/mocha.css +0 -135
  55. package/vendor/mocha/mocha.js +0 -3589
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global react:true util:true sprintf:true validate:true */
3
2
 
4
3
  if (typeof(chai) === 'undefined') {
@@ -22,6 +21,7 @@ if (typeof(validate) === 'undefined') {
22
21
  }
23
22
 
24
23
  (function () {
24
+ 'use strict';
25
25
 
26
26
  var t = chai.assert;
27
27
 
@@ -36,19 +36,19 @@ if (typeof(validate) === 'undefined') {
36
36
 
37
37
  test('retTask requires f, a, out', function (done) {
38
38
  var ast = {
39
- inParams: ['a'],
39
+ inParams: ['a'],
40
40
  tasks: [{ type: 'ret' }],
41
41
  outTask: { a: ['bar'] }
42
42
  };
43
43
  var msg = sprintf('retTask requires f, a, out - %s',
44
44
  util.inspect(ast.tasks[0]));
45
- t.deepEqual(validate(ast), [msg]);
45
+ t.deepEqual(validate(ast), [msg]);
46
46
  done();
47
47
  });
48
-
48
+
49
49
  test('retTask verifies f type', function (done) {
50
50
  var ast = {
51
- inParams: ['a'],
51
+ inParams: ['a'],
52
52
  tasks: [{ type: 'ret', f: foo, a: [], out: ['bar'] }],
53
53
  outTask: { a: ['bar'] }
54
54
  };
@@ -61,50 +61,50 @@ if (typeof(validate) === 'undefined') {
61
61
 
62
62
  test('retTask verifies a type', function (done) {
63
63
  var ast = {
64
- inParams: ['a'],
64
+ inParams: ['a'],
65
65
  tasks: [{ type: 'ret', f: foo, a: [], out: ['bar'] }],
66
66
  outTask: { a: ['bar'] }
67
67
  };
68
68
  ast.tasks[0].a = 'foo'; //err should be arr of strings
69
69
  var msg = sprintf('retTask requires a to be an array of string param names - %s',
70
70
  util.inspect(ast.tasks[0]));
71
- t.deepEqual(validate(ast), [msg]);
71
+ t.deepEqual(validate(ast), [msg]);
72
72
 
73
73
  ast = Object.create(ast);
74
74
  ast.tasks[0].a = ['foo', 1]; //err should be arr of strings
75
75
  msg = sprintf('retTask requires a to be an array of string param names - %s',
76
76
  util.inspect(ast.tasks[0]));
77
- t.deepEqual(validate(ast), [msg]);
77
+ t.deepEqual(validate(ast), [msg]);
78
78
  done();
79
79
  });
80
80
 
81
81
  test('retTask verifies out type', function (done) {
82
82
  var ast = {
83
- inParams: ['a'],
83
+ inParams: ['a'],
84
84
  tasks: [{ type: 'ret', f: foo, a: [], out: ['bar'] }],
85
85
  outTask: { a: ['bar'] }
86
86
  };
87
87
  ast.tasks[0].out = 'foo'; //err should be array with single string or []
88
88
  var msg = sprintf('retTask requires out to be an array with single string param name or [] - %s',
89
89
  util.inspect(ast.tasks[0]));
90
- t.deepEqual(validate(ast), [msg]);
90
+ t.deepEqual(validate(ast), [msg]);
91
91
 
92
92
  ast = Object.create(ast);
93
93
  ast.tasks[0].out = 123; //err should be array with single string or []
94
94
  msg = sprintf('retTask requires out to be an array with single string param name or [] - %s',
95
95
  util.inspect(ast.tasks[0]));
96
- t.deepEqual(validate(ast), [msg]);
96
+ t.deepEqual(validate(ast), [msg]);
97
97
  done();
98
98
  });
99
99
 
100
100
  test('valid retTask', function (done) {
101
101
  var ast = {
102
- inParams: ['a'],
102
+ inParams: ['a'],
103
103
  tasks: [{ type: 'ret', f: foo, a: [], out: ['bar'] }],
104
104
  outTask: { a: ['bar'] }
105
105
  };
106
- t.deepEqual(validate(ast), []);
106
+ t.deepEqual(validate(ast), []);
107
107
  done();
108
108
  });
109
109
 
110
- }());
110
+ }());
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global react:true util:true sprintf:true validate:true taskUtil:true */
3
2
 
4
3
  if (typeof(chai) === 'undefined') {
@@ -26,6 +25,7 @@ if (typeof(taskUtil) === 'undefined') {
26
25
  }
27
26
 
28
27
  (function () {
28
+ 'use strict';
29
29
 
30
30
  var t = chai.assert;
31
31
 
@@ -57,7 +57,7 @@ if (typeof(taskUtil) === 'undefined') {
57
57
  t.deepEqual(validate(ast), ['ast.inParams must be an array of strings']);
58
58
 
59
59
  ast.inParams = [1]; //err not an array of strings
60
- t.deepEqual(validate(ast), ['ast.inParams must be an array of strings']);
60
+ t.deepEqual(validate(ast), ['ast.inParams must be an array of strings']);
61
61
  done();
62
62
  });
63
63
 
@@ -73,19 +73,19 @@ if (typeof(taskUtil) === 'undefined') {
73
73
 
74
74
  test('each task must be an object', function (done) {
75
75
  var ast = {
76
- inParams: ['a'],
76
+ inParams: ['a'],
77
77
  tasks: [1], //err not array of objects
78
78
  outTask: { a: ['bar'] }
79
79
  };
80
- t.deepEqual(validate(ast), ['task must be an object - 1']);
80
+ t.deepEqual(validate(ast), ['task must be an object - 1']);
81
81
  done();
82
-
82
+
83
83
  });
84
84
 
85
-
85
+
86
86
  test('each task in ast.tasks must match a valid task type', function (done) {
87
87
  var ast = {
88
- inParams: ['a'],
88
+ inParams: ['a'],
89
89
  tasks: [{ type: 'zoo', f: foo, a: [], out: ['bar'] }], //err wrong type
90
90
  outTask: { a: ['bar'] }
91
91
  };
@@ -97,48 +97,48 @@ if (typeof(taskUtil) === 'undefined') {
97
97
 
98
98
  test('ast.outTask.a should be an array of string param names', function (done) {
99
99
  var ast = {
100
- inParams: ['a'],
101
- tasks: [{ f: foo, a: [], out: ['bar'], type: 'ret' }],
100
+ inParams: ['a'],
101
+ tasks: [{ f: foo, a: [], out: ['bar'], type: 'ret' }],
102
102
  outTask: { a: ['bar'] }
103
103
  };
104
104
  ast.outTask = {}; //err a should be an arr
105
105
  var msg = sprintf('ast.outTask.a should be an array of string param names - %s',
106
106
  util.inspect({ type: 'finalcb' }));
107
- t.deepEqual(validate(ast), [msg]);
107
+ t.deepEqual(validate(ast), [msg]);
108
108
 
109
109
  ast.outTask = { type: 'finalcb', a: 'bar' }; //err a should be an arr
110
110
  msg = sprintf('ast.outTask.a should be an array of string param names - %s',
111
111
  util.inspect(ast.outTask));
112
- t.deepEqual(validate(ast), [msg]);
112
+ t.deepEqual(validate(ast), [msg]);
113
113
 
114
114
  ast.outTask = { type: 'finalcb', a: ['bar', 1] }; //err a should be an arr of strings
115
115
  msg = sprintf('ast.outTask.a should be an array of string param names - %s',
116
116
  util.inspect(ast.outTask));
117
- t.deepEqual(validate(ast), [msg]);
117
+ t.deepEqual(validate(ast), [msg]);
118
118
 
119
119
  ast.outTask = { a: [] }; //valid
120
- t.deepEqual(validate(ast), []);
120
+ t.deepEqual(validate(ast), []);
121
121
  done();
122
122
  });
123
123
 
124
124
  test('ast.tasks that specify name need to be unique', function (done) {
125
125
  var ast = {
126
- inParams: ['a'],
126
+ inParams: ['a'],
127
127
  tasks: [
128
128
  { f: foo, a: [], out: ['bar'], name: 'dog' },
129
129
  { f: foo, a: [], out: ['bar'], name: 'dog' }
130
- ],
130
+ ],
131
131
  outTask: { a: ['bar'] }
132
132
  };
133
133
  var msg = sprintf('ast.tasks that specify name need to be unique, duplicate: %s',
134
134
  'dog');
135
- t.deepEqual(validate(ast), [msg]);
135
+ t.deepEqual(validate(ast), [msg]);
136
136
  done();
137
137
  });
138
-
138
+
139
139
  test('ast.locals should be non-null if passed in', function (done) {
140
140
  var ast = {
141
- inParams: ['a'],
141
+ inParams: ['a'],
142
142
  tasks: [{ f: foo, a: [], out: ['bar'], type: 'ret' }],
143
143
  outTask: { a: ['bar'] },
144
144
  locals: null //err should be non-null if passed in
@@ -152,173 +152,173 @@ if (typeof(taskUtil) === 'undefined') {
152
152
 
153
153
  test('non-method string functions need to map to fn in locals or in params', function (done) {
154
154
  var ast = {
155
- inParams: ['a'],
155
+ inParams: ['a'],
156
156
  tasks: [{ f: 'foo', a: [], out: ['bar'], type: 'ret' }],
157
157
  outTask: { a: ['bar'] },
158
158
  locals: { }
159
159
  };
160
- var msg = sprintf('function: %s not found in locals or input params - task[%s]',
160
+ var msg = sprintf('function: %s not found in locals or input params - task[%s]',
161
161
  'foo', 0);
162
- t.deepEqual(validate(ast), [msg]);
162
+ t.deepEqual(validate(ast), [msg]);
163
163
  done();
164
164
  });
165
165
 
166
166
  test('string functions maps to fn in locals', function (done) {
167
167
  var ast = {
168
- inParams: ['a'],
168
+ inParams: ['a'],
169
169
  tasks: [{ f: 'cat.bar', a: [], out: ['bar'], type: 'ret' }],
170
170
  outTask: { a: ['bar'] },
171
171
  locals: { cat: { bar: foo }}
172
172
  };
173
- t.deepEqual(validate(ast), []);
173
+ t.deepEqual(validate(ast), []);
174
174
  done();
175
175
  });
176
176
 
177
177
  test('string functions maps to fn in inputs', function (done) {
178
178
  var ast = {
179
- inParams: ['a1', 'dog'],
179
+ inParams: ['a1', 'dog'],
180
180
  tasks: [{ f: 'dog.food', a: [], out: ['bar'], type: 'ret' }],
181
181
  outTask: { a: ['bar'] },
182
182
  locals: { }
183
183
  };
184
- t.deepEqual(validate(ast), []);
184
+ t.deepEqual(validate(ast), []);
185
185
  done();
186
186
  });
187
187
 
188
188
  test('string functions need to map to fn in locals or in params', function (done) {
189
189
  var ast = {
190
- inParams: ['a'],
190
+ inParams: ['a'],
191
191
  tasks: [{ f: 'foo.bar', a: [], out: ['bar'], type: 'ret' }],
192
192
  outTask: { a: ['bar'] },
193
193
  locals: { foo: {}}
194
194
  };
195
- var msg = sprintf('function: %s not found in locals or input params - task[%s]',
195
+ var msg = sprintf('function: %s not found in locals or input params - task[%s]',
196
196
  'foo.bar', 0);
197
- t.deepEqual(validate(ast), [msg]);
197
+ t.deepEqual(validate(ast), [msg]);
198
198
  done();
199
199
  });
200
200
 
201
201
  test('param func str fn need to map to fn in locals or in params', function (done) {
202
202
  var ast = {
203
- inParams: ['a'],
203
+ inParams: ['a'],
204
204
  tasks: [{ f: 'a', a: [], out: ['bar'], type: 'ret' }],
205
205
  outTask: { a: ['bar'] },
206
206
  locals: { }
207
207
  };
208
- t.deepEqual(validate(ast), []);
208
+ t.deepEqual(validate(ast), []);
209
209
  done();
210
210
  });
211
211
 
212
212
  test('param obj exist func str needs map to fn in locals or in params', function (done) {
213
213
  var ast = {
214
- inParams: ['a'],
214
+ inParams: ['a'],
215
215
  tasks: [{ f: 'a.b', a: [], out: ['bar'], type: 'ret' }],
216
216
  outTask: { a: ['bar'] },
217
217
  locals: { }
218
218
  };
219
- t.deepEqual(validate(ast), []);
219
+ t.deepEqual(validate(ast), []);
220
220
  done();
221
221
  });
222
222
 
223
223
  test('param obj !exist func str needs map to fn in locals or in params', function (done) {
224
224
  var ast = {
225
- inParams: ['a'],
225
+ inParams: ['a'],
226
226
  tasks: [{ f: 'd.e', a: [], out: ['bar'], type: 'ret' }],
227
227
  outTask: { a: ['bar'] },
228
228
  locals: { }
229
229
  };
230
- t.deepEqual(validate(ast), []);
230
+ t.deepEqual(validate(ast), []);
231
231
  done();
232
232
  });
233
233
 
234
234
  test('multiple tasks output the same param, must be unique', function (done) {
235
235
  var ast = {
236
- inParams: ['a'],
236
+ inParams: ['a'],
237
237
  tasks: [
238
238
  { f: foo, a: [], out: ['baz', 'c'] },
239
239
  { f: bar, a: [], out: ['c'] }
240
- ],
240
+ ],
241
241
  outTask: { a: ['baz'] }
242
242
  };
243
243
  var msg = 'multiple tasks output the same param, must be unique. param: c';
244
- t.deepEqual(validate(ast), [msg]);
244
+ t.deepEqual(validate(ast), [msg]);
245
245
  done();
246
246
  });
247
247
 
248
248
  test('missing or mispelled input variable', function (done) {
249
249
  var ast = {
250
- inParams: [],
250
+ inParams: [],
251
251
  tasks: [
252
252
  { f: foo, a: [], out: [] },
253
253
  { f: bar, a: ['abc'], out: [] }
254
- ],
254
+ ],
255
255
  outTask: { a: [] }
256
256
  };
257
257
  var msg = 'missing or mispelled variable referenced in flow definition: abc';
258
- t.deepEqual(validate(ast), [msg]);
259
- done();
258
+ t.deepEqual(validate(ast), [msg]);
259
+ done();
260
260
  });
261
261
 
262
262
  test('missing or mispelled input variables', function (done) {
263
263
  var ast = {
264
- inParams: ['aaa', 'bbb'],
264
+ inParams: ['aaa', 'bbb'],
265
265
  tasks: [
266
266
  { f: foo, a: ['aaa', 'cat'], out: ['ccc'] },
267
267
  { f: bar, a: ['abc', 'bbb', 'ccc'], out: [] }
268
- ],
268
+ ],
269
269
  outTask: { a: [] }
270
270
  };
271
271
  var messages = [
272
272
  'missing or mispelled variable referenced in flow definition: cat',
273
273
  'missing or mispelled variable referenced in flow definition: abc'
274
274
  ];
275
- t.deepEqual(validate(ast), messages);
276
- done();
275
+ t.deepEqual(validate(ast), messages);
276
+ done();
277
277
  });
278
278
 
279
279
  test('missing or mispelled final output variables', function (done) {
280
280
  var ast = {
281
- inParams: ['aaa'],
281
+ inParams: ['aaa'],
282
282
  tasks: [
283
283
  { f: foo, a: ['aaa'], out: ['bbb'] },
284
284
  { f: bar, a: ['bbb'], out: ['ccc'] }
285
- ],
285
+ ],
286
286
  outTask: { a: ['ccc', 'ddd', 'eee'] }
287
287
  };
288
288
  var messages = [
289
289
  'missing or mispelled variable referenced in flow definition: ddd',
290
290
  'missing or mispelled variable referenced in flow definition: eee'
291
291
  ];
292
- t.deepEqual(validate(ast), messages);
293
- done();
292
+ t.deepEqual(validate(ast), messages);
293
+ done();
294
294
  });
295
295
 
296
296
  test('missing or mispelled validation ignores properties', function (done) {
297
297
  var ast = {
298
- inParams: ['obj'],
298
+ inParams: ['obj'],
299
299
  tasks: [
300
300
  { f: foo, a: ['obj.foo'], out: [] },
301
301
  { f: bar, a: ['obj.bar'], out: [] }
302
- ],
302
+ ],
303
303
  outTask: { a: ['obj.cat'] }
304
304
  };
305
- t.deepEqual(validate(ast), []);
306
- done();
305
+ t.deepEqual(validate(ast), []);
306
+ done();
307
307
  });
308
308
 
309
309
  test('missing or mispelled validation ignores literals', function (done) {
310
310
  var ast = {
311
- inParams: [],
311
+ inParams: [],
312
312
  tasks: [
313
313
  { f: foo, a: ['true', 'false', '123', '123.1', 'null'], out: [] },
314
314
  { f: bar, a: ['-123', '-123.4', '"wow"', "'hey'"], out: [] },
315
315
  { f: foo, a: ['"two-words"', "'also-two'", '"two.words"', "'also.two'"], out: [] },
316
316
  { f: foo, a: ['this'], out: [] }
317
- ],
317
+ ],
318
318
  outTask: { a: [] }
319
319
  };
320
- t.deepEqual(validate(ast), []);
321
- done();
320
+ t.deepEqual(validate(ast), []);
321
+ done();
322
322
  });
323
323
 
324
324
  }());
@@ -1,4 +1,3 @@
1
- 'use strict';
2
1
  /*global react:true VContext:true */
3
2
 
4
3
  if (typeof(chai) === 'undefined') {
@@ -14,11 +13,12 @@ if (typeof(VContext) === 'undefined') {
14
13
  }
15
14
 
16
15
  (function () {
16
+ 'use strict';
17
17
 
18
18
  var t = chai.assert;
19
19
 
20
20
  /**
21
- Testing Variable Context
21
+ Testing Variable Context
22
22
  */
23
23
 
24
24
  suite('vcon');
@@ -86,10 +86,10 @@ if (typeof(VContext) === 'undefined') {
86
86
  test('getVar on literals returns the literal', function (done) {
87
87
  t.equal(VContext.create([], []).getVar(true), true);
88
88
  t.equal(VContext.create([], []).getVar(false), false);
89
- t.equal(VContext.create([], []).getVar(null), null);
89
+ t.equal(VContext.create([], []).getVar(null), null);
90
90
  t.equal(VContext.create([], []).getVar('true'), true);
91
91
  t.equal(VContext.create([], []).getVar('false'), false);
92
- t.equal(VContext.create([], []).getVar('null'), null);
92
+ t.equal(VContext.create([], []).getVar('null'), null);
93
93
  t.equal(VContext.create([], []).getVar(-100), -100);
94
94
  t.equal(VContext.create([], []).getVar(100), 100);
95
95
  t.equal(VContext.create([], []).getVar(123.4), 123.4);
@@ -113,7 +113,7 @@ if (typeof(VContext) === 'undefined') {
113
113
  t.equal(VContext.create([o], ['a']).getVar('a.b'), 100);
114
114
  o = { b: { c: 200 }};
115
115
  t.equal(VContext.create([o], ['a']).getVar('a.b.c'), 200);
116
- done();
116
+ done();
117
117
  });
118
118
 
119
119
  test('setVar will create objects if needed', function (done) {
@@ -141,14 +141,14 @@ if (typeof(VContext) === 'undefined') {
141
141
  var v = VContext.create([{ bar: 1}], ['foo']);
142
142
  v.setVar(null, 2);
143
143
  t.deepEqual(v.values, { foo: { bar: 1 }});
144
- done();
144
+ done();
145
145
  });
146
146
 
147
147
  test('setVar with undefined key, will not set anything', function (done) {
148
148
  var v = VContext.create([{ bar: 1}], ['foo']);
149
149
  v.setVar(undefined, 2);
150
150
  t.deepEqual(v.values, { foo: { bar: 1 }});
151
- done();
151
+ done();
152
152
  });
153
153
 
154
154
  test('saveResults will set values for params and :LAST_RESULTS', function (done) {
@@ -156,7 +156,7 @@ if (typeof(VContext) === 'undefined') {
156
156
  v.saveResults(['foo', 'bar', 'cat'], [1, 'hello', null]);
157
157
  t.deepEqual(v.values, { foo: 1, bar: 'hello', cat: null,
158
158
  ':LAST_RESULTS': [1, 'hello', null] });
159
- done();
159
+ done();
160
160
  });
161
161
 
162
162
  test('saveResults set :LAST_RESULT w/all even params is short', function (done) {
@@ -164,7 +164,7 @@ if (typeof(VContext) === 'undefined') {
164
164
  v.saveResults(['foo'], [1, 'hello', null]);
165
165
  t.deepEqual(v.values, { foo: 1,
166
166
  ':LAST_RESULTS': [1, 'hello', null] });
167
- done();
167
+ done();
168
168
  });
169
169
 
170
170
  test('saveResults will set values for params and :LAST_RESULTS', function (done) {
@@ -172,22 +172,22 @@ if (typeof(VContext) === 'undefined') {
172
172
  v.saveResults(['foo', 'bar', 'cat'], [1, 'hello', null]);
173
173
  t.deepEqual(v.values, { foo: 1, bar: 'hello', cat: null,
174
174
  ':LAST_RESULTS': [1, 'hello', null] });
175
- done();
175
+ done();
176
176
  });
177
177
 
178
178
  test('saveResults upgrades undefined to null, but :LAST_RESULT is exact', function (done) {
179
179
  var v = VContext.create([], []);
180
180
  v.saveResults(['foo', 'bar', 'baz'], [1, undefined]);
181
- t.deepEqual(v.values, { foo: 1, bar: null, baz: null,
181
+ t.deepEqual(v.values, { foo: 1, bar: null, baz: null,
182
182
  ':LAST_RESULTS': [1, undefined] });
183
- done();
183
+ done();
184
184
  });
185
185
 
186
186
  test('saveResults null params skips saving, :LAST_RESULT is exact', function (done) {
187
187
  var v = VContext.create([], []);
188
188
  v.saveResults(['foo', null], [1, 20]); //skip second param
189
189
  t.deepEqual(v.values, { foo: 1, ':LAST_RESULTS': [1, 20] });
190
- done();
190
+ done();
191
191
  });
192
192
 
193
193
  }());