qunit-rails 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 59a108307b5fc8af1eb7e680fa1a62472018caf7
4
+ data.tar.gz: c23b8db5646703f3e72327c1a62baf2d6960d113
5
+ SHA512:
6
+ metadata.gz: ab29f53dedacf6efb20ee9671a6169abebbdf513b31b76a765ea93d8ce1df6710b35cdc8011f36f4c1c252d55bb33c55256811020f221d584d704321b6640c17
7
+ data.tar.gz: ae022fd3686219d3c41b4d95a858fd1da92e97e2673defdc91bcfbeaec8a5becbd8257972d0092a3d7c140038350b2ae008fbd01dfa68f737e3640bf8f794eaf
data/README.md CHANGED
@@ -38,7 +38,7 @@ If you prefer *CoffeeScript*, you can run:
38
38
 
39
39
  rails g qunit:install -c
40
40
 
41
- This will generate a `test_helper.coffe` file instead of `test_helper.js`.
41
+ This will generate a `test_helper.coffee` file instead of `test_helper.js`.
42
42
 
43
43
  ## Usage
44
44
 
data/qunit-rails.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'qunit-rails'
3
- gem.version = '0.0.3'
3
+ gem.version = '0.0.4'
4
4
 
5
5
  gem.authors = ['Francesco Rodriguez']
6
6
  gem.email = ['lrodriguezsanc@gmail.com']
@@ -1,11 +1,11 @@
1
1
  /**
2
- * QUnit v1.11.0 - A JavaScript Unit Testing Framework
2
+ * QUnit v1.12.0 - A JavaScript Unit Testing Framework
3
3
  *
4
4
  * http://qunitjs.com
5
5
  *
6
- * Copyright 2012 jQuery Foundation and other contributors
6
+ * Copyright 2013 jQuery Foundation and other contributors
7
7
  * Released under the MIT license.
8
- * http://jquery.org/license
8
+ * https://jquery.org/license/
9
9
  */
10
10
 
11
11
  (function( window ) {
@@ -20,6 +20,7 @@ var QUnit,
20
20
  hasOwn = Object.prototype.hasOwnProperty,
21
21
  // Keep a local reference to Date (GH-283)
22
22
  Date = window.Date,
23
+ setTimeout = window.setTimeout,
23
24
  defined = {
24
25
  setTimeout: typeof window.setTimeout !== "undefined",
25
26
  sessionStorage: (function() {
@@ -115,8 +116,16 @@ Test.prototype = {
115
116
  }
116
117
  },
117
118
  setup: function() {
118
- if ( this.module !== config.previousModule ) {
119
- if ( config.previousModule ) {
119
+ if (
120
+ // Emit moduleStart when we're switching from one module to another
121
+ this.module !== config.previousModule ||
122
+ // They could be equal (both undefined) but if the previousModule property doesn't
123
+ // yet exist it means this is the first test in a suite that isn't wrapped in a
124
+ // module, in which case we'll just emit a moduleStart event for 'undefined'.
125
+ // Without this, reporters can get testStart before moduleStart which is a problem.
126
+ !hasOwn.call( config, "previousModule" )
127
+ ) {
128
+ if ( hasOwn.call( config, "previousModule" ) ) {
120
129
  runLoggingCallbacks( "moduleDone", QUnit, {
121
130
  name: config.previousModule,
122
131
  failed: config.moduleStats.bad,
@@ -129,10 +138,6 @@ Test.prototype = {
129
138
  runLoggingCallbacks( "moduleStart", QUnit, {
130
139
  name: this.module
131
140
  });
132
- } else if ( config.autorun ) {
133
- runLoggingCallbacks( "moduleStart", QUnit, {
134
- name: this.module
135
- });
136
141
  }
137
142
 
138
143
  config.current = this;
@@ -148,19 +153,27 @@ Test.prototype = {
148
153
  module: this.module
149
154
  });
150
155
 
151
- // allow utility functions to access the current test environment
152
- // TODO why??
156
+ /*jshint camelcase:false */
157
+
158
+
159
+ /**
160
+ * Expose the current test environment.
161
+ *
162
+ * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
163
+ */
153
164
  QUnit.current_testEnvironment = this.testEnvironment;
154
165
 
166
+ /*jshint camelcase:true */
167
+
155
168
  if ( !config.pollution ) {
156
169
  saveGlobal();
157
170
  }
158
171
  if ( config.notrycatch ) {
159
- this.testEnvironment.setup.call( this.testEnvironment );
172
+ this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
160
173
  return;
161
174
  }
162
175
  try {
163
- this.testEnvironment.setup.call( this.testEnvironment );
176
+ this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
164
177
  } catch( e ) {
165
178
  QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
166
179
  }
@@ -208,11 +221,11 @@ Test.prototype = {
208
221
  if ( typeof this.callbackRuntime === "undefined" ) {
209
222
  this.callbackRuntime = +new Date() - this.callbackStarted;
210
223
  }
211
- this.testEnvironment.teardown.call( this.testEnvironment );
224
+ this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
212
225
  return;
213
226
  } else {
214
227
  try {
215
- this.testEnvironment.teardown.call( this.testEnvironment );
228
+ this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
216
229
  } catch( e ) {
217
230
  QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
218
231
  }
@@ -419,7 +432,7 @@ QUnit = {
419
432
  test.queue();
420
433
  },
421
434
 
422
- // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
435
+ // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
423
436
  expect: function( asserts ) {
424
437
  if (arguments.length === 1) {
425
438
  config.current.expected = asserts;
@@ -454,7 +467,7 @@ QUnit = {
454
467
  }
455
468
  // A slight delay, to avoid any current callbacks
456
469
  if ( defined.setTimeout ) {
457
- window.setTimeout(function() {
470
+ setTimeout(function() {
458
471
  if ( config.semaphore > 0 ) {
459
472
  return;
460
473
  }
@@ -477,7 +490,7 @@ QUnit = {
477
490
 
478
491
  if ( config.testTimeout && defined.setTimeout ) {
479
492
  clearTimeout( config.timeout );
480
- config.timeout = window.setTimeout(function() {
493
+ config.timeout = setTimeout(function() {
481
494
  QUnit.ok( false, "Test timed out" );
482
495
  config.semaphore = 1;
483
496
  QUnit.start();
@@ -487,7 +500,7 @@ QUnit = {
487
500
  };
488
501
 
489
502
  // `assert` initialized at top of scope
490
- // Asssert helpers
503
+ // Assert helpers
491
504
  // All of these must either call QUnit.push() or manually do:
492
505
  // - runLoggingCallbacks( "log", .. );
493
506
  // - config.current.assertions.push({ .. });
@@ -505,6 +518,7 @@ assert = {
505
518
  throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
506
519
  }
507
520
  result = !!result;
521
+ msg = msg || (result ? "okay" : "failed" );
508
522
 
509
523
  var source,
510
524
  details = {
@@ -514,8 +528,7 @@ assert = {
514
528
  message: msg
515
529
  };
516
530
 
517
- msg = escapeText( msg || (result ? "okay" : "failed" ) );
518
- msg = "<span class='test-message'>" + msg + "</span>";
531
+ msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
519
532
 
520
533
  if ( !result ) {
521
534
  source = sourceFromStacktrace( 2 );
@@ -642,13 +655,13 @@ assert = {
642
655
 
643
656
  QUnit.push( ok, actual, expectedOutput, message );
644
657
  } else {
645
- QUnit.pushFailure( message, null, 'No exception was thrown.' );
658
+ QUnit.pushFailure( message, null, "No exception was thrown." );
646
659
  }
647
660
  }
648
661
  };
649
662
 
650
663
  /**
651
- * @deprecate since 1.8.0
664
+ * @deprecated since 1.8.0
652
665
  * Kept assertion helpers in root for backwards compatibility.
653
666
  */
654
667
  extend( QUnit, assert );
@@ -737,7 +750,7 @@ config = {
737
750
  // Export global variables, unless an 'exports' object exists,
738
751
  // in that case we assume we're in CommonJS (dealt with on the bottom of the script)
739
752
  if ( typeof exports === "undefined" ) {
740
- extend( window, QUnit );
753
+ extend( window, QUnit.constructor.prototype );
741
754
 
742
755
  // Expose QUnit object
743
756
  window.QUnit = QUnit;
@@ -836,6 +849,11 @@ extend( QUnit, {
836
849
  },
837
850
 
838
851
  // Resets the test setup. Useful for tests that modify the DOM.
852
+ /*
853
+ DEPRECATED: Use multiple tests instead of resetting inside a test.
854
+ Use testStart or testDone for custom cleanup.
855
+ This method will throw an error in 2.0, and will be removed in 2.1
856
+ */
839
857
  reset: function() {
840
858
  var fixture = id( "qunit-fixture" );
841
859
  if ( fixture ) {
@@ -985,11 +1003,10 @@ extend( QUnit, {
985
1003
  querystring = "?";
986
1004
 
987
1005
  for ( key in params ) {
988
- if ( !hasOwn.call( params, key ) ) {
989
- continue;
1006
+ if ( hasOwn.call( params, key ) ) {
1007
+ querystring += encodeURIComponent( key ) + "=" +
1008
+ encodeURIComponent( params[ key ] ) + "&";
990
1009
  }
991
- querystring += encodeURIComponent( key ) + "=" +
992
- encodeURIComponent( params[ key ] ) + "&";
993
1010
  }
994
1011
  return window.location.protocol + "//" + window.location.host +
995
1012
  window.location.pathname + querystring.slice( 0, -1 );
@@ -997,7 +1014,10 @@ extend( QUnit, {
997
1014
 
998
1015
  extend: extend,
999
1016
  id: id,
1000
- addEvent: addEvent
1017
+ addEvent: addEvent,
1018
+ addClass: addClass,
1019
+ hasClass: hasClass,
1020
+ removeClass: removeClass
1001
1021
  // load, equiv, jsDump, diff: Attached later
1002
1022
  });
1003
1023
 
@@ -1044,6 +1064,7 @@ QUnit.load = function() {
1044
1064
  var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
1045
1065
  urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
1046
1066
  numModules = 0,
1067
+ moduleNames = [],
1047
1068
  moduleFilterHtml = "",
1048
1069
  urlConfigHtml = "",
1049
1070
  oldconfig = extend( {}, config );
@@ -1072,18 +1093,24 @@ QUnit.load = function() {
1072
1093
  "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
1073
1094
  "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
1074
1095
  }
1075
-
1096
+ for ( i in config.modules ) {
1097
+ if ( config.modules.hasOwnProperty( i ) ) {
1098
+ moduleNames.push(i);
1099
+ }
1100
+ }
1101
+ numModules = moduleNames.length;
1102
+ moduleNames.sort( function( a, b ) {
1103
+ return a.localeCompare( b );
1104
+ });
1076
1105
  moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
1077
1106
  ( config.module === undefined ? "selected='selected'" : "" ) +
1078
1107
  ">< All Modules ></option>";
1079
1108
 
1080
- for ( i in config.modules ) {
1081
- if ( config.modules.hasOwnProperty( i ) ) {
1082
- numModules += 1;
1083
- moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(i) ) + "' " +
1084
- ( config.module === i ? "selected='selected'" : "" ) +
1085
- ">" + escapeText(i) + "</option>";
1086
- }
1109
+
1110
+ for ( i = 0; i < numModules; i++) {
1111
+ moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
1112
+ ( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
1113
+ ">" + escapeText(moduleNames[i]) + "</option>";
1087
1114
  }
1088
1115
  moduleFilterHtml += "</select>";
1089
1116
 
@@ -1137,7 +1164,7 @@ QUnit.load = function() {
1137
1164
  // `label` initialized at top of scope
1138
1165
  label = document.createElement( "label" );
1139
1166
  label.setAttribute( "for", "qunit-filter-pass" );
1140
- label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." );
1167
+ label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
1141
1168
  label.innerHTML = "Hide passed tests";
1142
1169
  toolbar.appendChild( label );
1143
1170
 
@@ -1157,14 +1184,19 @@ QUnit.load = function() {
1157
1184
  toolbar.appendChild( urlConfigCheckboxesContainer );
1158
1185
 
1159
1186
  if (numModules > 1) {
1160
- moduleFilter = document.createElement( 'span' );
1161
- moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
1187
+ moduleFilter = document.createElement( "span" );
1188
+ moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
1162
1189
  moduleFilter.innerHTML = moduleFilterHtml;
1163
1190
  addEvent( moduleFilter.lastChild, "change", function() {
1164
1191
  var selectBox = moduleFilter.getElementsByTagName("select")[0],
1165
1192
  selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
1166
1193
 
1167
- window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
1194
+ window.location = QUnit.url({
1195
+ module: ( selectedModule === "" ) ? undefined : selectedModule,
1196
+ // Remove any existing filters
1197
+ filter: undefined,
1198
+ testNumber: undefined
1199
+ });
1168
1200
  });
1169
1201
  toolbar.appendChild(moduleFilter);
1170
1202
  }
@@ -1188,7 +1220,7 @@ addEvent( window, "load", QUnit.load );
1188
1220
  onErrorFnPrev = window.onerror;
1189
1221
 
1190
1222
  // Cover uncaught exceptions
1191
- // Returning true will surpress the default browser handler,
1223
+ // Returning true will suppress the default browser handler,
1192
1224
  // returning false will let it run.
1193
1225
  window.onerror = function ( error, filePath, linerNr ) {
1194
1226
  var ret = false;
@@ -1197,7 +1229,7 @@ window.onerror = function ( error, filePath, linerNr ) {
1197
1229
  }
1198
1230
 
1199
1231
  // Treat return value as window.onerror itself does,
1200
- // Only do our handling if not surpressed.
1232
+ // Only do our handling if not suppressed.
1201
1233
  if ( ret !== true ) {
1202
1234
  if ( QUnit.config.current ) {
1203
1235
  if ( QUnit.config.current.ignoreGlobalErrors ) {
@@ -1227,6 +1259,7 @@ function done() {
1227
1259
  total: config.moduleStats.all
1228
1260
  });
1229
1261
  }
1262
+ delete config.previousModule;
1230
1263
 
1231
1264
  var i, key,
1232
1265
  banner = id( "qunit-banner" ),
@@ -1386,16 +1419,16 @@ function escapeText( s ) {
1386
1419
  // Both single quotes and double quotes (for attributes)
1387
1420
  return s.replace( /['"<>&]/g, function( s ) {
1388
1421
  switch( s ) {
1389
- case '\'':
1390
- return '&#039;';
1391
- case '"':
1392
- return '&quot;';
1393
- case '<':
1394
- return '&lt;';
1395
- case '>':
1396
- return '&gt;';
1397
- case '&':
1398
- return '&amp;';
1422
+ case "'":
1423
+ return "&#039;";
1424
+ case "\"":
1425
+ return "&quot;";
1426
+ case "<":
1427
+ return "&lt;";
1428
+ case ">":
1429
+ return "&gt;";
1430
+ case "&":
1431
+ return "&amp;";
1399
1432
  }
1400
1433
  });
1401
1434
  }
@@ -1419,7 +1452,7 @@ function process( last ) {
1419
1452
  if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
1420
1453
  config.queue.shift()();
1421
1454
  } else {
1422
- window.setTimeout( next, 13 );
1455
+ setTimeout( next, 13 );
1423
1456
  break;
1424
1457
  }
1425
1458
  }
@@ -1434,11 +1467,13 @@ function saveGlobal() {
1434
1467
 
1435
1468
  if ( config.noglobals ) {
1436
1469
  for ( var key in window ) {
1437
- // in Opera sometimes DOM element ids show up here, ignore them
1438
- if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {
1439
- continue;
1470
+ if ( hasOwn.call( window, key ) ) {
1471
+ // in Opera sometimes DOM element ids show up here, ignore them
1472
+ if ( /^qunit-test-output/.test( key ) ) {
1473
+ continue;
1474
+ }
1475
+ config.pollution.push( key );
1440
1476
  }
1441
- config.pollution.push( key );
1442
1477
  }
1443
1478
  }
1444
1479
  }
@@ -1480,12 +1515,15 @@ function diff( a, b ) {
1480
1515
 
1481
1516
  function extend( a, b ) {
1482
1517
  for ( var prop in b ) {
1483
- if ( b[ prop ] === undefined ) {
1484
- delete a[ prop ];
1485
-
1486
- // Avoid "Member not found" error in IE8 caused by setting window.constructor
1487
- } else if ( prop !== "constructor" || a !== window ) {
1488
- a[ prop ] = b[ prop ];
1518
+ if ( hasOwn.call( b, prop ) ) {
1519
+ // Avoid "Member not found" error in IE8 caused by messing with window.constructor
1520
+ if ( !( prop === "constructor" && a === window ) ) {
1521
+ if ( b[ prop ] === undefined ) {
1522
+ delete a[ prop ];
1523
+ } else {
1524
+ a[ prop ] = b[ prop ];
1525
+ }
1526
+ }
1489
1527
  }
1490
1528
  }
1491
1529
 
@@ -1535,8 +1573,8 @@ function removeClass( elem, name ) {
1535
1573
  while ( set.indexOf(" " + name + " ") > -1 ) {
1536
1574
  set = set.replace(" " + name + " " , " ");
1537
1575
  }
1538
- // If possible, trim it for prettiness, but not neccecarily
1539
- elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );
1576
+ // If possible, trim it for prettiness, but not necessarily
1577
+ elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
1540
1578
  }
1541
1579
 
1542
1580
  function id( name ) {
@@ -1585,8 +1623,10 @@ QUnit.equiv = (function() {
1585
1623
  callers = [],
1586
1624
  // stack to avoiding loops from circular referencing
1587
1625
  parents = [],
1626
+ parentsB = [],
1588
1627
 
1589
1628
  getProto = Object.getPrototypeOf || function ( obj ) {
1629
+ /*jshint camelcase:false */
1590
1630
  return obj.__proto__;
1591
1631
  },
1592
1632
  callbacks = (function () {
@@ -1595,7 +1635,7 @@ QUnit.equiv = (function() {
1595
1635
  function useStrictEquality( b, a ) {
1596
1636
  /*jshint eqeqeq:false */
1597
1637
  if ( b instanceof a.constructor || a instanceof b.constructor ) {
1598
- // to catch short annotaion VS 'new' annotation of a
1638
+ // to catch short annotation VS 'new' annotation of a
1599
1639
  // declaration
1600
1640
  // e.g. var i = 1;
1601
1641
  // var j = new Number(1);
@@ -1624,7 +1664,7 @@ QUnit.equiv = (function() {
1624
1664
  return QUnit.objectType( b ) === "regexp" &&
1625
1665
  // the regex itself
1626
1666
  a.source === b.source &&
1627
- // and its modifers
1667
+ // and its modifiers
1628
1668
  a.global === b.global &&
1629
1669
  // (gmi) ...
1630
1670
  a.ignoreCase === b.ignoreCase &&
@@ -1641,7 +1681,7 @@ QUnit.equiv = (function() {
1641
1681
  },
1642
1682
 
1643
1683
  "array": function( b, a ) {
1644
- var i, j, len, loop;
1684
+ var i, j, len, loop, aCircular, bCircular;
1645
1685
 
1646
1686
  // b could be an object literal here
1647
1687
  if ( QUnit.objectType( b ) !== "array" ) {
@@ -1656,24 +1696,36 @@ QUnit.equiv = (function() {
1656
1696
 
1657
1697
  // track reference to avoid circular references
1658
1698
  parents.push( a );
1699
+ parentsB.push( b );
1659
1700
  for ( i = 0; i < len; i++ ) {
1660
1701
  loop = false;
1661
1702
  for ( j = 0; j < parents.length; j++ ) {
1662
- if ( parents[j] === a[i] ) {
1663
- loop = true;// dont rewalk array
1703
+ aCircular = parents[j] === a[i];
1704
+ bCircular = parentsB[j] === b[i];
1705
+ if ( aCircular || bCircular ) {
1706
+ if ( a[i] === b[i] || aCircular && bCircular ) {
1707
+ loop = true;
1708
+ } else {
1709
+ parents.pop();
1710
+ parentsB.pop();
1711
+ return false;
1712
+ }
1664
1713
  }
1665
1714
  }
1666
1715
  if ( !loop && !innerEquiv(a[i], b[i]) ) {
1667
1716
  parents.pop();
1717
+ parentsB.pop();
1668
1718
  return false;
1669
1719
  }
1670
1720
  }
1671
1721
  parents.pop();
1722
+ parentsB.pop();
1672
1723
  return true;
1673
1724
  },
1674
1725
 
1675
1726
  "object": function( b, a ) {
1676
- var i, j, loop,
1727
+ /*jshint forin:false */
1728
+ var i, j, loop, aCircular, bCircular,
1677
1729
  // Default to true
1678
1730
  eq = true,
1679
1731
  aProperties = [],
@@ -1692,28 +1744,36 @@ QUnit.equiv = (function() {
1692
1744
 
1693
1745
  // stack constructor before traversing properties
1694
1746
  callers.push( a.constructor );
1747
+
1695
1748
  // track reference to avoid circular references
1696
1749
  parents.push( a );
1750
+ parentsB.push( b );
1697
1751
 
1698
- for ( i in a ) { // be strict: don't ensures hasOwnProperty
1699
- // and go deep
1752
+ // be strict: don't ensure hasOwnProperty and go deep
1753
+ for ( i in a ) {
1700
1754
  loop = false;
1701
1755
  for ( j = 0; j < parents.length; j++ ) {
1702
- if ( parents[j] === a[i] ) {
1703
- // don't go down the same path twice
1704
- loop = true;
1756
+ aCircular = parents[j] === a[i];
1757
+ bCircular = parentsB[j] === b[i];
1758
+ if ( aCircular || bCircular ) {
1759
+ if ( a[i] === b[i] || aCircular && bCircular ) {
1760
+ loop = true;
1761
+ } else {
1762
+ eq = false;
1763
+ break;
1764
+ }
1705
1765
  }
1706
1766
  }
1707
- aProperties.push(i); // collect a's properties
1708
-
1709
- if (!loop && !innerEquiv( a[i], b[i] ) ) {
1767
+ aProperties.push(i);
1768
+ if ( !loop && !innerEquiv(a[i], b[i]) ) {
1710
1769
  eq = false;
1711
1770
  break;
1712
1771
  }
1713
1772
  }
1714
1773
 
1715
- callers.pop(); // unstack, we are done
1716
1774
  parents.pop();
1775
+ parentsB.pop();
1776
+ callers.pop(); // unstack, we are done
1717
1777
 
1718
1778
  for ( i in b ) {
1719
1779
  bProperties.push( i ); // collect b's properties
@@ -1743,7 +1803,7 @@ QUnit.equiv = (function() {
1743
1803
  }
1744
1804
 
1745
1805
  // apply transition with (1..n) arguments
1746
- }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );
1806
+ }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
1747
1807
  };
1748
1808
 
1749
1809
  return innerEquiv;
@@ -1761,7 +1821,7 @@ QUnit.equiv = (function() {
1761
1821
  */
1762
1822
  QUnit.jsDump = (function() {
1763
1823
  function quote( str ) {
1764
- return '"' + str.toString().replace( /"/g, '\\"' ) + '"';
1824
+ return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
1765
1825
  }
1766
1826
  function literal( o ) {
1767
1827
  return o + "";
@@ -1854,13 +1914,13 @@ QUnit.jsDump = (function() {
1854
1914
  if ( this.HTML ) {
1855
1915
  chr = chr.replace( /\t/g, " " ).replace( / /g, "&nbsp;" );
1856
1916
  }
1857
- return new Array( this._depth_ + (extra||0) ).join(chr);
1917
+ return new Array( this.depth + ( extra || 0 ) ).join(chr);
1858
1918
  },
1859
1919
  up: function( a ) {
1860
- this._depth_ += a || 1;
1920
+ this.depth += a || 1;
1861
1921
  },
1862
1922
  down: function( a ) {
1863
- this._depth_ -= a || 1;
1923
+ this.depth -= a || 1;
1864
1924
  },
1865
1925
  setParser: function( name, parser ) {
1866
1926
  this.parsers[name] = parser;
@@ -1870,7 +1930,7 @@ QUnit.jsDump = (function() {
1870
1930
  literal: literal,
1871
1931
  join: join,
1872
1932
  //
1873
- _depth_: 1,
1933
+ depth: 1,
1874
1934
  // This is the list of parsers, to modify them, use jsDump.setParser
1875
1935
  parsers: {
1876
1936
  window: "[Window]",
@@ -1898,6 +1958,7 @@ QUnit.jsDump = (function() {
1898
1958
  nodelist: array,
1899
1959
  "arguments": array,
1900
1960
  object: function( map, stack ) {
1961
+ /*jshint forin:false */
1901
1962
  var ret = [ ], keys, key, val, i;
1902
1963
  QUnit.jsDump.up();
1903
1964
  keys = [];
@@ -2036,18 +2097,17 @@ QUnit.diff = (function() {
2036
2097
  }
2037
2098
 
2038
2099
  for ( i in ns ) {
2039
- if ( !hasOwn.call( ns, i ) ) {
2040
- continue;
2041
- }
2042
- if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
2043
- n[ ns[i].rows[0] ] = {
2044
- text: n[ ns[i].rows[0] ],
2045
- row: os[i].rows[0]
2046
- };
2047
- o[ os[i].rows[0] ] = {
2048
- text: o[ os[i].rows[0] ],
2049
- row: ns[i].rows[0]
2050
- };
2100
+ if ( hasOwn.call( ns, i ) ) {
2101
+ if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
2102
+ n[ ns[i].rows[0] ] = {
2103
+ text: n[ ns[i].rows[0] ],
2104
+ row: os[i].rows[0]
2105
+ };
2106
+ o[ os[i].rows[0] ] = {
2107
+ text: o[ os[i].rows[0] ],
2108
+ row: ns[i].rows[0]
2109
+ };
2110
+ }
2051
2111
  }
2052
2112
  }
2053
2113
 
@@ -2143,9 +2203,9 @@ QUnit.diff = (function() {
2143
2203
  };
2144
2204
  }());
2145
2205
 
2146
- // for CommonJS enviroments, export everything
2206
+ // for CommonJS environments, export everything
2147
2207
  if ( typeof exports !== "undefined" ) {
2148
- extend( exports, QUnit );
2208
+ extend( exports, QUnit.constructor.prototype );
2149
2209
  }
2150
2210
 
2151
2211
  // get at whatever the global object is, like window in browsers
@@ -1,5 +1,5 @@
1
1
  /**
2
- * QUnit v1.11.0 - A JavaScript Unit Testing Framework
2
+ * QUnit v1.12.0 - A JavaScript Unit Testing Framework
3
3
  *
4
4
  * http://qunitjs.com
5
5
  *
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qunit-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.0.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Francesco Rodriguez
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-28 00:00:00.000000000 Z
11
+ date: 2013-09-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: railties
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 3.2.3
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: 3.2.3
30
27
  description: Qunit for Rails 3.2+
@@ -59,27 +56,26 @@ files:
59
56
  - vendor/assets/stylesheets/qunit.css
60
57
  homepage: https://github.com/frodsan/qunit-rails
61
58
  licenses: []
59
+ metadata: {}
62
60
  post_install_message:
63
61
  rdoc_options:
64
62
  - --charset=UTF-8
65
63
  require_paths:
66
64
  - lib
67
65
  required_ruby_version: !ruby/object:Gem::Requirement
68
- none: false
69
66
  requirements:
70
- - - ! '>='
67
+ - - '>='
71
68
  - !ruby/object:Gem::Version
72
69
  version: 1.9.2
73
70
  required_rubygems_version: !ruby/object:Gem::Requirement
74
- none: false
75
71
  requirements:
76
- - - ! '>='
72
+ - - '>='
77
73
  - !ruby/object:Gem::Version
78
74
  version: '0'
79
75
  requirements: []
80
76
  rubyforge_project:
81
- rubygems_version: 1.8.23
77
+ rubygems_version: 2.0.3
82
78
  signing_key:
83
- specification_version: 3
79
+ specification_version: 4
84
80
  summary: Qunit for Rails 3.2+
85
81
  test_files: []