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

}