You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
6.7 KiB
217 lines
6.7 KiB
/* |
|
* Jake JavaScript build tool |
|
* Copyright 2112 Matthew Eernisse (mde@fleegix.org) |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
*/ |
|
|
|
const PROJECT_DIR = process.env.PROJECT_DIR; |
|
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`; |
|
|
|
let assert = require('assert'); |
|
let exec = require('child_process').execSync; |
|
let fs = require('fs'); |
|
let { Rule } = require(`${PROJECT_DIR}/lib/rule`); |
|
let { rmRf } = require(`${PROJECT_DIR}/lib/jake`); |
|
|
|
let cleanUpAndNext = function (callback) { |
|
// Gotta add globbing to file utils rmRf |
|
let tmpFiles = [ |
|
'tmp' |
|
, 'tmp_ns' |
|
, 'tmp_cr' |
|
, 'tmp_p' |
|
, 'tmp_pf' |
|
, 'tmpbin' |
|
, 'tmpsrc' |
|
, 'tmp_dep1.c' |
|
, 'tmp_dep1.o' |
|
, 'tmp_dep1.oo' |
|
, 'tmp_dep2.c' |
|
, 'tmp_dep2.o' |
|
, 'tmp_dep2.oo' |
|
, 'foo' |
|
, 'foo.html' |
|
]; |
|
tmpFiles.forEach(function (f) { |
|
rmRf(f, { |
|
silent: true |
|
}); |
|
}); |
|
callback && callback(); |
|
}; |
|
|
|
suite('rule', function () { |
|
|
|
this.timeout(7000); |
|
|
|
setup(function (next) { |
|
cleanUpAndNext(next); |
|
}); |
|
|
|
|
|
// - name foo:bin/main.o |
|
// - pattern bin/%.o |
|
// - source src/%.c |
|
// |
|
// return { |
|
// 'dep' : 'foo:src/main.c', |
|
// 'file': 'src/main.c' |
|
// }; |
|
test('Rule.getSource', function () { |
|
let src = Rule.getSource('foo:bin/main.o', 'bin/%.o', 'src/%.c'); |
|
assert.equal('foo:src/main.c', src); |
|
}); |
|
|
|
test('rule w/o pattern', function () { |
|
let out = exec( `${JAKE_CMD} -q tmp`).toString().trim(); |
|
let output = [ |
|
"tmp_dep2.c task" |
|
, "tmp_dep1.c task" |
|
, "cp tmp_dep1.c tmp_dep1.o task" |
|
, "cp tmp_dep2.c tmp_dep2.o task" |
|
, "tmp task"]; |
|
assert.equal( output.join('\n'), out); |
|
let data = fs.readFileSync(process.cwd() + '/tmp'); |
|
assert.equal('src_1src_2', data.toString()); |
|
cleanUpAndNext(); |
|
}); |
|
|
|
test('rule w pattern w/o folder w/o namespace', function () { |
|
let out = exec( `${JAKE_CMD} -q tmp_p`).toString().trim(); |
|
let output = [ |
|
"tmp_dep2.c task" |
|
, "tmp_dep1.c task" |
|
, "cp tmp_dep1.c tmp_dep1.oo task" |
|
, "cp tmp_dep2.c tmp_dep2.oo task" |
|
, "tmp pattern task"]; |
|
let data; |
|
assert.equal( output.join('\n'), out); |
|
data = fs.readFileSync(process.cwd() + '/tmp_p'); |
|
assert.equal('src_1src_2 pattern', data.toString()); |
|
cleanUpAndNext(); |
|
}); |
|
|
|
test('rule w pattern w folder w/o namespace', function () { |
|
let out = exec( `${JAKE_CMD} -q tmp_pf`).toString().trim(); |
|
let output = [ |
|
"tmpsrc/tmp_dep1.c task" |
|
, "cp tmpsrc/tmp_dep1.c tmpbin/tmp_dep1.oo task" |
|
, "tmpsrc/tmp_dep2.c task" |
|
, "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task" |
|
, "tmp pattern folder task"]; |
|
let data; |
|
assert.equal( output.join('\n'), out); |
|
data = fs.readFileSync(process.cwd() + '/tmp_pf'); |
|
assert.equal('src/src_1src/src_2 pattern folder', data.toString()); |
|
cleanUpAndNext(); |
|
}); |
|
|
|
test.skip('rule w pattern w folder w namespace', function () { |
|
let out = exec( `${JAKE_CMD} -q tmp_ns`).toString().trim(); |
|
let output = [ |
|
"tmpsrc/file2.c init task" // yes |
|
, "tmpsrc/tmp_dep2.c task" // no |
|
, "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task" // no |
|
, "tmpsrc/dep1.c task" // no |
|
, "cp tmpsrc/dep1.c tmpbin/dep1.oo ns task" // no |
|
, "cp tmpsrc/file2.c tmpbin/file2.oo ns task" // yes |
|
, "tmp pattern folder namespace task"]; // yes |
|
let data; |
|
assert.equal( output.join('\n'), out); |
|
data = fs.readFileSync(process.cwd() + '/tmp_ns'); |
|
assert.equal('src/src_1src/src_2src/src_3 pattern folder namespace', data.toString()); |
|
cleanUpAndNext(); |
|
}); |
|
|
|
test.skip('rule w chain w pattern w folder w namespace', function () { |
|
let out = exec( `${JAKE_CMD} -q tmp_cr`).toString().trim(); |
|
let output = [ |
|
"chainrule init task" |
|
, "cp tmpsrc/file1.tex tmpbin/file1.dvi tex->dvi task" |
|
, "cp tmpbin/file1.dvi tmpbin/file1.pdf dvi->pdf task" |
|
, "cp tmpsrc/file2.tex tmpbin/file2.dvi tex->dvi task" |
|
, "cp tmpbin/file2.dvi tmpbin/file2.pdf dvi->pdf task" |
|
, "tmp chainrule namespace task"]; |
|
let data; |
|
assert.equal( output.join('\n'), out); |
|
data = fs.readFileSync(process.cwd() + '/tmp_cr'); |
|
assert.equal('tex1 tex2 chainrule namespace', data.toString()); |
|
cleanUpAndNext(); |
|
}); |
|
|
|
|
|
['precedence', 'regexPattern', 'sourceFunction'].forEach(function (key) { |
|
|
|
test('rule with source file not created yet (' + key + ')', function () { |
|
let write = process.stderr.write; |
|
process.stderr.write = () => {}; |
|
rmRf('foo.txt', {silent: true}); |
|
rmRf('foo.html', {silent: true}); |
|
try { |
|
exec(`${JAKE_CMD} ` + key + ':test'); |
|
} |
|
catch(err) { |
|
// foo.txt prereq doesn't exist yet |
|
assert.ok(err.message.indexOf('Unknown task "foo.html"') > -1); |
|
} |
|
process.stderr.write = write; |
|
}); |
|
|
|
test('rule with source file now created (' + key + ')', function () { |
|
fs.writeFileSync('foo.txt', ''); |
|
let out = exec(`${JAKE_CMD} -q ` + key + ':test').toString().trim(); |
|
// Should run prereq and test task |
|
let output = [ |
|
'created html' |
|
, 'ran test' |
|
]; |
|
assert.equal(output.join('\n'), out); |
|
}); |
|
|
|
test('rule with source file modified (' + key + ')', function (next) { |
|
setTimeout(function () { |
|
fs.writeFileSync('foo.txt', ''); |
|
let out = exec(`${JAKE_CMD} -q ` + key + ':test').toString().trim(); |
|
// Should again run both prereq and test task |
|
let output = [ |
|
'created html' |
|
, 'ran test' |
|
]; |
|
assert.equal(output.join('\n'), out); |
|
//next(); |
|
cleanUpAndNext(next); |
|
}, 1000); // Wait to do the touch to ensure mod-time is different |
|
}); |
|
|
|
test('rule with existing objective file and no source ' + |
|
' (should be normal file-task) (' + key + ')', function () { |
|
// Remove just the source file |
|
fs.writeFileSync('foo.html', ''); |
|
rmRf('foo.txt', {silent: true}); |
|
let out = exec(`${JAKE_CMD} -q ` + key + ':test').toString().trim(); |
|
// Should treat existing objective file as plain file-task, |
|
// and just run test-task |
|
let output = [ |
|
'ran test' |
|
]; |
|
assert.equal(output.join('\n'), out); |
|
cleanUpAndNext(); |
|
}); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|