jasmine-core 2.0.0.rc5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 64fc08a60b942909e10f43cd7568374e95e0ccda
4
+ data.tar.gz: f6cc9a58eeb24163496fb22903321b73d97cd3fd
5
+ SHA512:
6
+ metadata.gz: 24d62c7f7aea8cc8b640f562a77ba219d25b203e587df68b2b29245d22e98e0475ca27fbf2f994f031b89b35b4c8e08c1ba402f1dc8eb81281c90ee27a909daf
7
+ data.tar.gz: d2ee9eacc009ce20f427baf2a13d61b69abb814d1a40788986d393322ccad3347d2f00b57c5c2feb57ccb88231fa6d5e49049aa8c99c1268566a798ddb9aa60a
@@ -50,10 +50,10 @@ getJasmineRequireObj().ConsoleReporter = function() {
50
50
  failedSpecs = [],
51
51
  pendingCount,
52
52
  ansi = {
53
- green: '\033[32m',
54
- red: '\033[31m',
55
- yellow: '\033[33m',
56
- none: '\033[0m'
53
+ green: '\x1B[32m',
54
+ red: '\x1B[31m',
55
+ yellow: '\x1B[33m',
56
+ none: '\x1B[0m'
57
57
  };
58
58
 
59
59
  this.jasmineStarted = function() {
@@ -1,15 +1,15 @@
1
1
  beforeEach(function () {
2
- jasmine.Expectation.addMatchers({
3
- toBePlaying: function () {
4
- return {
5
- compare: function (actual, expected) {
6
- var player = actual;
2
+ jasmine.addMatchers({
3
+ toBePlaying: function () {
4
+ return {
5
+ compare: function (actual, expected) {
6
+ var player = actual;
7
7
 
8
- return {
9
- pass: player.currentlyPlayingSong === expected && player.isPlaying
10
- }
11
- }
12
- };
8
+ return {
9
+ pass: player.currentlyPlayingSong === expected && player.isPlaying
10
+ }
13
11
  }
14
- });
12
+ };
13
+ }
14
+ });
15
15
  });
@@ -97,13 +97,12 @@ getJasmineRequireObj().base = function(j$) {
97
97
  j$.MAX_PRETTY_PRINT_DEPTH = 40;
98
98
  j$.DEFAULT_TIMEOUT_INTERVAL = 5000;
99
99
 
100
- j$.getGlobal = function() {
101
- function getGlobal() {
102
- return this;
103
- }
104
-
105
- return getGlobal();
106
- };
100
+ j$.getGlobal = (function() {
101
+ var jasmineGlobal = eval.call(null, "this");
102
+ return function() {
103
+ return jasmineGlobal;
104
+ };
105
+ })();
107
106
 
108
107
  j$.getEnv = function(options) {
109
108
  var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options);
@@ -231,14 +230,13 @@ getJasmineRequireObj().Spec = function(j$) {
231
230
  this.id = attrs.id;
232
231
  this.description = attrs.description || '';
233
232
  this.fn = attrs.fn;
234
- this.beforeFns = attrs.beforeFns || function() {};
235
- this.afterFns = attrs.afterFns || function() {};
236
- this.catchingExceptions = attrs.catchingExceptions;
233
+ this.beforeFns = attrs.beforeFns || function() { return []; };
234
+ this.afterFns = attrs.afterFns || function() { return []; };
237
235
  this.onStart = attrs.onStart || function() {};
238
236
  this.exceptionFormatter = attrs.exceptionFormatter || function() {};
239
237
  this.getSpecName = attrs.getSpecName || function() { return ''; };
240
238
  this.expectationResultFactory = attrs.expectationResultFactory || function() { };
241
- this.queueRunner = attrs.queueRunner || function() {};
239
+ this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
242
240
  this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
243
241
 
244
242
  this.timer = attrs.timer || {setTimeout: setTimeout, clearTimeout: clearTimeout};
@@ -267,7 +265,8 @@ getJasmineRequireObj().Spec = function(j$) {
267
265
  };
268
266
 
269
267
  Spec.prototype.execute = function(onComplete) {
270
- var self = this;
268
+ var self = this,
269
+ timeout;
271
270
 
272
271
  this.onStart(this);
273
272
 
@@ -278,13 +277,13 @@ getJasmineRequireObj().Spec = function(j$) {
278
277
 
279
278
  function timeoutable(fn) {
280
279
  return function(done) {
281
- var timeout = Function.prototype.apply.apply(self.timer.setTimeout, [j$.getGlobal(), [function() {
280
+ timeout = Function.prototype.apply.apply(self.timer.setTimeout, [j$.getGlobal(), [function() {
282
281
  onException(new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.'));
283
282
  done();
284
283
  }, j$.DEFAULT_TIMEOUT_INTERVAL]]);
285
284
 
286
285
  var callDone = function() {
287
- Function.prototype.apply.apply(self.timer.clearTimeout, [j$.getGlobal(), [timeout]]);
286
+ clearTimeoutable();
288
287
  done();
289
288
  };
290
289
 
@@ -292,18 +291,26 @@ getJasmineRequireObj().Spec = function(j$) {
292
291
  };
293
292
  }
294
293
 
295
- var befores = this.beforeFns() || [],
296
- afters = this.afterFns() || [],
297
- thisOne = (this.fn.length) ? timeoutable(this.fn) : this.fn;
298
- var allFns = befores.concat(thisOne).concat(afters);
294
+ function clearTimeoutable() {
295
+ Function.prototype.apply.apply(self.timer.clearTimeout, [j$.getGlobal(), [timeout]]);
296
+ timeout = void 0;
297
+ }
299
298
 
300
- this.queueRunner({
301
- fns: allFns,
299
+ var allFns = this.beforeFns().concat(this.fn).concat(this.afterFns()),
300
+ allTimeoutableFns = [];
301
+ for (var i = 0; i < allFns.length; i++) {
302
+ var fn = allFns[i];
303
+ allTimeoutableFns.push(fn.length > 0 ? timeoutable(fn) : fn);
304
+ }
305
+
306
+ this.queueRunnerFactory({
307
+ fns: allTimeoutableFns,
302
308
  onException: onException,
303
309
  onComplete: complete
304
310
  });
305
311
 
306
312
  function onException(e) {
313
+ clearTimeoutable();
307
314
  if (Spec.isPendingSpecException(e)) {
308
315
  self.pend();
309
316
  return;
@@ -641,7 +648,7 @@ getJasmineRequireObj().Env = function(j$) {
641
648
  onStart: specStarted,
642
649
  description: description,
643
650
  expectationResultFactory: expectationResultFactory,
644
- queueRunner: queueRunnerFactory,
651
+ queueRunnerFactory: queueRunnerFactory,
645
652
  fn: fn,
646
653
  timer: {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}
647
654
  });
@@ -976,14 +983,17 @@ getJasmineRequireObj().Clock = function() {
976
983
  getJasmineRequireObj().DelayedFunctionScheduler = function() {
977
984
  function DelayedFunctionScheduler() {
978
985
  var self = this;
986
+ var scheduledLookup = [];
979
987
  var scheduledFunctions = {};
980
988
  var currentTime = 0;
981
989
  var delayedFnCount = 0;
982
990
 
983
991
  self.tick = function(millis) {
984
992
  millis = millis || 0;
985
- currentTime = currentTime + millis;
986
- runFunctionsWithinRange(currentTime - millis, currentTime);
993
+ var endTime = currentTime + millis;
994
+
995
+ runScheduledFunctions(endTime);
996
+ currentTime = endTime;
987
997
  };
988
998
 
989
999
  self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) {
@@ -999,7 +1009,8 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
999
1009
  millis = millis || 0;
1000
1010
  timeoutKey = timeoutKey || ++delayedFnCount;
1001
1011
  runAtMillis = runAtMillis || (currentTime + millis);
1002
- scheduledFunctions[timeoutKey] = {
1012
+
1013
+ var funcToSchedule = {
1003
1014
  runAtMillis: runAtMillis,
1004
1015
  funcToCall: f,
1005
1016
  recurring: recurring,
@@ -1007,58 +1018,73 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
1007
1018
  timeoutKey: timeoutKey,
1008
1019
  millis: millis
1009
1020
  };
1021
+
1022
+ if (runAtMillis in scheduledFunctions) {
1023
+ scheduledFunctions[runAtMillis].push(funcToSchedule);
1024
+ } else {
1025
+ scheduledFunctions[runAtMillis] = [funcToSchedule];
1026
+ scheduledLookup.push(runAtMillis);
1027
+ scheduledLookup.sort(function (a, b) {
1028
+ return a - b;
1029
+ });
1030
+ }
1031
+
1010
1032
  return timeoutKey;
1011
1033
  };
1012
1034
 
1013
1035
  self.removeFunctionWithId = function(timeoutKey) {
1014
- delete scheduledFunctions[timeoutKey];
1036
+ for (var runAtMillis in scheduledFunctions) {
1037
+ var funcs = scheduledFunctions[runAtMillis];
1038
+ var i = indexOfFirstToPass(funcs, function (func) {
1039
+ return func.timeoutKey === timeoutKey;
1040
+ });
1041
+
1042
+ if (i > -1) {
1043
+ if (funcs.length === 1) {
1044
+ delete scheduledFunctions[runAtMillis];
1045
+ deleteFromLookup(runAtMillis);
1046
+ } else {
1047
+ funcs.splice(i, 1);
1048
+ }
1049
+
1050
+ // intervals get rescheduled when executed, so there's never more
1051
+ // than a single scheduled function with a given timeoutKey
1052
+ break;
1053
+ }
1054
+ }
1015
1055
  };
1016
1056
 
1017
1057
  self.reset = function() {
1018
1058
  currentTime = 0;
1059
+ scheduledLookup = [];
1019
1060
  scheduledFunctions = {};
1020
1061
  delayedFnCount = 0;
1021
1062
  };
1022
1063
 
1023
1064
  return self;
1024
1065
 
1025
- // finds/dupes functions within range and removes them.
1026
- function functionsWithinRange(startMillis, endMillis) {
1027
- var fnsToRun = [];
1028
- for (var timeoutKey in scheduledFunctions) {
1029
- var scheduledFunc = scheduledFunctions[timeoutKey];
1030
- if (scheduledFunc &&
1031
- scheduledFunc.runAtMillis >= startMillis &&
1032
- scheduledFunc.runAtMillis <= endMillis) {
1033
-
1034
- // remove fn -- we'll reschedule later if it is recurring.
1035
- self.removeFunctionWithId(timeoutKey);
1036
- if (!scheduledFunc.recurring) {
1037
- fnsToRun.push(scheduledFunc); // schedules each function only once
1038
- } else {
1039
- fnsToRun.push(buildNthInstanceOf(scheduledFunc, 0));
1040
- var additionalTimesFnRunsInRange =
1041
- Math.floor((endMillis - scheduledFunc.runAtMillis) / scheduledFunc.millis);
1042
- for (var i = 0; i < additionalTimesFnRunsInRange; i++) {
1043
- fnsToRun.push(buildNthInstanceOf(scheduledFunc, i + 1));
1044
- }
1045
- reschedule(buildNthInstanceOf(scheduledFunc, additionalTimesFnRunsInRange));
1046
- }
1066
+ function indexOfFirstToPass(array, testFn) {
1067
+ var index = -1;
1068
+
1069
+ for (var i = 0; i < array.length; ++i) {
1070
+ if (testFn(array[i])) {
1071
+ index = i;
1072
+ break;
1047
1073
  }
1048
1074
  }
1049
1075
 
1050
- return fnsToRun;
1076
+ return index;
1051
1077
  }
1052
1078
 
1053
- function buildNthInstanceOf(scheduledFunc, n) {
1054
- return {
1055
- runAtMillis: scheduledFunc.runAtMillis + (scheduledFunc.millis * n),
1056
- funcToCall: scheduledFunc.funcToCall,
1057
- params: scheduledFunc.params,
1058
- millis: scheduledFunc.millis,
1059
- recurring: scheduledFunc.recurring,
1060
- timeoutKey: scheduledFunc.timeoutKey
1061
- };
1079
+ function deleteFromLookup(key) {
1080
+ var value = Number(key);
1081
+ var i = indexOfFirstToPass(scheduledLookup, function (millis) {
1082
+ return millis === value;
1083
+ });
1084
+
1085
+ if (i > -1) {
1086
+ scheduledLookup.splice(i, 1);
1087
+ }
1062
1088
  }
1063
1089
 
1064
1090
  function reschedule(scheduledFn) {
@@ -1070,21 +1096,30 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
1070
1096
  scheduledFn.runAtMillis + scheduledFn.millis);
1071
1097
  }
1072
1098
 
1073
-
1074
- function runFunctionsWithinRange(startMillis, endMillis) {
1075
- var funcsToRun = functionsWithinRange(startMillis, endMillis);
1076
- if (funcsToRun.length === 0) {
1099
+ function runScheduledFunctions(endTime) {
1100
+ if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
1077
1101
  return;
1078
1102
  }
1079
1103
 
1080
- funcsToRun.sort(function(a, b) {
1081
- return a.runAtMillis - b.runAtMillis;
1082
- });
1104
+ do {
1105
+ currentTime = scheduledLookup.shift();
1083
1106
 
1084
- for (var i = 0; i < funcsToRun.length; ++i) {
1085
- var funcToRun = funcsToRun[i];
1086
- funcToRun.funcToCall.apply(null, funcToRun.params || []);
1087
- }
1107
+ var funcsToRun = scheduledFunctions[currentTime];
1108
+ delete scheduledFunctions[currentTime];
1109
+
1110
+ for (var i = 0; i < funcsToRun.length; ++i) {
1111
+ var funcToRun = funcsToRun[i];
1112
+ funcToRun.funcToCall.apply(null, funcToRun.params || []);
1113
+
1114
+ if (funcToRun.recurring) {
1115
+ reschedule(funcToRun);
1116
+ }
1117
+ }
1118
+ } while (scheduledLookup.length > 0 &&
1119
+ // checking first if we're out of time prevents setTimeout(0)
1120
+ // scheduled in a funcToRun from forcing an extra iteration
1121
+ currentTime !== endTime &&
1122
+ scheduledLookup[0] <= endTime);
1088
1123
  }
1089
1124
  }
1090
1125
 
@@ -2363,5 +2398,5 @@ getJasmineRequireObj().toThrowError = function(j$) {
2363
2398
  };
2364
2399
 
2365
2400
  getJasmineRequireObj().version = function() {
2366
- return "2.0.0-rc5";
2401
+ return "2.0.0";
2367
2402
  };
@@ -80,7 +80,7 @@ describe("ConsoleReporter", function() {
80
80
  expect(out.getOutput()).toEqual("*");
81
81
  });
82
82
 
83
- it("reports a summary when done (singluar spec and time)", function() {
83
+ it("reports a summary when done (singular spec and time)", function() {
84
84
  var timerSpy = jasmine.createSpyObj('timer', ['start', 'elapsed']),
85
85
  reporter = new j$.ConsoleReporter({
86
86
  print: out.print,
@@ -198,7 +198,7 @@ describe("ConsoleReporter", function() {
198
198
 
199
199
  reporter.specDone({status: "passed"});
200
200
 
201
- expect(out.getOutput()).toEqual("\033[32m.\033[0m");
201
+ expect(out.getOutput()).toEqual("\x1B[32m.\x1B[0m");
202
202
  });
203
203
 
204
204
  it("does not report a disabled spec", function() {
@@ -220,7 +220,7 @@ describe("ConsoleReporter", function() {
220
220
 
221
221
  reporter.specDone({status: 'failed'});
222
222
 
223
- expect(out.getOutput()).toEqual("\033[31mF\033[0m");
223
+ expect(out.getOutput()).toEqual("\x1B[31mF\x1B[0m");
224
224
  });
225
225
  });
226
226
  });
@@ -341,4 +341,19 @@ describe("Clock (acceptance)", function() {
341
341
  clock.tick();
342
342
  expect(delayedFn2).toHaveBeenCalled();
343
343
  });
344
+
345
+ it("correctly calls functions scheduled while the Clock is advancing", function() {
346
+ var delayedFn1 = jasmine.createSpy('delayedFn1'),
347
+ delayedFn2 = jasmine.createSpy('delayedFn2'),
348
+ delayedFunctionScheduler = new j$.DelayedFunctionScheduler(),
349
+ clock = new j$.Clock({setTimeout: function() {}}, delayedFunctionScheduler);
350
+
351
+ delayedFn1.and.callFake(function() { clock.setTimeout(delayedFn2, 1); });
352
+ clock.install();
353
+ clock.setTimeout(delayedFn1, 5);
354
+
355
+ clock.tick(6);
356
+ expect(delayedFn1).toHaveBeenCalled();
357
+ expect(delayedFn2).toHaveBeenCalled();
358
+ });
344
359
  });
@@ -175,5 +175,72 @@ describe("DelayedFunctionScheduler", function() {
175
175
  expect(fn).toHaveBeenCalled();
176
176
  });
177
177
 
178
+ it("schedules a function for later execution during a tick", function () {
179
+ var scheduler = new j$.DelayedFunctionScheduler(),
180
+ fn = jasmine.createSpy('fn'),
181
+ fnDelay = 10;
182
+
183
+ scheduler.scheduleFunction(function () {
184
+ scheduler.scheduleFunction(fn, fnDelay);
185
+ }, 0);
186
+
187
+ expect(fn).not.toHaveBeenCalled();
188
+
189
+ scheduler.tick(fnDelay);
190
+
191
+ expect(fn).toHaveBeenCalled();
192
+ });
193
+
194
+ it("#removeFunctionWithId removes a previously scheduled function with a given id during a tick", function () {
195
+ var scheduler = new j$.DelayedFunctionScheduler(),
196
+ fn = jasmine.createSpy('fn'),
197
+ fnDelay = 10,
198
+ timeoutKey;
199
+
200
+ scheduler.scheduleFunction(function () {
201
+ scheduler.removeFunctionWithId(timeoutKey);
202
+ }, 0);
203
+ timeoutKey = scheduler.scheduleFunction(fn, fnDelay);
204
+
205
+ expect(fn).not.toHaveBeenCalled();
206
+
207
+ scheduler.tick(fnDelay);
208
+
209
+ expect(fn).not.toHaveBeenCalled();
210
+ });
211
+
212
+ it("executes recurring functions interleaved with regular functions and functions scheduled during a tick in the correct order", function () {
213
+ var scheduler = new j$.DelayedFunctionScheduler(),
214
+ fn = jasmine.createSpy('fn'),
215
+ recurringCallCount = 0,
216
+ recurring = jasmine.createSpy('recurring').and.callFake(function() {
217
+ recurringCallCount++;
218
+ if (recurringCallCount < 5) {
219
+ expect(fn).not.toHaveBeenCalled();
220
+ }
221
+ }),
222
+ innerFn = jasmine.createSpy('innerFn').and.callFake(function() {
223
+ expect(recurring.calls.count()).toBe(4);
224
+ expect(fn).not.toHaveBeenCalled();
225
+ }),
226
+ scheduling = jasmine.createSpy('scheduling').and.callFake(function() {
227
+ expect(recurring.calls.count()).toBe(3);
228
+ expect(fn).not.toHaveBeenCalled();
229
+ scheduler.scheduleFunction(innerFn, 10); // 41ms absolute
230
+ });
231
+
232
+ scheduler.scheduleFunction(recurring, 10, [], true);
233
+ scheduler.scheduleFunction(fn, 50);
234
+ scheduler.scheduleFunction(scheduling, 31);
235
+
236
+ scheduler.tick(60);
237
+
238
+ expect(recurring).toHaveBeenCalled();
239
+ expect(recurring.calls.count()).toBe(6);
240
+ expect(fn).toHaveBeenCalled();
241
+ expect(scheduling).toHaveBeenCalled();
242
+ expect(innerFn).toHaveBeenCalled();
243
+ });
244
+
178
245
  });
179
246