test_framework.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. function InputEvent(name, port, parameters, time_offset) {
  2. this.name = name;
  3. this.port = port;
  4. this.parameters = parameters;
  5. this.time_offset = time_offset;
  6. }
  7. TestFramework = {
  8. Results: function() {
  9. this.start_time = (new Date()).getTime();
  10. this.num_passed = 0;
  11. this.num_total = 0;
  12. this.num_skipped = 0;
  13. },
  14. LogResults: function(log, results) {
  15. var time = ((new Date()).getTime() - results.start_time);
  16. log(results.num_passed + " out of " + results.num_total + " tests passed, " + results.num_skipped + " skipped.");
  17. log("tests took " + time + " ms");
  18. },
  19. RunAll: function(tests) {
  20. var run_single_test = (function(log) {
  21. return function(name, run_next_callback, results) {
  22. if (!window[name]) {
  23. log("skipping test \"" + name + "\"");
  24. results.num_skipped++;
  25. if (run_next_callback) {
  26. run_next_callback(results);
  27. } else {
  28. TestFramework.LogResults(log, results);
  29. }
  30. return;
  31. } else {
  32. // log("initializing test \"" + name + "\"");
  33. }
  34. var controller = new (window[name].Controller)(new JsEventLoop());
  35. var listener = controller.addOutputListener("test_output");
  36. var inputs = window[name].Test.prototype.input_events;
  37. var expected = window[name].Test.prototype.expected_events;
  38. if (expected === undefined) expected = new Array();
  39. var expected_flattened = new Array();
  40. for (var slot in expected) {
  41. if (!expected.hasOwnProperty(slot)) continue;
  42. for (var event in expected[slot]) {
  43. if (!expected[slot].hasOwnProperty(event)) continue;
  44. expected_flattened.push(expected[slot][event])
  45. }
  46. }
  47. var check_output = (function(log, test_name, listener, expected, run_next_callback, results) {
  48. return function() {
  49. // log("checking output...");
  50. var passed = true;
  51. if (listener.queue.length !== expected.length) {
  52. log("error: output listener queue length (" + listener.queue.length + ") differs from expected length (" + expected.length + "). Expected: " + JSON.stringify(expected) + ", got: " + JSON.stringify(listener.queue));
  53. passed = false;
  54. } else {
  55. // iterate over expected output events
  56. for (var e in expected) {
  57. if (!expected.hasOwnProperty(e)) continue;
  58. var actual_name = listener.queue[e].name;
  59. var actual_port = listener.queue[e].port;
  60. var actual_parameters = listener.queue[e].parameters;
  61. var expected_name = expected[e].name;
  62. var expected_port = expected[e].port;
  63. var expected_parameters = expected[e].parameters;
  64. if (actual_name !== expected_name) {
  65. log("error: expected_name["+e+"]=\"" + expected_name + "\", actual_name["+e+"]=\"" + actual_name + "\"");
  66. passed = false;
  67. }
  68. if (actual_port !== expected_port) {
  69. log("error: expected_port["+e+"]=\"" + expected_port + "\", actual_port["+e+"]=\"" + actual_port + "\"");
  70. passed = false;
  71. }
  72. if (actual_parameters.length !== expected_parameters.length) {
  73. log("error: event ["+e+"] \"" + actual_name + "\": number of actual parameters (" + actual_parameters.length + ") doesn't match expected (" + expected_parameters.length + ")");
  74. passed = false;
  75. } else {
  76. // iterate over expected parameters
  77. for (var p in expected_parameters) {
  78. if (!expected_parameters.hasOwnProperty(p)) continue;
  79. var actual_parameter = actual_parameters[p];
  80. var expected_parameter = expected_parameters[p];
  81. if (actual_parameter !== expected_parameter) {
  82. log("error: event \"" + actual_name + "\": expected_parameter=\"" + expected_parameter + "\", actual_parameter=\"" + actual_parameter + "\"");
  83. passed = false;
  84. }
  85. }
  86. }
  87. }
  88. }
  89. results.num_total++;
  90. if (passed) {
  91. log("test \"" + test_name + "\" passed.");
  92. results.num_passed++;
  93. } else {
  94. log("test \"" + test_name + "\" failed.");
  95. }
  96. // run next test
  97. if (run_next_callback)
  98. run_next_callback(results);
  99. else {
  100. TestFramework.LogResults(log, results);
  101. }
  102. };
  103. })(log, name, listener, expected_flattened, run_next_callback, results);
  104. for (var i in inputs) {
  105. if (!inputs.hasOwnProperty(i)) continue;
  106. ii = inputs[i]
  107. controller.addInput(new Event(ii.name, ii.port, ii.parameters), ii.time_offset);
  108. }
  109. // log("starting controller...");
  110. controller.finished_callback = check_output;
  111. controller.start();
  112. };
  113. })(log);
  114. var last = null;
  115. for (var t in tests) {
  116. if (!tests.hasOwnProperty(t)) continue;
  117. last = (function(name, callback) {
  118. return function(results) {
  119. run_single_test(name, callback, results);
  120. };
  121. })(tests[t], last);
  122. }
  123. var results = new (this.Results)();
  124. last(results);
  125. }
  126. };