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: function(){ cb(null, handler.events.reduce(eventReducer, [])); }}); return handler; }; 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(cb){ 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)); }); } };