瀏覽代碼

more tests

Vladislav Folts 12 年之前
父節點
當前提交
4ef4b39111
共有 8 個文件被更改,包括 132 次插入89 次删除
  1. 6 3
      src/oc.js
  2. 1 0
      test/expected/errors/compile.txt
  3. 2 0
      test/input/errors/compile.ob
  4. 50 39
      test/test.js
  5. 2 0
      test/test_compile.cmd
  6. 67 0
      test/test_compile.js
  7. 1 1
      test/test_unit.cmd
  8. 3 46
      test/test_unit.js

+ 6 - 3
src/oc.js

@@ -5,7 +5,7 @@ var Grammar = require("grammar.js");
 var Lexer = require("lexer.js");
 var Stream = require("stream.js").Stream;
 
-exports.compile = function(text){
+exports.compile = function(text, handleErrors){
 	var stream = new Stream(text);
 	var context = new Context.Context();
 	try {
@@ -14,8 +14,11 @@ exports.compile = function(text){
 	}
 	catch (x) {
 		if (x instanceof Errors.Error) {
-			console.log(context.getResult());
-			console.error(stream.describePosition());
+			//console.log(context.getResult());
+			if (handleErrors){
+				handleErrors(stream.describePosition() + ": " + x);
+				return undefined;
+			}
 		}
 		throw x;
 	}

+ 1 - 0
test/expected/errors/compile.txt

@@ -0,0 +1 @@
+line 2: original module name 'm1' expected, got 'm2'

+ 2 - 0
test/input/errors/compile.ob

@@ -0,0 +1,2 @@
+MODULE m1;
+END m2.

+ 50 - 39
test/test.js

@@ -1,50 +1,61 @@
-var oc = require('oc');
-var fs = require('fs');
+function TestError(s) {this.__s = s;}
+TestError.prototype.toString = function(){return this.__s;};
 
-function normalizeLineEndings(text)
-{
-    return text.replace(/\r\n/g, '\n');
+function runImpl(tests, stat, tab){
+    for(var t in tests)
+        if (!runTest(t, tests, stat, tab))
+            ++stat.failCount;
 }
 
-function run()
-{
-    var inputDir = "input";
-    var outputDir = "output";
-    if (!fs.existsSync(outputDir))
-        fs.mkdirSync(outputDir);
-    var sources = fs.readdirSync(inputDir);
-    var failCount = 0;
+function runTest(t, tests, stat, tab){
+    var r = tests[t];
+	if (typeof r != "function"){
+        console.log(tab + t);
+        runImpl(r, stat, tab + "\t");
+        return true;
+    }
 
-    var start = Date.now();
+    var result = false;
+	var padding = "                           ";
+	var log = t;
+	if (log.length < padding.length)
+		log = t + padding.substring(log.length);
+	else
+		log += " ";
 
-    for(var i = 0; i < sources.length; ++i)
-    {
-        var source = sources[i];
-        console.log(source + ":\t");
-        var text = fs.readFileSync(inputDir + "/" + source, "utf8");
-        var result = oc.compile(text);
-        var resultName = source.replace(".ob", ".js");
-        fs.writeFileSync(outputDir + "/" + resultName, result);
-        var success = (normalizeLineEndings(result) == normalizeLineEndings(fs.readFileSync("expected/" + resultName, "utf8")));
-        console.log(success ? "OK" : "Failed");
-        if (!success)
-            ++failCount;
-    }
-    console.log(sources.length + " tests" + (failCount ? ", " + failCount + " failed." : ""));
+	try {
+        ++stat.count;
+		r();
+		log += "OK";
+		result = true;
+	}
+	catch (x){
+		if (x instanceof TestError)
+			log += "Failed\n\t" + tab + x;
+		else
+			log += "Failed\n" + (x.stack ? x.stack : '\t' + tab + x);
+	}
+	console.log(tab + log);
+	return result;
+}
+
+function run(tests){
+    var stat = {count: 0, failCount: 0};
 
+    var start = Date.now();
+    if (typeof process != "undefined" && process.argv.length > 2)
+        runTest(process.argv[2], tests, "");
+    else
+        runImpl(tests, stat, "");
     var stop = Date.now();
-    console.log("elapsed: " + (stop - start) / 1000 + " s" );
 
-    if (!failCount)
+    console.log("elapsed: " + (stop - start) / 1000 + " s" );
+    console.log(stat.count + " test(s) run");
+    if (!stat.failCount)
         console.log("All OK!");
+    else
+        console.log(stat.failCount + " test(s) failed");
 }
 
-//try
-{
-    run();
-}
-//catch (x)
-//{
- //   console.error(x);
-//    console.error(x.stack);
-//}
+exports.run = run;
+exports.TestError = TestError;

+ 2 - 0
test/test_compile.cmd

@@ -0,0 +1,2 @@
+SET NODE_PATH=.;%~dp0../src
+"C:\Program Files\nodejs\node.exe" test_compile.js

+ 67 - 0
test/test_compile.js

@@ -0,0 +1,67 @@
+var oc = require("oc");
+var fs = require("fs");
+var path = require("path");
+var Test = require("test.js");
+
+function normalizeLineEndings(text){
+    return text.replace(/\r\n/g, '\n');
+}
+
+function compareResults(result, name, dirs){
+    fs.writeFileSync(dirs.output + "/" + name, result);
+    var expected = fs.readFileSync(dirs.expected + "/" + name, "utf8");
+    if (normalizeLineEndings(result) != normalizeLineEndings(expected))
+        throw new Test.TestError("Failed");
+}
+
+function expectOk(src, dirs){
+    var text = fs.readFileSync(src, "utf8");
+    var result = oc.compile(text);
+    var resultName = path.basename(src).replace(".ob", ".js");
+    compareResults(result, resultName, dirs);
+}
+
+function expectError(src, dirs){
+    var text = fs.readFileSync(src, "utf8");
+    var errors = "";
+    try {
+        oc.compile(text, function(e){errors += e + "\n";});
+    }
+    catch (e){
+        errors += e;
+    }
+    if (!errors.length)
+        throw new Test.TestError("compiler error expected");
+    var resultName = path.basename(src).replace(".ob", ".txt");
+    compareResults(errors, resultName, dirs);
+}
+
+function makeTest(test, src, dirs){
+    return function(){test(src, dirs);};
+}
+
+function makeTests(test, dirs){
+    var sources = fs.readdirSync(dirs.input);
+    var tests = {};
+    for(var i = 0; i < sources.length; ++i){
+        var source = sources[i];
+        var path = dirs.input + "/" + source;
+        if (fs.statSync(path).isFile())
+            tests[source] = makeTest(test, path, dirs);
+    }
+    return tests;
+}
+
+var okDirs = {input: "input", output: "output", expected: "expected"};
+var errDirs = {};
+for(var p in okDirs)
+    errDirs[p] = okDirs[p] + "/errors";
+
+if (!fs.existsSync(okDirs.output))
+    fs.mkdirSync(okDirs.output);
+if (!fs.existsSync(errDirs.output))
+    fs.mkdirSync(errDirs.output);
+
+Test.run({"expect OK": makeTests(expectOk, okDirs),
+          "expect compile error": makeTests(expectError, errDirs)}
+        );

+ 1 - 1
test/test_unit.cmd

@@ -1,2 +1,2 @@
-SET NODE_PATH=%~dp0../src
+SET NODE_PATH=.;%~dp0../src
 "C:\Program Files\nodejs\node.exe" test_unit.js %*

+ 3 - 46
test/test_unit.js

@@ -5,9 +5,9 @@ var Grammar = require("grammar.js");
 var oc = require("oc.js");
 var Class = require("rtl.js").Class;
 var Stream = require("stream.js").Stream;
+var Test = require("test.js");
 
-function TestError(s) {this.__s = s;}
-TestError.prototype.toString = function(){return this.__s;};
+var TestError = Test.TestError;
 
 function parseInContext(grammar, s, context){
 	var stream = new Stream(s);
@@ -771,47 +771,4 @@ IMPORT: function(){
 	test.parse("MODULE m; IMPORT JS; BEGIN JS.console.info(123) END m.");
 }};
 
-function runTest(t){
-	var result = false;
-	var padding = "                           ";
-	var log = t;
-	if (log.length < padding.length)
-		log = t + padding.substring(log.length);
-	else
-		log += " ";
-
-	try {
-		testSuite[t]();
-		log += "OK";
-		result = true;
-	}
-	catch (x){
-		if (x instanceof TestError)
-			log += "Failed\n\t" + x;
-		else
-			log += "Failed\n" + (x.stack ? x.stack : '\t' + x);
-	}
-	console.log(log);
-	return result;
-}
-
-var failCount = 0;
-var start = Date.now();
-
-if (typeof process != "undefined" && process.argv.length > 2)
-	runTest(process.argv[2]);
-else {
-	console.log("Running " + Object.keys(testSuite).length + " tests...");
-
-	for(var t in testSuite)
-		if (!runTest(t))
-			++failCount;
-}
-
-var stop = Date.now();
-console.log("elapsed: " + (stop - start) / 1000 + " s" );
-
-if (!failCount)
-	console.log("All OK!");
-else
-	console.log(failCount + " test(s) failed");
+Test.run(testSuite);