| var fs = require("fs"), |
| path = require("path"), |
| assert = require("assert"), |
| util = require("util"), |
| Parser = require("htmlparser2").Parser, |
| Handler = require("../"); |
| |
| var basePath = path.resolve(__dirname, "cases"), |
| inspectOpts = { showHidden: true, depth: null }; |
| |
| fs |
| .readdirSync(basePath) |
| .filter(RegExp.prototype.test, /\.json$/) //only allow .json files |
| .map(function(name){ |
| return path.resolve(basePath, name); |
| }) |
| .map(require) |
| .forEach(function(test){ |
| it(test.name, function(){ |
| var expected = test.expected; |
| |
| var handler = new Handler(function(err, actual){ |
| assert.ifError(err); |
| try { |
| compare(expected, actual); |
| } catch(e){ |
| e.expected = util.inspect(expected, inspectOpts); |
| e.actual = util.inspect(actual, inspectOpts); |
| throw e; |
| } |
| }, test.options); |
| |
| var data = test.html; |
| |
| var parser = new Parser(handler, test.options); |
| |
| //first, try to run the test via chunks |
| if (test.streaming || test.streaming === undefined){ |
| for(var i = 0; i < data.length; i++){ |
| parser.write(data.charAt(i)); |
| } |
| parser.done(); |
| } |
| |
| //then parse everything |
| parser.parseComplete(data); |
| }); |
| }); |
| |
| function compare(expected, result){ |
| assert.equal(typeof expected, typeof result, "types didn't match"); |
| if(typeof expected !== "object" || expected === null){ |
| assert.strictEqual(expected, result, "result doesn't equal expected"); |
| } else { |
| for(var prop in expected){ |
| assert.ok(prop in result, "result didn't contain property " + prop); |
| compare(expected[prop], result[prop]); |
| } |
| } |
| } |