qedproject 0.4.2 → 0.5.0

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.
Files changed (46) hide show
  1. data/bin/qedproject +5 -4
  2. data/lib/qedproject/libraries/ember.rb +1 -19
  3. data/lib/qedproject/libraries/jquery.rb +1 -1
  4. data/lib/qedproject/libraries/jquerymobile.rb +2 -2
  5. data/lib/qedproject/libraries/knockout.rb +1 -1
  6. data/lib/qedproject/project.rb +15 -2
  7. data/lib/qedproject/version.rb +1 -1
  8. data/templates/Gemfile +8 -0
  9. data/templates/assets.yml +1 -0
  10. data/templates/suite.html +3 -3
  11. data/vendor/backbone/VERSION +1 -1
  12. data/vendor/backbone/backbone-min.js +37 -33
  13. data/vendor/backbone/underscore-min.js +1 -32
  14. data/vendor/ember/VERSION +1 -0
  15. data/vendor/ember/ember-1.0.0-rc.1.js +26839 -0
  16. data/vendor/ember/handlebars-1.0.0-rc.3.js +2201 -0
  17. data/vendor/jasmine-jquery/jasmine-jquery.js +389 -144
  18. data/vendor/jasmine/lib/{jasmine-1.2.0 → jasmine-1.3.1}/jasmine-html.js +77 -12
  19. data/vendor/jasmine/lib/{jasmine-1.2.0 → jasmine-1.3.1}/jasmine.css +1 -0
  20. data/vendor/jasmine/lib/{jasmine-1.2.0 → jasmine-1.3.1}/jasmine.js +107 -36
  21. data/vendor/jquery/VERSION +1 -1
  22. data/vendor/jquery/jquery-1.9.1.min.js +5 -0
  23. data/vendor/jquerymobile/icons-18-black.png +0 -0
  24. data/vendor/jquerymobile/icons-18-white.png +0 -0
  25. data/vendor/jquerymobile/icons-36-black.png +0 -0
  26. data/vendor/jquerymobile/icons-36-white.png +0 -0
  27. data/vendor/jquerymobile/{jquery.mobile-1.2.0.css → jquery.mobile-1.3.0.css} +1399 -374
  28. data/vendor/jquerymobile/{jquery.mobile-1.2.0.js → jquery.mobile-1.3.0.js} +7201 -5271
  29. data/vendor/jquerymobile/templates/index.html +43 -44
  30. data/vendor/knockout/VERSION +1 -1
  31. data/vendor/knockout/knockout-2.2.1.js +85 -0
  32. data/vendor/mustache/VERSION +1 -1
  33. data/vendor/mustache/mustache.js +572 -286
  34. metadata +261 -240
  35. data/vendor/ember/app.js +0 -7
  36. data/vendor/ember/apple-touch-icon-114x114-precomposed.png +0 -0
  37. data/vendor/ember/apple-touch-icon-57x57-precomposed.png +0 -0
  38. data/vendor/ember/apple-touch-icon-72x72-precomposed.png +0 -0
  39. data/vendor/ember/apple-touch-icon-precomposed.png +0 -0
  40. data/vendor/ember/apple-touch-icon.png +0 -0
  41. data/vendor/ember/ember-0.9.js +0 -14745
  42. data/vendor/ember/favicon.ico +0 -0
  43. data/vendor/ember/style.css +0 -141
  44. data/vendor/ember/templates/index.html +0 -57
  45. data/vendor/jquery/jquery-1.8.2.min.js +0 -2
  46. data/vendor/knockout/knockout-2.0.0.js +0 -97
@@ -78,6 +78,7 @@ jasmine.HtmlReporter = function(_doc) {
78
78
 
79
79
  createReporterDom(runner.env.versionString());
80
80
  doc.body.appendChild(dom.reporter);
81
+ setExceptionHandling();
81
82
 
82
83
  reporterView = new jasmine.HtmlReporter.ReporterView(dom);
83
84
  reporterView.addSpecs(specs, self.specFilter);
@@ -131,7 +132,7 @@ jasmine.HtmlReporter = function(_doc) {
131
132
  }
132
133
 
133
134
  var paramMap = [];
134
- var params = doc.location.search.substring(1).split('&');
135
+ var params = jasmine.HtmlReporter.parameters(doc);
135
136
 
136
137
  for (var i = 0; i < params.length; i++) {
137
138
  var p = params[i].split('=');
@@ -151,14 +152,78 @@ jasmine.HtmlReporter = function(_doc) {
151
152
  self.createDom('span', { className: 'version' }, version)),
152
153
 
153
154
  dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
154
- dom.alert = self.createDom('div', {className: 'alert'}),
155
+ dom.alert = self.createDom('div', {className: 'alert'},
156
+ self.createDom('span', { className: 'exceptions' },
157
+ self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'),
158
+ self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))),
155
159
  dom.results = self.createDom('div', {className: 'results'},
156
160
  dom.summary = self.createDom('div', { className: 'summary' }),
157
161
  dom.details = self.createDom('div', { id: 'details' }))
158
162
  );
159
163
  }
164
+
165
+ function noTryCatch() {
166
+ return window.location.search.match(/catch=false/);
167
+ }
168
+
169
+ function searchWithCatch() {
170
+ var params = jasmine.HtmlReporter.parameters(window.document);
171
+ var removed = false;
172
+ var i = 0;
173
+
174
+ while (!removed && i < params.length) {
175
+ if (params[i].match(/catch=/)) {
176
+ params.splice(i, 1);
177
+ removed = true;
178
+ }
179
+ i++;
180
+ }
181
+ if (jasmine.CATCH_EXCEPTIONS) {
182
+ params.push("catch=false");
183
+ }
184
+
185
+ return params.join("&");
186
+ }
187
+
188
+ function setExceptionHandling() {
189
+ var chxCatch = document.getElementById('no_try_catch');
190
+
191
+ if (noTryCatch()) {
192
+ chxCatch.setAttribute('checked', true);
193
+ jasmine.CATCH_EXCEPTIONS = false;
194
+ }
195
+ chxCatch.onclick = function() {
196
+ window.location.search = searchWithCatch();
197
+ };
198
+ }
199
+ };
200
+ jasmine.HtmlReporter.parameters = function(doc) {
201
+ var paramStr = doc.location.search.substring(1);
202
+ var params = [];
203
+
204
+ if (paramStr.length > 0) {
205
+ params = paramStr.split('&');
206
+ }
207
+ return params;
208
+ }
209
+ jasmine.HtmlReporter.sectionLink = function(sectionName) {
210
+ var link = '?';
211
+ var params = [];
212
+
213
+ if (sectionName) {
214
+ params.push('spec=' + encodeURIComponent(sectionName));
215
+ }
216
+ if (!jasmine.CATCH_EXCEPTIONS) {
217
+ params.push("catch=false");
218
+ }
219
+ if (params.length > 0) {
220
+ link += params.join("&");
221
+ }
222
+
223
+ return link;
160
224
  };
161
- jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporter.ReporterView = function(dom) {
225
+ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);
226
+ jasmine.HtmlReporter.ReporterView = function(dom) {
162
227
  this.startedAt = new Date();
163
228
  this.runningSpecCount = 0;
164
229
  this.completeSpecCount = 0;
@@ -241,14 +306,14 @@ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporte
241
306
 
242
307
  // currently running UI
243
308
  if (isUndefined(this.runningAlert)) {
244
- this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"});
309
+ this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" });
245
310
  dom.alert.appendChild(this.runningAlert);
246
311
  }
247
312
  this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
248
313
 
249
314
  // skipped specs UI
250
315
  if (isUndefined(this.skippedAlert)) {
251
- this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"});
316
+ this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" });
252
317
  }
253
318
 
254
319
  this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
@@ -259,7 +324,7 @@ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporte
259
324
 
260
325
  // passing specs UI
261
326
  if (isUndefined(this.passedAlert)) {
262
- this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"});
327
+ this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" });
263
328
  }
264
329
  this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
265
330
 
@@ -331,11 +396,11 @@ jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
331
396
  this.dom.symbolSummary.appendChild(this.symbol);
332
397
 
333
398
  this.summary = this.createDom('div', { className: 'specSummary' },
334
- this.createDom('a', {
335
- className: 'description',
336
- href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
337
- title: this.spec.getFullName()
338
- }, this.spec.description)
399
+ this.createDom('a', {
400
+ className: 'description',
401
+ href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()),
402
+ title: this.spec.getFullName()
403
+ }, this.spec.description)
339
404
  );
340
405
 
341
406
  this.detail = this.createDom('div', { className: 'specDetail' },
@@ -406,7 +471,7 @@ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.Ht
406
471
  this.views = views;
407
472
 
408
473
  this.element = this.createDom('div', { className: 'suite' },
409
- this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description)
474
+ this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description)
410
475
  );
411
476
 
412
477
  this.appendToSummary(this.suite, this.element);
@@ -19,6 +19,7 @@ body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
19
19
  #HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
20
20
  #HTMLReporter .symbolSummary li.pending { line-height: 11px; }
21
21
  #HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
22
+ #HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }
22
23
  #HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
23
24
  #HTMLReporter .runningAlert { background-color: #666666; }
24
25
  #HTMLReporter .skippedAlert { background-color: #aaaaaa; }
@@ -1,4 +1,4 @@
1
- var isCommonJS = typeof window == "undefined";
1
+ var isCommonJS = typeof window == "undefined" && typeof exports == "object";
2
2
 
3
3
  /**
4
4
  * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
@@ -34,11 +34,23 @@ jasmine.VERBOSE = false;
34
34
  */
35
35
  jasmine.DEFAULT_UPDATE_INTERVAL = 250;
36
36
 
37
+ /**
38
+ * Maximum levels of nesting that will be included when an object is pretty-printed
39
+ */
40
+ jasmine.MAX_PRETTY_PRINT_DEPTH = 40;
41
+
37
42
  /**
38
43
  * Default timeout interval in milliseconds for waitsFor() blocks.
39
44
  */
40
45
  jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
41
46
 
47
+ /**
48
+ * By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite.
49
+ * Set to false to let the exception bubble up in the browser.
50
+ *
51
+ */
52
+ jasmine.CATCH_EXCEPTIONS = true;
53
+
42
54
  jasmine.getGlobal = function() {
43
55
  function getGlobal() {
44
56
  return this;
@@ -463,7 +475,7 @@ jasmine.log = function() {
463
475
  * @see jasmine.createSpy
464
476
  * @param obj
465
477
  * @param methodName
466
- * @returns a Jasmine spy that can be chained with all spy methods
478
+ * @return {jasmine.Spy} a Jasmine spy that can be chained with all spy methods
467
479
  */
468
480
  var spyOn = function(obj, methodName) {
469
481
  return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
@@ -508,6 +520,7 @@ if (isCommonJS) exports.xit = xit;
508
520
  * jasmine.Matchers functions.
509
521
  *
510
522
  * @param {Object} actual Actual value to test against and expected value
523
+ * @return {jasmine.Matchers}
511
524
  */
512
525
  var expect = function(actual) {
513
526
  return jasmine.getEnv().currentSpec.expect(actual);
@@ -867,6 +880,25 @@ jasmine.Env.prototype.xit = function(desc, func) {
867
880
  };
868
881
  };
869
882
 
883
+ jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) {
884
+ if (a.source != b.source)
885
+ mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/");
886
+
887
+ if (a.ignoreCase != b.ignoreCase)
888
+ mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier");
889
+
890
+ if (a.global != b.global)
891
+ mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier");
892
+
893
+ if (a.multiline != b.multiline)
894
+ mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier");
895
+
896
+ if (a.sticky != b.sticky)
897
+ mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier");
898
+
899
+ return (mismatchValues.length === 0);
900
+ };
901
+
870
902
  jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
871
903
  if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
872
904
  return true;
@@ -953,6 +985,10 @@ jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
953
985
  return (a == b);
954
986
  }
955
987
 
988
+ if (a instanceof RegExp && b instanceof RegExp) {
989
+ return this.compareRegExps_(a, b, mismatchKeys, mismatchValues);
990
+ }
991
+
956
992
  if (typeof a === "object" && typeof b === "object") {
957
993
  return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
958
994
  }
@@ -1019,11 +1055,16 @@ jasmine.Block = function(env, func, spec) {
1019
1055
  this.spec = spec;
1020
1056
  };
1021
1057
 
1022
- jasmine.Block.prototype.execute = function(onComplete) {
1023
- try {
1058
+ jasmine.Block.prototype.execute = function(onComplete) {
1059
+ if (!jasmine.CATCH_EXCEPTIONS) {
1024
1060
  this.func.apply(this.spec);
1025
- } catch (e) {
1026
- this.spec.fail(e);
1061
+ }
1062
+ else {
1063
+ try {
1064
+ this.func.apply(this.spec);
1065
+ } catch (e) {
1066
+ this.spec.fail(e);
1067
+ }
1027
1068
  }
1028
1069
  onComplete();
1029
1070
  };
@@ -1281,6 +1322,17 @@ jasmine.Matchers.prototype.toBeNull = function() {
1281
1322
  return (this.actual === null);
1282
1323
  };
1283
1324
 
1325
+ /**
1326
+ * Matcher that compares the actual to NaN.
1327
+ */
1328
+ jasmine.Matchers.prototype.toBeNaN = function() {
1329
+ this.message = function() {
1330
+ return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ];
1331
+ };
1332
+
1333
+ return (this.actual !== this.actual);
1334
+ };
1335
+
1284
1336
  /**
1285
1337
  * Matcher that boolean not-nots the actual.
1286
1338
  */
@@ -1358,18 +1410,14 @@ jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
1358
1410
  throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
1359
1411
  }
1360
1412
  this.message = function() {
1413
+ var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was.";
1414
+ var positiveMessage = "";
1361
1415
  if (this.actual.callCount === 0) {
1362
- // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
1363
- return [
1364
- "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
1365
- "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
1366
- ];
1416
+ positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.";
1367
1417
  } else {
1368
- return [
1369
- "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
1370
- "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
1371
- ];
1418
+ positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, '')
1372
1419
  }
1420
+ return [positiveMessage, invertedMessage];
1373
1421
  };
1374
1422
 
1375
1423
  return this.env.contains_(this.actual.argsForCall, expectedArgs);
@@ -1427,22 +1475,19 @@ jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
1427
1475
  * up to a given level of decimal precision (default 2).
1428
1476
  *
1429
1477
  * @param {Number} expected
1430
- * @param {Number} precision
1478
+ * @param {Number} precision, as number of decimal places
1431
1479
  */
1432
1480
  jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) {
1433
1481
  if (!(precision === 0)) {
1434
1482
  precision = precision || 2;
1435
1483
  }
1436
- var multiplier = Math.pow(10, precision);
1437
- var actual = Math.round(this.actual * multiplier);
1438
- expected = Math.round(expected * multiplier);
1439
- return expected == actual;
1484
+ return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2);
1440
1485
  };
1441
1486
 
1442
1487
  /**
1443
1488
  * Matcher that checks that the expected exception was thrown by the actual.
1444
1489
  *
1445
- * @param {String} expected
1490
+ * @param {String} [expected]
1446
1491
  */
1447
1492
  jasmine.Matchers.prototype.toThrow = function(expected) {
1448
1493
  var result = false;
@@ -1840,10 +1885,6 @@ jasmine.PrettyPrinter = function() {
1840
1885
  * @param value
1841
1886
  */
1842
1887
  jasmine.PrettyPrinter.prototype.format = function(value) {
1843
- if (this.ppNestLevel_ > 40) {
1844
- throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
1845
- }
1846
-
1847
1888
  this.ppNestLevel_++;
1848
1889
  try {
1849
1890
  if (value === jasmine.undefined) {
@@ -1886,6 +1927,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) {
1886
1927
 
1887
1928
  jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
1888
1929
  for (var property in obj) {
1930
+ if (!obj.hasOwnProperty(property)) continue;
1889
1931
  if (property == '__Jasmine_been_here_before__') continue;
1890
1932
  fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined &&
1891
1933
  obj.__lookupGetter__(property) !== null) : false);
@@ -1913,6 +1955,11 @@ jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
1913
1955
  };
1914
1956
 
1915
1957
  jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
1958
+ if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) {
1959
+ this.append("Array");
1960
+ return;
1961
+ }
1962
+
1916
1963
  this.append('[ ');
1917
1964
  for (var i = 0; i < array.length; i++) {
1918
1965
  if (i > 0) {
@@ -1924,6 +1971,11 @@ jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
1924
1971
  };
1925
1972
 
1926
1973
  jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
1974
+ if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) {
1975
+ this.append("Object");
1976
+ return;
1977
+ }
1978
+
1927
1979
  var self = this;
1928
1980
  this.append('{ ');
1929
1981
  var first = true;
@@ -1952,6 +2004,10 @@ jasmine.StringPrettyPrinter.prototype.append = function(value) {
1952
2004
  };
1953
2005
  jasmine.Queue = function(env) {
1954
2006
  this.env = env;
2007
+
2008
+ // parallel to blocks. each true value in this array means the block will
2009
+ // get executed even if we abort
2010
+ this.ensured = [];
1955
2011
  this.blocks = [];
1956
2012
  this.running = false;
1957
2013
  this.index = 0;
@@ -1959,15 +2015,30 @@ jasmine.Queue = function(env) {
1959
2015
  this.abort = false;
1960
2016
  };
1961
2017
 
1962
- jasmine.Queue.prototype.addBefore = function(block) {
2018
+ jasmine.Queue.prototype.addBefore = function(block, ensure) {
2019
+ if (ensure === jasmine.undefined) {
2020
+ ensure = false;
2021
+ }
2022
+
1963
2023
  this.blocks.unshift(block);
2024
+ this.ensured.unshift(ensure);
1964
2025
  };
1965
2026
 
1966
- jasmine.Queue.prototype.add = function(block) {
2027
+ jasmine.Queue.prototype.add = function(block, ensure) {
2028
+ if (ensure === jasmine.undefined) {
2029
+ ensure = false;
2030
+ }
2031
+
1967
2032
  this.blocks.push(block);
2033
+ this.ensured.push(ensure);
1968
2034
  };
1969
2035
 
1970
- jasmine.Queue.prototype.insertNext = function(block) {
2036
+ jasmine.Queue.prototype.insertNext = function(block, ensure) {
2037
+ if (ensure === jasmine.undefined) {
2038
+ ensure = false;
2039
+ }
2040
+
2041
+ this.ensured.splice((this.index + this.offset + 1), 0, ensure);
1971
2042
  this.blocks.splice((this.index + this.offset + 1), 0, block);
1972
2043
  this.offset++;
1973
2044
  };
@@ -1991,7 +2062,7 @@ jasmine.Queue.prototype.next_ = function() {
1991
2062
  while (goAgain) {
1992
2063
  goAgain = false;
1993
2064
 
1994
- if (self.index < self.blocks.length && !this.abort) {
2065
+ if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) {
1995
2066
  var calledSynchronously = true;
1996
2067
  var completedSynchronously = false;
1997
2068
 
@@ -2282,7 +2353,7 @@ jasmine.Spec.prototype.finish = function(onComplete) {
2282
2353
 
2283
2354
  jasmine.Spec.prototype.after = function(doAfter) {
2284
2355
  if (this.queue.isRunning()) {
2285
- this.queue.add(new jasmine.Block(this.env, doAfter, this));
2356
+ this.queue.add(new jasmine.Block(this.env, doAfter, this), true);
2286
2357
  } else {
2287
2358
  this.afterCallbacks.unshift(doAfter);
2288
2359
  }
@@ -2320,15 +2391,15 @@ jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
2320
2391
  this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
2321
2392
  }
2322
2393
  for (i = 0; i < this.afterCallbacks.length; i++) {
2323
- this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
2394
+ this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this), true);
2324
2395
  }
2325
2396
  for (suite = this.suite; suite; suite = suite.parentSuite) {
2326
2397
  for (i = 0; i < suite.after_.length; i++) {
2327
- this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
2398
+ this.queue.add(new jasmine.Block(this.env, suite.after_[i], this), true);
2328
2399
  }
2329
2400
  }
2330
2401
  for (i = 0; i < runner.after_.length; i++) {
2331
- this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
2402
+ this.queue.add(new jasmine.Block(this.env, runner.after_[i], this), true);
2332
2403
  }
2333
2404
  };
2334
2405
 
@@ -2523,7 +2594,7 @@ jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
2523
2594
 
2524
2595
  jasmine.version_= {
2525
2596
  "major": 1,
2526
- "minor": 2,
2527
- "build": 0,
2528
- "revision": 1337005947
2597
+ "minor": 3,
2598
+ "build": 1,
2599
+ "revision": 1354556913
2529
2600
  };