2
0

test_compile.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. var oc = require("oc");
  2. var fs = require("fs");
  3. var path = require("path");
  4. var Test = require("test.js");
  5. function normalizeLineEndings(text){
  6. return text.replace(/\r\n/g, '\n');
  7. }
  8. function compareResults(result, name, dirs){
  9. fs.writeFileSync(dirs.output + "/" + name, result);
  10. var expected = fs.readFileSync(dirs.expected + "/" + name, "utf8");
  11. if (normalizeLineEndings(result) != normalizeLineEndings(expected))
  12. throw new Test.TestError("Failed");
  13. }
  14. function compile(src){
  15. var text = fs.readFileSync(src, "utf8");
  16. var errors = "";
  17. var result = oc.compile(text, function(e){errors += e;});
  18. if (errors)
  19. throw new Test.TestError(errors);
  20. return result;
  21. }
  22. function expectOk(src, dirs){
  23. var result = compile(src);
  24. var resultName = path.basename(src).replace(".ob", ".js");
  25. compareResults(result, resultName, dirs);
  26. }
  27. function expectError(src, dirs){
  28. var text = fs.readFileSync(src, "utf8");
  29. var errors = "";
  30. try {
  31. oc.compile(text, function(e){errors += e + "\n";});
  32. }
  33. catch (e){
  34. errors += e;
  35. }
  36. if (!errors.length)
  37. throw new Test.TestError("compiler error expected");
  38. var resultName = path.basename(src).replace(".ob", ".txt");
  39. compareResults(errors, resultName, dirs);
  40. }
  41. function run(src, dirs){
  42. eval(compile(src));
  43. }
  44. function makeTest(test, src, dirs){
  45. return function(){test(src, dirs);};
  46. }
  47. function makeTests(test, dirs){
  48. var sources = fs.readdirSync(dirs.input);
  49. var tests = {};
  50. for(var i = 0; i < sources.length; ++i){
  51. var source = sources[i];
  52. var path = dirs.input + "/" + source;
  53. if (fs.statSync(path).isFile())
  54. tests[source] = makeTest(test, path, dirs);
  55. }
  56. return tests;
  57. }
  58. if (process.argv.length > 2){
  59. var tests = {};
  60. var name = process.argv[2];
  61. tests[name] = function(){run(name);};
  62. Test.run(tests);
  63. return;
  64. }
  65. var okDirs = {input: "input", output: "output", expected: "expected"};
  66. var errDirs = {};
  67. var runDirs = {};
  68. for(var p in okDirs)
  69. errDirs[p] = okDirs[p] + "/errors";
  70. for(var p in okDirs)
  71. runDirs[p] = okDirs[p] + "/run";
  72. if (!fs.existsSync(okDirs.output))
  73. fs.mkdirSync(okDirs.output);
  74. if (!fs.existsSync(errDirs.output))
  75. fs.mkdirSync(errDirs.output);
  76. if (!fs.existsSync(runDirs.output))
  77. fs.mkdirSync(runDirs.output);
  78. Test.run({"expect OK": makeTests(expectOk, okDirs),
  79. "expect compile error": makeTests(expectError, errDirs),
  80. "run": makeTests(run, runDirs)}
  81. );