@luminati-io/jake
Version:
JavaScript build tool, similar to Make or Rake
229 lines (204 loc) • 6.75 kB
JavaScript
var assert = require('assert')
, fs = require('fs')
, path = require('path')
, exec = require('child_process').exec
, h = require('./helpers')
, Matcher = require('../lib/rule').Matcher
, utils = require('utilities');
var cleanUpAndNext = function (callback) {
// Gotta add globbing to file utils rmRf
var 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) {
utils.file.rmRf(f, {
silent: true
});
});
callback();
};
var tests = {
'before': function (next) {
process.chdir('./test');
cleanUpAndNext(next);
}
, 'after': function () {
process.chdir('../');
}
// - name foo:bin/main.o
// - pattern bin/%.o
// - source src/%.c
//
// return {
// 'dep' : 'foo:src/main.c',
// 'file': 'src/main.c'
// };
, 'test Matcher.getSource': function () {
var src = Matcher.getSource('foo:bin/main.o', 'bin/%.o', 'src/%.c');
assert.equal('foo:src/main.c', src);
}
, 'test rule w/o pattern': function (next) {
h.exec( '../bin/cli.js -f Jakefile.rule tmp', function (out) {
var 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" ];
var data;
assert.equal( output.join('\n') , out);
data = fs.readFileSync(process.cwd() + '/tmp');
assert.equal('src_1src_2', data.toString());
cleanUpAndNext(next);
});
}
, 'test rule w pattern w/o folder w/o namespace': function (next) {
h.exec( '../bin/cli.js -f Jakefile.rule tmp_p', function (out) {
var 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" ];
var data;
assert.equal( output.join('\n') , out);
data = fs.readFileSync(process.cwd() + '/tmp_p');
assert.equal('src_1src_2 pattern', data.toString());
cleanUpAndNext(next);
});
}
, 'test rule w pattern w folder w/o namespace': function (next) {
h.exec( '../bin/cli.js -f Jakefile.rule tmp_pf', function (out) {
var 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" ];
var 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(next);
});
}
, 'test rule w pattern w folder w namespace': function (next) {
h.exec( '../bin/cli.js -f Jakefile.rule tmp_ns', function (out) {
var output = [
"tmpsrc/file2.c init task"
, "tmpsrc/tmp_dep2.c task"
, "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task"
, "tmpsrc/dep1.c task"
, "cp tmpsrc/dep1.c tmpbin/dep1.oo ns task"
, "cp tmpsrc/file2.c tmpbin/file2.oo ns task"
, "tmp pattern folder namespace task" ];
var 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(next);
});
}
, 'test rule w chain w pattern w folder w namespace': function (next) {
h.exec( '../bin/cli.js -f Jakefile.rule tmp_cr', function (out) {
var 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" ];
var data;
assert.equal( output.join('\n') , out);
data = fs.readFileSync(process.cwd() + '/tmp_cr');
assert.equal('tex1 tex2 chainrule namespace', data.toString());
cleanUpAndNext(next);
});
}
};
['precedence', 'regexPattern', 'sourceFunction'].forEach(function (key) {
tests['test rule with source file not created yet (' + key + ')'] = function (next) {
utils.file.rmRf('foo.txt', {silent: true});
utils.file.rmRf('foo.html', {silent: true});
h.exec('../bin/cli.js -f Jakefile.rule ' + key + ':test', {breakOnError: false},
function (out) {
// foo.txt prereq doesn't exist yet
assert.ok(out.toString().indexOf('Unknown task "foo.html"') > -1);
next();
});
};
tests['test rule with source file now created (' + key + ')'] = function (next) {
fs.writeFileSync('foo.txt', '');
h.exec('../bin/cli.js -f Jakefile.rule ' + key + ':test', function (out) {
// Should run prereq and test task
var output = [
'created html'
, 'ran test'
];
assert.equal(output.join('\n'), out);
next();
});
};
/*
tests['test rule with objective file now created (' + key + ')'] = function (next) {
fs.writeFileSync('foo.txt', '');
h.exec('../bin/cli.js -f Jakefile.rule ' + key + ':test', function (out) {
// Should only run test task
var output = [
'ran test'
];
assert.equal(output.join('\n'), out);
next();
});
};
*/
tests['test rule with source file modified (' + key + ')'] = function (next) {
setTimeout(function () {
fs.writeFile('foo.txt', '', function (err, data) {
if (err) {
throw err;
}
h.exec('../bin/cli.js -f Jakefile.rule ' + key + ':test', function (out) {
// Should again run both prereq and test task
var 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
};
tests['test rule with existing objective file and no source ' +
' (should be normal file-task) (' + key + ')'] = function (next) {
// Remove just the source file
fs.writeFileSync('foo.html', '');
utils.file.rmRf('foo.txt', {silent: true});
h.exec('../bin/cli.js -f Jakefile.rule ' + key + ':test', function (out) {
// Should treat existing objective file as plain file-task,
// and just run test-task
var output = [
'ran test'
];
assert.equal(output.join('\n'), out);
cleanUpAndNext(next);
});
};
});
module.exports = tests;