thirdparty/jsdoctoolkit/app/t/TestDoc.js
changeset 3041 c8f47f0b6697
equal deleted inserted replaced
3040:8f9580309846 3041:c8f47f0b6697
       
     1 var TestDoc = {
       
     2 	fails: 0,
       
     3 	plans: 0,
       
     4 	passes: 0,
       
     5 	results: []
       
     6 };
       
     7 
       
     8 TestDoc.record = function(result) {
       
     9 	TestDoc.results.push(result);
       
    10 	if (typeof result.verdict == "boolean") {
       
    11 		if (result.verdict === false) TestDoc.fails++;
       
    12 		if (result.verdict === true) TestDoc.passes++;
       
    13 	}
       
    14 }
       
    15 
       
    16 TestDoc.prove = function(filePath) {
       
    17 	if (typeof document != "undefined" && typeof document.write != "undefined") {
       
    18 		if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); }
       
    19 		else print = function(s) { document.write(s+"<br />"); }
       
    20 	}
       
    21 	TestDoc.run(TestDoc.readFile(filePath));
       
    22 }
       
    23 
       
    24 TestDoc.run = function(src) {
       
    25 	try { eval(src); } catch(e) { print("# ERROR! "+e); }
       
    26 	
       
    27 	var chunks = src.split(/\/\*t:/);
       
    28 	
       
    29 	var run = function(chunk) {
       
    30 		// local shortcuts
       
    31 		var is = TestDoc.assertEquals;
       
    32 		var isnt = TestDoc.assertNotEquals;
       
    33 		var plan = TestDoc.plan;
       
    34 		var requires = TestDoc.requires;
       
    35 		
       
    36 		try { eval(chunk); } catch(e) { print("# ERROR! "+e); }
       
    37 	}
       
    38 	for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) {
       
    39 		run(
       
    40 			src.substring(
       
    41 				start+4,
       
    42 				(end = src.indexOf("*/", start))
       
    43 			)
       
    44 		);
       
    45 	}
       
    46 }
       
    47 
       
    48 TestDoc.Result = function(verdict, message) {
       
    49 	this.verdict = verdict;
       
    50 	this.message = message;
       
    51 }
       
    52 
       
    53 TestDoc.Result.prototype.toString = function() {
       
    54 	if (typeof this.verdict == "boolean") {
       
    55 		return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message;
       
    56 	}
       
    57 	
       
    58 	return "# " + this.message;
       
    59 }
       
    60 
       
    61 TestDoc.requires = function(file) {
       
    62 	if (!TestDoc.requires.loaded[file]) {
       
    63 		load(file);
       
    64 		TestDoc.requires.loaded[file] = true;
       
    65 	}
       
    66 }
       
    67 TestDoc.requires.loaded = {};
       
    68 
       
    69 TestDoc.report = function() {
       
    70 	TestDoc.report.counter = 0;
       
    71 	print("1.."+TestDoc.plans);
       
    72 	for (var i = 0; i < TestDoc.results.length; i++) {
       
    73 		print(TestDoc.results[i]);
       
    74 	}
       
    75 	print("----------------------------------------");
       
    76 	if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) {
       
    77 		print("All tests successful.");
       
    78 	}
       
    79 	else {
       
    80 		print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".")
       
    81 	}
       
    82 }
       
    83 
       
    84 TestDoc.plan = function(n, message) {
       
    85 	TestDoc.plans += n;
       
    86 	TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)"));
       
    87 }
       
    88 
       
    89 TestDoc.assertEquals = function(a, b, message) {
       
    90 	var result = (a == b);
       
    91 	if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#";
       
    92 	TestDoc.record(new TestDoc.Result(result, message));
       
    93 }
       
    94 
       
    95 TestDoc.assertNotEquals = function(a, b, message) {
       
    96 	var result = (a != b);
       
    97 	if (!result) message += "\n#\n# " + a + " equals " + b + "\n#";
       
    98 	TestDoc.record(new TestDoc.Result(result, message));
       
    99 }
       
   100 
       
   101 TestDoc.readFile = (function(){
       
   102 	// rhino
       
   103 	if (typeof readFile == "function") {
       
   104 		return function(url) {
       
   105 			var text = readFile(url);
       
   106 			return text || "";
       
   107 		}
       
   108 	}
       
   109 
       
   110 	// a web browser
       
   111 	else {
       
   112 		return function(url) {
       
   113 			var httpRequest;
       
   114 		
       
   115 			if (window.XMLHttpRequest) { // Mozilla, Safari, etc
       
   116 				httpRequest = new XMLHttpRequest();
       
   117 			} 
       
   118 			else if (window.ActiveXObject) { // IE
       
   119 				try {
       
   120 					httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
       
   121 				} 
       
   122 				catch (e) {
       
   123 				   try {
       
   124 						httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
       
   125 					} 
       
   126 					catch (e) {
       
   127 					}
       
   128 				}
       
   129 			}
       
   130 		
       
   131 			if (!httpRequest) { throw "Cannot create HTTP Request."; }
       
   132 			
       
   133 			httpRequest.open('GET', url, false);
       
   134 			httpRequest.send('');
       
   135 			if (httpRequest.readyState == 4) {
       
   136 				if (httpRequest.status >= 400) {
       
   137 					throw "The HTTP Request returned an error code: "+httpRequest.status;
       
   138 				}
       
   139 			}
       
   140 			
       
   141 			return httpRequest.responseText || "";
       
   142 		}
       
   143 	}
       
   144 })();