1let assert = require('assert');
2let h = require('./helpers');
3let exec = require('child_process').execSync;
4
5const PROJECT_DIR = process.env.PROJECT_DIR;
6const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
7
8suite('taskBase', function () {
9
10  this.timeout(7000);
11
12  test('default task', function () {
13    let out;
14    out = exec(`${JAKE_CMD} -q`).toString().trim();
15    assert.equal(out, 'default task');
16    out = exec(`${JAKE_CMD} -q default`).toString().trim();
17    assert.equal(out, 'default task');
18  });
19
20  test('task with no action', function () {
21    let out = exec(`${JAKE_CMD} -q noAction`).toString().trim();
22    assert.equal(out, 'default task');
23  });
24
25  test('a task with no action and no prereqs', function () {
26    exec(`${JAKE_CMD} noActionNoPrereqs`);
27  });
28
29  test('a task that exists at the top-level, and not in the specified namespace, should error', function () {
30    let res = require('child_process').spawnSync(`${JAKE_CMD}`,
31      ['asdfasdfasdf:zerbofrangazoomy']);
32    let err = res.stderr.toString();
33    assert.ok(err.indexOf('Unknown task' > -1));
34  });
35
36  test('passing args to a task', function () {
37    let out = exec(`${JAKE_CMD} -q argsEnvVars[foo,bar]`).toString().trim();
38    let parsed = h.parse(out);
39    let args = parsed.args;
40    assert.equal(args[0], 'foo');
41    assert.equal(args[1], 'bar');
42  });
43
44  test('a task with environment vars', function () {
45    let out = exec(`${JAKE_CMD} -q argsEnvVars foo=bar baz=qux`).toString().trim();
46    let parsed = h.parse(out);
47    let env = parsed.env;
48    assert.equal(env.foo, 'bar');
49    assert.equal(env.baz, 'qux');
50  });
51
52  test('passing args and using environment vars', function () {
53    let out = exec(`${JAKE_CMD} -q argsEnvVars[foo,bar] foo=bar baz=qux`).toString().trim();
54    let parsed = h.parse(out);
55    let args = parsed.args;
56    let env = parsed.env;
57    assert.equal(args[0], 'foo');
58    assert.equal(args[1], 'bar');
59    assert.equal(env.foo, 'bar');
60    assert.equal(env.baz, 'qux');
61  });
62
63  test('a simple prereq', function () {
64    let out = exec(`${JAKE_CMD} -q foo:baz`).toString().trim();
65    assert.equal(out, 'foo:bar task\nfoo:baz task');
66  });
67
68  test('a duplicate prereq only runs once', function () {
69    let out = exec(`${JAKE_CMD} -q foo:asdf`).toString().trim();
70    assert.equal(out, 'foo:bar task\nfoo:baz task\nfoo:asdf task');
71  });
72
73  test('a prereq with command-line args', function () {
74    let out = exec(`${JAKE_CMD} -q foo:qux`).toString().trim();
75    assert.equal(out, 'foo:bar[asdf,qwer] task\nfoo:qux task');
76  });
77
78  test('a prereq with args via invoke', function () {
79    let out = exec(`${JAKE_CMD} -q foo:frang[zxcv,uiop]`).toString().trim();
80    assert.equal(out, 'foo:bar[zxcv,uiop] task\nfoo:frang task');
81  });
82
83  test('a prereq with args via execute', function () {
84    let out = exec(`${JAKE_CMD} -q foo:zerb[zxcv,uiop]`).toString().trim();
85    assert.equal(out, 'foo:bar[zxcv,uiop] task\nfoo:zerb task');
86  });
87
88  test('repeating the task via execute', function () {
89    let out = exec(`${JAKE_CMD} -q foo:voom`).toString().trim();
90    assert.equal(out, 'foo:bar task\nfoo:bar task\ncomplete\ncomplete');
91  });
92
93  test('prereq execution-order', function () {
94    let out = exec(`${JAKE_CMD} -q hoge:fuga`).toString().trim();
95    assert.equal(out, 'hoge:hoge task\nhoge:piyo task\nhoge:fuga task');
96  });
97
98  test('basic async task', function () {
99    let out = exec(`${JAKE_CMD} -q bar:bar`).toString().trim();
100    assert.equal(out, 'bar:foo task\nbar:bar task');
101  });
102
103  test('promise async task', function () {
104    let out = exec(`${JAKE_CMD} -q bar:dependOnpromise`).toString().trim();
105    assert.equal(out, 'bar:promise task\nbar:dependOnpromise task saw value 123654');
106  });
107
108  test('failing promise async task', function () {
109    try {
110      exec(`${JAKE_CMD} -q bar:brokenPromise`);
111    }
112    catch(e) {
113      assert(e.message.indexOf('Command failed') > -1);
114    }
115  });
116
117  test('that current-prereq index gets reset', function () {
118    let out = exec(`${JAKE_CMD} -q hoge:kira`).toString().trim();
119    assert.equal(out, 'hoge:hoge task\nhoge:piyo task\nhoge:fuga task\n' +
120        'hoge:charan task\nhoge:gero task\nhoge:kira task');
121  });
122
123  test('modifying a task by adding prereq during execution', function () {
124    let out = exec(`${JAKE_CMD} -q voom`).toString().trim();
125    assert.equal(out, 2);
126  });
127
128  test('listening for task error-event', function () {
129    try {
130      exec(`${JAKE_CMD} -q vronk:groo`).toString().trim();
131    }
132    catch(e) {
133      assert(e.message.indexOf('OMFGZONG') > -1);
134    }
135  });
136
137  test('listening for jake error-event', function () {
138    let out = exec(`${JAKE_CMD} -q throwy`).toString().trim();
139    assert(out.indexOf('Emitted\nError: I am bad') > -1);
140  });
141
142  test('listening for jake unhandledRejection-event', function () {
143    let out = exec(`${JAKE_CMD} -q promiseRejecter`).toString().trim();
144    assert.equal(out, '<promise rejected on purpose>');
145  });
146
147  test('large number of same prereqs', function () {
148    let out = exec(`${JAKE_CMD} -q large:same`).toString().trim();
149    assert.equal(out, 'large:leaf\nlarge:same');
150  });
151
152  test('large number of different prereqs', function () {
153    let out = exec(`${JAKE_CMD} -q large:different`).toString().trim();
154    assert.equal(out, 'leaf-12\nleaf-123\nlarge:different');
155  });
156
157  test('large number of different prereqs', function () {
158    let out = exec(`${JAKE_CMD} -q usingRequire:test`).toString().trim();
159    assert.equal(out, 'howdy test');
160  });
161
162  test('modifying a namespace by adding a new task', function () {
163    let out = exec(`${JAKE_CMD} -q one:two`).toString().trim();
164    assert.equal('one:one\none:two', out);
165  });
166
167});
168