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.
carto/test/support/helper.js

209 lines
5.7 KiB

var path = require('path'),
_ = require('underscore'),
fs = require('fs'),
assert = require('assert'),
crypto = require('crypto'),
sax = require('sax'),
diff = require('./diff').diff,
constants = ((!process.ENOENT) >= 1) ?
require('constants') :
{ ENOENT: process.ENOENT };
var helper = exports;
exports.files = function(dir, extension, callback) {
var dir = path.join(__dirname, '..', dir);
extension = new RegExp('\\.' + extension + '$');
fs.readdirSync(dir).forEach(function(filename) {
if (extension.test(filename)) {
callback(path.join(dir, filename));
}
});
};
exports.file = function(file, callback) {
fs.readFile(file, 'utf-8', function(err, content) {
if (err) throw err;
callback(content);
});
};
exports.json = function(file, callback) {
fs.readFile(file, 'utf-8', function(err, content) {
if (err) throw err;
callback(JSON.parse(content));
});
};
exports.mml = function(file) {
var mml = JSON.parse(fs.readFileSync(file, 'utf-8'));
mml.Stylesheet = _(mml.Stylesheet).map(function(s) {
return {
id: s,
data: fs.readFileSync(path.join(path.dirname(file), s), 'utf-8')
};
});
return mml;
};
exports.mss = function(file) {
return fs.readFileSync(file, 'utf-8');
};
exports.showDifferences = function(e, format) {
var changes = diff(
(format || JSON.stringify)(e.actual),
(format || JSON.stringify)(e.expected)
);
console.warn(helper.stylize('actual:', 'bold') + '\n' + changes.del);
console.warn(helper.stylize('expected:', 'bold') + '\n' + changes.ins);
};
exports.formatJSON = function(arr) {
return '[\n ' + arr.map(function(t) {
return JSON.stringify(t);
}).join(',\n ') + '\n]';
};
exports.makePlain = function(obj, fn) {
return JSON.parse(JSON.stringify(obj, fn));
};
exports.parseXML = function(xml, callback) {
var parser = sax.parser(true);
var i = 0;
var tree = [ {} ];
parser.onopentag = function(node) {
if (!(node.name in tree[0])) tree[0][node.name] = [];
node.attributes.__order__ = i++;
tree[0][node.name].push(node.attributes);
tree.unshift(node.attributes);
};
parser.onclosetag = function() {
tree.shift();
if (tree.length === 1) callback(tree[0]);
};
parser.ontext = parser.oncdata = function(text) {
if (text.trim()) tree[0].text = (tree[0].text || '') + text;
};
parser.write(xml.toString());
};
exports.compareToXMLFile = function(filename, second, callback, processors) {
helper.file(filename, function(first) {
helper.parseXML(first, function(firstXML) {
helper.parseXML(second, function(secondXML) {
processors.forEach(function(processor) {
processor(secondXML);
});
try {
assert.deepEqual(firstXML, secondXML);
callback(null);
} catch (err) {
callback(err, firstXML, secondXML);
}
});
});
});
};
exports.resultFile = function(file) {
return path.join(path.dirname(file), path.basename(file).replace(/\.\w+$/, '.result'));
};
// Stylize a string
exports.stylize = function(str, style) {
var styles = {
'bold' : [1, 22],
'inverse' : [7, 27],
'underline' : [4, 24],
'yellow' : [33, 39],
'green' : [32, 39],
'red' : [31, 39]
};
return '\033[' + styles[style][0] + 'm' + str +
'\033[' + styles[style][1] + 'm';
};
exports.isDirectory = function(dir, context) {
fs.stat(dir, function(err, stats) {
if (err) throw err;
assert.ok(stats.isDirectory());
context.tests++;
});
};
exports.isFile = function(file, context) {
fs.stat(file, function(err, stats) {
if (err) throw err;
assert.ok(stats.isFile());
context.tests++;
});
};
exports.rmrf = function rmrf(p) {
try {
if (fs.statSync(p).isDirectory()) {
fs.readdirSync(p).forEach(function(file) { rmrf(path.join(p, file)); });
fs.rmdirSync(p);
}
else fs.unlinkSync(p);
} catch (err) {
if (err.errno !== constants.ENOENT) throw err;
}
};
exports.md5File = function(file, md5, context) {
fs.readFile(file, 'binary', function(err, data) {
var hash = crypto.createHash('md5').update(data).digest('hex');
assert.equal(hash, md5);
context.tests++;
});
};
helper.removeErrorFilename = function(error) {
error.forEach(function(e) {
e.filename = '[absolute path]';
});
return error;
};
helper.removeAbsoluteImages = function(xml) {
xml.Map.forEach(function(map) {
if (map.Style) map.Style.forEach(function(style) {
style.Rule.forEach(function(rule) {
for (var symbolizer in rule) {
for (var i = 0; i < rule[symbolizer].length; i++) {
if (rule[symbolizer][i].file) {
rule[symbolizer][i].file = '[absolute path]';
}
}
}
});
});
});
};
helper.removeAbsoluteDatasources = function(xml) {
xml.Map.forEach(function(map) {
if (map.Layer) map.Layer.forEach(function(layer) {
if (!layer.Datasource) return;
layer.Datasource.forEach(function(datasource) {
datasource.Parameter.forEach(function(param) {
if (param.name === 'file') {
param.text = '[absolute path]';
}
});
});
});
});
};