84 lines
1.9 KiB
JavaScript
84 lines
1.9 KiB
JavaScript
|
var htmlparser2 = require(".."),
|
||
|
fs = require("fs"),
|
||
|
path = require("path"),
|
||
|
assert = require("assert"),
|
||
|
Parser = htmlparser2.Parser,
|
||
|
CollectingHandler = htmlparser2.CollectingHandler;
|
||
|
|
||
|
exports.writeToParser = function(handler, options, data){
|
||
|
var parser = new Parser(handler, options);
|
||
|
//first, try to run the test via chunks
|
||
|
for(var i = 0; i < data.length; i++){
|
||
|
parser.write(data.charAt(i));
|
||
|
}
|
||
|
parser.end();
|
||
|
//then parse everything
|
||
|
parser.parseComplete(data);
|
||
|
};
|
||
|
|
||
|
//returns a tree structure
|
||
|
exports.getEventCollector = function(cb){
|
||
|
var handler = new CollectingHandler({onerror: cb, onend: onend});
|
||
|
|
||
|
return handler;
|
||
|
|
||
|
function onend(){
|
||
|
cb(null, handler.events.reduce(eventReducer, []));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function eventReducer(events, arr){
|
||
|
if(arr[0] === "onerror" || arr[0] === "onend");
|
||
|
else if(arr[0] === "ontext" && events.length && events[events.length - 1].event === "text"){
|
||
|
events[events.length - 1].data[0] += arr[1];
|
||
|
} else {
|
||
|
events.push({
|
||
|
event: arr[0].substr(2),
|
||
|
data: arr.slice(1)
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return events;
|
||
|
}
|
||
|
|
||
|
function getCallback(expected, done){
|
||
|
var repeated = false;
|
||
|
|
||
|
return function(err, actual){
|
||
|
assert.ifError(err);
|
||
|
try {
|
||
|
assert.deepEqual(expected, actual, "didn't get expected output");
|
||
|
} catch(e){
|
||
|
e.expected = JSON.stringify(expected, null, 2);
|
||
|
e.actual = JSON.stringify(actual, null, 2);
|
||
|
throw e;
|
||
|
}
|
||
|
|
||
|
if(repeated) done();
|
||
|
else repeated = true;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
exports.mochaTest = function(name, root, test){
|
||
|
describe(name, readDir);
|
||
|
|
||
|
function readDir(){
|
||
|
var dir = path.join(root, name);
|
||
|
|
||
|
fs
|
||
|
.readdirSync(dir)
|
||
|
.filter(RegExp.prototype.test, /^[^\._]/) //ignore all files with a leading dot or underscore
|
||
|
.map(function(name){
|
||
|
return path.join(dir, name);
|
||
|
})
|
||
|
.map(require)
|
||
|
.forEach(runTest);
|
||
|
}
|
||
|
|
||
|
function runTest(file){
|
||
|
it(file.name, function(done){
|
||
|
test(file, getCallback(file.expected, done));
|
||
|
});
|
||
|
}
|
||
|
};
|