294 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			294 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env node
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var nodeunit = require('nodeunit'),
							 | 
						||
| 
								 | 
							
								    fs = require('fs'),
							 | 
						||
| 
								 | 
							
								    path = require('path'),
							 | 
						||
| 
								 | 
							
								    AssertionError = require('assert').AssertionError;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var optimist = require('optimist')
							 | 
						||
| 
								 | 
							
								    .usage('Run the jsdom test suite')
							 | 
						||
| 
								 | 
							
								    .alias('s', 'suites')
							 | 
						||
| 
								 | 
							
								    .string('s')
							 | 
						||
| 
								 | 
							
								    .describe('s', 'suites that you want to run. ie: -s level1/core,1/html,html')
							 | 
						||
| 
								 | 
							
								    .alias('f', 'fail-fast')
							 | 
						||
| 
								 | 
							
								    .describe('f', 'stop on the first failed test')
							 | 
						||
| 
								 | 
							
								    .alias('h', 'help')
							 | 
						||
| 
								 | 
							
								    .describe('h', 'show the help')
							 | 
						||
| 
								 | 
							
								    .alias('t', 'tests')
							 | 
						||
| 
								 | 
							
								    .describe('t', 'choose the test cases to run. ie: -t jquery')
							 | 
						||
| 
								 | 
							
								    .alias('d', 'debug')
							 | 
						||
| 
								 | 
							
								    .describe('d', 'run in node\'s interactive debugger mode')
							 | 
						||
| 
								 | 
							
								    .alias('p', 'parser')
							 | 
						||
| 
								 | 
							
								    .describe('p', 'the HTML parser to use (e.g. html5); default is htmlparser')
							 | 
						||
| 
								 | 
							
								    .alias('v', 'verbose')
							 | 
						||
| 
								 | 
							
								    .describe('v', 'show all tests that are being run');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var argv = optimist.argv;
							 | 
						||
| 
								 | 
							
								if (argv.help) {
							 | 
						||
| 
								 | 
							
								  optimist.showHelp();
							 | 
						||
| 
								 | 
							
								  process.exit();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var totalTests = 0;
							 | 
						||
| 
								 | 
							
								var failedTests = 0;
							 | 
						||
| 
								 | 
							
								var passedTests = 0;
							 | 
						||
| 
								 | 
							
								var modules = {};
							 | 
						||
| 
								 | 
							
								var currentModule = "";
							 | 
						||
| 
								 | 
							
								var moduleIndex = 0;
							 | 
						||
| 
								 | 
							
								var start = new Date().getTime();
							 | 
						||
| 
								 | 
							
								var fileFilter = [];
							 | 
						||
| 
								 | 
							
								var testFilter = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Error.stackTraceLimit = 100;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (argv.suites) {
							 | 
						||
| 
								 | 
							
								  fileFilter = argv.suites.replace(/\s/g, '').split(',');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (argv.tests) {
							 | 
						||
| 
								 | 
							
								  testFilter = argv.tests.replace(/\s/g, '').split(',');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var assert = require('nodeunit/lib/assert');
							 | 
						||
| 
								 | 
							
								require('nodeunit/lib/assert').equal = function equal(actual, expected, message) {
							 | 
						||
| 
								 | 
							
								  if (actual != expected) {
							 | 
						||
| 
								 | 
							
								    if (actual && actual.nodeType) {
							 | 
						||
| 
								 | 
							
								      actual = actual.toString();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (expected && expected.nodeType) {
							 | 
						||
| 
								 | 
							
								      expected = expected.toString();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    assert.fail(actual, expected, message, '==', assert.equal);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								assert.domSame = function(actual, expected, message) {
							 | 
						||
| 
								 | 
							
								  if(expected != actual) {
							 | 
						||
| 
								 | 
							
								    assert.equal(expected.nodeType, actual.nodeType);
							 | 
						||
| 
								 | 
							
								    assert.equal(expected.nodeValue, actual.nodeValue);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var files = [
							 | 
						||
| 
								 | 
							
								  "level1/core.js",
							 | 
						||
| 
								 | 
							
								  "level1/html.js",
							 | 
						||
| 
								 | 
							
								  "level1/svg.js",
							 | 
						||
| 
								 | 
							
								  "level2/core.js",
							 | 
						||
| 
								 | 
							
								  "level2/html.js",
							 | 
						||
| 
								 | 
							
								  "level2/style.js",
							 | 
						||
| 
								 | 
							
								  "level2/extra.js",
							 | 
						||
| 
								 | 
							
								  "level2/events.js",
							 | 
						||
| 
								 | 
							
								  //"level3/core.js",
							 | 
						||
| 
								 | 
							
								  //"level3/ls.js",
							 | 
						||
| 
								 | 
							
								  "level3/xpath.js",
							 | 
						||
| 
								 | 
							
								  "whatwg/attributes.js",
							 | 
						||
| 
								 | 
							
								  "window/index.js",
							 | 
						||
| 
								 | 
							
								  "window/history.js",
							 | 
						||
| 
								 | 
							
								  "window/script.js",
							 | 
						||
| 
								 | 
							
								  "window/console.js",
							 | 
						||
| 
								 | 
							
								  "window/frame.js",
							 | 
						||
| 
								 | 
							
								  "sizzle/index.js",
							 | 
						||
| 
								 | 
							
								  "jsdom/index.js",
							 | 
						||
| 
								 | 
							
								  "jsdom/parsing.js",
							 | 
						||
| 
								 | 
							
								  "jsdom/env.js",
							 | 
						||
| 
								 | 
							
								  "jsdom/utils.js",
							 | 
						||
| 
								 | 
							
								  "jsonp/jsonp.js",
							 | 
						||
| 
								 | 
							
								  "browser/css.js",
							 | 
						||
| 
								 | 
							
								  "browser/index.js"
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (fileFilter.length > 0) {
							 | 
						||
| 
								 | 
							
								  files = files.filter(function(val) {
							 | 
						||
| 
								 | 
							
								   var ok = false;
							 | 
						||
| 
								 | 
							
								   fileFilter.forEach(function(v) {
							 | 
						||
| 
								 | 
							
								     if (val.indexOf(v) > -1) {
							 | 
						||
| 
								 | 
							
								      ok = true;
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								   });
							 | 
						||
| 
								 | 
							
								   return ok;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var modules = {};
							 | 
						||
| 
								 | 
							
								var modulesToRun = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								files.map(function (p) {
							 | 
						||
| 
								 | 
							
								  var required = require(path.join(__dirname, p));
							 | 
						||
| 
								 | 
							
								  var module = required.tests || required;
							 | 
						||
| 
								 | 
							
								  var filteredModule = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (testFilter.length) {
							 | 
						||
| 
								 | 
							
								    var moduleKeys = Object.keys(module);
							 | 
						||
| 
								 | 
							
								    testFilter.forEach(function(filter) {
							 | 
						||
| 
								 | 
							
								      filter = filter.toLowerCase();
							 | 
						||
| 
								 | 
							
								      moduleKeys.forEach(function(moduleKey) {
							 | 
						||
| 
								 | 
							
								        if (moduleKey.toLowerCase().indexOf(filter) > -1) {
							 | 
						||
| 
								 | 
							
								          filteredModule[moduleKey] = module[moduleKey];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    module = filteredModule;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (module && Object.keys(module).length > 0) {
							 | 
						||
| 
								 | 
							
								    modulesToRun[p] = module;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (argv.parser) {
							 | 
						||
| 
								 | 
							
								  var browser = require("../lib/jsdom/browser/index");
							 | 
						||
| 
								 | 
							
								  console.log("Using parser " + argv.parser);
							 | 
						||
| 
								 | 
							
								  browser.setDefaultParser(argv.parser);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								nodeunit.runModules(modulesToRun, {
							 | 
						||
| 
								 | 
							
								  moduleStart: function (name) {
							 | 
						||
| 
								 | 
							
								    currentModule = name.replace('.js', '');
							 | 
						||
| 
								 | 
							
								    console.log("running", name, currentModule);
							 | 
						||
| 
								 | 
							
								    modules[currentModule] = {
							 | 
						||
| 
								 | 
							
								      total : 0,
							 | 
						||
| 
								 | 
							
								      fail  : 0,
							 | 
						||
| 
								 | 
							
								      pass  : 0
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    moduleIndex++;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  moduleDone: function (name, assertions) {
							 | 
						||
| 
								 | 
							
								    if (argv['verbose']) {
							 | 
						||
| 
								 | 
							
								      console.log(' ');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  testStart: function (test) {
							 | 
						||
| 
								 | 
							
								    modules[currentModule].total++;
							 | 
						||
| 
								 | 
							
								    if (argv['verbose']) {
							 | 
						||
| 
								 | 
							
								      process.stdout.write('  ' + test[0] + ' ...');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  testDone: function (test, assertions) {
							 | 
						||
| 
								 | 
							
								    if (argv['verbose']) {
							 | 
						||
| 
								 | 
							
								      console.log(' done');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    totalTests++;
							 | 
						||
| 
								 | 
							
								    if (!assertions.failures()) {
							 | 
						||
| 
								 | 
							
								      passedTests++;
							 | 
						||
| 
								 | 
							
								      modules[currentModule].pass++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								      failedTests++;
							 | 
						||
| 
								 | 
							
								      modules[currentModule].fail++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      console.log('✖ ' + currentModule + '/' + test);
							 | 
						||
| 
								 | 
							
								      assertions.forEach(function (a) {
							 | 
						||
| 
								 | 
							
								        if (a.failed()) {
							 | 
						||
| 
								 | 
							
								          if (a.error instanceof AssertionError) {
							 | 
						||
| 
								 | 
							
								            a = nodeunit.utils.betterErrors(a);
							 | 
						||
| 
								 | 
							
								            if (a.message) {
							 | 
						||
| 
								 | 
							
								                console.log(
							 | 
						||
| 
								 | 
							
								                    'Assertion Message: ' + assertion_message(a.message) + '\n' +
							 | 
						||
| 
								 | 
							
								                    'expected:', a.error.expected, 'got:', a.error.actual
							 | 
						||
| 
								 | 
							
								                 );
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								           } else {
							 | 
						||
| 
								 | 
							
								            if (a.error.expected || a.error.actual) {
							 | 
						||
| 
								 | 
							
								              console.log('\nERROR', a.error.expected, 'vs', a.error.actual, '\n');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            console.log(a.error.message, a.error.stack, (new Error()).stack);
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								         } else {
							 | 
						||
| 
								 | 
							
								           console.log(a.message);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (argv['fail-fast']) {
							 | 
						||
| 
								 | 
							
								        process.exit();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  done: function (assertions) {
							 | 
						||
| 
								 | 
							
								    var end = new Date().getTime();
							 | 
						||
| 
								 | 
							
								    var duration = end - start;
							 | 
						||
| 
								 | 
							
								    var maxWidths = {
							 | 
						||
| 
								 | 
							
								      name   : 0,
							 | 
						||
| 
								 | 
							
								      ratio   : 0,
							 | 
						||
| 
								 | 
							
								      percent : 4
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    var width = 0;
							 | 
						||
| 
								 | 
							
								    var keys = Object.keys(modules);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var calculateMax = function(name, value) {
							 | 
						||
| 
								 | 
							
								      if (!maxWidths[name] || value.length > maxWidths[name]) {
							 | 
						||
| 
								 | 
							
								          maxWidths[name] = value.length;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      width = 2;
							 | 
						||
| 
								 | 
							
								      Object.keys(maxWidths).forEach(function(v) {
							 | 
						||
| 
								 | 
							
								        width += maxWidths[v] + 2;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var pad = function(name, value, rightJustified) {
							 | 
						||
| 
								 | 
							
								      var ret = '';
							 | 
						||
| 
								 | 
							
								      var padding = '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var amount = maxWidths[name] - value.length;
							 | 
						||
| 
								 | 
							
								      while(amount--) {
							 | 
						||
| 
								 | 
							
								          padding += " ";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (rightJustified) {
							 | 
						||
| 
								 | 
							
								        return ' ' + padding + value + '     ';
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        return ' ' + value + padding + '     ';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // First pass, calculate the max widths
							 | 
						||
| 
								 | 
							
								    keys.forEach(function(v) {
							 | 
						||
| 
								 | 
							
								       var module = modules[v];
							 | 
						||
| 
								 | 
							
								       var ratio  = module.pass + '/' + module.total;
							 | 
						||
| 
								 | 
							
								       var percentage = Math.floor((module.pass/module.total)*100) + '%';
							 | 
						||
| 
								 | 
							
								       modules[v].ratio = ratio;
							 | 
						||
| 
								 | 
							
								       modules[v].percentage = percentage;
							 | 
						||
| 
								 | 
							
								       calculateMax('name', v);
							 | 
						||
| 
								 | 
							
								       calculateMax('ratio', ratio);
							 | 
						||
| 
								 | 
							
								       calculateMax('percentage', percentage);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var caps = '';
							 | 
						||
| 
								 | 
							
								    var gen = width;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    while(gen--) {
							 | 
						||
| 
								 | 
							
								      caps += '-';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    console.log('');
							 | 
						||
| 
								 | 
							
								    Object.keys(modules).forEach(function(v) {
							 | 
						||
| 
								 | 
							
								       var module = modules[v];
							 | 
						||
| 
								 | 
							
								       process.stdout.write(pad('name', v, false));
							 | 
						||
| 
								 | 
							
								       process.stdout.write(pad('ratio', module.ratio, true));
							 | 
						||
| 
								 | 
							
								       process.stdout.write(pad('percentage', module.percentage, true));
							 | 
						||
| 
								 | 
							
								       process.stdout.write('\n');
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    console.log(caps);
							 | 
						||
| 
								 | 
							
								    var ratio = failedTests + '/' + totalTests;
							 | 
						||
| 
								 | 
							
								    var percent = 0;
							 | 
						||
| 
								 | 
							
								    if (totalTests === 0) {
							 | 
						||
| 
								 | 
							
								      percent = '100%';
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      percent = Math.floor((passedTests/totalTests)*100) + '%';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    console.log('TOTALS: %s failed; %s success', ratio, percent);
							 | 
						||
| 
								 | 
							
								    console.log('TIME: %dms', duration);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (passedTests !== totalTests) {
							 | 
						||
| 
								 | 
							
								      process.exit(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 |