@ -1,4 +1,4 @@
var isCommonJS = typeof window == "undefined" ;
var isCommonJS = typeof window == "undefined" && typeof exports == "object" ;
/ * *
/ * *
* Top level namespace for Jasmine , a lightweight JavaScript BDD / spec / testing framework .
* Top level namespace for Jasmine , a lightweight JavaScript BDD / spec / testing framework .
@ -34,11 +34,23 @@ jasmine.VERBOSE = false;
* /
* /
jasmine . DEFAULT _UPDATE _INTERVAL = 250 ;
jasmine . DEFAULT _UPDATE _INTERVAL = 250 ;
/ * *
* Maximum levels of nesting that will be included when an object is pretty - printed
* /
jasmine . MAX _PRETTY _PRINT _DEPTH = 40 ;
/ * *
/ * *
* Default timeout interval in milliseconds for waitsFor ( ) blocks .
* Default timeout interval in milliseconds for waitsFor ( ) blocks .
* /
* /
jasmine . DEFAULT _TIMEOUT _INTERVAL = 5000 ;
jasmine . DEFAULT _TIMEOUT _INTERVAL = 5000 ;
/ * *
* 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 .
* Set to false to let the exception bubble up in the browser .
*
* /
jasmine . CATCH _EXCEPTIONS = true ;
jasmine . getGlobal = function ( ) {
jasmine . getGlobal = function ( ) {
function getGlobal ( ) {
function getGlobal ( ) {
return this ;
return this ;
@ -463,7 +475,7 @@ jasmine.log = function() {
* @ see jasmine . createSpy
* @ see jasmine . createSpy
* @ param obj
* @ param obj
* @ param methodName
* @ param methodName
* @ returns a Jasmine spy that can be chained with all spy methods
* @ return { jasmine . Spy } a Jasmine spy that can be chained with all spy methods
* /
* /
var spyOn = function ( obj , methodName ) {
var spyOn = function ( obj , methodName ) {
return jasmine . getEnv ( ) . currentSpec . spyOn ( obj , methodName ) ;
return jasmine . getEnv ( ) . currentSpec . spyOn ( obj , methodName ) ;
@ -508,6 +520,7 @@ if (isCommonJS) exports.xit = xit;
* jasmine . Matchers functions .
* jasmine . Matchers functions .
*
*
* @ param { Object } actual Actual value to test against and expected value
* @ param { Object } actual Actual value to test against and expected value
* @ return { jasmine . Matchers }
* /
* /
var expect = function ( actual ) {
var expect = function ( actual ) {
return jasmine . getEnv ( ) . currentSpec . expect ( actual ) ;
return jasmine . getEnv ( ) . currentSpec . expect ( actual ) ;
@ -867,6 +880,25 @@ jasmine.Env.prototype.xit = function(desc, func) {
} ;
} ;
} ;
} ;
jasmine . Env . prototype . compareRegExps _ = function ( a , b , mismatchKeys , mismatchValues ) {
if ( a . source != b . source )
mismatchValues . push ( "expected pattern /" + b . source + "/ is not equal to the pattern /" + a . source + "/" ) ;
if ( a . ignoreCase != b . ignoreCase )
mismatchValues . push ( "expected modifier i was" + ( b . ignoreCase ? " " : " not " ) + "set and does not equal the origin modifier" ) ;
if ( a . global != b . global )
mismatchValues . push ( "expected modifier g was" + ( b . global ? " " : " not " ) + "set and does not equal the origin modifier" ) ;
if ( a . multiline != b . multiline )
mismatchValues . push ( "expected modifier m was" + ( b . multiline ? " " : " not " ) + "set and does not equal the origin modifier" ) ;
if ( a . sticky != b . sticky )
mismatchValues . push ( "expected modifier y was" + ( b . sticky ? " " : " not " ) + "set and does not equal the origin modifier" ) ;
return ( mismatchValues . length === 0 ) ;
} ;
jasmine . Env . prototype . compareObjects _ = function ( a , b , mismatchKeys , mismatchValues ) {
jasmine . Env . prototype . compareObjects _ = function ( a , b , mismatchKeys , mismatchValues ) {
if ( a . _ _Jasmine _been _here _before _ _ === b && b . _ _Jasmine _been _here _before _ _ === a ) {
if ( a . _ _Jasmine _been _here _before _ _ === b && b . _ _Jasmine _been _here _before _ _ === a ) {
return true ;
return true ;
@ -953,6 +985,10 @@ jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
return ( a == b ) ;
return ( a == b ) ;
}
}
if ( a instanceof RegExp && b instanceof RegExp ) {
return this . compareRegExps _ ( a , b , mismatchKeys , mismatchValues ) ;
}
if ( typeof a === "object" && typeof b === "object" ) {
if ( typeof a === "object" && typeof b === "object" ) {
return this . compareObjects _ ( a , b , mismatchKeys , mismatchValues ) ;
return this . compareObjects _ ( a , b , mismatchKeys , mismatchValues ) ;
}
}
@ -1019,11 +1055,16 @@ jasmine.Block = function(env, func, spec) {
this . spec = spec ;
this . spec = spec ;
} ;
} ;
jasmine . Block . prototype . execute = function ( onComplete ) {
jasmine . Block . prototype . execute = function ( onComplete ) {
try {
if ( ! jasmine . CATCH _EXCEPTIONS ) {
this . func . apply ( this . spec ) ;
this . func . apply ( this . spec ) ;
} catch ( e ) {
}
this . spec . fail ( e ) ;
else {
try {
this . func . apply ( this . spec ) ;
} catch ( e ) {
this . spec . fail ( e ) ;
}
}
}
onComplete ( ) ;
onComplete ( ) ;
} ;
} ;
@ -1281,6 +1322,17 @@ jasmine.Matchers.prototype.toBeNull = function() {
return ( this . actual === null ) ;
return ( this . actual === null ) ;
} ;
} ;
/ * *
* Matcher that compares the actual to NaN .
* /
jasmine . Matchers . prototype . toBeNaN = function ( ) {
this . message = function ( ) {
return [ "Expected " + jasmine . pp ( this . actual ) + " to be NaN." ] ;
} ;
return ( this . actual !== this . actual ) ;
} ;
/ * *
/ * *
* Matcher that boolean not - nots the actual .
* Matcher that boolean not - nots the actual .
* /
* /
@ -1358,18 +1410,14 @@ jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
throw new Error ( 'Expected a spy, but got ' + jasmine . pp ( this . actual ) + '.' ) ;
throw new Error ( 'Expected a spy, but got ' + jasmine . pp ( this . actual ) + '.' ) ;
}
}
this . message = function ( ) {
this . message = function ( ) {
var invertedMessage = "Expected spy " + this . actual . identity + " not to have been called with " + jasmine . pp ( expectedArgs ) + " but it was." ;
var positiveMessage = "" ;
if ( this . actual . callCount === 0 ) {
if ( this . actual . callCount === 0 ) {
// todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
positiveMessage = "Expected spy " + this . actual . identity + " to have been called with " + jasmine . pp ( expectedArgs ) + " but it was never called." ;
return [
"Expected spy " + this . actual . identity + " to have been called with " + jasmine . pp ( expectedArgs ) + " but it was never called." ,
"Expected spy " + this . actual . identity + " not to have been called with " + jasmine . pp ( expectedArgs ) + " but it was."
] ;
} else {
} else {
return [
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 , '' )
"Expected spy " + this . actual . identity + " to have been called with " + jasmine . pp ( expectedArgs ) + " but was called with " + jasmine . pp ( this . actual . argsForCall ) ,
"Expected spy " + this . actual . identity + " not to have been called with " + jasmine . pp ( expectedArgs ) + " but was called with " + jasmine . pp ( this . actual . argsForCall )
] ;
}
}
return [ positiveMessage , invertedMessage ] ;
} ;
} ;
return this . env . contains _ ( this . actual . argsForCall , expectedArgs ) ;
return this . env . contains _ ( this . actual . argsForCall , expectedArgs ) ;
@ -1427,22 +1475,19 @@ jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
* up to a given level of decimal precision ( default 2 ) .
* up to a given level of decimal precision ( default 2 ) .
*
*
* @ param { Number } expected
* @ param { Number } expected
* @ param { Number } precision
* @ param { Number } precision , as number of decimal places
* /
* /
jasmine . Matchers . prototype . toBeCloseTo = function ( expected , precision ) {
jasmine . Matchers . prototype . toBeCloseTo = function ( expected , precision ) {
if ( ! ( precision === 0 ) ) {
if ( ! ( precision === 0 ) ) {
precision = precision || 2 ;
precision = precision || 2 ;
}
}
var multiplier = Math . pow ( 10 , precision ) ;
return Math . abs ( expected - this . actual ) < ( Math . pow ( 10 , - precision ) / 2 ) ;
var actual = Math . round ( this . actual * multiplier ) ;
expected = Math . round ( expected * multiplier ) ;
return expected == actual ;
} ;
} ;
/ * *
/ * *
* Matcher that checks that the expected exception was thrown by the actual .
* Matcher that checks that the expected exception was thrown by the actual .
*
*
* @ param { String } expected
* @ param { String } [ expected ]
* /
* /
jasmine . Matchers . prototype . toThrow = function ( expected ) {
jasmine . Matchers . prototype . toThrow = function ( expected ) {
var result = false ;
var result = false ;
@ -1529,6 +1574,189 @@ jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mis
jasmine . Matchers . ObjectContaining . prototype . jasmineToString = function ( ) {
jasmine . Matchers . ObjectContaining . prototype . jasmineToString = function ( ) {
return "<jasmine.objectContaining(" + jasmine . pp ( this . sample ) + ")>" ;
return "<jasmine.objectContaining(" + jasmine . pp ( this . sample ) + ")>" ;
} ;
} ;
// Mock setTimeout, clearTimeout
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
jasmine . FakeTimer = function ( ) {
this . reset ( ) ;
var self = this ;
self . setTimeout = function ( funcToCall , millis ) {
self . timeoutsMade ++ ;
self . scheduleFunction ( self . timeoutsMade , funcToCall , millis , false ) ;
return self . timeoutsMade ;
} ;
self . setInterval = function ( funcToCall , millis ) {
self . timeoutsMade ++ ;
self . scheduleFunction ( self . timeoutsMade , funcToCall , millis , true ) ;
return self . timeoutsMade ;
} ;
self . clearTimeout = function ( timeoutKey ) {
self . scheduledFunctions [ timeoutKey ] = jasmine . undefined ;
} ;
self . clearInterval = function ( timeoutKey ) {
self . scheduledFunctions [ timeoutKey ] = jasmine . undefined ;
} ;
} ;
jasmine . FakeTimer . prototype . reset = function ( ) {
this . timeoutsMade = 0 ;
this . scheduledFunctions = { } ;
this . nowMillis = 0 ;
} ;
jasmine . FakeTimer . prototype . tick = function ( millis ) {
var oldMillis = this . nowMillis ;
var newMillis = oldMillis + millis ;
this . runFunctionsWithinRange ( oldMillis , newMillis ) ;
this . nowMillis = newMillis ;
} ;
jasmine . FakeTimer . prototype . runFunctionsWithinRange = function ( oldMillis , nowMillis ) {
var scheduledFunc ;
var funcsToRun = [ ] ;
for ( var timeoutKey in this . scheduledFunctions ) {
scheduledFunc = this . scheduledFunctions [ timeoutKey ] ;
if ( scheduledFunc != jasmine . undefined &&
scheduledFunc . runAtMillis >= oldMillis &&
scheduledFunc . runAtMillis <= nowMillis ) {
funcsToRun . push ( scheduledFunc ) ;
this . scheduledFunctions [ timeoutKey ] = jasmine . undefined ;
}
}
if ( funcsToRun . length > 0 ) {
funcsToRun . sort ( function ( a , b ) {
return a . runAtMillis - b . runAtMillis ;
} ) ;
for ( var i = 0 ; i < funcsToRun . length ; ++ i ) {
try {
var funcToRun = funcsToRun [ i ] ;
this . nowMillis = funcToRun . runAtMillis ;
funcToRun . funcToCall ( ) ;
if ( funcToRun . recurring ) {
this . scheduleFunction ( funcToRun . timeoutKey ,
funcToRun . funcToCall ,
funcToRun . millis ,
true ) ;
}
} catch ( e ) {
}
}
this . runFunctionsWithinRange ( oldMillis , nowMillis ) ;
}
} ;
jasmine . FakeTimer . prototype . scheduleFunction = function ( timeoutKey , funcToCall , millis , recurring ) {
this . scheduledFunctions [ timeoutKey ] = {
runAtMillis : this . nowMillis + millis ,
funcToCall : funcToCall ,
recurring : recurring ,
timeoutKey : timeoutKey ,
millis : millis
} ;
} ;
/ * *
* @ namespace
* /
jasmine . Clock = {
defaultFakeTimer : new jasmine . FakeTimer ( ) ,
reset : function ( ) {
jasmine . Clock . assertInstalled ( ) ;
jasmine . Clock . defaultFakeTimer . reset ( ) ;
} ,
tick : function ( millis ) {
jasmine . Clock . assertInstalled ( ) ;
jasmine . Clock . defaultFakeTimer . tick ( millis ) ;
} ,
runFunctionsWithinRange : function ( oldMillis , nowMillis ) {
jasmine . Clock . defaultFakeTimer . runFunctionsWithinRange ( oldMillis , nowMillis ) ;
} ,
scheduleFunction : function ( timeoutKey , funcToCall , millis , recurring ) {
jasmine . Clock . defaultFakeTimer . scheduleFunction ( timeoutKey , funcToCall , millis , recurring ) ;
} ,
useMock : function ( ) {
if ( ! jasmine . Clock . isInstalled ( ) ) {
var spec = jasmine . getEnv ( ) . currentSpec ;
spec . after ( jasmine . Clock . uninstallMock ) ;
jasmine . Clock . installMock ( ) ;
}
} ,
installMock : function ( ) {
jasmine . Clock . installed = jasmine . Clock . defaultFakeTimer ;
} ,
uninstallMock : function ( ) {
jasmine . Clock . assertInstalled ( ) ;
jasmine . Clock . installed = jasmine . Clock . real ;
} ,
real : {
setTimeout : jasmine . getGlobal ( ) . setTimeout ,
clearTimeout : jasmine . getGlobal ( ) . clearTimeout ,
setInterval : jasmine . getGlobal ( ) . setInterval ,
clearInterval : jasmine . getGlobal ( ) . clearInterval
} ,
assertInstalled : function ( ) {
if ( ! jasmine . Clock . isInstalled ( ) ) {
throw new Error ( "Mock clock is not installed, use jasmine.Clock.useMock()" ) ;
}
} ,
isInstalled : function ( ) {
return jasmine . Clock . installed == jasmine . Clock . defaultFakeTimer ;
} ,
installed : null
} ;
jasmine . Clock . installed = jasmine . Clock . real ;
//else for IE support
jasmine . getGlobal ( ) . setTimeout = function ( funcToCall , millis ) {
if ( jasmine . Clock . installed . setTimeout . apply ) {
return jasmine . Clock . installed . setTimeout . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . setTimeout ( funcToCall , millis ) ;
}
} ;
jasmine . getGlobal ( ) . setInterval = function ( funcToCall , millis ) {
if ( jasmine . Clock . installed . setInterval . apply ) {
return jasmine . Clock . installed . setInterval . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . setInterval ( funcToCall , millis ) ;
}
} ;
jasmine . getGlobal ( ) . clearTimeout = function ( timeoutKey ) {
if ( jasmine . Clock . installed . clearTimeout . apply ) {
return jasmine . Clock . installed . clearTimeout . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . clearTimeout ( timeoutKey ) ;
}
} ;
jasmine . getGlobal ( ) . clearInterval = function ( timeoutKey ) {
if ( jasmine . Clock . installed . clearTimeout . apply ) {
return jasmine . Clock . installed . clearInterval . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . clearInterval ( timeoutKey ) ;
}
} ;
/ * *
/ * *
* @ constructor
* @ constructor
* /
* /
@ -1657,10 +1885,6 @@ jasmine.PrettyPrinter = function() {
* @ param value
* @ param value
* /
* /
jasmine . PrettyPrinter . prototype . format = function ( value ) {
jasmine . PrettyPrinter . prototype . format = function ( value ) {
if ( this . ppNestLevel _ > 40 ) {
throw new Error ( 'jasmine.PrettyPrinter: format() nested too deeply!' ) ;
}
this . ppNestLevel _ ++ ;
this . ppNestLevel _ ++ ;
try {
try {
if ( value === jasmine . undefined ) {
if ( value === jasmine . undefined ) {
@ -1703,6 +1927,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) {
jasmine . PrettyPrinter . prototype . iterateObject = function ( obj , fn ) {
jasmine . PrettyPrinter . prototype . iterateObject = function ( obj , fn ) {
for ( var property in obj ) {
for ( var property in obj ) {
if ( ! obj . hasOwnProperty ( property ) ) continue ;
if ( property == '__Jasmine_been_here_before__' ) continue ;
if ( property == '__Jasmine_been_here_before__' ) continue ;
fn ( property , obj . _ _lookupGetter _ _ ? ( obj . _ _lookupGetter _ _ ( property ) !== jasmine . undefined &&
fn ( property , obj . _ _lookupGetter _ _ ? ( obj . _ _lookupGetter _ _ ( property ) !== jasmine . undefined &&
obj . _ _lookupGetter _ _ ( property ) !== null ) : false ) ;
obj . _ _lookupGetter _ _ ( property ) !== null ) : false ) ;
@ -1730,6 +1955,11 @@ jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
} ;
} ;
jasmine . StringPrettyPrinter . prototype . emitArray = function ( array ) {
jasmine . StringPrettyPrinter . prototype . emitArray = function ( array ) {
if ( this . ppNestLevel _ > jasmine . MAX _PRETTY _PRINT _DEPTH ) {
this . append ( "Array" ) ;
return ;
}
this . append ( '[ ' ) ;
this . append ( '[ ' ) ;
for ( var i = 0 ; i < array . length ; i ++ ) {
for ( var i = 0 ; i < array . length ; i ++ ) {
if ( i > 0 ) {
if ( i > 0 ) {
@ -1741,6 +1971,11 @@ jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
} ;
} ;
jasmine . StringPrettyPrinter . prototype . emitObject = function ( obj ) {
jasmine . StringPrettyPrinter . prototype . emitObject = function ( obj ) {
if ( this . ppNestLevel _ > jasmine . MAX _PRETTY _PRINT _DEPTH ) {
this . append ( "Object" ) ;
return ;
}
var self = this ;
var self = this ;
this . append ( '{ ' ) ;
this . append ( '{ ' ) ;
var first = true ;
var first = true ;
@ -1769,6 +2004,10 @@ jasmine.StringPrettyPrinter.prototype.append = function(value) {
} ;
} ;
jasmine . Queue = function ( env ) {
jasmine . Queue = function ( env ) {
this . env = env ;
this . env = env ;
// parallel to blocks. each true value in this array means the block will
// get executed even if we abort
this . ensured = [ ] ;
this . blocks = [ ] ;
this . blocks = [ ] ;
this . running = false ;
this . running = false ;
this . index = 0 ;
this . index = 0 ;
@ -1776,15 +2015,30 @@ jasmine.Queue = function(env) {
this . abort = false ;
this . abort = false ;
} ;
} ;
jasmine . Queue . prototype . addBefore = function ( block ) {
jasmine . Queue . prototype . addBefore = function ( block , ensure ) {
if ( ensure === jasmine . undefined ) {
ensure = false ;
}
this . blocks . unshift ( block ) ;
this . blocks . unshift ( block ) ;
this . ensured . unshift ( ensure ) ;
} ;
} ;
jasmine . Queue . prototype . add = function ( block ) {
jasmine . Queue . prototype . add = function ( block , ensure ) {
if ( ensure === jasmine . undefined ) {
ensure = false ;
}
this . blocks . push ( block ) ;
this . blocks . push ( block ) ;
this . ensured . push ( ensure ) ;
} ;
} ;
jasmine . Queue . prototype . insertNext = function ( block ) {
jasmine . Queue . prototype . insertNext = function ( block , ensure ) {
if ( ensure === jasmine . undefined ) {
ensure = false ;
}
this . ensured . splice ( ( this . index + this . offset + 1 ) , 0 , ensure ) ;
this . blocks . splice ( ( this . index + this . offset + 1 ) , 0 , block ) ;
this . blocks . splice ( ( this . index + this . offset + 1 ) , 0 , block ) ;
this . offset ++ ;
this . offset ++ ;
} ;
} ;
@ -1808,7 +2062,7 @@ jasmine.Queue.prototype.next_ = function() {
while ( goAgain ) {
while ( goAgain ) {
goAgain = false ;
goAgain = false ;
if ( self . index < self . blocks . length && ! this . abort ) {
if ( self . index < self . blocks . length && ! ( this . abort && ! this . ensured [ self . index ] ) ) {
var calledSynchronously = true ;
var calledSynchronously = true ;
var completedSynchronously = false ;
var completedSynchronously = false ;
@ -2099,7 +2353,7 @@ jasmine.Spec.prototype.finish = function(onComplete) {
jasmine . Spec . prototype . after = function ( doAfter ) {
jasmine . Spec . prototype . after = function ( doAfter ) {
if ( this . queue . isRunning ( ) ) {
if ( this . queue . isRunning ( ) ) {
this . queue . add ( new jasmine . Block ( this . env , doAfter , this ) );
this . queue . add ( new jasmine . Block ( this . env , doAfter , this ) , true );
} else {
} else {
this . afterCallbacks . unshift ( doAfter ) ;
this . afterCallbacks . unshift ( doAfter ) ;
}
}
@ -2137,15 +2391,15 @@ jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
this . queue . addBefore ( new jasmine . Block ( this . env , runner . before _ [ i ] , this ) ) ;
this . queue . addBefore ( new jasmine . Block ( this . env , runner . before _ [ i ] , this ) ) ;
}
}
for ( i = 0 ; i < this . afterCallbacks . length ; i ++ ) {
for ( i = 0 ; i < this . afterCallbacks . length ; i ++ ) {
this . queue . add ( new jasmine . Block ( this . env , this . afterCallbacks [ i ] , this ) );
this . queue . add ( new jasmine . Block ( this . env , this . afterCallbacks [ i ] , this ) , true );
}
}
for ( suite = this . suite ; suite ; suite = suite . parentSuite ) {
for ( suite = this . suite ; suite ; suite = suite . parentSuite ) {
for ( i = 0 ; i < suite . after _ . length ; i ++ ) {
for ( i = 0 ; i < suite . after _ . length ; i ++ ) {
this . queue . add ( new jasmine . Block ( this . env , suite . after _ [ i ] , this ) );
this . queue . add ( new jasmine . Block ( this . env , suite . after _ [ i ] , this ) , true );
}
}
}
}
for ( i = 0 ; i < runner . after _ . length ; i ++ ) {
for ( i = 0 ; i < runner . after _ . length ; i ++ ) {
this . queue . add ( new jasmine . Block ( this . env , runner . after _ [ i ] , this ) );
this . queue . add ( new jasmine . Block ( this . env , runner . after _ [ i ] , this ) , true );
}
}
} ;
} ;
@ -2337,192 +2591,10 @@ jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
} , jasmine . WaitsForBlock . TIMEOUT _INCREMENT ) ;
} , jasmine . WaitsForBlock . TIMEOUT _INCREMENT ) ;
}
}
} ;
} ;
// Mock setTimeout, clearTimeout
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
jasmine . FakeTimer = function ( ) {
this . reset ( ) ;
var self = this ;
self . setTimeout = function ( funcToCall , millis ) {
self . timeoutsMade ++ ;
self . scheduleFunction ( self . timeoutsMade , funcToCall , millis , false ) ;
return self . timeoutsMade ;
} ;
self . setInterval = function ( funcToCall , millis ) {
self . timeoutsMade ++ ;
self . scheduleFunction ( self . timeoutsMade , funcToCall , millis , true ) ;
return self . timeoutsMade ;
} ;
self . clearTimeout = function ( timeoutKey ) {
self . scheduledFunctions [ timeoutKey ] = jasmine . undefined ;
} ;
self . clearInterval = function ( timeoutKey ) {
self . scheduledFunctions [ timeoutKey ] = jasmine . undefined ;
} ;
} ;
jasmine . FakeTimer . prototype . reset = function ( ) {
this . timeoutsMade = 0 ;
this . scheduledFunctions = { } ;
this . nowMillis = 0 ;
} ;
jasmine . FakeTimer . prototype . tick = function ( millis ) {
var oldMillis = this . nowMillis ;
var newMillis = oldMillis + millis ;
this . runFunctionsWithinRange ( oldMillis , newMillis ) ;
this . nowMillis = newMillis ;
} ;
jasmine . FakeTimer . prototype . runFunctionsWithinRange = function ( oldMillis , nowMillis ) {
var scheduledFunc ;
var funcsToRun = [ ] ;
for ( var timeoutKey in this . scheduledFunctions ) {
scheduledFunc = this . scheduledFunctions [ timeoutKey ] ;
if ( scheduledFunc != jasmine . undefined &&
scheduledFunc . runAtMillis >= oldMillis &&
scheduledFunc . runAtMillis <= nowMillis ) {
funcsToRun . push ( scheduledFunc ) ;
this . scheduledFunctions [ timeoutKey ] = jasmine . undefined ;
}
}
if ( funcsToRun . length > 0 ) {
funcsToRun . sort ( function ( a , b ) {
return a . runAtMillis - b . runAtMillis ;
} ) ;
for ( var i = 0 ; i < funcsToRun . length ; ++ i ) {
try {
var funcToRun = funcsToRun [ i ] ;
this . nowMillis = funcToRun . runAtMillis ;
funcToRun . funcToCall ( ) ;
if ( funcToRun . recurring ) {
this . scheduleFunction ( funcToRun . timeoutKey ,
funcToRun . funcToCall ,
funcToRun . millis ,
true ) ;
}
} catch ( e ) {
}
}
this . runFunctionsWithinRange ( oldMillis , nowMillis ) ;
}
} ;
jasmine . FakeTimer . prototype . scheduleFunction = function ( timeoutKey , funcToCall , millis , recurring ) {
this . scheduledFunctions [ timeoutKey ] = {
runAtMillis : this . nowMillis + millis ,
funcToCall : funcToCall ,
recurring : recurring ,
timeoutKey : timeoutKey ,
millis : millis
} ;
} ;
/ * *
* @ namespace
* /
jasmine . Clock = {
defaultFakeTimer : new jasmine . FakeTimer ( ) ,
reset : function ( ) {
jasmine . Clock . assertInstalled ( ) ;
jasmine . Clock . defaultFakeTimer . reset ( ) ;
} ,
tick : function ( millis ) {
jasmine . Clock . assertInstalled ( ) ;
jasmine . Clock . defaultFakeTimer . tick ( millis ) ;
} ,
runFunctionsWithinRange : function ( oldMillis , nowMillis ) {
jasmine . Clock . defaultFakeTimer . runFunctionsWithinRange ( oldMillis , nowMillis ) ;
} ,
scheduleFunction : function ( timeoutKey , funcToCall , millis , recurring ) {
jasmine . Clock . defaultFakeTimer . scheduleFunction ( timeoutKey , funcToCall , millis , recurring ) ;
} ,
useMock : function ( ) {
if ( ! jasmine . Clock . isInstalled ( ) ) {
var spec = jasmine . getEnv ( ) . currentSpec ;
spec . after ( jasmine . Clock . uninstallMock ) ;
jasmine . Clock . installMock ( ) ;
}
} ,
installMock : function ( ) {
jasmine . Clock . installed = jasmine . Clock . defaultFakeTimer ;
} ,
uninstallMock : function ( ) {
jasmine . Clock . assertInstalled ( ) ;
jasmine . Clock . installed = jasmine . Clock . real ;
} ,
real : {
setTimeout : jasmine . getGlobal ( ) . setTimeout ,
clearTimeout : jasmine . getGlobal ( ) . clearTimeout ,
setInterval : jasmine . getGlobal ( ) . setInterval ,
clearInterval : jasmine . getGlobal ( ) . clearInterval
} ,
assertInstalled : function ( ) {
if ( ! jasmine . Clock . isInstalled ( ) ) {
throw new Error ( "Mock clock is not installed, use jasmine.Clock.useMock()" ) ;
}
} ,
isInstalled : function ( ) {
return jasmine . Clock . installed == jasmine . Clock . defaultFakeTimer ;
} ,
installed : null
} ;
jasmine . Clock . installed = jasmine . Clock . real ;
//else for IE support
jasmine . getGlobal ( ) . setTimeout = function ( funcToCall , millis ) {
if ( jasmine . Clock . installed . setTimeout . apply ) {
return jasmine . Clock . installed . setTimeout . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . setTimeout ( funcToCall , millis ) ;
}
} ;
jasmine . getGlobal ( ) . setInterval = function ( funcToCall , millis ) {
if ( jasmine . Clock . installed . setInterval . apply ) {
return jasmine . Clock . installed . setInterval . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . setInterval ( funcToCall , millis ) ;
}
} ;
jasmine . getGlobal ( ) . clearTimeout = function ( timeoutKey ) {
if ( jasmine . Clock . installed . clearTimeout . apply ) {
return jasmine . Clock . installed . clearTimeout . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . clearTimeout ( timeoutKey ) ;
}
} ;
jasmine . getGlobal ( ) . clearInterval = function ( timeoutKey ) {
if ( jasmine . Clock . installed . clearTimeout . apply ) {
return jasmine . Clock . installed . clearInterval . apply ( this , arguments ) ;
} else {
return jasmine . Clock . installed . clearInterval ( timeoutKey ) ;
}
} ;
jasmine . version _ = {
jasmine . version _ = {
"major" : 1 ,
"major" : 1 ,
"minor" : 1 ,
"minor" : 3 ,
"build" : 0 ,
"build" : 1 ,
"revision" : 13 30200206
"revision" : 1354556913
} ;
} ;