PageRenderTime 44ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/test/run.js

https://github.com/skysbird/js.io
JavaScript | 227 lines | 187 code | 27 blank | 13 comment | 25 complexity | e79c3c4b7e01ab7d09e4e839b6ac5ce5 MD5 | raw file
  1. var envjs_path = process.ENV['ENVJS_PATH'];
  2. var mjsunit_path = process.ENV['MJSUNIT_PATH'];
  3. var posix = require('posix');
  4. var sys = require('sys');
  5. /*
  6. * We're depending on env.js to supply us with a fake DOM.
  7. * We'll get it and then mix it into the global context.
  8. */
  9. require.paths.unshift(envjs_path);
  10. var ENV = require('env');
  11. process.mixin(GLOBAL, ENV);
  12. process.compile(posix.cat(mjsunit_path).wait(), 'mjsunit');
  13. require.paths.unshift(process.cwd());
  14. require('jsio/jsio');
  15. var Event = function (test, error, logs) {
  16. var self = this;
  17. self.test = test;
  18. self.error = error;
  19. self.logs = logs;
  20. };
  21. var TestResult = function () {
  22. var self = this;
  23. self._tests = [];
  24. self._errors = [];
  25. self._failures = [];
  26. self.addTest = function (test) {
  27. self._tests.push(test);
  28. };
  29. self.addError = function (test, error, logs) {
  30. var event = new Event(test, error, logs);
  31. self._errors.push(event);
  32. };
  33. self.addFailure = function (test, failure, logs) {
  34. var event = new Event(test, failure, logs);
  35. self._failures.push(event);
  36. };
  37. self.isSuccess = function () {
  38. return self.events().length == 0;
  39. };
  40. self.testCount = function () {
  41. return self._tests.length;
  42. };
  43. self.errorCount = function () {
  44. return self._errors.length;
  45. };
  46. self.failureCount = function () {
  47. return self._failures.length;
  48. };
  49. self.events = function () {
  50. var events = self._errors.concat(self._failures);
  51. return events;
  52. };
  53. };
  54. /*
  55. * A TestCase is a function with a name like test_*.
  56. */
  57. var TestCase = function (name, module) {
  58. var self = this;
  59. self.name = name;
  60. self._test = module._code[name];
  61. if (module) {
  62. self.name = module.name + "." + name;
  63. };
  64. self.run = function () {
  65. self._test();
  66. };
  67. };
  68. /*
  69. * A TestModule is a module that has tests.
  70. */
  71. var TestModule = function (modulepath) {
  72. var self = this;
  73. self.name = modulepath.replace('/', '.');
  74. self._code = require(modulepath.split('.')[0]);
  75. self._isTest = function (name, func) {
  76. return ((typeof(func) == 'function') &&
  77. (name.match('test_.+')));
  78. };
  79. var _loadTestsFromModule = function (test_filename) {
  80. var tests = [];
  81. for (var name in self._code) {
  82. if (self._isTest(name, self._code[name])) {
  83. var test_case = new TestCase(name, self);
  84. tests.push(test_case);
  85. };
  86. };
  87. return tests;
  88. };
  89. self._tests = _loadTestsFromModule(modulepath);
  90. self.run = function (result) {
  91. for (var testname in self._tests) {
  92. var test = self._tests[testname];
  93. result.addTest(test);
  94. var module = self._code;
  95. try {
  96. if (module && (module.setup)) {
  97. module.setup();
  98. };
  99. test.run();
  100. if (module && (module.teardown)) {
  101. module.teardown();
  102. };
  103. } catch (error) {
  104. result.addError(test, error, []);
  105. }
  106. };
  107. };
  108. };
  109. /*
  110. * A TestSuite holds TestModules.
  111. */
  112. var TestSuite = function (dirname) {
  113. var self = this;
  114. self.name = dirname;
  115. self._modules = [];
  116. self._isTest = function (filename) {
  117. var segments = filename.split('/');
  118. var basename = segments[segments.length-1];
  119. return basename.match('^test_.+\.js$');
  120. };
  121. var _loadTestModules = function (dirname) {
  122. require.paths.push(dirname);
  123. var gatherer = posix.readdir(dirname);
  124. gatherer.addCallback(
  125. function (files) {
  126. for (var i in files) {
  127. var filename = files[i];
  128. var full_filename = [dirname, filename].join("/");
  129. var isDir = false;
  130. isFile = false;
  131. var statCheck = posix.stat(full_filename);
  132. statCheck.
  133. addCallback(
  134. function (stats) {
  135. isFile = stats.isFile();
  136. isDir = (isFile && stats.isDirectory());
  137. });
  138. statCheck.
  139. addErrback(
  140. function (err) {
  141. isFile = false;
  142. isDir = false;
  143. });
  144. try {
  145. statCheck.wait();
  146. } catch (x) {};
  147. if (isDir) {
  148. self._modules.push(new TestSuite(full_filename));
  149. } else if (isFile && (self._isTest(filename))) {
  150. self._modules.push(
  151. new TestModule(full_filename)
  152. );
  153. } else {
  154. };
  155. };
  156. });
  157. gatherer.wait();
  158. require.paths.pop();
  159. };
  160. _loadTestModules(dirname);
  161. self.run = function (result) {
  162. for (var i in self._modules) {
  163. var module = self._modules[i];
  164. module.run(result);
  165. };
  166. };
  167. };
  168. var target = process.cwd();
  169. if (process.ARGV.length > 2) {
  170. target = process.ARGV[2];
  171. };
  172. var result = new TestResult();
  173. require.paths.push(process.cwd());
  174. var suite = new TestSuite(target);
  175. suite.run(result);
  176. var events = result.events();
  177. for (var i in events) {
  178. var event = events[i];
  179. process.stdio.write("===================================\n");
  180. process.stdio.write("Test: " + event.test.name + "\n");
  181. if (event.error.stack)
  182. process.stdio.write(event.error.stack + "\n");
  183. else
  184. process.stdio.write(event.error + "\n");
  185. if (event.logs.length > 0) {
  186. process.stdio.write("*** captured logs ***\n");
  187. for (var j in event.logs) {
  188. process.stdio.write(event.logs[j]);
  189. };
  190. };
  191. };
  192. process.stdio.write("===================================\n");
  193. process.stdio.write("Ran " + result.testCount() + " tests\n");
  194. process.stdio.write("\n");
  195. if (result.isSuccess()) {
  196. process.stdio.write("OK\n");
  197. } else {
  198. process.stdio.write(result.errorCount() + " errors\n");
  199. process.stdio.write(result.failureCount() + " failures\n");
  200. };