diff --git a/packages/handlebars/package.js b/packages/handlebars/package.js index da2203e54b..46d285ad82 100644 --- a/packages/handlebars/package.js +++ b/packages/handlebars/package.js @@ -12,7 +12,7 @@ require('../../packages/handlebars/parse.js'); // XXX lame!! Package.on_use(function (api) { // XXX should only be sent if we have handlebars templates in the app.. api.add_files('evaluate.js', 'client'); - api.use('underscore', 'client') + api.use('underscore', 'client'); }); // XXX lots more to do here .. registering this a templating engine, diff --git a/packages/minimongo/minimongo_tests.js b/packages/minimongo/minimongo_tests.js index c6f62d7c17..fc04e8d197 100644 --- a/packages/minimongo/minimongo_tests.js +++ b/packages/minimongo/minimongo_tests.js @@ -76,7 +76,7 @@ Tinytest.add("minimongo - basics", function (test) { test.equal(c.find().count(), 4); c.remove(); - test.equal(0, c.find().count()); + test.equal(c.find().count(), 0); c.insert({_id: 1, name: "strawberry", tags: ["fruit", "red", "squishy"]}); c.insert({_id: 2, name: "apple", tags: ["fruit", "red", "hard"]}); diff --git a/packages/test-helpers/package.js b/packages/test-helpers/package.js index 8883afd771..ee84d839d5 100644 --- a/packages/test-helpers/package.js +++ b/packages/test-helpers/package.js @@ -8,6 +8,7 @@ Package.on_use(function (api, where) { api.add_files('try_all_permutations.js', where); api.add_files('async_multi.js', where); + api.add_files('simulate_event.js', where); }); Package.on_test(function (api) { diff --git a/packages/test-helpers/simulate_event.js b/packages/test-helpers/simulate_event.js new file mode 100644 index 0000000000..76c1ca86c7 --- /dev/null +++ b/packages/test-helpers/simulate_event.js @@ -0,0 +1,14 @@ +var simulateEvent = function (node, event, args) { + node = (node instanceof $ ? node[0] : node); + + if (document.createEvent) { + var e = document.createEvent("Event"); + e.initEvent(event, true, true); + _.extend(e, args); + node.dispatchEvent(e); + } else { + var e = document.createEventObject(); + _.extend(e, args); + node.fireEvent("on" + event, e); + } +}; diff --git a/packages/test-in-browser/driver.css b/packages/test-in-browser/driver.css index 2735ae7adb..f8489a5a5f 100644 --- a/packages/test-in-browser/driver.css +++ b/packages/test-in-browser/driver.css @@ -17,6 +17,11 @@ font-weight: bold; } +.header .time { + color: #666; + font-size: 14px; +} + .test_table { font-family: Arial, sans-serif; width: 500px; diff --git a/packages/test-in-browser/driver.html b/packages/test-in-browser/driver.html index 6117d06544..903bdd0167 100644 --- a/packages/test-in-browser/driver.html +++ b/packages/test-in-browser/driver.html @@ -11,9 +11,13 @@
Testing in progress ...
{{else}} {{#if passed}} -
All tests pass!
+
All tests pass! + {{total_test_time}} ms +
{{else}} -
There are failures.
+
There are failures. + {{total_test_time}} ms +
{{/if}} {{/if}} @@ -74,7 +78,7 @@ {{/if}} {{/with}} {{#if is_debuggable}} - [Debug] + [Debug] {{/if}} diff --git a/packages/test-in-browser/driver.js b/packages/test-in-browser/driver.js index 8e4220d0d4..bd2796a022 100644 --- a/packages/test-in-browser/driver.js +++ b/packages/test-in-browser/driver.js @@ -47,6 +47,33 @@ Template.test_table.passed = function() { return walk(resultTree); }; + +Template.test_table.total_test_time = function() { + var cx = Meteor.deps.Context.current; + if (cx) { + resultDeps.push(cx); + } + + // walk whole tree to get all tests + var walk = function (groups) { + var total = 0; + + _.each(groups || [], function (group) { + _.each(group.tests || [], function (t) { + total += _testTime(t); + }); + + total += walk(group.groups); + }); + + return total; + }; + + return walk(resultTree); +}; + + + Template.test_table.data = function() { var cx = Meteor.deps.Context.current; if (cx) { diff --git a/packages/tinytest/tinytest.js b/packages/tinytest/tinytest.js index 7d2c99e39c..3efc21a111 100644 --- a/packages/tinytest/tinytest.js +++ b/packages/tinytest/tinytest.js @@ -22,6 +22,7 @@ _.extend(TestCaseResults.prototype, { if (doc) ok.details = doc; if (self.expecting_failure) { + ok.details = ok.details || {}; ok.details["was_expecting_failure"] = true; self.expecting_failure = false; } @@ -82,23 +83,19 @@ _.extend(TestCaseResults.prototype, { // XXX eliminate 'message' and 'not' arguments equal: function (actual, expected, message, not) { /* If expected is a DOM node, do a literal '===' comparison with - * actual. Otherwise compare the JSON stringifications of expected - * and actual. (It's no good to stringify a DOM node. Circular - * references, to start with..) */ - - // XXX WE REALLY SHOULD NOT BE USING - // STRINGIFY. stringify([undefined]) === stringify([null]). should use - // deep equality instead. + * actual. Otherwise do a deep comparison, as implemented by _.isEqual. + */ + var matched; // XXX remove cruft specific to liverange if (typeof expected === "object" && expected && expected.nodeType) { - var matched = expected === actual; + matched = expected === actual; expected = "[Node]"; actual = "[Unknown]"; } else { + matched = _.isEqual(expected, actual); expected = JSON.stringify(expected); actual = JSON.stringify(actual); - var matched = expected === actual; } if (matched === !!not) { @@ -203,7 +200,8 @@ _.extend(TestCaseResults.prototype, { if (obj.length === expected_length) this.ok(); else - this.fail({type: "length"}); // XXX what other data? + this.fail({type: "length", expected: expected_length, + actual: obj.length}); } }); diff --git a/packages/uuid/uuid.js b/packages/uuid/uuid.js index 1469be2823..ca42c34447 100644 --- a/packages/uuid/uuid.js +++ b/packages/uuid/uuid.js @@ -99,7 +99,7 @@ Meteor._Alea = function () { return random; } (Array.prototype.slice.call(arguments))); -} +}; // instantiate RNG. use the default seed, which is current time. Meteor.random = new Meteor._Alea();