mediawiki-extensions-Visual.../tests/parser/roundtrip-test.js
2011-12-01 15:23:23 +00:00

63 lines
1.6 KiB
JavaScript

module.exports.init = function(worker) {
var fs = require('fs'),
path = require('path');
// Fetch up some of our wacky parser bits...
//var basePath = '../modules/';
var basePath = path.join(path.dirname(process.cwd()), 'modules');
function _require(filename) {
return require(path.join(basePath, filename));
}
function _import(filename, symbols) {
var module = _require(filename);
symbols.forEach(function(symbol) {
global[symbol] = module[symbol];
})
}
// For now most modules only need this for $.extend and $.each :)
global.$ = require('jquery');
// XXX: Avoid a global here!
global.PEG = require('pegjs');
// Our code...
_import('ext.parserPlayground.serializer.js', ['MWTreeSerializer']);
_import('ext.parserPlayground.pegParser.js', ['PegParser']);
// Preload the grammar file...
PegParser.src = fs.readFileSync(path.join(basePath, 'pegParser.pegjs.txt'), 'utf8');
var parser = new PegParser(),
serializer = new MWTreeSerializer();
function sendResult(expected, received, msg) {
worker.postMessage({
expected: expected,
received: received,
msg: msg
});
}
roundTripTest = function(text, msg) {
parser.parseToTree(text, function(tree, err) {
if (err) throw new Error(err);
serializer.treeToSource(tree, function(newText, err) {
if (err) throw new Error(err);
sendResult(text, newText, msg);
})
})
}
worker.onmessage = function(msg) {
var data = msg.data;
if (data.action == 'roundTrip') {
roundTripTest(data.text, data.msg);
} else {
throw new Error('unknown action ' + data.action);
}
}
};