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