teabag 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/app/assets/javascripts/teabag-mocha.js +154 -123
  2. data/app/assets/javascripts/teabag-qunit.js +401 -195
  3. data/app/assets/javascripts/teabag-teabag.js +3 -4
  4. data/app/assets/javascripts/teabag/mocha.coffee +1 -1
  5. data/app/assets/javascripts/teabag/mocha/reporters/html.coffee +1 -1
  6. data/app/assets/javascripts/teabag/qunit.coffee +1 -1
  7. data/app/assets/javascripts/teabag/qunit/reporters/html.coffee +1 -1
  8. data/app/assets/javascripts/teabag/teabag.coffee +1 -0
  9. data/lib/teabag/version.rb +1 -1
  10. data/spec/dummy/log/development.log +18711 -0
  11. data/spec/dummy/log/test.log +632 -0
  12. data/spec/dummy/tmp/cache/assets/C35/A30/sprockets%2F29906bf540f7d2e081088494b2554989 +0 -0
  13. data/spec/dummy/tmp/cache/assets/C4E/9B0/sprockets%2Fa807397434c9262c3d62da3e91152184 +0 -0
  14. data/spec/dummy/tmp/cache/assets/C5B/D00/sprockets%2F01f43815683089878e371a5d078d3e2c +0 -0
  15. data/spec/dummy/tmp/cache/assets/C72/150/sprockets%2F4194031b4b51b6422c14ac697e3455e5 +0 -0
  16. data/spec/dummy/tmp/cache/assets/C75/D50/sprockets%2F5302968a40e08d2c011aa38666d273f6 +0 -0
  17. data/spec/dummy/tmp/cache/assets/C78/F80/sprockets%2F9161622ddd251097a4ab816b8220984c +0 -0
  18. data/spec/dummy/tmp/cache/assets/C7C/AC0/sprockets%2F29124be1160817c61bb4878894b2ba55 +0 -0
  19. data/spec/dummy/tmp/cache/assets/C7D/8F0/sprockets%2Ff13d01b85f2449a4f0638ff260425906 +0 -0
  20. data/spec/dummy/tmp/cache/assets/C7E/E80/sprockets%2F38544f84f61bb3942d24104e39e108c4 +0 -0
  21. data/spec/dummy/tmp/cache/assets/C85/6E0/sprockets%2F9e583044ba9762ac39f15431ed504495 +0 -0
  22. data/spec/dummy/tmp/cache/assets/C8A/460/sprockets%2F77bffd9959420103906722b404ae8d59 +0 -0
  23. data/spec/dummy/tmp/cache/assets/C91/FA0/sprockets%2F2eb81283f5789ae91a69344552db3856 +0 -0
  24. data/spec/dummy/tmp/cache/assets/C97/430/sprockets%2Fc049582fd1c9178ff983323f75326f64 +0 -0
  25. data/spec/dummy/tmp/cache/assets/C9D/E90/sprockets%2F3045c9533f179d3e1c805d163ed002a0 +0 -0
  26. data/spec/dummy/tmp/cache/assets/CA3/C80/sprockets%2F00916393d1e2e947ddafa91701411a73 +0 -0
  27. data/spec/dummy/tmp/cache/assets/CA6/DF0/sprockets%2F7da83747ce56e49393b6b8726587f846 +0 -0
  28. data/spec/dummy/tmp/cache/assets/CA9/C40/sprockets%2F932b7e2cd1e067289ab51190800814df +0 -0
  29. data/spec/dummy/tmp/cache/assets/CAD/410/sprockets%2F651414e5c7e86f05c5108dc71626b25c +0 -0
  30. data/spec/dummy/tmp/cache/assets/CAF/0F0/sprockets%2F6000e67cf3f2377f860c24da7c819701 +0 -0
  31. data/spec/dummy/tmp/cache/assets/CB0/700/sprockets%2F006af6bf0f6b55777b03c4615c853881 +0 -0
  32. data/spec/dummy/tmp/cache/assets/CB1/B50/sprockets%2F44b5b96ee7652d66a217a1756431c4a8 +0 -0
  33. data/spec/dummy/tmp/cache/assets/CB6/120/sprockets%2F2df706e820de0f82332a613c49f47867 +0 -0
  34. data/spec/dummy/tmp/cache/assets/CBB/FA0/sprockets%2F74922109263bdc965b2e9567eec6d154 +0 -0
  35. data/spec/dummy/tmp/cache/assets/CBD/AF0/sprockets%2Fd687ec33822256e9444e8cd04f1b4873 +0 -0
  36. data/spec/dummy/tmp/cache/assets/CBF/630/sprockets%2F707d2db81468088470d476abff35388d +0 -0
  37. data/spec/dummy/tmp/cache/assets/CC2/EC0/sprockets%2F76bf80cb571ca530357f78db78167866 +0 -0
  38. data/spec/dummy/tmp/cache/assets/CCB/3B0/sprockets%2F9535146026add9cffa012ee220204a66 +0 -0
  39. data/spec/dummy/tmp/cache/assets/CCC/DB0/sprockets%2F3998958d61cda73452466f5652ed81ef +0 -0
  40. data/spec/dummy/tmp/cache/assets/CCE/C50/sprockets%2Fe12774c2fea852112414bb379a71f31a +0 -0
  41. data/spec/dummy/tmp/cache/assets/CD3/460/sprockets%2F7f3f6802b0b309ed142d0b671c9640c4 +0 -0
  42. data/spec/dummy/tmp/cache/assets/CD6/DD0/sprockets%2F301bd3b0e19eb866905681d03a891be3 +0 -0
  43. data/spec/dummy/tmp/cache/assets/CE0/090/sprockets%2F48d5d35ae87d0723318b8bc257fa2237 +0 -0
  44. data/spec/dummy/tmp/cache/assets/CE3/1F0/sprockets%2Fe69a515d3a9d14c669be8871012a7d07 +0 -0
  45. data/spec/dummy/tmp/cache/assets/CE4/190/sprockets%2F36c9ee4181433e33e07eb9748d218ae2 +0 -0
  46. data/spec/dummy/tmp/cache/assets/CE6/270/sprockets%2F2c98152560d18470fec8cf4c6829b4d0 +0 -0
  47. data/spec/dummy/tmp/cache/assets/CE6/7C0/sprockets%2Fa03a2c86ce6724be8542295e1cf24798 +0 -0
  48. data/spec/dummy/tmp/cache/assets/CE7/A60/sprockets%2Ff58eee249aa167d23f8220087bb46684 +0 -0
  49. data/spec/dummy/tmp/cache/assets/CE9/9E0/sprockets%2F135480d497ed7e4884462dc0ef0b80d7 +0 -0
  50. data/spec/dummy/tmp/cache/assets/CEB/680/sprockets%2F67f0794ef8c0576d5c7da34f4437305a +0 -0
  51. data/spec/dummy/tmp/cache/assets/CEB/B40/sprockets%2F1150bf8d912aa100a132251eefaf6045 +0 -0
  52. data/spec/dummy/tmp/cache/assets/CEC/360/sprockets%2F264b79dde726b36d63fee272a0609469 +0 -0
  53. data/spec/dummy/tmp/cache/assets/CEE/930/sprockets%2Fe196521e15fd8d33e3261d5538fe8f92 +0 -0
  54. data/spec/dummy/tmp/cache/assets/CEF/650/sprockets%2Fe859309c630f7637a53d381b327df8fd +0 -0
  55. data/spec/dummy/tmp/cache/assets/CEF/840/sprockets%2F16c7d195fa548e8343c6a4d2256ed778 +0 -0
  56. data/spec/dummy/tmp/cache/assets/CF1/C50/sprockets%2F57bd9ac92067ea01882feef075582758 +0 -0
  57. data/spec/dummy/tmp/cache/assets/CF3/3A0/sprockets%2F6571249b82eb52e7c7e035c692df9b69 +0 -0
  58. data/spec/dummy/tmp/cache/assets/CF3/C50/sprockets%2F892b968b622f37b988a1de81e09bf631 +0 -0
  59. data/spec/dummy/tmp/cache/assets/CF8/780/sprockets%2F8845b81ff27cdb57c835836c9f91a265 +0 -0
  60. data/spec/dummy/tmp/cache/assets/CFA/D20/sprockets%2Fb26796b39b3c5d6ed70be7989637a493 +0 -0
  61. data/spec/dummy/tmp/cache/assets/CFB/210/sprockets%2F9104695bfbf9a9d4b94382e6e90487a9 +0 -0
  62. data/spec/dummy/tmp/cache/assets/CFC/380/sprockets%2Fa7443cbd671446a589867dd5f4a4f989 +0 -0
  63. data/spec/dummy/tmp/cache/assets/D00/110/sprockets%2F6a6353b7723a8b21708e0fbfe04bd422 +0 -0
  64. data/spec/dummy/tmp/cache/assets/D00/F60/sprockets%2F42e279b52511c47d26c0adb125fd04e8 +0 -0
  65. data/spec/dummy/tmp/cache/assets/D02/570/sprockets%2F51fa8dc514e6256ae0836d5eb24e0312 +0 -0
  66. data/spec/dummy/tmp/cache/assets/D03/630/sprockets%2F5d8da32dba6a7be70426a1d554773701 +0 -0
  67. data/spec/dummy/tmp/cache/assets/D04/170/sprockets%2F76ab1dc02e6c7618852708a1e05a2df3 +0 -0
  68. data/spec/dummy/tmp/cache/assets/D04/480/sprockets%2F8bd8f10500b21d2f9d94e4cd1401c936 +0 -0
  69. data/spec/dummy/tmp/cache/assets/D05/8D0/sprockets%2F319f8f235f452343f1ebf03cb262d23d +0 -0
  70. data/spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F9e6bca5d26f50d9484385d51ba04312c +0 -0
  71. data/spec/dummy/tmp/cache/assets/D0B/210/sprockets%2Fb95ce127097fba0e4019f633e91b730d +0 -0
  72. data/spec/dummy/tmp/cache/assets/D0E/570/sprockets%2F90fe371bf8091e88a712124d9cdae260 +0 -0
  73. data/spec/dummy/tmp/cache/assets/D11/080/sprockets%2Fe202468befa786e2a3e7c6d5980b2333 +0 -0
  74. data/spec/dummy/tmp/cache/assets/D15/750/sprockets%2F8effdd3e668a4036260a3e370f3b6657 +0 -0
  75. data/spec/dummy/tmp/cache/assets/D17/710/sprockets%2Ffa49fb6823d466e79a195e0cd71340c5 +0 -0
  76. data/spec/dummy/tmp/cache/assets/D1D/560/sprockets%2F1ca784ee7ba1922465147e7f8963eae5 +0 -0
  77. data/spec/dummy/tmp/cache/assets/D1E/AA0/sprockets%2F5c8741a556bc955cd36e61c88582b6dc +0 -0
  78. data/spec/dummy/tmp/cache/assets/D22/4D0/sprockets%2Fe94f07f16b94d5cf185c48023f98f1b7 +0 -0
  79. data/spec/dummy/tmp/cache/assets/D2D/060/sprockets%2F545ec7a363badb5e7106e5112b53b26d +0 -0
  80. data/spec/dummy/tmp/cache/assets/D30/740/sprockets%2F4ac342b2e0244e90d08bac61f54f4f82 +0 -0
  81. data/spec/dummy/tmp/cache/assets/D31/9C0/sprockets%2Fbd102a4f5a4985c3519dd6ab0295a1c6 +0 -0
  82. data/spec/dummy/tmp/cache/assets/D35/7C0/sprockets%2Ff536a2606eaf7d542c0985104cb62baf +0 -0
  83. data/spec/dummy/tmp/cache/assets/D37/FF0/sprockets%2F96841ca4cfae32c515077f3f5fc303b2 +0 -0
  84. data/spec/dummy/tmp/cache/assets/D3C/840/sprockets%2Fc6202ec91d567a85bd3d46dc43ea9108 +0 -0
  85. data/spec/dummy/tmp/cache/assets/D44/0F0/sprockets%2Fc4d293b967c2e290deed3f3bd2271828 +0 -0
  86. data/spec/dummy/tmp/cache/assets/D44/E90/sprockets%2F05cfc0bf7c9938963d1d1c63248db80d +0 -0
  87. data/spec/dummy/tmp/cache/assets/D45/C30/sprockets%2Fcc744877558178a3adb77c441cadce70 +0 -0
  88. data/spec/dummy/tmp/cache/assets/D48/BA0/sprockets%2F30a5bfc94bac88df67501fc509b84694 +0 -0
  89. data/spec/dummy/tmp/cache/assets/D49/A10/sprockets%2Fc4656bd995a6f297c26d19b13aadb963 +0 -0
  90. data/spec/dummy/tmp/cache/assets/D4A/580/sprockets%2F19b8d8a9a57850de79b6c099fb2d010e +0 -0
  91. data/spec/dummy/tmp/cache/assets/D50/D70/sprockets%2Fe2a3e6c95b11e0801a4eebae3a026026 +0 -0
  92. data/spec/dummy/tmp/cache/assets/D51/400/sprockets%2Ff5e433d8a31e80985b75ce598de236be +0 -0
  93. data/spec/dummy/tmp/cache/assets/D54/D80/sprockets%2F631327e25ec20edc723046cdec3bb1c0 +0 -0
  94. data/spec/dummy/tmp/cache/assets/D5C/710/sprockets%2F9427d05cee2caa721241a25a9af1d08f +0 -0
  95. data/spec/dummy/tmp/cache/assets/D5C/CC0/sprockets%2Faa8bf6de211f2765b0a26f112b971f0c +0 -0
  96. data/spec/dummy/tmp/cache/assets/D61/1F0/sprockets%2F0c7a6176d2fc4db00bb9a74d36380fe1 +0 -0
  97. data/spec/dummy/tmp/cache/assets/D63/050/sprockets%2Fae26cd0ae2c0da97e49f6043b91008d5 +0 -0
  98. data/spec/dummy/tmp/cache/assets/D67/BC0/sprockets%2F35d2c2b45981ade5a2db2a9c7f37a615 +0 -0
  99. data/spec/dummy/tmp/cache/assets/D67/C20/sprockets%2F0d30bf27e5f74bbd85f313cb8d3c4623 +0 -0
  100. data/spec/dummy/tmp/cache/assets/D69/F90/sprockets%2F6a0795b7b38bd7e6142cd1b88211dade +0 -0
  101. data/spec/dummy/tmp/cache/assets/D6D/530/sprockets%2F8d52dee91bff01a8a2306d8a7c9152a9 +0 -0
  102. data/spec/dummy/tmp/cache/assets/D6D/DA0/sprockets%2Fac936bf40b42227a2bf9d474ae9ec149 +0 -0
  103. data/spec/dummy/tmp/cache/assets/D77/B30/sprockets%2F946cf2f17c7eb41037f9ee08ad67ec40 +0 -0
  104. data/spec/dummy/tmp/cache/assets/D78/2F0/sprockets%2F3c61f8915b8f717b1de788e6ecad122c +0 -0
  105. data/spec/dummy/tmp/cache/assets/D80/390/sprockets%2Fe44158f578d9ffade083a07f54eab729 +0 -0
  106. data/spec/dummy/tmp/cache/assets/D8C/520/sprockets%2F221cd58a042baac534d27e4cfedc1188 +0 -0
  107. data/spec/dummy/tmp/cache/assets/D93/BD0/sprockets%2Ff5e1b60201e08e3ddf8d3de5211f3d5e +0 -0
  108. data/spec/dummy/tmp/cache/assets/D9B/C20/sprockets%2F0e01606ddd95e451bc7d39ce0eeb664d +0 -0
  109. data/spec/dummy/tmp/cache/assets/DA0/330/sprockets%2Fcbbb4de706387d50f48a72ee6c9c1b80 +0 -0
  110. data/spec/dummy/tmp/cache/assets/DA5/0A0/sprockets%2F7a4b5928cec69ab65afff309a04d6b47 +0 -0
  111. data/spec/dummy/tmp/cache/assets/DAE/6C0/sprockets%2F77c7a8676aeefa73156c55dfcf51cc46 +0 -0
  112. data/spec/dummy/tmp/cache/assets/DAF/7C0/sprockets%2F8942514d59e7bffbfb33cde6fa9735c2 +0 -0
  113. data/spec/dummy/tmp/cache/assets/DB3/5D0/sprockets%2Fce1d4d75832c9bdeafd869f6f7b61725 +0 -0
  114. data/spec/dummy/tmp/cache/assets/DB3/D70/sprockets%2Fcc2f5e1f6eeb99c33881848cb1cde758 +0 -0
  115. data/spec/dummy/tmp/cache/assets/DB5/040/sprockets%2F9a9da5df88713663b9fbc945facca891 +0 -0
  116. data/spec/dummy/tmp/cache/assets/DC3/230/sprockets%2Fdf52e72eb73be91eccc60182191aed0b +0 -0
  117. data/spec/dummy/tmp/cache/assets/DC7/A10/sprockets%2F84a8af0fcbf401864e1ae5bf092cba94 +0 -0
  118. data/spec/dummy/tmp/cache/assets/DCD/EB0/sprockets%2F4f77f509126ecbced7ea2a5ab290c8d4 +0 -0
  119. data/spec/dummy/tmp/cache/assets/DD8/C10/sprockets%2Ffb91282efc9f16ebaf7e98e312ce0b73 +0 -0
  120. data/spec/dummy/tmp/cache/assets/DDB/EF0/sprockets%2Fe790bb18b64df8aa0a9fe94642a9edd8 +0 -0
  121. data/spec/dummy/tmp/cache/assets/DDD/A60/sprockets%2Fff948b6ffe44a3cc3d2d109a39f548fd +0 -0
  122. data/spec/dummy/tmp/cache/assets/DEB/110/sprockets%2F2dbdab0ce5babca645cdb5780004f875 +0 -0
  123. data/spec/dummy/tmp/cache/assets/DF6/0E0/sprockets%2F85b10db6e1afe643aba6d396abdd77f0 +0 -0
  124. data/spec/dummy/tmp/cache/assets/DF7/E10/sprockets%2F25e4253aba9a9adcefb72552fb1ff0c8 +0 -0
  125. data/spec/dummy/tmp/cache/assets/DF9/AD0/sprockets%2Fc700afd7cee3fe9d7ff8352b213b2c4a +0 -0
  126. data/spec/dummy/tmp/cache/assets/DFC/C20/sprockets%2Fd9178ad7e3b401c9fceafd64ea2b50d6 +0 -0
  127. data/spec/dummy/tmp/cache/assets/DFC/C30/sprockets%2Fb50a07cb30b0bd0eec8e98e5de79d65d +0 -0
  128. data/spec/dummy/tmp/cache/assets/E02/6E0/sprockets%2F63d6a5cdb8cefa64ef76b5c6e0fd3720 +0 -0
  129. data/spec/dummy/tmp/cache/assets/E08/BB0/sprockets%2Fefac99af1af28543aef6fb607faa4973 +0 -0
  130. data/spec/dummy/tmp/cache/assets/E0D/070/sprockets%2F0e7ef9a5978dcc6b1abce678ef836c0a +0 -0
  131. data/spec/dummy/tmp/cache/assets/E17/EF0/sprockets%2Fa291ad64a26afd055dfadabbdf03f154 +0 -0
  132. data/spec/dummy/tmp/cache/assets/E2F/790/sprockets%2F7fac280deaa7ef20a77d5c9b5b9cfc34 +0 -0
  133. data/spec/dummy/tmp/cache/assets/E37/9B0/sprockets%2F4defba98cf7befff81450e2b24e90b6d +0 -0
  134. data/spec/dummy/tmp/cache/assets/E41/250/sprockets%2F97cf8fe3d7ffaff076f655aefb36da03 +0 -0
  135. data/spec/dummy/tmp/cache/assets/E58/840/sprockets%2Fab7a15f76acfee8c320dd3cfc2a8c6d5 +0 -0
  136. data/spec/dummy/tmp/cache/assets/E64/1E0/sprockets%2F81ab4c863fbbdec8dd66afc97ebf034d +0 -0
  137. data/spec/dummy/tmp/cache/assets/E6E/260/sprockets%2Fd9f8ab8b91ef582cc6c99a3ba0dedfe6 +0 -0
  138. data/spec/dummy/tmp/cache/assets/E89/4C0/sprockets%2F68b2eedb3cde6fc01d50fead7caf8a18 +0 -0
  139. data/spec/dummy/tmp/cache/assets/F79/360/sprockets%2F0ce035fefee5ebdabc8efabfbdbd6ee4 +0 -0
  140. data/spec/javascripts/teabag/mocha/reporters/html_mspec.coffee +1 -1
  141. data/vendor/assets/javascripts/{mocha-1.8.1.MIT.LICENSE → mocha-1.9.1.MIT.LICENSE} +0 -0
  142. data/vendor/assets/javascripts/{mocha-1.8.1.js → mocha-1.9.1.js} +79 -81
  143. data/vendor/assets/javascripts/{qunit-1.10.0.MIT.LICENSE → qunit-1.11.0.MIT.LICENSE} +0 -0
  144. data/vendor/assets/javascripts/{qunit-1.10.0.js → qunit-1.11.0.js} +319 -144
  145. data/vendor/assets/javascripts/support/chai.js +721 -279
  146. data/vendor/assets/javascripts/support/jasmine-jquery.js +28 -2
  147. data/vendor/assets/javascripts/support/sinon.js +581 -435
  148. metadata +26 -8
@@ -1,5 +1,5 @@
1
1
  /**
2
- * QUnit v1.10.0 - A JavaScript Unit Testing Framework
2
+ * QUnit v1.11.0 - A JavaScript Unit Testing Framework
3
3
  *
4
4
  * http://qunitjs.com
5
5
  *
@@ -12,6 +12,7 @@
12
12
  (function( window ) {
13
13
 
14
14
  var QUnit,
15
+ assert,
15
16
  config,
16
17
  onErrorFnPrev,
17
18
  testId = 0,
@@ -32,6 +33,55 @@
32
33
  return false;
33
34
  }
34
35
  }())
36
+ },
37
+ /**
38
+ * Provides a normalized error string, correcting an issue
39
+ * with IE 7 (and prior) where Error.prototype.toString is
40
+ * not properly implemented
41
+ *
42
+ * Based on http://es5.github.com/#x15.11.4.4
43
+ *
44
+ * @param {String|Error} error
45
+ * @return {String} error message
46
+ */
47
+ errorString = function( error ) {
48
+ var name, message,
49
+ errorString = error.toString();
50
+ if ( errorString.substring( 0, 7 ) === "[object" ) {
51
+ name = error.name ? error.name.toString() : "Error";
52
+ message = error.message ? error.message.toString() : "";
53
+ if ( name && message ) {
54
+ return name + ": " + message;
55
+ } else if ( name ) {
56
+ return name;
57
+ } else if ( message ) {
58
+ return message;
59
+ } else {
60
+ return "Error";
61
+ }
62
+ } else {
63
+ return errorString;
64
+ }
65
+ },
66
+ /**
67
+ * Makes a clone of an object using only Array or Object as base,
68
+ * and copies over the own enumerable properties.
69
+ *
70
+ * @param {Object} obj
71
+ * @return {Object} New object with only the own properties (recursively).
72
+ */
73
+ objectValues = function( obj ) {
74
+ // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
75
+ /*jshint newcap: false */
76
+ var key, val,
77
+ vals = QUnit.is( "array", obj ) ? [] : {};
78
+ for ( key in obj ) {
79
+ if ( hasOwn.call( obj, key ) ) {
80
+ val = obj[key];
81
+ vals[key] = val === Object(val) ? objectValues(val) : val;
82
+ }
83
+ }
84
+ return vals;
35
85
  };
36
86
 
37
87
  function Test( settings ) {
@@ -49,7 +99,7 @@
49
99
 
50
100
  if ( tests ) {
51
101
  b = document.createElement( "strong" );
52
- b.innerHTML = this.name;
102
+ b.innerHTML = this.nameHtml;
53
103
 
54
104
  // `a` initialized at top of scope
55
105
  a = document.createElement( "a" );
@@ -93,6 +143,7 @@
93
143
  teardown: function() {}
94
144
  }, this.moduleTestEnvironment );
95
145
 
146
+ this.started = +new Date();
96
147
  runLoggingCallbacks( "testStart", QUnit, {
97
148
  name: this.testName,
98
149
  module: this.module
@@ -112,7 +163,7 @@
112
163
  try {
113
164
  this.testEnvironment.setup.call( this.testEnvironment );
114
165
  } catch( e ) {
115
- QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
166
+ QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
116
167
  }
117
168
  },
118
169
  run: function() {
@@ -121,22 +172,28 @@
121
172
  var running = id( "qunit-testresult" );
122
173
 
123
174
  if ( running ) {
124
- running.innerHTML = "Running: <br/>" + this.name;
175
+ running.innerHTML = "Running: <br/>" + this.nameHtml;
125
176
  }
126
177
 
127
178
  if ( this.async ) {
128
179
  QUnit.stop();
129
180
  }
130
181
 
182
+ this.callbackStarted = +new Date();
183
+
131
184
  if ( config.notrycatch ) {
132
185
  this.callback.call( this.testEnvironment, QUnit.assert );
186
+ this.callbackRuntime = +new Date() - this.callbackStarted;
133
187
  return;
134
188
  }
135
189
 
136
190
  try {
137
191
  this.callback.call( this.testEnvironment, QUnit.assert );
192
+ this.callbackRuntime = +new Date() - this.callbackStarted;
138
193
  } catch( e ) {
139
- QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + e.message, extractStacktrace( e, 0 ) );
194
+ this.callbackRuntime = +new Date() - this.callbackStarted;
195
+
196
+ QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
140
197
  // else next test will carry the responsibility
141
198
  saveGlobal();
142
199
 
@@ -149,38 +206,43 @@
149
206
  teardown: function() {
150
207
  config.current = this;
151
208
  if ( config.notrycatch ) {
209
+ if ( typeof this.callbackRuntime === "undefined" ) {
210
+ this.callbackRuntime = +new Date() - this.callbackStarted;
211
+ }
152
212
  this.testEnvironment.teardown.call( this.testEnvironment );
153
213
  return;
154
214
  } else {
155
215
  try {
156
216
  this.testEnvironment.teardown.call( this.testEnvironment );
157
217
  } catch( e ) {
158
- QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
218
+ QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
159
219
  }
160
220
  }
161
221
  checkPollution();
162
222
  },
163
223
  finish: function() {
164
224
  config.current = this;
165
- if ( config.requireExpects && this.expected == null ) {
225
+ if ( config.requireExpects && this.expected === null ) {
166
226
  QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
167
- } else if ( this.expected != null && this.expected != this.assertions.length ) {
227
+ } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
168
228
  QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
169
- } else if ( this.expected == null && !this.assertions.length ) {
229
+ } else if ( this.expected === null && !this.assertions.length ) {
170
230
  QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
171
231
  }
172
232
 
173
- var assertion, a, b, i, li, ol,
233
+ var i, assertion, a, b, time, li, ol,
174
234
  test = this,
175
235
  good = 0,
176
236
  bad = 0,
177
237
  tests = id( "qunit-tests" );
178
238
 
239
+ this.runtime = +new Date() - this.started;
179
240
  config.stats.all += this.assertions.length;
180
241
  config.moduleStats.all += this.assertions.length;
181
242
 
182
243
  if ( tests ) {
183
244
  ol = document.createElement( "ol" );
245
+ ol.className = "qunit-assert-list";
184
246
 
185
247
  for ( i = 0; i < this.assertions.length; i++ ) {
186
248
  assertion = this.assertions[i];
@@ -209,22 +271,22 @@
209
271
  }
210
272
 
211
273
  if ( bad === 0 ) {
212
- ol.style.display = "none";
274
+ addClass( ol, "qunit-collapsed" );
213
275
  }
214
276
 
215
277
  // `b` initialized at top of scope
216
278
  b = document.createElement( "strong" );
217
- b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
279
+ b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
218
280
 
219
281
  addEvent(b, "click", function() {
220
- var next = b.nextSibling.nextSibling,
221
- display = next.style.display;
222
- next.style.display = display === "none" ? "block" : "none";
282
+ var next = b.parentNode.lastChild,
283
+ collapsed = hasClass( next, "qunit-collapsed" );
284
+ ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
223
285
  });
224
286
 
225
287
  addEvent(b, "dblclick", function( e ) {
226
288
  var target = e && e.target ? e.target : window.event.srcElement;
227
- if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
289
+ if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
228
290
  target = target.parentNode;
229
291
  }
230
292
  if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
@@ -232,13 +294,19 @@
232
294
  }
233
295
  });
234
296
 
297
+ // `time` initialized at top of scope
298
+ time = document.createElement( "span" );
299
+ time.className = "runtime";
300
+ time.innerHTML = this.runtime + " ms";
301
+
235
302
  // `li` initialized at top of scope
236
303
  li = id( this.id );
237
304
  li.className = bad ? "fail" : "pass";
238
305
  li.removeChild( li.firstChild );
239
306
  a = li.firstChild;
240
307
  li.appendChild( b );
241
- li.appendChild ( a );
308
+ li.appendChild( a );
309
+ li.appendChild( time );
242
310
  li.appendChild( ol );
243
311
 
244
312
  } else {
@@ -256,7 +324,8 @@
256
324
  module: this.module,
257
325
  failed: bad,
258
326
  passed: this.assertions.length - bad,
259
- total: this.assertions.length
327
+ total: this.assertions.length,
328
+ duration: this.runtime
260
329
  });
261
330
 
262
331
  QUnit.reset();
@@ -322,7 +391,7 @@
322
391
 
323
392
  test: function( testName, expected, callback, async ) {
324
393
  var test,
325
- name = "<span class='test-name'>" + escapeInnerText( testName ) + "</span>";
394
+ nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
326
395
 
327
396
  if ( arguments.length === 2 ) {
328
397
  callback = expected;
@@ -330,11 +399,11 @@
330
399
  }
331
400
 
332
401
  if ( config.currentModule ) {
333
- name = "<span class='module-name'>" + config.currentModule + "</span>: " + name;
402
+ nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
334
403
  }
335
404
 
336
405
  test = new Test({
337
- name: name,
406
+ nameHtml: nameHtml,
338
407
  testName: testName,
339
408
  expected: expected,
340
409
  async: async,
@@ -361,6 +430,18 @@
361
430
  },
362
431
 
363
432
  start: function( count ) {
433
+ // QUnit hasn't been initialized yet.
434
+ // Note: RequireJS (et al) may delay onLoad
435
+ if ( config.semaphore === undefined ) {
436
+ QUnit.begin(function() {
437
+ // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
438
+ setTimeout(function() {
439
+ QUnit.start( count );
440
+ });
441
+ });
442
+ return;
443
+ }
444
+
364
445
  config.semaphore -= count || 1;
365
446
  // don't start until equal number of stop-calls
366
447
  if ( config.semaphore > 0 ) {
@@ -369,6 +450,8 @@
369
450
  // ignore if start is called more often then stop
370
451
  if ( config.semaphore < 0 ) {
371
452
  config.semaphore = 0;
453
+ QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
454
+ return;
372
455
  }
373
456
  // A slight delay, to avoid any current callbacks
374
457
  if ( defined.setTimeout ) {
@@ -404,11 +487,14 @@
404
487
  }
405
488
  };
406
489
 
490
+ // `assert` initialized at top of scope
407
491
  // Asssert helpers
408
- // All of these must call either QUnit.push() or manually do:
492
+ // All of these must either call QUnit.push() or manually do:
409
493
  // - runLoggingCallbacks( "log", .. );
410
494
  // - config.current.assertions.push({ .. });
411
- QUnit.assert = {
495
+ // We attach it to the QUnit object *after* we expose the public API,
496
+ // otherwise `assert` will become a global variable in browsers (#341).
497
+ assert = {
412
498
  /**
413
499
  * Asserts rough true-ish result.
414
500
  * @name ok
@@ -429,14 +515,14 @@
429
515
  message: msg
430
516
  };
431
517
 
432
- msg = escapeInnerText( msg || (result ? "okay" : "failed" ) );
518
+ msg = escapeText( msg || (result ? "okay" : "failed" ) );
433
519
  msg = "<span class='test-message'>" + msg + "</span>";
434
520
 
435
521
  if ( !result ) {
436
522
  source = sourceFromStacktrace( 2 );
437
523
  if ( source ) {
438
524
  details.source = source;
439
- msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
525
+ msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
440
526
  }
441
527
  }
442
528
  runLoggingCallbacks( "log", QUnit, details );
@@ -454,6 +540,7 @@
454
540
  * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
455
541
  */
456
542
  equal: function( actual, expected, message ) {
543
+ /*jshint eqeqeq:false */
457
544
  QUnit.push( expected == actual, actual, expected, message );
458
545
  },
459
546
 
@@ -462,9 +549,30 @@
462
549
  * @function
463
550
  */
464
551
  notEqual: function( actual, expected, message ) {
552
+ /*jshint eqeqeq:false */
465
553
  QUnit.push( expected != actual, actual, expected, message );
466
554
  },
467
555
 
556
+ /**
557
+ * @name propEqual
558
+ * @function
559
+ */
560
+ propEqual: function( actual, expected, message ) {
561
+ actual = objectValues(actual);
562
+ expected = objectValues(expected);
563
+ QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
564
+ },
565
+
566
+ /**
567
+ * @name notPropEqual
568
+ * @function
569
+ */
570
+ notPropEqual: function( actual, expected, message ) {
571
+ actual = objectValues(actual);
572
+ expected = objectValues(expected);
573
+ QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
574
+ },
575
+
468
576
  /**
469
577
  * @name deepEqual
470
578
  * @function
@@ -497,8 +605,9 @@
497
605
  QUnit.push( expected !== actual, actual, expected, message );
498
606
  },
499
607
 
500
- throws: function( block, expected, message ) {
608
+ "throws": function( block, expected, message ) {
501
609
  var actual,
610
+ expectedOutput = expected,
502
611
  ok = false;
503
612
 
504
613
  // 'expected' is optional
@@ -519,18 +628,20 @@
519
628
  // we don't want to validate thrown error
520
629
  if ( !expected ) {
521
630
  ok = true;
631
+ expectedOutput = null;
522
632
  // expected is a regexp
523
633
  } else if ( QUnit.objectType( expected ) === "regexp" ) {
524
- ok = expected.test( actual );
634
+ ok = expected.test( errorString( actual ) );
525
635
  // expected is a constructor
526
636
  } else if ( actual instanceof expected ) {
527
637
  ok = true;
528
638
  // expected is a validation function which returns true is validation passed
529
639
  } else if ( expected.call( {}, actual ) === true ) {
640
+ expectedOutput = null;
530
641
  ok = true;
531
642
  }
532
643
 
533
- QUnit.push( ok, actual, null, message );
644
+ QUnit.push( ok, actual, expectedOutput, message );
534
645
  } else {
535
646
  QUnit.pushFailure( message, null, 'No exception was thrown.' );
536
647
  }
@@ -539,15 +650,16 @@
539
650
 
540
651
  /**
541
652
  * @deprecate since 1.8.0
542
- * Kept assertion helpers in root for backwards compatibility
653
+ * Kept assertion helpers in root for backwards compatibility.
543
654
  */
544
- extend( QUnit, QUnit.assert );
655
+ extend( QUnit, assert );
545
656
 
546
657
  /**
547
658
  * @deprecated since 1.9.0
548
- * Kept global "raises()" for backwards compatibility
659
+ * Kept root "raises()" for backwards compatibility.
660
+ * (Note that we don't introduce assert.raises).
549
661
  */
550
- QUnit.raises = QUnit.assert.throws;
662
+ QUnit.raises = assert[ "throws" ];
551
663
 
552
664
  /**
553
665
  * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
@@ -623,6 +735,15 @@
623
735
  moduleDone: []
624
736
  };
625
737
 
738
+ // Export global variables, unless an 'exports' object exists,
739
+ // in that case we assume we're in CommonJS (dealt with on the bottom of the script)
740
+ if ( typeof exports === "undefined" ) {
741
+ extend( window, QUnit );
742
+
743
+ // Expose QUnit object
744
+ window.QUnit = QUnit;
745
+ }
746
+
626
747
  // Initialize more QUnit.config and QUnit.urlParams
627
748
  (function() {
628
749
  var i,
@@ -656,18 +777,11 @@
656
777
  QUnit.isLocal = location.protocol === "file:";
657
778
  }());
658
779
 
659
- // Export global variables, unless an 'exports' object exists,
660
- // in that case we assume we're in CommonJS (dealt with on the bottom of the script)
661
- if ( typeof exports === "undefined" ) {
662
- extend( window, QUnit );
663
-
664
- // Expose QUnit object
665
- window.QUnit = QUnit;
666
- }
667
-
668
780
  // Extend QUnit object,
669
781
  // these after set here because they should not be exposed as global functions
670
782
  extend( QUnit, {
783
+ assert: assert,
784
+
671
785
  config: config,
672
786
 
673
787
  // Initialize the configuration options
@@ -682,7 +796,7 @@
682
796
  autorun: false,
683
797
  filter: "",
684
798
  queue: [],
685
- semaphore: 0
799
+ semaphore: 1
686
800
  });
687
801
 
688
802
  var tests, banner, result,
@@ -690,7 +804,7 @@
690
804
 
691
805
  if ( qunit ) {
692
806
  qunit.innerHTML =
693
- "<h1 id='qunit-header'>" + escapeInnerText( document.title ) + "</h1>" +
807
+ "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
694
808
  "<h2 id='qunit-banner'></h2>" +
695
809
  "<div id='qunit-testrunner-toolbar'></div>" +
696
810
  "<h2 id='qunit-userAgent'></h2>" +
@@ -746,7 +860,7 @@
746
860
 
747
861
  // Safe object type checking
748
862
  is: function( type, obj ) {
749
- return QUnit.objectType( obj ) == type;
863
+ return QUnit.objectType( obj ) === type;
750
864
  },
751
865
 
752
866
  objectType: function( obj ) {
@@ -758,7 +872,8 @@
758
872
  return "null";
759
873
  }
760
874
 
761
- var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || "";
875
+ var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
876
+ type = match && match[1] || "";
762
877
 
763
878
  switch ( type ) {
764
879
  case "Number":
@@ -795,16 +910,16 @@
795
910
  expected: expected
796
911
  };
797
912
 
798
- message = escapeInnerText( message ) || ( result ? "okay" : "failed" );
913
+ message = escapeText( message ) || ( result ? "okay" : "failed" );
799
914
  message = "<span class='test-message'>" + message + "</span>";
800
915
  output = message;
801
916
 
802
917
  if ( !result ) {
803
- expected = escapeInnerText( QUnit.jsDump.parse(expected) );
804
- actual = escapeInnerText( QUnit.jsDump.parse(actual) );
918
+ expected = escapeText( QUnit.jsDump.parse(expected) );
919
+ actual = escapeText( QUnit.jsDump.parse(actual) );
805
920
  output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
806
921
 
807
- if ( actual != expected ) {
922
+ if ( actual !== expected ) {
808
923
  output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
809
924
  output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
810
925
  }
@@ -813,7 +928,7 @@
813
928
 
814
929
  if ( source ) {
815
930
  details.source = source;
816
- output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
931
+ output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
817
932
  }
818
933
 
819
934
  output += "</table>";
@@ -840,19 +955,19 @@
840
955
  message: message
841
956
  };
842
957
 
843
- message = escapeInnerText( message ) || "error";
958
+ message = escapeText( message ) || "error";
844
959
  message = "<span class='test-message'>" + message + "</span>";
845
960
  output = message;
846
961
 
847
962
  output += "<table>";
848
963
 
849
964
  if ( actual ) {
850
- output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeInnerText( actual ) + "</pre></td></tr>";
965
+ output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
851
966
  }
852
967
 
853
968
  if ( source ) {
854
969
  details.source = source;
855
- output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
970
+ output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
856
971
  }
857
972
 
858
973
  output += "</table>";
@@ -877,7 +992,8 @@
877
992
  querystring += encodeURIComponent( key ) + "=" +
878
993
  encodeURIComponent( params[ key ] ) + "&";
879
994
  }
880
- return window.location.pathname + querystring.slice( 0, -1 );
995
+ return window.location.protocol + "//" + window.location.host +
996
+ window.location.pathname + querystring.slice( 0, -1 );
881
997
  },
882
998
 
883
999
  extend: extend,
@@ -908,7 +1024,7 @@
908
1024
  // testStart: { name }
909
1025
  testStart: registerLoggingCallback( "testStart" ),
910
1026
 
911
- // testDone: { name, failed, passed, total }
1027
+ // testDone: { name, failed, passed, total, duration }
912
1028
  testDone: registerLoggingCallback( "testDone" ),
913
1029
 
914
1030
  // moduleStart: { name }
@@ -926,7 +1042,8 @@
926
1042
  runLoggingCallbacks( "begin", QUnit, {} );
927
1043
 
928
1044
  // Initialize the config, saving the execution queue
929
- var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter,
1045
+ var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
1046
+ urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
930
1047
  numModules = 0,
931
1048
  moduleFilterHtml = "",
932
1049
  urlConfigHtml = "",
@@ -949,14 +1066,24 @@
949
1066
  };
950
1067
  }
951
1068
  config[ val.id ] = QUnit.urlParams[ val.id ];
952
- urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
1069
+ urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
1070
+ "' name='" + escapeText( val.id ) +
1071
+ "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
1072
+ " title='" + escapeText( val.tooltip ) +
1073
+ "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
1074
+ "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
953
1075
  }
954
1076
 
955
- moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " + ( config.module === undefined ? "selected" : "" ) + ">< All Modules ></option>";
1077
+ moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
1078
+ ( config.module === undefined ? "selected='selected'" : "" ) +
1079
+ ">< All Modules ></option>";
1080
+
956
1081
  for ( i in config.modules ) {
957
1082
  if ( config.modules.hasOwnProperty( i ) ) {
958
1083
  numModules += 1;
959
- moduleFilterHtml += "<option value='" + encodeURIComponent(i) + "' " + ( config.module === i ? "selected" : "" ) + ">" + i + "</option>";
1084
+ moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(i) ) + "' " +
1085
+ ( config.module === i ? "selected='selected'" : "" ) +
1086
+ ">" + escapeText(i) + "</option>";
960
1087
  }
961
1088
  }
962
1089
  moduleFilterHtml += "</select>";
@@ -1015,20 +1142,26 @@
1015
1142
  label.innerHTML = "Hide passed tests";
1016
1143
  toolbar.appendChild( label );
1017
1144
 
1018
- urlConfigCheckboxes = document.createElement( 'span' );
1019
- urlConfigCheckboxes.innerHTML = urlConfigHtml;
1020
- addEvent( urlConfigCheckboxes, "change", function( event ) {
1021
- var params = {};
1022
- params[ event.target.name ] = event.target.checked ? true : undefined;
1145
+ urlConfigCheckboxesContainer = document.createElement("span");
1146
+ urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
1147
+ urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
1148
+ // For oldIE support:
1149
+ // * Add handlers to the individual elements instead of the container
1150
+ // * Use "click" instead of "change"
1151
+ // * Fallback from event.target to event.srcElement
1152
+ addEvents( urlConfigCheckboxes, "click", function( event ) {
1153
+ var params = {},
1154
+ target = event.target || event.srcElement;
1155
+ params[ target.name ] = target.checked ? true : undefined;
1023
1156
  window.location = QUnit.url( params );
1024
1157
  });
1025
- toolbar.appendChild( urlConfigCheckboxes );
1158
+ toolbar.appendChild( urlConfigCheckboxesContainer );
1026
1159
 
1027
1160
  if (numModules > 1) {
1028
1161
  moduleFilter = document.createElement( 'span' );
1029
1162
  moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
1030
1163
  moduleFilter.innerHTML = moduleFilterHtml;
1031
- addEvent( moduleFilter, "change", function() {
1164
+ addEvent( moduleFilter.lastChild, "change", function() {
1032
1165
  var selectBox = moduleFilter.getElementsByTagName("select")[0],
1033
1166
  selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
1034
1167
 
@@ -1107,7 +1240,7 @@
1107
1240
  " milliseconds.<br/>",
1108
1241
  "<span class='passed'>",
1109
1242
  passed,
1110
- "</span> tests of <span class='total'>",
1243
+ "</span> assertions of <span class='total'>",
1111
1244
  config.stats.all,
1112
1245
  "</span> passed, <span class='failed'>",
1113
1246
  config.stats.bad,
@@ -1200,7 +1333,7 @@
1200
1333
  function extractStacktrace( e, offset ) {
1201
1334
  offset = offset === undefined ? 3 : offset;
1202
1335
 
1203
- var stack, include, i, regex;
1336
+ var stack, include, i;
1204
1337
 
1205
1338
  if ( e.stacktrace ) {
1206
1339
  // Opera
@@ -1214,7 +1347,7 @@
1214
1347
  if ( fileName ) {
1215
1348
  include = [];
1216
1349
  for ( i = offset; i < stack.length; i++ ) {
1217
- if ( stack[ i ].indexOf( fileName ) != -1 ) {
1350
+ if ( stack[ i ].indexOf( fileName ) !== -1 ) {
1218
1351
  break;
1219
1352
  }
1220
1353
  include.push( stack[ i ] );
@@ -1243,17 +1376,27 @@
1243
1376
  }
1244
1377
  }
1245
1378
 
1246
- function escapeInnerText( s ) {
1379
+ /**
1380
+ * Escape text for attribute or text content.
1381
+ */
1382
+ function escapeText( s ) {
1247
1383
  if ( !s ) {
1248
1384
  return "";
1249
1385
  }
1250
1386
  s = s + "";
1251
- return s.replace( /[\&<>]/g, function( s ) {
1387
+ // Both single quotes and double quotes (for attributes)
1388
+ return s.replace( /['"<>&]/g, function( s ) {
1252
1389
  switch( s ) {
1253
- case "&": return "&amp;";
1254
- case "<": return "&lt;";
1255
- case ">": return "&gt;";
1256
- default: return s;
1390
+ case '\'':
1391
+ return '&#039;';
1392
+ case '"':
1393
+ return '&quot;';
1394
+ case '<':
1395
+ return '&lt;';
1396
+ case '>':
1397
+ return '&gt;';
1398
+ case '&':
1399
+ return '&amp;';
1257
1400
  }
1258
1401
  });
1259
1402
  }
@@ -1301,7 +1444,7 @@
1301
1444
  }
1302
1445
  }
1303
1446
 
1304
- function checkPollution( name ) {
1447
+ function checkPollution() {
1305
1448
  var newGlobals,
1306
1449
  deletedGlobals,
1307
1450
  old = config.pollution;
@@ -1350,16 +1493,53 @@
1350
1493
  return a;
1351
1494
  }
1352
1495
 
1496
+ /**
1497
+ * @param {HTMLElement} elem
1498
+ * @param {string} type
1499
+ * @param {Function} fn
1500
+ */
1353
1501
  function addEvent( elem, type, fn ) {
1502
+ // Standards-based browsers
1354
1503
  if ( elem.addEventListener ) {
1355
1504
  elem.addEventListener( type, fn, false );
1356
- } else if ( elem.attachEvent ) {
1357
- elem.attachEvent( "on" + type, fn );
1505
+ // IE
1358
1506
  } else {
1359
- fn();
1507
+ elem.attachEvent( "on" + type, fn );
1360
1508
  }
1361
1509
  }
1362
1510
 
1511
+ /**
1512
+ * @param {Array|NodeList} elems
1513
+ * @param {string} type
1514
+ * @param {Function} fn
1515
+ */
1516
+ function addEvents( elems, type, fn ) {
1517
+ var i = elems.length;
1518
+ while ( i-- ) {
1519
+ addEvent( elems[i], type, fn );
1520
+ }
1521
+ }
1522
+
1523
+ function hasClass( elem, name ) {
1524
+ return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
1525
+ }
1526
+
1527
+ function addClass( elem, name ) {
1528
+ if ( !hasClass( elem, name ) ) {
1529
+ elem.className += (elem.className ? " " : "") + name;
1530
+ }
1531
+ }
1532
+
1533
+ function removeClass( elem, name ) {
1534
+ var set = " " + elem.className + " ";
1535
+ // Class name may appear multiple times
1536
+ while ( set.indexOf(" " + name + " ") > -1 ) {
1537
+ set = set.replace(" " + name + " " , " ");
1538
+ }
1539
+ // If possible, trim it for prettiness, but not neccecarily
1540
+ elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );
1541
+ }
1542
+
1363
1543
  function id( name ) {
1364
1544
  return !!( typeof document !== "undefined" && document && document.getElementById ) &&
1365
1545
  document.getElementById( name );
@@ -1373,7 +1553,6 @@
1373
1553
 
1374
1554
  // Supports deprecated method of completely overwriting logging callbacks
1375
1555
  function runLoggingCallbacks( key, scope, args ) {
1376
- //debugger;
1377
1556
  var i, callbacks;
1378
1557
  if ( QUnit.hasOwnProperty( key ) ) {
1379
1558
  QUnit[ key ].call(scope, args );
@@ -1415,6 +1594,7 @@
1415
1594
 
1416
1595
  // for string, boolean, number and null
1417
1596
  function useStrictEquality( b, a ) {
1597
+ /*jshint eqeqeq:false */
1418
1598
  if ( b instanceof a.constructor || a instanceof b.constructor ) {
1419
1599
  // to catch short annotaion VS 'new' annotation of a
1420
1600
  // declaration
@@ -1611,7 +1791,8 @@
1611
1791
 
1612
1792
  var reName = /^function (\w+)/,
1613
1793
  jsDump = {
1614
- parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
1794
+ // type is used mostly internally, you can fix a (custom)type in advance
1795
+ parse: function( obj, type, stack ) {
1615
1796
  stack = stack || [ ];
1616
1797
  var inStack, res,
1617
1798
  parser = this.parsers[ type || this.typeOf(obj) ];
@@ -1619,18 +1800,16 @@
1619
1800
  type = typeof parser;
1620
1801
  inStack = inArray( obj, stack );
1621
1802
 
1622
- if ( inStack != -1 ) {
1803
+ if ( inStack !== -1 ) {
1623
1804
  return "recursion(" + (inStack - stack.length) + ")";
1624
1805
  }
1625
- //else
1626
- if ( type == "function" ) {
1806
+ if ( type === "function" ) {
1627
1807
  stack.push( obj );
1628
1808
  res = parser.call( this, obj, stack );
1629
1809
  stack.pop();
1630
1810
  return res;
1631
1811
  }
1632
- // else
1633
- return ( type == "string" ) ? parser : this.parsers.error;
1812
+ return ( type === "string" ) ? parser : this.parsers.error;
1634
1813
  },
1635
1814
  typeOf: function( obj ) {
1636
1815
  var type;
@@ -1657,6 +1836,8 @@
1657
1836
  ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
1658
1837
  ) {
1659
1838
  type = "array";
1839
+ } else if ( obj.constructor === Error.prototype.constructor ) {
1840
+ type = "error";
1660
1841
  } else {
1661
1842
  type = typeof obj;
1662
1843
  }
@@ -1665,7 +1846,8 @@
1665
1846
  separator: function() {
1666
1847
  return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
1667
1848
  },
1668
- indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
1849
+ // extra can be a number, shortcut for increasing-calling-decreasing
1850
+ indent: function( extra ) {
1669
1851
  if ( !this.multiline ) {
1670
1852
  return "";
1671
1853
  }
@@ -1694,13 +1876,16 @@
1694
1876
  parsers: {
1695
1877
  window: "[Window]",
1696
1878
  document: "[Document]",
1697
- error: "[ERROR]", //when no parser is found, shouldn"t happen
1879
+ error: function(error) {
1880
+ return "Error(\"" + error.message + "\")";
1881
+ },
1698
1882
  unknown: "[Unknown]",
1699
1883
  "null": "null",
1700
1884
  "undefined": "undefined",
1701
1885
  "function": function( fn ) {
1702
1886
  var ret = "function",
1703
- name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE
1887
+ // functions never have name in IE
1888
+ name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
1704
1889
 
1705
1890
  if ( name ) {
1706
1891
  ret += " " + name;
@@ -1716,13 +1901,9 @@
1716
1901
  object: function( map, stack ) {
1717
1902
  var ret = [ ], keys, key, val, i;
1718
1903
  QUnit.jsDump.up();
1719
- if ( Object.keys ) {
1720
- keys = Object.keys( map );
1721
- } else {
1722
- keys = [];
1723
- for ( key in map ) {
1724
- keys.push( key );
1725
- }
1904
+ keys = [];
1905
+ for ( key in map ) {
1906
+ keys.push( key );
1726
1907
  }
1727
1908
  keys.sort();
1728
1909
  for ( i = 0; i < keys.length; i++ ) {
@@ -1734,21 +1915,34 @@
1734
1915
  return join( "{", ret, "}" );
1735
1916
  },
1736
1917
  node: function( node ) {
1737
- var a, val,
1918
+ var len, i, val,
1738
1919
  open = QUnit.jsDump.HTML ? "&lt;" : "<",
1739
1920
  close = QUnit.jsDump.HTML ? "&gt;" : ">",
1740
1921
  tag = node.nodeName.toLowerCase(),
1741
- ret = open + tag;
1742
-
1743
- for ( a in QUnit.jsDump.DOMAttrs ) {
1744
- val = node[ QUnit.jsDump.DOMAttrs[a] ];
1745
- if ( val ) {
1746
- ret += " " + a + "=" + QUnit.jsDump.parse( val, "attribute" );
1922
+ ret = open + tag,
1923
+ attrs = node.attributes;
1924
+
1925
+ if ( attrs ) {
1926
+ for ( i = 0, len = attrs.length; i < len; i++ ) {
1927
+ val = attrs[i].nodeValue;
1928
+ // IE6 includes all attributes in .attributes, even ones not explicitly set.
1929
+ // Those have values like undefined, null, 0, false, "" or "inherit".
1930
+ if ( val && val !== "inherit" ) {
1931
+ ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
1932
+ }
1747
1933
  }
1748
1934
  }
1749
- return ret + close + open + "/" + tag + close;
1935
+ ret += close;
1936
+
1937
+ // Show content of TextNode or CDATASection
1938
+ if ( node.nodeType === 3 || node.nodeType === 4 ) {
1939
+ ret += node.nodeValue;
1940
+ }
1941
+
1942
+ return ret + open + "/" + tag + close;
1750
1943
  },
1751
- functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
1944
+ // function calls it internally, it's the arguments part of the function
1945
+ functionArgs: function( fn ) {
1752
1946
  var args,
1753
1947
  l = fn.length;
1754
1948
 
@@ -1758,54 +1952,34 @@
1758
1952
 
1759
1953
  args = new Array(l);
1760
1954
  while ( l-- ) {
1761
- args[l] = String.fromCharCode(97+l);//97 is 'a'
1955
+ // 97 is 'a'
1956
+ args[l] = String.fromCharCode(97+l);
1762
1957
  }
1763
1958
  return " " + args.join( ", " ) + " ";
1764
1959
  },
1765
- key: quote, //object calls it internally, the key part of an item in a map
1766
- functionCode: "[code]", //function calls it internally, it's the content of the function
1767
- attribute: quote, //node calls it internally, it's an html attribute value
1960
+ // object calls it internally, the key part of an item in a map
1961
+ key: quote,
1962
+ // function calls it internally, it's the content of the function
1963
+ functionCode: "[code]",
1964
+ // node calls it internally, it's an html attribute value
1965
+ attribute: quote,
1768
1966
  string: quote,
1769
1967
  date: quote,
1770
- regexp: literal, //regex
1968
+ regexp: literal,
1771
1969
  number: literal,
1772
1970
  "boolean": literal
1773
1971
  },
1774
- DOMAttrs: {
1775
- //attributes to dump from nodes, name=>realName
1776
- id: "id",
1777
- name: "name",
1778
- "class": "className"
1779
- },
1780
- HTML: false,//if true, entities are escaped ( <, >, \t, space and \n )
1781
- indentChar: " ",//indentation unit
1782
- multiline: true //if true, items in a collection, are separated by a \n, else just a space.
1972
+ // if true, entities are escaped ( <, >, \t, space and \n )
1973
+ HTML: false,
1974
+ // indentation unit
1975
+ indentChar: " ",
1976
+ // if true, items in a collection, are separated by a \n, else just a space.
1977
+ multiline: true
1783
1978
  };
1784
1979
 
1785
1980
  return jsDump;
1786
1981
  }());
1787
1982
 
1788
- // from Sizzle.js
1789
- function getText( elems ) {
1790
- var i, elem,
1791
- ret = "";
1792
-
1793
- for ( i = 0; elems[i]; i++ ) {
1794
- elem = elems[i];
1795
-
1796
- // Get the text from text nodes and CDATA nodes
1797
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
1798
- ret += elem.nodeValue;
1799
-
1800
- // Traverse everything else, except comment nodes
1801
- } else if ( elem.nodeType !== 8 ) {
1802
- ret += getText( elem.childNodes );
1803
- }
1804
- }
1805
-
1806
- return ret;
1807
- }
1808
-
1809
1983
  // from jquery.js
1810
1984
  function inArray( elem, array ) {
1811
1985
  if ( array.indexOf ) {
@@ -1836,13 +2010,14 @@
1836
2010
  * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
1837
2011
  */
1838
2012
  QUnit.diff = (function() {
2013
+ /*jshint eqeqeq:false, eqnull:true */
1839
2014
  function diff( o, n ) {
1840
2015
  var i,
1841
2016
  ns = {},
1842
2017
  os = {};
1843
2018
 
1844
2019
  for ( i = 0; i < n.length; i++ ) {
1845
- if ( ns[ n[i] ] == null ) {
2020
+ if ( !hasOwn.call( ns, n[i] ) ) {
1846
2021
  ns[ n[i] ] = {
1847
2022
  rows: [],
1848
2023
  o: null
@@ -1852,7 +2027,7 @@
1852
2027
  }
1853
2028
 
1854
2029
  for ( i = 0; i < o.length; i++ ) {
1855
- if ( os[ o[i] ] == null ) {
2030
+ if ( !hasOwn.call( os, o[i] ) ) {
1856
2031
  os[ o[i] ] = {
1857
2032
  rows: [],
1858
2033
  n: null
@@ -1865,7 +2040,7 @@
1865
2040
  if ( !hasOwn.call( ns, i ) ) {
1866
2041
  continue;
1867
2042
  }
1868
- if ( ns[i].rows.length == 1 && typeof os[i] != "undefined" && os[i].rows.length == 1 ) {
2043
+ if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
1869
2044
  n[ ns[i].rows[0] ] = {
1870
2045
  text: n[ ns[i].rows[0] ],
1871
2046
  row: os[i].rows[0]
@@ -1971,15 +2146,13 @@
1971
2146
 
1972
2147
  // for CommonJS enviroments, export everything
1973
2148
  if ( typeof exports !== "undefined" ) {
1974
- extend(exports, QUnit);
2149
+ extend( exports, QUnit );
1975
2150
  }
1976
2151
 
1977
2152
  // get at whatever the global object is, like window in browsers
1978
2153
  }( (function() {return this;}.call()) ));
1979
2154
  (function() {
1980
-
1981
2155
  this.Teabag = (function() {
1982
-
1983
2156
  function Teabag() {}
1984
2157
 
1985
2158
  Teabag.defer = false;
@@ -2011,6 +2184,7 @@
2011
2184
 
2012
2185
  Teabag.resolveDependenciesFromParams = function(all) {
2013
2186
  var dep, deps, file, parts, path, paths, _i, _j, _len, _len1;
2187
+
2014
2188
  if (all == null) {
2015
2189
  all = [];
2016
2190
  }
@@ -2036,16 +2210,20 @@
2036
2210
  };
2037
2211
 
2038
2212
  Teabag.log = function() {
2213
+ var e;
2214
+
2039
2215
  this.messages.push(arguments[0]);
2040
2216
  try {
2041
2217
  return console.log.apply(console, arguments);
2042
- } catch (e) {
2218
+ } catch (_error) {
2219
+ e = _error;
2043
2220
  throw new Error("Unable to use console.log for logging");
2044
2221
  }
2045
2222
  };
2046
2223
 
2047
2224
  Teabag.getMessages = function() {
2048
2225
  var messages;
2226
+
2049
2227
  messages = this.messages;
2050
2228
  this.messages = [];
2051
2229
  return messages;
@@ -2057,9 +2235,7 @@
2057
2235
 
2058
2236
  }).call(this);
2059
2237
  (function() {
2060
-
2061
2238
  Teabag.Runner = (function() {
2062
-
2063
2239
  Runner.run = false;
2064
2240
 
2065
2241
  function Runner() {
@@ -2074,6 +2250,7 @@
2074
2250
 
2075
2251
  Runner.prototype.getParams = function() {
2076
2252
  var name, param, params, value, _i, _len, _ref, _ref1;
2253
+
2077
2254
  params = {};
2078
2255
  _ref = Teabag.location.search.substring(1).split("&");
2079
2256
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
@@ -2120,6 +2297,7 @@
2120
2297
 
2121
2298
  fixture.preload = function() {
2122
2299
  var url, urls, _i, _len, _results;
2300
+
2123
2301
  urls = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
2124
2302
  _results = [];
2125
2303
  for (_i = 0, _len = urls.length; _i < _len; _i++) {
@@ -2131,6 +2309,7 @@
2131
2309
 
2132
2310
  fixture.load = function() {
2133
2311
  var append, index, url, urls, _i, _j, _len, _results;
2312
+
2134
2313
  urls = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), append = arguments[_i++];
2135
2314
  if (append == null) {
2136
2315
  append = false;
@@ -2149,6 +2328,7 @@
2149
2328
 
2150
2329
  fixture.set = function() {
2151
2330
  var append, html, htmls, index, _i, _j, _len, _results;
2331
+
2152
2332
  htmls = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), append = arguments[_i++];
2153
2333
  if (append == null) {
2154
2334
  append = false;
@@ -2181,6 +2361,7 @@
2181
2361
 
2182
2362
  load = function(url, append, preload) {
2183
2363
  var cached, value;
2364
+
2184
2365
  if (preload == null) {
2185
2366
  preload = false;
2186
2367
  }
@@ -2242,6 +2423,7 @@
2242
2423
 
2243
2424
  create = function() {
2244
2425
  var _ref;
2426
+
2245
2427
  Teabag.fixture.el = document.createElement("div");
2246
2428
  if (typeof window.$ === 'function') {
2247
2429
  Teabag.fixture.$el = $(Teabag.fixture.el);
@@ -2252,6 +2434,7 @@
2252
2434
 
2253
2435
  cleanup = function() {
2254
2436
  var _base, _ref, _ref1;
2437
+
2255
2438
  (_base = Teabag.fixture).el || (_base.el = document.getElementById("teabag-fixtures"));
2256
2439
  if ((_ref = Teabag.fixture.el) != null) {
2257
2440
  if ((_ref1 = _ref.parentNode) != null) {
@@ -2262,16 +2445,19 @@
2262
2445
  };
2263
2446
 
2264
2447
  xhrRequest = function(url, callback) {
2448
+ var e;
2449
+
2265
2450
  if (window.XMLHttpRequest) {
2266
2451
  xhr = new XMLHttpRequest();
2267
2452
  } else if (window.ActiveXObject) {
2268
2453
  try {
2269
2454
  xhr = new ActiveXObject("Msxml2.XMLHTTP");
2270
- } catch (e) {
2455
+ } catch (_error) {
2456
+ e = _error;
2271
2457
  try {
2272
2458
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
2273
- } catch (e) {
2274
-
2459
+ } catch (_error) {
2460
+ e = _error;
2275
2461
  }
2276
2462
  }
2277
2463
  }
@@ -2289,9 +2475,7 @@
2289
2475
 
2290
2476
  }).call(this);
2291
2477
  (function() {
2292
-
2293
2478
  Teabag.Reporters.BaseView = (function() {
2294
-
2295
2479
  function BaseView() {
2296
2480
  this.elements = {};
2297
2481
  this.build();
@@ -2311,6 +2495,7 @@
2311
2495
 
2312
2496
  BaseView.prototype.createEl = function(type, className) {
2313
2497
  var el;
2498
+
2314
2499
  if (className == null) {
2315
2500
  className = "";
2316
2501
  }
@@ -2321,18 +2506,21 @@
2321
2506
 
2322
2507
  BaseView.prototype.findEl = function(id) {
2323
2508
  var _base;
2509
+
2324
2510
  this.elements || (this.elements = {});
2325
2511
  return (_base = this.elements)[id] || (_base[id] = document.getElementById("teabag-" + id));
2326
2512
  };
2327
2513
 
2328
2514
  BaseView.prototype.setText = function(id, value) {
2329
2515
  var el;
2516
+
2330
2517
  el = this.findEl(id);
2331
2518
  return el.innerHTML = value;
2332
2519
  };
2333
2520
 
2334
2521
  BaseView.prototype.setHtml = function(id, value, add) {
2335
2522
  var el;
2523
+
2336
2524
  if (add == null) {
2337
2525
  add = false;
2338
2526
  }
@@ -2346,12 +2534,14 @@
2346
2534
 
2347
2535
  BaseView.prototype.setClass = function(id, value) {
2348
2536
  var el;
2537
+
2349
2538
  el = this.findEl(id);
2350
2539
  return el.className = value;
2351
2540
  };
2352
2541
 
2353
2542
  BaseView.prototype.htmlSafe = function(str) {
2354
2543
  var el;
2544
+
2355
2545
  el = document.createElement("div");
2356
2546
  el.appendChild(document.createTextNode(str));
2357
2547
  return el.innerHTML;
@@ -2368,14 +2558,11 @@
2368
2558
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
2369
2559
 
2370
2560
  Teabag.Reporters.HTML = (function(_super) {
2371
-
2372
2561
  __extends(HTML, _super);
2373
2562
 
2374
2563
  function HTML() {
2375
2564
  this.toggleConfig = __bind(this.toggleConfig, this);
2376
-
2377
- this.reportRunnerResults = __bind(this.reportRunnerResults, this);
2378
- this.start = new Teabag.Date().getTime();
2565
+ this.reportRunnerResults = __bind(this.reportRunnerResults, this); this.start = new Teabag.Date().getTime();
2379
2566
  this.config = {
2380
2567
  "use-catch": true,
2381
2568
  "build-full-report": false,
@@ -2400,6 +2587,7 @@
2400
2587
 
2401
2588
  HTML.prototype.build = function() {
2402
2589
  var _ref;
2590
+
2403
2591
  this.buildLayout();
2404
2592
  this.setText("env-info", this.envInfo());
2405
2593
  this.setText("version", Teabag.version);
@@ -2417,6 +2605,7 @@
2417
2605
 
2418
2606
  HTML.prototype.buildLayout = function() {
2419
2607
  var el;
2608
+
2420
2609
  el = this.createEl("div");
2421
2610
  el.id = "teabag-interface";
2422
2611
  el.innerHTML = Teabag.Reporters.HTML.template;
@@ -2425,6 +2614,7 @@
2425
2614
 
2426
2615
  HTML.prototype.buildSuiteSelect = function() {
2427
2616
  var options, suite, _i, _len, _ref;
2617
+
2428
2618
  if (Teabag.suites.all.length === 1) {
2429
2619
  return "";
2430
2620
  }
@@ -2501,6 +2691,7 @@
2501
2691
 
2502
2692
  HTML.prototype.updateStatus = function(spec) {
2503
2693
  var elapsed, result, _ref, _ref1;
2694
+
2504
2695
  spec = new Teabag.Spec(spec);
2505
2696
  result = spec.result();
2506
2697
  if (result.skipped || result.status === "pending") {
@@ -2529,6 +2720,7 @@
2529
2720
 
2530
2721
  HTML.prototype.showConfiguration = function() {
2531
2722
  var key, value, _ref, _results;
2723
+
2532
2724
  _ref = this.config;
2533
2725
  _results = [];
2534
2726
  for (key in _ref) {
@@ -2544,6 +2736,7 @@
2544
2736
 
2545
2737
  HTML.prototype.setFilters = function() {
2546
2738
  var link;
2739
+
2547
2740
  link = [Teabag.root, Teabag.suites.active].join('/');
2548
2741
  if (Teabag.params["file"]) {
2549
2742
  this.filters.push("<a href='" + link + "'>remove</a> by file: " + Teabag.params["file"]);
@@ -2555,6 +2748,7 @@
2555
2748
 
2556
2749
  HTML.prototype.readConfig = function() {
2557
2750
  var config;
2751
+
2558
2752
  if (config = this.cookie("teabag")) {
2559
2753
  return this.config = config;
2560
2754
  }
@@ -2562,6 +2756,7 @@
2562
2756
 
2563
2757
  HTML.prototype.toggleConfig = function(e) {
2564
2758
  var button, name;
2759
+
2565
2760
  button = e.target;
2566
2761
  if (button.tagName.toLowerCase() !== "button") {
2567
2762
  return;
@@ -2582,6 +2777,7 @@
2582
2777
 
2583
2778
  HTML.prototype.cookie = function(name, value) {
2584
2779
  var date, match;
2780
+
2585
2781
  if (value == null) {
2586
2782
  value = void 0;
2587
2783
  }
@@ -2602,15 +2798,16 @@
2602
2798
 
2603
2799
  }).call(this);
2604
2800
  (function() {
2605
- var __hasProp = {}.hasOwnProperty,
2801
+ var _ref, _ref1, _ref2,
2802
+ __hasProp = {}.hasOwnProperty,
2606
2803
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
2607
2804
 
2608
2805
  Teabag.Reporters.HTML.ProgressView = (function(_super) {
2609
-
2610
2806
  __extends(ProgressView, _super);
2611
2807
 
2612
2808
  function ProgressView() {
2613
- return ProgressView.__super__.constructor.apply(this, arguments);
2809
+ _ref = ProgressView.__super__.constructor.apply(this, arguments);
2810
+ return _ref;
2614
2811
  }
2615
2812
 
2616
2813
  ProgressView.create = function(displayProgress) {
@@ -2638,11 +2835,11 @@
2638
2835
  })(Teabag.Reporters.BaseView);
2639
2836
 
2640
2837
  Teabag.Reporters.HTML.SimpleProgressView = (function(_super) {
2641
-
2642
2838
  __extends(SimpleProgressView, _super);
2643
2839
 
2644
2840
  function SimpleProgressView() {
2645
- return SimpleProgressView.__super__.constructor.apply(this, arguments);
2841
+ _ref1 = SimpleProgressView.__super__.constructor.apply(this, arguments);
2842
+ return _ref1;
2646
2843
  }
2647
2844
 
2648
2845
  SimpleProgressView.prototype.build = function() {
@@ -2652,6 +2849,7 @@
2652
2849
 
2653
2850
  SimpleProgressView.prototype.update = function(total, run) {
2654
2851
  var percent;
2852
+
2655
2853
  percent = total ? Math.ceil((run * 100) / total) : 0;
2656
2854
  return this.setHtml("progress-percent", "" + percent + "%");
2657
2855
  };
@@ -2661,11 +2859,11 @@
2661
2859
  })(Teabag.Reporters.HTML.ProgressView);
2662
2860
 
2663
2861
  Teabag.Reporters.HTML.RadialProgressView = (function(_super) {
2664
-
2665
2862
  __extends(RadialProgressView, _super);
2666
2863
 
2667
2864
  function RadialProgressView() {
2668
- return RadialProgressView.__super__.constructor.apply(this, arguments);
2865
+ _ref2 = RadialProgressView.__super__.constructor.apply(this, arguments);
2866
+ return _ref2;
2669
2867
  }
2670
2868
 
2671
2869
  RadialProgressView.supported = !!document.createElement("canvas").getContext;
@@ -2676,7 +2874,8 @@
2676
2874
  };
2677
2875
 
2678
2876
  RadialProgressView.prototype.appendTo = function() {
2679
- var canvas;
2877
+ var canvas, e;
2878
+
2680
2879
  RadialProgressView.__super__.appendTo.apply(this, arguments);
2681
2880
  this.size = 80;
2682
2881
  try {
@@ -2685,13 +2884,14 @@
2685
2884
  this.ctx = canvas.getContext("2d");
2686
2885
  this.ctx.strokeStyle = "#fff";
2687
2886
  return this.ctx.lineWidth = 1.5;
2688
- } catch (e) {
2689
-
2887
+ } catch (_error) {
2888
+ e = _error;
2690
2889
  }
2691
2890
  };
2692
2891
 
2693
2892
  RadialProgressView.prototype.update = function(total, run) {
2694
2893
  var half, percent;
2894
+
2695
2895
  percent = total ? Math.ceil((run * 100) / total) : 0;
2696
2896
  this.setHtml("progress-percent", "" + percent + "%");
2697
2897
  if (!this.ctx) {
@@ -2731,6 +2931,7 @@
2731
2931
 
2732
2932
  SpecView.prototype.build = function() {
2733
2933
  var classes;
2934
+
2734
2935
  classes = ["spec"];
2735
2936
  if (this.spec.pending) {
2736
2937
  classes.push("state-pending");
@@ -2743,6 +2944,7 @@
2743
2944
 
2744
2945
  SpecView.prototype.buildParent = function() {
2745
2946
  var parent, view;
2947
+
2746
2948
  parent = this.spec.parent;
2747
2949
  if (parent.viewId) {
2748
2950
  return this.views.suites[parent.viewId];
@@ -2754,6 +2956,7 @@
2754
2956
 
2755
2957
  SpecView.prototype.buildErrors = function() {
2756
2958
  var div, error, html, _i, _len, _ref;
2959
+
2757
2960
  div = this.createEl("div");
2758
2961
  html = "";
2759
2962
  _ref = this.spec.errors();
@@ -2767,6 +2970,7 @@
2767
2970
 
2768
2971
  SpecView.prototype.updateState = function(state, elapsed) {
2769
2972
  var classes, result, _base;
2973
+
2770
2974
  result = this.spec.result();
2771
2975
  classes = ["state-" + state];
2772
2976
  if (elapsed > Teabag.slow) {
@@ -2792,7 +2996,6 @@
2792
2996
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
2793
2997
 
2794
2998
  Teabag.Reporters.HTML.FailureView = (function(_super) {
2795
-
2796
2999
  __extends(FailureView, _super);
2797
3000
 
2798
3001
  function FailureView(spec) {
@@ -2802,6 +3005,7 @@
2802
3005
 
2803
3006
  FailureView.prototype.build = function() {
2804
3007
  var error, html, _i, _len, _ref;
3008
+
2805
3009
  FailureView.__super__.build.call(this, "spec");
2806
3010
  html = "<h1 class=\"teabag-clearfix\"><a href=\"" + this.spec.link + "\">" + this.spec.fullDescription + "</a></h1>";
2807
3011
  _ref = this.spec.errors();
@@ -2847,6 +3051,7 @@
2847
3051
 
2848
3052
  SuiteView.prototype.buildParent = function() {
2849
3053
  var parent, view;
3054
+
2850
3055
  parent = this.suite.parent;
2851
3056
  if (!parent) {
2852
3057
  return this.reporter;
@@ -2868,6 +3073,7 @@
2868
3073
 
2869
3074
  SuiteView.prototype.updateState = function(state) {
2870
3075
  var _base;
3076
+
2871
3077
  if (this.state === "failed") {
2872
3078
  return;
2873
3079
  }
@@ -2884,7 +3090,6 @@
2884
3090
 
2885
3091
  }).call(this);
2886
3092
  (function() {
2887
-
2888
3093
  Teabag.Reporters.HTML.template = "<div class=\"teabag-clearfix\">\n <div id=\"teabag-title\">\n <h1><a href=\"\" id=\"teabag-root-link\">Teabag</a></h1>\n <ul>\n <li>version: <b id=\"teabag-version\"></b></li>\n <li id=\"teabag-env-info\"></li>\n </ul>\n </div>\n <div id=\"teabag-progress\"></div>\n <ul id=\"teabag-stats\">\n <li>passes: <b id=\"teabag-stats-passes\">0</b></li>\n <li>failures: <b id=\"teabag-stats-failures\">0</b></li>\n <li>skipped: <b id=\"teabag-stats-skipped\">0</b></li>\n <li>duration: <b id=\"teabag-stats-duration\">&infin;</b></li>\n </ul>\n</div>\n\n<div id=\"teabag-controls\" class=\"teabag-clearfix\">\n <div id=\"teabag-toggles\">\n <button id=\"teabag-use-catch\" title=\"Toggle using try/catch wrappers when possible\">Try/Catch</button>\n <button id=\"teabag-build-full-report\" title=\"Toggle building the full report\">Full Report</button>\n <button id=\"teabag-display-progress\" title=\"Toggle displaying progress as tests run\">Progress</button>\n </div>\n <div id=\"teabag-suites\"></div>\n</div>\n\n<hr/>\n\n<div id=\"teabag-filter\">\n <h1>Filtering</h1>\n <ul id=\"teabag-filter-list\"></ul>\n</div>\n\n<div id=\"teabag-report\">\n <ol id=\"teabag-report-failures\"></ol>\n <ol id=\"teabag-report-all\"></ol>\n</div>";
2889
3094
 
2890
3095
  }).call(this);
@@ -2892,10 +3097,8 @@
2892
3097
  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
2893
3098
 
2894
3099
  Teabag.Reporters.Console = (function() {
2895
-
2896
3100
  function Console() {
2897
- this.reportRunnerResults = __bind(this.reportRunnerResults, this);
2898
- this.start = new Teabag.Date();
3101
+ this.reportRunnerResults = __bind(this.reportRunnerResults, this); this.start = new Teabag.Date();
2899
3102
  this.suites = {};
2900
3103
  }
2901
3104
 
@@ -2909,6 +3112,7 @@
2909
3112
 
2910
3113
  Console.prototype.reportSuites = function() {
2911
3114
  var index, suite, _i, _len, _ref, _results;
3115
+
2912
3116
  _ref = this.spec.getParents();
2913
3117
  _results = [];
2914
3118
  for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {
@@ -2928,6 +3132,7 @@
2928
3132
 
2929
3133
  Console.prototype.reportSpecResults = function(spec) {
2930
3134
  var result;
3135
+
2931
3136
  this.spec = new Teabag.Spec(spec);
2932
3137
  result = this.spec.result();
2933
3138
  if (result.skipped) {
@@ -2952,6 +3157,7 @@
2952
3157
 
2953
3158
  Console.prototype.trackPending = function() {
2954
3159
  var result;
3160
+
2955
3161
  result = this.spec.result();
2956
3162
  return this.log({
2957
3163
  type: "spec",
@@ -2964,6 +3170,7 @@
2964
3170
 
2965
3171
  Console.prototype.trackFailure = function() {
2966
3172
  var error, result, _i, _len, _ref, _results;
3173
+
2967
3174
  result = this.spec.result();
2968
3175
  _ref = this.spec.errors();
2969
3176
  _results = [];
@@ -3048,19 +3255,17 @@
3048
3255
 
3049
3256
  }).call(this);
3050
3257
  (function() {
3051
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
3258
+ var _ref, _ref1,
3259
+ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
3052
3260
  __hasProp = {}.hasOwnProperty,
3053
3261
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
3054
3262
 
3055
3263
  Teabag.Reporters.HTML = (function(_super) {
3056
-
3057
3264
  __extends(HTML, _super);
3058
3265
 
3059
3266
  function HTML(env) {
3060
3267
  this.reportRunnerResults = __bind(this.reportRunnerResults, this);
3061
-
3062
- this.reportSpecResults = __bind(this.reportSpecResults, this);
3063
- HTML.__super__.constructor.apply(this, arguments);
3268
+ this.reportSpecResults = __bind(this.reportSpecResults, this); HTML.__super__.constructor.apply(this, arguments);
3064
3269
  env.log(this.reportSpecResults);
3065
3270
  env.testDone(this.reportSpecResults);
3066
3271
  env.done(this.reportRunnerResults);
@@ -3095,7 +3300,7 @@
3095
3300
  };
3096
3301
 
3097
3302
  HTML.prototype.envInfo = function() {
3098
- return "qunit 1.10.0";
3303
+ return "qunit 1.11.0";
3099
3304
  };
3100
3305
 
3101
3306
  return HTML;
@@ -3103,20 +3308,21 @@
3103
3308
  })(Teabag.Reporters.HTML);
3104
3309
 
3105
3310
  Teabag.Reporters.HTML.SpecView = (function(_super) {
3106
-
3107
3311
  __extends(SpecView, _super);
3108
3312
 
3109
3313
  function SpecView() {
3110
- return SpecView.__super__.constructor.apply(this, arguments);
3314
+ _ref = SpecView.__super__.constructor.apply(this, arguments);
3315
+ return _ref;
3111
3316
  }
3112
3317
 
3113
3318
  SpecView.prototype.buildErrors = function() {
3114
- var div, error, html, _i, _len, _ref;
3319
+ var div, error, html, _i, _len, _ref1;
3320
+
3115
3321
  div = this.createEl("div");
3116
3322
  html = "";
3117
- _ref = this.spec.errors();
3118
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
3119
- error = _ref[_i];
3323
+ _ref1 = this.spec.errors();
3324
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
3325
+ error = _ref1[_i];
3120
3326
  html += "<strong>" + error.message + "</strong><br/>" + (this.htmlSafe(error.stack || "Stack trace unavailable")) + "<br/>";
3121
3327
  }
3122
3328
  div.innerHTML = html;
@@ -3125,6 +3331,7 @@
3125
3331
 
3126
3332
  SpecView.prototype.buildParent = function() {
3127
3333
  var parent, view;
3334
+
3128
3335
  parent = this.spec.parent;
3129
3336
  if (!parent) {
3130
3337
  return this.reporter;
@@ -3142,20 +3349,21 @@
3142
3349
  })(Teabag.Reporters.HTML.SpecView);
3143
3350
 
3144
3351
  Teabag.Reporters.HTML.FailureView = (function(_super) {
3145
-
3146
3352
  __extends(FailureView, _super);
3147
3353
 
3148
3354
  function FailureView() {
3149
- return FailureView.__super__.constructor.apply(this, arguments);
3355
+ _ref1 = FailureView.__super__.constructor.apply(this, arguments);
3356
+ return _ref1;
3150
3357
  }
3151
3358
 
3152
3359
  FailureView.prototype.build = function() {
3153
- var error, html, _i, _len, _ref;
3360
+ var error, html, _i, _len, _ref2;
3361
+
3154
3362
  FailureView.__super__.build.call(this, "spec");
3155
3363
  html = "<h1 class=\"teabag-clearfix\"><a href=\"" + this.spec.link + "\">" + this.spec.fullDescription + "</a></h1>";
3156
- _ref = this.spec.errors();
3157
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
3158
- error = _ref[_i];
3364
+ _ref2 = this.spec.errors();
3365
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
3366
+ error = _ref2[_i];
3159
3367
  html += "<div><strong>" + error.message + "</strong><br/>" + (this.htmlSafe(error.stack || "Stack trace unavailable")) + "</div>";
3160
3368
  }
3161
3369
  return this.el.innerHTML = html;
@@ -3166,7 +3374,6 @@
3166
3374
  })(Teabag.Reporters.HTML.FailureView);
3167
3375
 
3168
3376
  Teabag.Reporters.HTML.SuiteView = (function(_super) {
3169
-
3170
3377
  __extends(SuiteView, _super);
3171
3378
 
3172
3379
  function SuiteView(suite, reporter) {
@@ -3188,7 +3395,6 @@
3188
3395
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
3189
3396
 
3190
3397
  Teabag.Runner = (function(_super) {
3191
-
3192
3398
  __extends(Runner, _super);
3193
3399
 
3194
3400
  function Runner() {
@@ -3205,7 +3411,6 @@
3205
3411
  })(Teabag.Runner);
3206
3412
 
3207
3413
  Teabag.Spec = (function() {
3208
-
3209
3414
  function Spec(spec) {
3210
3415
  this.spec = spec;
3211
3416
  this.fullDescription = "" + this.spec.module + " " + this.spec.name;
@@ -3221,6 +3426,7 @@
3221
3426
 
3222
3427
  Spec.prototype.errors = function() {
3223
3428
  var item, _i, _len, _ref, _results;
3429
+
3224
3430
  if (!this.spec.failed) {
3225
3431
  return [];
3226
3432
  }
@@ -3248,6 +3454,7 @@
3248
3454
 
3249
3455
  Spec.prototype.result = function() {
3250
3456
  var status;
3457
+
3251
3458
  status = "failed";
3252
3459
  if (!this.spec.failed) {
3253
3460
  status = "passed";
@@ -3263,7 +3470,6 @@
3263
3470
  })();
3264
3471
 
3265
3472
  Teabag.Suite = (function() {
3266
-
3267
3473
  function Suite(suite) {
3268
3474
  this.suite = suite;
3269
3475
  this.fullDescription = this.suite.description;