| 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]); | 
|         } | 
|     } | 
| } |