test_compile.js 2.7 KB

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