view $/testing.js @ 0:493bcb69166c

added public content
author Daniel Wolff
date Tue, 09 Feb 2016 20:54:02 +0100
parents
children
line wrap: on
line source
getJasmineRequireObj=function(jasmineGlobal){var jasmineRequire;if(typeof module!=="undefined"&&module.exports){jasmineGlobal=global;jasmineRequire=exports}else{jasmineRequire=jasmineGlobal.jasmineRequire=jasmineGlobal.jasmineRequire||{}}function getJasmineRequire(){return jasmineRequire}getJasmineRequire().core=function(jRequire){var j$={};jRequire.base(j$,jasmineGlobal);j$.util=jRequire.util();j$.Any=jRequire.Any();j$.CallTracker=jRequire.CallTracker();j$.MockDate=jRequire.MockDate();j$.Clock=jRequire.Clock();j$.DelayedFunctionScheduler=jRequire.DelayedFunctionScheduler();j$.Env=jRequire.Env(j$);j$.ExceptionFormatter=jRequire.ExceptionFormatter();j$.Expectation=jRequire.Expectation();j$.buildExpectationResult=jRequire.buildExpectationResult();j$.JsApiReporter=jRequire.JsApiReporter();j$.matchersUtil=jRequire.matchersUtil(j$);j$.ObjectContaining=jRequire.ObjectContaining(j$);j$.pp=jRequire.pp(j$);j$.QueueRunner=jRequire.QueueRunner(j$);j$.ReportDispatcher=jRequire.ReportDispatcher();j$.Spec=jRequire.Spec(j$);j$.SpyRegistry=jRequire.SpyRegistry(j$);j$.SpyStrategy=jRequire.SpyStrategy();j$.Suite=jRequire.Suite();j$.Timer=jRequire.Timer();j$.version=jRequire.version();j$.matchers=jRequire.requireMatchers(jRequire,j$);return j$};return getJasmineRequire}(this);getJasmineRequireObj().requireMatchers=function(jRequire,j$){var availableMatchers=["toBe","toBeCloseTo","toBeDefined","toBeFalsy","toBeGreaterThan","toBeLessThan","toBeNaN","toBeNull","toBeTruthy","toBeUndefined","toContain","toEqual","toHaveBeenCalled","toHaveBeenCalledWith","toMatch","toThrow","toThrowError"],matchers={};for(var i=0;i<availableMatchers.length;i++){var name=availableMatchers[i];matchers[name]=jRequire[name](j$)}return matchers};getJasmineRequireObj().base=function(j$,jasmineGlobal){j$.unimplementedMethod_=function(){throw new Error("unimplemented method")};j$.MAX_PRETTY_PRINT_DEPTH=40;j$.MAX_PRETTY_PRINT_ARRAY_LENGTH=100;j$.DEFAULT_TIMEOUT_INTERVAL=5e3;j$.getGlobal=function(){return jasmineGlobal};j$.getEnv=function(options){var env=j$.currentEnv_=j$.currentEnv_||new j$.Env(options);return env};j$.isArray_=function(value){return j$.isA_("Array",value)};j$.isString_=function(value){return j$.isA_("String",value)};j$.isNumber_=function(value){return j$.isA_("Number",value)};j$.isA_=function(typeName,value){return Object.prototype.toString.apply(value)==="[object "+typeName+"]"};j$.isDomNode=function(obj){return obj.nodeType>0};j$.any=function(clazz){return new j$.Any(clazz)};j$.objectContaining=function(sample){return new j$.ObjectContaining(sample)};j$.createSpy=function(name,originalFn){var spyStrategy=new j$.SpyStrategy({name:name,fn:originalFn,getSpy:function(){return spy}}),callTracker=new j$.CallTracker,spy=function(){var callData={object:this,args:Array.prototype.slice.apply(arguments)};callTracker.track(callData);var returnValue=spyStrategy.exec.apply(this,arguments);callData.returnValue=returnValue;return returnValue};for(var prop in originalFn){if(prop==="and"||prop==="calls"){throw new Error("Jasmine spies would overwrite the 'and' and 'calls' properties on the object being spied upon")}spy[prop]=originalFn[prop]}spy.and=spyStrategy;spy.calls=callTracker;return spy};j$.isSpy=function(putativeSpy){if(!putativeSpy){return false}return putativeSpy.and instanceof j$.SpyStrategy&&putativeSpy.calls instanceof j$.CallTracker};j$.createSpyObj=function(baseName,methodNames){if(!j$.isArray_(methodNames)||methodNames.length===0){throw"createSpyObj requires a non-empty array of method names to create spies for"}var obj={};for(var i=0;i<methodNames.length;i++){obj[methodNames[i]]=j$.createSpy(baseName+"."+methodNames[i])}return obj}};getJasmineRequireObj().util=function(){var util={};util.inherit=function(childClass,parentClass){var Subclass=function(){};Subclass.prototype=parentClass.prototype;childClass.prototype=new Subclass};util.htmlEscape=function(str){if(!str){return str}return str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")};util.argsToArray=function(args){var arrayOfArgs=[];for(var i=0;i<args.length;i++){arrayOfArgs.push(args[i])}return arrayOfArgs};util.isUndefined=function(obj){return obj===void 0};util.arrayContains=function(array,search){var i=array.length;while(i--){if(array[i]===search){return true}}return false};util.clone=function(obj){if(Object.prototype.toString.apply(obj)==="[object Array]"){return obj.slice()}var cloned={};for(var prop in obj){if(obj.hasOwnProperty(prop)){cloned[prop]=obj[prop]}}return cloned};return util};getJasmineRequireObj().Spec=function(j$){function Spec(attrs){this.expectationFactory=attrs.expectationFactory;this.resultCallback=attrs.resultCallback||function(){};this.id=attrs.id;this.description=attrs.description||"";this.queueableFn=attrs.queueableFn;this.beforeAndAfterFns=attrs.beforeAndAfterFns||function(){return{befores:[],afters:[]}};this.userContext=attrs.userContext||function(){return{}};this.onStart=attrs.onStart||function(){};this.getSpecName=attrs.getSpecName||function(){return""};this.expectationResultFactory=attrs.expectationResultFactory||function(){};this.queueRunnerFactory=attrs.queueRunnerFactory||function(){};this.catchingExceptions=attrs.catchingExceptions||function(){return true};if(!this.queueableFn.fn){this.pend()}this.result={id:this.id,description:this.description,fullName:this.getFullName(),failedExpectations:[],passedExpectations:[]}}Spec.prototype.addExpectationResult=function(passed,data){var expectationResult=this.expectationResultFactory(data);if(passed){this.result.passedExpectations.push(expectationResult)}else{this.result.failedExpectations.push(expectationResult)}};Spec.prototype.expect=function(actual){return this.expectationFactory(actual,this)};Spec.prototype.execute=function(onComplete){var self=this;this.onStart(this);if(this.markedPending||this.disabled){complete();return}var fns=this.beforeAndAfterFns();var allFns=fns.befores.concat(this.queueableFn).concat(fns.afters);this.queueRunnerFactory({queueableFns:allFns,onException:function(){self.onException.apply(self,arguments)},onComplete:complete,userContext:this.userContext()});function complete(){self.result.status=self.status();self.resultCallback(self.result);if(onComplete){onComplete()}}};Spec.prototype.onException=function onException(e){if(Spec.isPendingSpecException(e)){this.pend();return}this.addExpectationResult(false,{matcherName:"",passed:false,expected:"",actual:"",error:e})};Spec.prototype.disable=function(){this.disabled=true};Spec.prototype.pend=function(){this.markedPending=true};Spec.prototype.status=function(){if(this.disabled){return"disabled"}if(this.markedPending){return"pending"}if(this.result.failedExpectations.length>0){return"failed"}else{return"passed"}};Spec.prototype.isExecutable=function(){return!this.disabled&&!this.markedPending};Spec.prototype.getFullName=function(){return this.getSpecName(this)};Spec.pendingSpecExceptionMessage="=> marked Pending";Spec.isPendingSpecException=function(e){return!!(e&&e.toString&&e.toString().indexOf(Spec.pendingSpecExceptionMessage)!==-1)};return Spec};if(typeof window==void 0&&typeof exports=="object"){exports.Spec=jasmineRequire.Spec}getJasmineRequireObj().Env=function(j$){function Env(options){options=options||{};var self=this;var global=options.global||j$.getGlobal();var totalSpecsDefined=0;var catchExceptions=true;var realSetTimeout=j$.getGlobal().setTimeout;var realClearTimeout=j$.getGlobal().clearTimeout;this.clock=new j$.Clock(global,new j$.DelayedFunctionScheduler,new j$.MockDate(global));var runnableLookupTable={};var runnableResources={};var currentSpec=null;var currentlyExecutingSuites=[];var currentDeclarationSuite=null;var currentSuite=function(){return currentlyExecutingSuites[currentlyExecutingSuites.length-1]};var currentRunnable=function(){return currentSpec||currentSuite()};var reporter=new j$.ReportDispatcher(["jasmineStarted","jasmineDone","suiteStarted","suiteDone","specStarted","specDone"]);this.specFilter=function(){return true};this.addCustomEqualityTester=function(tester){if(!currentRunnable()){throw new Error("Custom Equalities must be added in a before function or a spec")}runnableResources[currentRunnable().id].customEqualityTesters.push(tester)};this.addMatchers=function(matchersToAdd){if(!currentRunnable()){throw new Error("Matchers must be added in a before function or a spec")}var customMatchers=runnableResources[currentRunnable().id].customMatchers;for(var matcherName in matchersToAdd){customMatchers[matcherName]=matchersToAdd[matcherName]}};j$.Expectation.addCoreMatchers(j$.matchers);var nextSpecId=0;var getNextSpecId=function(){return"spec"+nextSpecId++};var nextSuiteId=0;var getNextSuiteId=function(){return"suite"+nextSuiteId++};var expectationFactory=function(actual,spec){return j$.Expectation.Factory({util:j$.matchersUtil,customEqualityTesters:runnableResources[spec.id].customEqualityTesters,customMatchers:runnableResources[spec.id].customMatchers,actual:actual,addExpectationResult:addExpectationResult});function addExpectationResult(passed,result){return spec.addExpectationResult(passed,result)}};var defaultResourcesForRunnable=function(id,parentRunnableId){var resources={spies:[],customEqualityTesters:[],customMatchers:{}};if(runnableResources[parentRunnableId]){resources.customEqualityTesters=j$.util.clone(runnableResources[parentRunnableId].customEqualityTesters);resources.customMatchers=j$.util.clone(runnableResources[parentRunnableId].customMatchers)}runnableResources[id]=resources};var clearResourcesForRunnable=function(id){spyRegistry.clearSpies();delete runnableResources[id]};var beforeAndAfterFns=function(suite,runnablesExplictlySet){return function(){var befores=[],afters=[],beforeAlls=[],afterAlls=[];while(suite){befores=befores.concat(suite.beforeFns);afters=afters.concat(suite.afterFns);if(runnablesExplictlySet()){beforeAlls=beforeAlls.concat(suite.beforeAllFns);afterAlls=afterAlls.concat(suite.afterAllFns)}suite=suite.parentSuite}return{befores:beforeAlls.reverse().concat(befores.reverse()),afters:afters.concat(afterAlls)}}};var getSpecName=function(spec,suite){return suite.getFullName()+" "+spec.description};var buildExpectationResult=j$.buildExpectationResult,exceptionFormatter=new j$.ExceptionFormatter,expectationResultFactory=function(attrs){attrs.messageFormatter=exceptionFormatter.message;attrs.stackFormatter=exceptionFormatter.stack;return buildExpectationResult(attrs)};this.catchExceptions=function(value){catchExceptions=!!value;return catchExceptions};this.catchingExceptions=function(){return catchExceptions};var maximumSpecCallbackDepth=20;var currentSpecCallbackDepth=0;function clearStack(fn){currentSpecCallbackDepth++;if(currentSpecCallbackDepth>=maximumSpecCallbackDepth){currentSpecCallbackDepth=0;realSetTimeout(fn,0)}else{fn()}}var catchException=function(e){return j$.Spec.isPendingSpecException(e)||catchExceptions};var queueRunnerFactory=function(options){options.catchException=catchException;options.clearStack=options.clearStack||clearStack;options.timer={setTimeout:realSetTimeout,clearTimeout:realClearTimeout};options.fail=self.fail;new j$.QueueRunner(options).execute()};var topSuite=new j$.Suite({env:this,id:getNextSuiteId(),description:"Jasmine__TopLevel__Suite",queueRunner:queueRunnerFactory});runnableLookupTable[topSuite.id]=topSuite;defaultResourcesForRunnable(topSuite.id);currentDeclarationSuite=topSuite;this.topSuite=function(){return topSuite};this.execute=function(runnablesToRun){if(runnablesToRun){runnablesExplictlySet=true}else if(focusedRunnables.length){runnablesExplictlySet=true;runnablesToRun=focusedRunnables}else{runnablesToRun=[topSuite.id]}var allFns=[];for(var i=0;i<runnablesToRun.length;i++){var runnable=runnableLookupTable[runnablesToRun[i]];allFns.push(function(runnable){return{fn:function(done){runnable.execute(done)}}}(runnable))}reporter.jasmineStarted({totalSpecsDefined:totalSpecsDefined});queueRunnerFactory({queueableFns:allFns,onComplete:reporter.jasmineDone})};this.addReporter=function(reporterToAdd){reporter.addReporter(reporterToAdd)};var spyRegistry=new j$.SpyRegistry({currentSpies:function(){if(!currentRunnable()){throw new Error("Spies must be created in a before function or a spec")}return runnableResources[currentRunnable().id].spies}});this.spyOn=function(){return spyRegistry.spyOn.apply(spyRegistry,arguments)};var suiteFactory=function(description){var suite=new j$.Suite({env:self,id:getNextSuiteId(),description:description,parentSuite:currentDeclarationSuite,queueRunner:queueRunnerFactory,onStart:suiteStarted,expectationFactory:expectationFactory,expectationResultFactory:expectationResultFactory,resultCallback:function(attrs){if(!suite.disabled){clearResourcesForRunnable(suite.id);currentlyExecutingSuites.pop()}reporter.suiteDone(attrs)}});runnableLookupTable[suite.id]=suite;return suite;function suiteStarted(suite){currentlyExecutingSuites.push(suite);defaultResourcesForRunnable(suite.id,suite.parentSuite.id);reporter.suiteStarted(suite.result)}};this.describe=function(description,specDefinitions){var suite=suiteFactory(description);addSpecsToSuite(suite,specDefinitions);return suite};this.xdescribe=function(description,specDefinitions){var suite=this.describe(description,specDefinitions);suite.disable();return suite};var focusedRunnables=[];this.fdescribe=function(description,specDefinitions){var suite=suiteFactory(description);suite.isFocused=true;focusedRunnables.push(suite.id);unfocusAncestor();addSpecsToSuite(suite,specDefinitions);return suite};function addSpecsToSuite(suite,specDefinitions){var parentSuite=currentDeclarationSuite;parentSuite.addChild(suite);currentDeclarationSuite=suite;var declarationError=null;try{specDefinitions.call(suite)}catch(e){declarationError=e}if(declarationError){self.it("encountered a declaration exception",function(){throw declarationError})}currentDeclarationSuite=parentSuite}function findFocusedAncestor(suite){while(suite){if(suite.isFocused){return suite.id}suite=suite.parentSuite}return null}function unfocusAncestor(){var focusedAncestor=findFocusedAncestor(currentDeclarationSuite);if(focusedAncestor){for(var i=0;i<focusedRunnables.length;i++){if(focusedRunnables[i]===focusedAncestor){focusedRunnables.splice(i,1);break}}}}var runnablesExplictlySet=false;var runnablesExplictlySetGetter=function(){return runnablesExplictlySet};var specFactory=function(description,fn,suite,timeout){totalSpecsDefined++;var spec=new j$.Spec({id:getNextSpecId(),beforeAndAfterFns:beforeAndAfterFns(suite,runnablesExplictlySetGetter),expectationFactory:expectationFactory,resultCallback:specResultCallback,getSpecName:function(spec){return getSpecName(spec,suite)},onStart:specStarted,description:description,expectationResultFactory:expectationResultFactory,queueRunnerFactory:queueRunnerFactory,userContext:function(){return suite.clonedSharedUserContext()},queueableFn:{fn:fn,timeout:function(){return timeout||j$.DEFAULT_TIMEOUT_INTERVAL}}});runnableLookupTable[spec.id]=spec;if(!self.specFilter(spec)){spec.disable()}return spec;function specResultCallback(result){clearResourcesForRunnable(spec.id);currentSpec=null;reporter.specDone(result)}function specStarted(spec){currentSpec=spec;defaultResourcesForRunnable(spec.id,suite.id);reporter.specStarted(spec.result)}};this.it=function(description,fn,timeout){var spec=specFactory(description,fn,currentDeclarationSuite,timeout);currentDeclarationSuite.addChild(spec);return spec};this.xit=function(){var spec=this.it.apply(this,arguments);spec.pend();return spec};this.fit=function(){var spec=this.it.apply(this,arguments);focusedRunnables.push(spec.id);unfocusAncestor();return spec};this.expect=function(actual){if(!currentRunnable()){throw new Error("'expect' was used when there was no current spec, this could be because an asynchronous test timed out")}return currentRunnable().expect(actual)};this.beforeEach=function(beforeEachFunction,timeout){currentDeclarationSuite.beforeEach({fn:beforeEachFunction,timeout:function(){return timeout||j$.DEFAULT_TIMEOUT_INTERVAL}})};this.beforeAll=function(beforeAllFunction,timeout){currentDeclarationSuite.beforeAll({fn:beforeAllFunction,timeout:function(){return timeout||j$.DEFAULT_TIMEOUT_INTERVAL}})};this.afterEach=function(afterEachFunction,timeout){currentDeclarationSuite.afterEach({fn:afterEachFunction,timeout:function(){return timeout||j$.DEFAULT_TIMEOUT_INTERVAL}})};this.afterAll=function(afterAllFunction,timeout){currentDeclarationSuite.afterAll({fn:afterAllFunction,timeout:function(){return timeout||j$.DEFAULT_TIMEOUT_INTERVAL}})};this.pending=function(){throw j$.Spec.pendingSpecExceptionMessage};this.fail=function(error){var message="Failed";if(error){message+=": ";message+=error.message||error}currentRunnable().addExpectationResult(false,{matcherName:"",passed:false,expected:"",actual:"",message:message})}}return Env};getJasmineRequireObj().JsApiReporter=function(){var noopTimer={start:function(){},elapsed:function(){return 0}};function JsApiReporter(options){var timer=options.timer||noopTimer,status="loaded";this.started=false;this.finished=false;this.jasmineStarted=function(){this.started=true;status="started";timer.start()};var executionTime;this.jasmineDone=function(){this.finished=true;executionTime=timer.elapsed();status="done"};this.status=function(){return status};var suites=[],suites_hash={};this.suiteStarted=function(result){suites_hash[result.id]=result};this.suiteDone=function(result){storeSuite(result)};this.suiteResults=function(index,length){return suites.slice(index,index+length)};function storeSuite(result){suites.push(result);suites_hash[result.id]=result}this.suites=function(){return suites_hash};var specs=[];this.specDone=function(result){specs.push(result)};this.specResults=function(index,length){return specs.slice(index,index+length)};this.specs=function(){return specs};this.executionTime=function(){return executionTime}}return JsApiReporter};getJasmineRequireObj().Any=function(){function Any(expectedObject){this.expectedObject=expectedObject}Any.prototype.jasmineMatches=function(other){if(this.expectedObject==String){return typeof other=="string"||other instanceof String}if(this.expectedObject==Number){return typeof other=="number"||other instanceof Number}if(this.expectedObject==Function){return typeof other=="function"||other instanceof Function}if(this.expectedObject==Object){return typeof other=="object"}if(this.expectedObject==Boolean){return typeof other=="boolean"}return other instanceof this.expectedObject};Any.prototype.jasmineToString=function(){return"<jasmine.any("+this.expectedObject+")>"};return Any};getJasmineRequireObj().CallTracker=function(){function CallTracker(){var calls=[];this.track=function(context){calls.push(context)};this.any=function(){return!!calls.length};this.count=function(){return calls.length};this.argsFor=function(index){var call=calls[index];return call?call.args:[]};this.all=function(){return calls};this.allArgs=function(){var callArgs=[];for(var i=0;i<calls.length;i++){callArgs.push(calls[i].args)}return callArgs};this.first=function(){return calls[0]};this.mostRecent=function(){return calls[calls.length-1]};this.reset=function(){calls=[]}}return CallTracker};getJasmineRequireObj().Clock=function(){function Clock(global,delayedFunctionScheduler,mockDate){var self=this,realTimingFunctions={setTimeout:global.setTimeout,clearTimeout:global.clearTimeout,setInterval:global.setInterval,clearInterval:global.clearInterval},fakeTimingFunctions={setTimeout:setTimeout,clearTimeout:clearTimeout,setInterval:setInterval,clearInterval:clearInterval},installed=false,timer;self.install=function(){replace(global,fakeTimingFunctions);timer=fakeTimingFunctions;installed=true;return self};self.uninstall=function(){delayedFunctionScheduler.reset();mockDate.uninstall();replace(global,realTimingFunctions);timer=realTimingFunctions;installed=false};self.mockDate=function(initialDate){mockDate.install(initialDate)};self.setTimeout=function(fn,delay,params){if(legacyIE()){if(arguments.length>2){throw new Error("IE < 9 cannot support extra params to setTimeout without a polyfill")}return timer.setTimeout(fn,delay)}return Function.prototype.apply.apply(timer.setTimeout,[global,arguments])};self.setInterval=function(fn,delay,params){if(legacyIE()){if(arguments.length>2){throw new Error("IE < 9 cannot support extra params to setInterval without a polyfill")}return timer.setInterval(fn,delay)}return Function.prototype.apply.apply(timer.setInterval,[global,arguments])};self.clearTimeout=function(id){return Function.prototype.call.apply(timer.clearTimeout,[global,id])};self.clearInterval=function(id){return Function.prototype.call.apply(timer.clearInterval,[global,id])};self.tick=function(millis){if(installed){mockDate.tick(millis);delayedFunctionScheduler.tick(millis)}else{throw new Error("Mock clock is not installed, use jasmine.clock().install()")}};return self;function legacyIE(){return!(realTimingFunctions.setTimeout||realTimingFunctions.setInterval).apply}function replace(dest,source){for(var prop in source){dest[prop]=source[prop]}}function setTimeout(fn,delay){return delayedFunctionScheduler.scheduleFunction(fn,delay,argSlice(arguments,2))}function clearTimeout(id){return delayedFunctionScheduler.removeFunctionWithId(id)}function setInterval(fn,interval){return delayedFunctionScheduler.scheduleFunction(fn,interval,argSlice(arguments,2),true)}function clearInterval(id){return delayedFunctionScheduler.removeFunctionWithId(id)}function argSlice(argsObj,n){return Array.prototype.slice.call(argsObj,n)}}return Clock};getJasmineRequireObj().DelayedFunctionScheduler=function(){function DelayedFunctionScheduler(){var self=this;var scheduledLookup=[];var scheduledFunctions={};var currentTime=0;var delayedFnCount=0;self.tick=function(millis){millis=millis||0;var endTime=currentTime+millis;runScheduledFunctions(endTime);currentTime=endTime};self.scheduleFunction=function(funcToCall,millis,params,recurring,timeoutKey,runAtMillis){var f;if(typeof funcToCall==="string"){f=function(){return eval(funcToCall)}}else{f=funcToCall}millis=millis||0;timeoutKey=timeoutKey||++delayedFnCount;runAtMillis=runAtMillis||currentTime+millis;var funcToSchedule={runAtMillis:runAtMillis,funcToCall:f,recurring:recurring,params:params,timeoutKey:timeoutKey,millis:millis};if(runAtMillis in scheduledFunctions){scheduledFunctions[runAtMillis].push(funcToSchedule)}else{scheduledFunctions[runAtMillis]=[funcToSchedule];scheduledLookup.push(runAtMillis);scheduledLookup.sort(function(a,b){return a-b})}return timeoutKey};self.removeFunctionWithId=function(timeoutKey){for(var runAtMillis in scheduledFunctions){var funcs=scheduledFunctions[runAtMillis];var i=indexOfFirstToPass(funcs,function(func){return func.timeoutKey===timeoutKey});if(i>-1){if(funcs.length===1){delete scheduledFunctions[runAtMillis];deleteFromLookup(runAtMillis)}else{funcs.splice(i,1)}break}}};self.reset=function(){currentTime=0;scheduledLookup=[];scheduledFunctions={};delayedFnCount=0};return self;function indexOfFirstToPass(array,testFn){var index=-1;for(var i=0;i<array.length;++i){if(testFn(array[i])){index=i;break}}return index}function deleteFromLookup(key){var value=Number(key);var i=indexOfFirstToPass(scheduledLookup,function(millis){return millis===value});if(i>-1){scheduledLookup.splice(i,1)}}function reschedule(scheduledFn){self.scheduleFunction(scheduledFn.funcToCall,scheduledFn.millis,scheduledFn.params,true,scheduledFn.timeoutKey,scheduledFn.runAtMillis+scheduledFn.millis)}function runScheduledFunctions(endTime){if(scheduledLookup.length===0||scheduledLookup[0]>endTime){return}do{currentTime=scheduledLookup.shift();var funcsToRun=scheduledFunctions[currentTime];delete scheduledFunctions[currentTime];for(var i=0;i<funcsToRun.length;++i){var funcToRun=funcsToRun[i];if(funcToRun.recurring){reschedule(funcToRun)}funcToRun.funcToCall.apply(null,funcToRun.params||[])}}while(scheduledLookup.length>0&&currentTime!==endTime&&scheduledLookup[0]<=endTime)}}return DelayedFunctionScheduler};getJasmineRequireObj().ExceptionFormatter=function(){function ExceptionFormatter(){this.message=function(error){var message="";if(error.name&&error.message){message+=error.name+": "+error.message}else{message+=error.toString()+" thrown"}if(error.fileName||error.sourceURL){message+=" in "+(error.fileName||error.sourceURL)}if(error.line||error.lineNumber){message+=" (line "+(error.line||error.lineNumber)+")"}return message};this.stack=function(error){return error?error.stack:null}}return ExceptionFormatter};getJasmineRequireObj().Expectation=function(){function Expectation(options){this.util=options.util||{buildFailureMessage:function(){}};this.customEqualityTesters=options.customEqualityTesters||[];this.actual=options.actual;this.addExpectationResult=options.addExpectationResult||function(){};this.isNot=options.isNot;var customMatchers=options.customMatchers||{};for(var matcherName in customMatchers){this[matcherName]=Expectation.prototype.wrapCompare(matcherName,customMatchers[matcherName])}}Expectation.prototype.wrapCompare=function(name,matcherFactory){return function(){var args=Array.prototype.slice.call(arguments,0),expected=args.slice(0),message="";args.unshift(this.actual);var matcher=matcherFactory(this.util,this.customEqualityTesters),matcherCompare=matcher.compare;function defaultNegativeCompare(){var result=matcher.compare.apply(null,args);result.pass=!result.pass;return result}if(this.isNot){matcherCompare=matcher.negativeCompare||defaultNegativeCompare}var result=matcherCompare.apply(null,args);if(!result.pass){if(!result.message){args.unshift(this.isNot);args.unshift(name);message=this.util.buildFailureMessage.apply(null,args)}else{if(Object.prototype.toString.apply(result.message)==="[object Function]"){message=result.message()}else{message=result.message}}}if(expected.length==1){expected=expected[0]}this.addExpectationResult(result.pass,{matcherName:name,passed:result.pass,message:message,actual:this.actual,expected:expected})}};Expectation.addCoreMatchers=function(matchers){var prototype=Expectation.prototype;for(var matcherName in matchers){var matcher=matchers[matcherName];prototype[matcherName]=prototype.wrapCompare(matcherName,matcher)}};Expectation.Factory=function(options){options=options||{};var expect=new Expectation(options);options.isNot=true;expect.not=new Expectation(options);return expect};return Expectation};getJasmineRequireObj().buildExpectationResult=function(){function buildExpectationResult(options){var messageFormatter=options.messageFormatter||function(){},stackFormatter=options.stackFormatter||function(){};var result={matcherName:options.matcherName,message:message(),stack:stack(),passed:options.passed};if(!result.passed){result.expected=options.expected;result.actual=options.actual}return result;function message(){if(options.passed){return"Passed."}else if(options.message){return options.message}else if(options.error){return messageFormatter(options.error)}return""}function stack(){if(options.passed){return""}var error=options.error;if(!error){try{throw new Error(message())}catch(e){error=e}}return stackFormatter(error)}}return buildExpectationResult};getJasmineRequireObj().MockDate=function(){function MockDate(global){var self=this;var currentTime=0;if(!global||!global.Date){self.install=function(){};self.tick=function(){};self.uninstall=function(){};return self}var GlobalDate=global.Date;self.install=function(mockDate){if(mockDate instanceof GlobalDate){currentTime=mockDate.getTime()}else{currentTime=(new GlobalDate).getTime()}global.Date=FakeDate};self.tick=function(millis){millis=millis||0;currentTime=currentTime+millis};self.uninstall=function(){currentTime=0;global.Date=GlobalDate};createDateProperties();return self;function FakeDate(){switch(arguments.length){case 0:return new GlobalDate(currentTime);case 1:return new GlobalDate(arguments[0]);case 2:return new GlobalDate(arguments[0],arguments[1]);case 3:return new GlobalDate(arguments[0],arguments[1],arguments[2]);case 4:return new GlobalDate(arguments[0],arguments[1],arguments[2],arguments[3]);case 5:return new GlobalDate(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4]);case 6:return new GlobalDate(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]);case 7:return new GlobalDate(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5],arguments[6])}}function createDateProperties(){FakeDate.prototype=GlobalDate.prototype;FakeDate.now=function(){if(GlobalDate.now){return currentTime}else{throw new Error("Browser does not support Date.now()")}};FakeDate.toSource=GlobalDate.toSource;FakeDate.toString=GlobalDate.toString;FakeDate.parse=GlobalDate.parse;FakeDate.UTC=GlobalDate.UTC}}return MockDate};getJasmineRequireObj().ObjectContaining=function(j$){function ObjectContaining(sample){this.sample=sample}ObjectContaining.prototype.jasmineMatches=function(other,mismatchKeys,mismatchValues){if(typeof this.sample!=="object"){throw new Error("You must provide an object to objectContaining, not '"+this.sample+"'.")}mismatchKeys=mismatchKeys||[];mismatchValues=mismatchValues||[];var hasKey=function(obj,keyName){return obj!==null&&!j$.util.isUndefined(obj[keyName])};for(var property in this.sample){if(!hasKey(other,property)&&hasKey(this.sample,property)){mismatchKeys.push("expected has key '"+property+"', but missing from actual.")}else if(!j$.matchersUtil.equals(other[property],this.sample[property])){mismatchValues.push("'"+property+"' was '"+(other[property]?j$.util.htmlEscape(other[property].toString()):other[property])+"' in actual, but was '"+(this.sample[property]?j$.util.htmlEscape(this.sample[property].toString()):this.sample[property])+"' in expected.")}}return mismatchKeys.length===0&&mismatchValues.length===0};ObjectContaining.prototype.jasmineToString=function(){return"<jasmine.objectContaining("+j$.pp(this.sample)+")>"};return ObjectContaining};getJasmineRequireObj().pp=function(j$){function PrettyPrinter(){this.ppNestLevel_=0;this.seen=[]}PrettyPrinter.prototype.format=function(value){this.ppNestLevel_++;try{if(j$.util.isUndefined(value)){this.emitScalar("undefined")}else if(value===null){this.emitScalar("null")}else if(value===0&&1/value===-Infinity){this.emitScalar("-0")}else if(value===j$.getGlobal()){this.emitScalar("<global>")}else if(value.jasmineToString){this.emitScalar(value.jasmineToString())}else if(typeof value==="string"){this.emitString(value)}else if(j$.isSpy(value)){this.emitScalar("spy on "+value.and.identity())}else if(value instanceof RegExp){this.emitScalar(value.toString())}else if(typeof value==="function"){this.emitScalar("Function")}else if(typeof value.nodeType==="number"){this.emitScalar("HTMLNode")}else if(value instanceof Date){this.emitScalar("Date("+value+")")}else if(j$.util.arrayContains(this.seen,value)){this.emitScalar("<circular reference: "+(j$.isArray_(value)?"Array":"Object")+">")}else if(j$.isArray_(value)||j$.isA_("Object",value)){this.seen.push(value);if(j$.isArray_(value)){this.emitArray(value)}else{this.emitObject(value)}this.seen.pop()}else{this.emitScalar(value.toString())}}finally{this.ppNestLevel_--}};PrettyPrinter.prototype.iterateObject=function(obj,fn){for(var property in obj){if(!Object.prototype.hasOwnProperty.call(obj,property)){continue}fn(property,obj.__lookupGetter__?!j$.util.isUndefined(obj.__lookupGetter__(property))&&obj.__lookupGetter__(property)!==null:false)}};PrettyPrinter.prototype.emitArray=j$.unimplementedMethod_;PrettyPrinter.prototype.emitObject=j$.unimplementedMethod_;PrettyPrinter.prototype.emitScalar=j$.unimplementedMethod_;PrettyPrinter.prototype.emitString=j$.unimplementedMethod_;function StringPrettyPrinter(){PrettyPrinter.call(this);this.string=""}j$.util.inherit(StringPrettyPrinter,PrettyPrinter);StringPrettyPrinter.prototype.emitScalar=function(value){this.append(value)};StringPrettyPrinter.prototype.emitString=function(value){this.append("'"+value+"'")};StringPrettyPrinter.prototype.emitArray=function(array){if(this.ppNestLevel_>j$.MAX_PRETTY_PRINT_DEPTH){this.append("Array");
return}var length=Math.min(array.length,j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);this.append("[ ");for(var i=0;i<length;i++){if(i>0){this.append(", ")}this.format(array[i])}if(array.length>length){this.append(", ...")}this.append(" ]")};StringPrettyPrinter.prototype.emitObject=function(obj){if(this.ppNestLevel_>j$.MAX_PRETTY_PRINT_DEPTH){this.append("Object");return}var self=this;this.append("{ ");var first=true;this.iterateObject(obj,function(property,isGetter){if(first){first=false}else{self.append(", ")}self.append(property);self.append(": ");if(isGetter){self.append("<getter>")}else{self.format(obj[property])}});this.append(" }")};StringPrettyPrinter.prototype.append=function(value){this.string+=value};return function(value){var stringPrettyPrinter=new StringPrettyPrinter;stringPrettyPrinter.format(value);return stringPrettyPrinter.string}};getJasmineRequireObj().QueueRunner=function(j$){function once(fn){var called=false;return function(){if(!called){called=true;fn()}}}function QueueRunner(attrs){this.queueableFns=attrs.queueableFns||[];this.onComplete=attrs.onComplete||function(){};this.clearStack=attrs.clearStack||function(fn){fn()};this.onException=attrs.onException||function(){};this.catchException=attrs.catchException||function(){return true};this.userContext=attrs.userContext||{};this.timer=attrs.timeout||{setTimeout:setTimeout,clearTimeout:clearTimeout};this.fail=attrs.fail||function(){}}QueueRunner.prototype.execute=function(){this.run(this.queueableFns,0)};QueueRunner.prototype.run=function(queueableFns,recursiveIndex){var length=queueableFns.length,self=this,iterativeIndex;for(iterativeIndex=recursiveIndex;iterativeIndex<length;iterativeIndex++){var queueableFn=queueableFns[iterativeIndex];if(queueableFn.fn.length>0){return attemptAsync(queueableFn)}else{attemptSync(queueableFn)}}var runnerDone=iterativeIndex>=length;if(runnerDone){this.clearStack(this.onComplete)}function attemptSync(queueableFn){try{queueableFn.fn.call(self.userContext)}catch(e){handleException(e,queueableFn)}}function attemptAsync(queueableFn){var clearTimeout=function(){Function.prototype.apply.apply(self.timer.clearTimeout,[j$.getGlobal(),[timeoutId]])},next=once(function(){clearTimeout(timeoutId);self.run(queueableFns,iterativeIndex+1)}),timeoutId;next.fail=function(){self.fail.apply(null,arguments);next()};if(queueableFn.timeout){timeoutId=Function.prototype.apply.apply(self.timer.setTimeout,[j$.getGlobal(),[function(){var error=new Error("Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.");onException(error,queueableFn);next()},queueableFn.timeout()]])}try{queueableFn.fn.call(self.userContext,next)}catch(e){handleException(e,queueableFn);next()}}function onException(e,queueableFn){self.onException(e)}function handleException(e,queueableFn){onException(e,queueableFn);if(!self.catchException(e)){throw e}}};return QueueRunner};getJasmineRequireObj().ReportDispatcher=function(){function ReportDispatcher(methods){var dispatchedMethods=methods||[];for(var i=0;i<dispatchedMethods.length;i++){var method=dispatchedMethods[i];this[method]=function(m){return function(){dispatch(m,arguments)}}(method)}var reporters=[];this.addReporter=function(reporter){reporters.push(reporter)};return this;function dispatch(method,args){for(var i=0;i<reporters.length;i++){var reporter=reporters[i];if(reporter[method]){reporter[method].apply(reporter,args)}}}}return ReportDispatcher};getJasmineRequireObj().SpyRegistry=function(j$){function SpyRegistry(options){options=options||{};var currentSpies=options.currentSpies||function(){return[]};this.spyOn=function(obj,methodName){if(j$.util.isUndefined(obj)){throw new Error("spyOn could not find an object to spy upon for "+methodName+"()")}if(j$.util.isUndefined(obj[methodName])){throw new Error(methodName+"() method does not exist")}if(obj[methodName]&&j$.isSpy(obj[methodName])){throw new Error(methodName+" has already been spied upon")}var spy=j$.createSpy(methodName,obj[methodName]);currentSpies().push({spy:spy,baseObj:obj,methodName:methodName,originalValue:obj[methodName]});obj[methodName]=spy;return spy};this.clearSpies=function(){var spies=currentSpies();for(var i=0;i<spies.length;i++){var spyEntry=spies[i];spyEntry.baseObj[spyEntry.methodName]=spyEntry.originalValue}}}return SpyRegistry};getJasmineRequireObj().SpyStrategy=function(){function SpyStrategy(options){options=options||{};var identity=options.name||"unknown",originalFn=options.fn||function(){},getSpy=options.getSpy||function(){},plan=function(){};this.identity=function(){return identity};this.exec=function(){return plan.apply(this,arguments)};this.callThrough=function(){plan=originalFn;return getSpy()};this.returnValue=function(value){plan=function(){return value};return getSpy()};this.returnValues=function(){var values=Array.prototype.slice.call(arguments);plan=function(){return values.shift()};return getSpy()};this.throwError=function(something){var error=something instanceof Error?something:new Error(something);plan=function(){throw error};return getSpy()};this.callFake=function(fn){plan=fn;return getSpy()};this.stub=function(fn){plan=function(){};return getSpy()}}return SpyStrategy};getJasmineRequireObj().Suite=function(){function Suite(attrs){this.env=attrs.env;this.id=attrs.id;this.parentSuite=attrs.parentSuite;this.description=attrs.description;this.onStart=attrs.onStart||function(){};this.resultCallback=attrs.resultCallback||function(){};this.clearStack=attrs.clearStack||function(fn){fn()};this.expectationFactory=attrs.expectationFactory;this.expectationResultFactory=attrs.expectationResultFactory;this.beforeFns=[];this.afterFns=[];this.beforeAllFns=[];this.afterAllFns=[];this.queueRunner=attrs.queueRunner||function(){};this.disabled=false;this.children=[];this.result={id:this.id,description:this.description,fullName:this.getFullName(),failedExpectations:[]}}Suite.prototype.expect=function(actual){return this.expectationFactory(actual,this)};Suite.prototype.getFullName=function(){var fullName=this.description;for(var parentSuite=this.parentSuite;parentSuite;parentSuite=parentSuite.parentSuite){if(parentSuite.parentSuite){fullName=parentSuite.description+" "+fullName}}return fullName};Suite.prototype.disable=function(){this.disabled=true};Suite.prototype.beforeEach=function(fn){this.beforeFns.unshift(fn)};Suite.prototype.beforeAll=function(fn){this.beforeAllFns.push(fn)};Suite.prototype.afterEach=function(fn){this.afterFns.unshift(fn)};Suite.prototype.afterAll=function(fn){this.afterAllFns.push(fn)};Suite.prototype.addChild=function(child){this.children.push(child)};Suite.prototype.status=function(){if(this.disabled){return"disabled"}if(this.result.failedExpectations.length>0){return"failed"}else{return"finished"}};Suite.prototype.execute=function(onComplete){var self=this;this.onStart(this);if(this.disabled){complete();return}var allFns=[];for(var i=0;i<this.children.length;i++){allFns.push(wrapChildAsAsync(this.children[i]))}if(this.isExecutable()){allFns=this.beforeAllFns.concat(allFns);allFns=allFns.concat(this.afterAllFns)}this.queueRunner({queueableFns:allFns,onComplete:complete,userContext:this.sharedUserContext(),onException:function(){self.onException.apply(self,arguments)}});function complete(){self.result.status=self.status();self.resultCallback(self.result);if(onComplete){onComplete()}}function wrapChildAsAsync(child){return{fn:function(done){child.execute(done)}}}};Suite.prototype.isExecutable=function(){var foundActive=false;for(var i=0;i<this.children.length;i++){if(this.children[i].isExecutable()){foundActive=true;break}}return foundActive};Suite.prototype.sharedUserContext=function(){if(!this.sharedContext){this.sharedContext=this.parentSuite?clone(this.parentSuite.sharedUserContext()):{}}return this.sharedContext};Suite.prototype.clonedSharedUserContext=function(){return clone(this.sharedUserContext())};Suite.prototype.onException=function(){if(isAfterAll(this.children)){var data={matcherName:"",passed:false,expected:"",actual:"",error:arguments[0]};this.result.failedExpectations.push(this.expectationResultFactory(data))}else{for(var i=0;i<this.children.length;i++){var child=this.children[i];child.onException.apply(child,arguments)}}};Suite.prototype.addExpectationResult=function(){if(isAfterAll(this.children)&&isFailure(arguments)){var data=arguments[1];this.result.failedExpectations.push(this.expectationResultFactory(data))}else{for(var i=0;i<this.children.length;i++){var child=this.children[i];child.addExpectationResult.apply(child,arguments)}}};function isAfterAll(children){return children&&children[0].result.status}function isFailure(args){return!args[0]}function clone(obj){var clonedObj={};for(var prop in obj){if(obj.hasOwnProperty(prop)){clonedObj[prop]=obj[prop]}}return clonedObj}return Suite};if(typeof window==void 0&&typeof exports=="object"){exports.Suite=jasmineRequire.Suite}getJasmineRequireObj().Timer=function(){var defaultNow=function(Date){return function(){return(new Date).getTime()}}(Date);function Timer(options){options=options||{};var now=options.now||defaultNow,startTime;this.start=function(){startTime=now()};this.elapsed=function(){return now()-startTime}}return Timer};getJasmineRequireObj().matchersUtil=function(j$){return{equals:function(a,b,customTesters){customTesters=customTesters||[];return eq(a,b,[],[],customTesters)},contains:function(haystack,needle,customTesters){customTesters=customTesters||[];if(Object.prototype.toString.apply(haystack)==="[object Array]"||!!haystack&&!haystack.indexOf){for(var i=0;i<haystack.length;i++){if(eq(haystack[i],needle,[],[],customTesters)){return true}}return false}return!!haystack&&haystack.indexOf(needle)>=0},buildFailureMessage:function(){var args=Array.prototype.slice.call(arguments,0),matcherName=args[0],isNot=args[1],actual=args[2],expected=args.slice(3),englishyPredicate=matcherName.replace(/[A-Z]/g,function(s){return" "+s.toLowerCase()});var message="Expected "+j$.pp(actual)+(isNot?" not ":" ")+englishyPredicate;if(expected.length>0){for(var i=0;i<expected.length;i++){if(i>0){message+=","}message+=" "+j$.pp(expected[i])}}return message+"."}};function eq(a,b,aStack,bStack,customTesters){var result=true;for(var i=0;i<customTesters.length;i++){var customTesterResult=customTesters[i](a,b);if(!j$.util.isUndefined(customTesterResult)){return customTesterResult}}if(a instanceof j$.Any){result=a.jasmineMatches(b);if(result){return true}}if(b instanceof j$.Any){result=b.jasmineMatches(a);if(result){return true}}if(b instanceof j$.ObjectContaining){result=b.jasmineMatches(a);if(result){return true}}if(a instanceof Error&&b instanceof Error){return a.message==b.message}if(a===b){return a!==0||1/a==1/b}if(a===null||b===null){return a===b}var className=Object.prototype.toString.call(a);if(className!=Object.prototype.toString.call(b)){return false}switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a===0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object"){return false}var length=aStack.length;while(length--){if(aStack[length]==a){return bStack[length]==b}}aStack.push(a);bStack.push(b);var size=0;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack,customTesters))){break}}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(isFunction(aCtor)&&aCtor instanceof aCtor&&isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(has(a,key)){size++;if(!(result=has(b,key)&&eq(a[key],b[key],aStack,bStack,customTesters))){break}}}if(result){for(key in b){if(has(b,key)&&!size--){break}}result=!size}}aStack.pop();bStack.pop();return result;function has(obj,key){return obj.hasOwnProperty(key)}function isFunction(obj){return typeof obj==="function"}}};getJasmineRequireObj().toBe=function(){function toBe(){return{compare:function(actual,expected){return{pass:actual===expected}}}}return toBe};getJasmineRequireObj().toBeCloseTo=function(){function toBeCloseTo(){return{compare:function(actual,expected,precision){if(precision!==0){precision=precision||2}return{pass:Math.abs(expected-actual)<Math.pow(10,-precision)/2}}}}return toBeCloseTo};getJasmineRequireObj().toBeDefined=function(){function toBeDefined(){return{compare:function(actual){return{pass:void 0!==actual}}}}return toBeDefined};getJasmineRequireObj().toBeFalsy=function(){function toBeFalsy(){return{compare:function(actual){return{pass:!!!actual}}}}return toBeFalsy};getJasmineRequireObj().toBeGreaterThan=function(){function toBeGreaterThan(){return{compare:function(actual,expected){return{pass:actual>expected}}}}return toBeGreaterThan};getJasmineRequireObj().toBeLessThan=function(){function toBeLessThan(){return{compare:function(actual,expected){return{pass:actual<expected}}}}return toBeLessThan};getJasmineRequireObj().toBeNaN=function(j$){function toBeNaN(){return{compare:function(actual){var result={pass:actual!==actual};if(result.pass){result.message="Expected actual not to be NaN."}else{result.message=function(){return"Expected "+j$.pp(actual)+" to be NaN."}}return result}}}return toBeNaN};getJasmineRequireObj().toBeNull=function(){function toBeNull(){return{compare:function(actual){return{pass:actual===null}}}}return toBeNull};getJasmineRequireObj().toBeTruthy=function(){function toBeTruthy(){return{compare:function(actual){return{pass:!!actual}}}}return toBeTruthy};getJasmineRequireObj().toBeUndefined=function(){function toBeUndefined(){return{compare:function(actual){return{pass:void 0===actual}}}}return toBeUndefined};getJasmineRequireObj().toContain=function(){function toContain(util,customEqualityTesters){customEqualityTesters=customEqualityTesters||[];return{compare:function(actual,expected){return{pass:util.contains(actual,expected,customEqualityTesters)}}}}return toContain};getJasmineRequireObj().toEqual=function(){function toEqual(util,customEqualityTesters){customEqualityTesters=customEqualityTesters||[];return{compare:function(actual,expected){var result={pass:false};result.pass=util.equals(actual,expected,customEqualityTesters);return result}}}return toEqual};getJasmineRequireObj().toHaveBeenCalled=function(j$){function toHaveBeenCalled(){return{compare:function(actual){var result={};if(!j$.isSpy(actual)){throw new Error("Expected a spy, but got "+j$.pp(actual)+".")}if(arguments.length>1){throw new Error("toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith")}result.pass=actual.calls.any();result.message=result.pass?"Expected spy "+actual.and.identity()+" not to have been called.":"Expected spy "+actual.and.identity()+" to have been called.";return result}}}return toHaveBeenCalled};getJasmineRequireObj().toHaveBeenCalledWith=function(j$){function toHaveBeenCalledWith(util,customEqualityTesters){return{compare:function(){var args=Array.prototype.slice.call(arguments,0),actual=args[0],expectedArgs=args.slice(1),result={pass:false};if(!j$.isSpy(actual)){throw new Error("Expected a spy, but got "+j$.pp(actual)+".")}if(!actual.calls.any()){result.message=function(){return"Expected spy "+actual.and.identity()+" to have been called with "+j$.pp(expectedArgs)+" but it was never called."};return result}if(util.contains(actual.calls.allArgs(),expectedArgs,customEqualityTesters)){result.pass=true;result.message=function(){return"Expected spy "+actual.and.identity()+" not to have been called with "+j$.pp(expectedArgs)+" but it was."}}else{result.message=function(){return"Expected spy "+actual.and.identity()+" to have been called with "+j$.pp(expectedArgs)+" but actual calls were "+j$.pp(actual.calls.allArgs()).replace(/^\[ | \]$/g,"")+"."}}return result}}}return toHaveBeenCalledWith};getJasmineRequireObj().toMatch=function(){function toMatch(){return{compare:function(actual,expected){var regexp=new RegExp(expected);return{pass:regexp.test(actual)}}}}return toMatch};getJasmineRequireObj().toThrow=function(j$){function toThrow(util){return{compare:function(actual,expected){var result={pass:false},threw=false,thrown;if(typeof actual!="function"){throw new Error("Actual is not a Function")}try{actual()}catch(e){threw=true;thrown=e}if(!threw){result.message="Expected function to throw an exception.";return result}if(arguments.length==1){result.pass=true;result.message=function(){return"Expected function not to throw, but it threw "+j$.pp(thrown)+"."};return result}if(util.equals(thrown,expected)){result.pass=true;result.message=function(){return"Expected function not to throw "+j$.pp(expected)+"."}}else{result.message=function(){return"Expected function to throw "+j$.pp(expected)+", but it threw "+j$.pp(thrown)+"."}}return result}}}return toThrow};getJasmineRequireObj().toThrowError=function(j$){function toThrowError(util){return{compare:function(actual){var threw=false,pass={pass:true},fail={pass:false},thrown;if(typeof actual!="function"){throw new Error("Actual is not a Function")}var errorMatcher=getMatcher.apply(null,arguments);try{actual()}catch(e){threw=true;thrown=e}if(!threw){fail.message="Expected function to throw an Error.";return fail}if(!(thrown instanceof Error)){fail.message=function(){return"Expected function to throw an Error, but it threw "+j$.pp(thrown)+"."};return fail}if(errorMatcher.hasNoSpecifics()){pass.message="Expected function not to throw an Error, but it threw "+fnNameFor(thrown)+".";return pass}if(errorMatcher.matches(thrown)){pass.message=function(){return"Expected function not to throw "+errorMatcher.errorTypeDescription+errorMatcher.messageDescription()+"."};return pass}else{fail.message=function(){return"Expected function to throw "+errorMatcher.errorTypeDescription+errorMatcher.messageDescription()+", but it threw "+errorMatcher.thrownDescription(thrown)+"."};return fail}}};function getMatcher(){var expected=null,errorType=null;if(arguments.length==2){expected=arguments[1];if(isAnErrorType(expected)){errorType=expected;expected=null}}else if(arguments.length>2){errorType=arguments[1];expected=arguments[2];if(!isAnErrorType(errorType)){throw new Error("Expected error type is not an Error.")}}if(expected&&!isStringOrRegExp(expected)){if(errorType){throw new Error("Expected error message is not a string or RegExp.")}else{throw new Error("Expected is not an Error, string, or RegExp.")}}function messageMatch(message){if(typeof expected=="string"){return expected==message}else{return expected.test(message)}}return{errorTypeDescription:errorType?fnNameFor(errorType):"an exception",thrownDescription:function(thrown){var thrownName=errorType?fnNameFor(thrown.constructor):"an exception",thrownMessage="";if(expected){thrownMessage=" with message "+j$.pp(thrown.message)}return thrownName+thrownMessage},messageDescription:function(){if(expected===null){return""}else if(expected instanceof RegExp){return" with a message matching "+j$.pp(expected)}else{return" with message "+j$.pp(expected)}},hasNoSpecifics:function(){return expected===null&&errorType===null},matches:function(error){return(errorType===null||error.constructor===errorType)&&(expected===null||messageMatch(error.message))}}}function fnNameFor(func){return func.name||func.toString().match(/^\s*function\s*(\w*)\s*\(/)[1]}function isStringOrRegExp(potential){return potential instanceof RegExp||typeof potential=="string"}function isAnErrorType(type){if(typeof type!=="function"){return false}var Surrogate=function(){};Surrogate.prototype=type.prototype;return new Surrogate instanceof Error}}return toThrowError};getJasmineRequireObj().interface=function(jasmine,env){var jasmineInterface={describe:function(description,specDefinitions){return env.describe(description,specDefinitions)},xdescribe:function(description,specDefinitions){return env.xdescribe(description,specDefinitions)},fdescribe:function(description,specDefinitions){return env.fdescribe(description,specDefinitions)},it:function(desc,func){return env.it(desc,func)},xit:function(desc,func){return env.xit(desc,func)},fit:function(desc,func){return env.fit(desc,func)},beforeEach:function(beforeEachFunction){return env.beforeEach(beforeEachFunction)},afterEach:function(afterEachFunction){return env.afterEach(afterEachFunction)},beforeAll:function(beforeAllFunction){return env.beforeAll(beforeAllFunction)},afterAll:function(afterAllFunction){return env.afterAll(afterAllFunction)},expect:function(actual){return env.expect(actual)},pending:function(){return env.pending()},fail:function(){return env.fail.apply(env,arguments)},spyOn:function(obj,methodName){return env.spyOn(obj,methodName)},jsApiReporter:new jasmine.JsApiReporter({timer:new jasmine.Timer}),jasmine:jasmine};jasmine.addCustomEqualityTester=function(tester){env.addCustomEqualityTester(tester)};jasmine.addMatchers=function(matchers){return env.addMatchers(matchers)};jasmine.clock=function(){return env.clock};return jasmineInterface};getJasmineRequireObj().version=function(){return"2.1.3"};
jasmineRequire.html=function(j$){j$.ResultsNode=jasmineRequire.ResultsNode();j$.HtmlReporter=jasmineRequire.HtmlReporter(j$);j$.QueryString=jasmineRequire.QueryString();j$.HtmlSpecFilter=jasmineRequire.HtmlSpecFilter()};jasmineRequire.HtmlReporter=function(j$){var noopTimer={start:function(){},elapsed:function(){return 0}};function HtmlReporter(options){var env=options.env||{},getContainer=options.getContainer,createElement=options.createElement,createTextNode=options.createTextNode,onRaiseExceptionsClick=options.onRaiseExceptionsClick||function(){},timer=options.timer||noopTimer,results=[],specsExecuted=0,failureCount=0,pendingSpecCount=0,htmlReporterMain,symbols,failedSuites=[];this.initialize=function(){clearPrior();htmlReporterMain=createDom("div",{className:"jasmine_html-reporter"},createDom("div",{className:"banner"},createDom("a",{className:"title",href:"http://jasmine.github.io/",target:"_blank"}),createDom("span",{className:"version"},j$.version)),createDom("ul",{className:"symbol-summary"}),createDom("div",{className:"alert"}),createDom("div",{className:"results"},createDom("div",{className:"failures"})));getContainer().appendChild(htmlReporterMain);symbols=find(".symbol-summary")};var totalSpecsDefined;this.jasmineStarted=function(options){totalSpecsDefined=options.totalSpecsDefined||0;timer.start()};var summary=createDom("div",{className:"summary"});var topResults=new j$.ResultsNode({},"",null),currentParent=topResults;this.suiteStarted=function(result){currentParent.addChild(result,"suite");currentParent=currentParent.last()};this.suiteDone=function(result){if(result.status=="failed"){failedSuites.push(result)}if(currentParent==topResults){return}currentParent=currentParent.parent};this.specStarted=function(result){currentParent.addChild(result,"spec")};var failures=[];this.specDone=function(result){if(noExpectations(result)&&typeof console!=="undefined"&&typeof console.error!=="undefined"){console.error("Spec '"+result.fullName+"' has no expectations.")}if(result.status!="disabled"){specsExecuted++}symbols.appendChild(createDom("li",{className:noExpectations(result)?"empty":result.status,id:"spec_"+result.id,title:result.fullName}));if(result.status=="failed"){failureCount++;var failure=createDom("div",{className:"spec-detail failed"},createDom("div",{className:"description"},createDom("a",{title:result.fullName,href:specHref(result)},result.fullName)),createDom("div",{className:"messages"}));var messages=failure.childNodes[1];for(var i=0;i<result.failedExpectations.length;i++){var expectation=result.failedExpectations[i];messages.appendChild(createDom("div",{className:"result-message"},expectation.message));messages.appendChild(createDom("div",{className:"stack-trace"},expectation.stack))}failures.push(failure)}if(result.status=="pending"){pendingSpecCount++}};this.jasmineDone=function(){var banner=find(".banner");banner.appendChild(createDom("span",{className:"duration"},"finished in "+timer.elapsed()/1e3+"s"));var alert=find(".alert");alert.appendChild(createDom("span",{className:"exceptions"},createDom("label",{className:"label","for":"raise-exceptions"},"raise exceptions"),createDom("input",{className:"raise",id:"raise-exceptions",type:"checkbox"})));var checkbox=find("#raise-exceptions");checkbox.checked=!env.catchingExceptions();checkbox.onclick=onRaiseExceptionsClick;if(specsExecuted<totalSpecsDefined){var skippedMessage="Ran "+specsExecuted+" of "+totalSpecsDefined+" specs - run all";alert.appendChild(createDom("span",{className:"bar skipped"},createDom("a",{href:"?jasmine",title:"Run all specs"},skippedMessage)))}var statusBarMessage="";var statusBarClassName="bar ";if(totalSpecsDefined>0){statusBarMessage+=pluralize("spec",specsExecuted)+", "+pluralize("failure",failureCount);if(pendingSpecCount){statusBarMessage+=", "+pluralize("pending spec",pendingSpecCount)}statusBarClassName+=failureCount>0?"failed":"passed"}else{statusBarClassName+="skipped";statusBarMessage+="No specs found"}alert.appendChild(createDom("span",{className:statusBarClassName},statusBarMessage));for(i=0;i<failedSuites.length;i++){var failedSuite=failedSuites[i];for(var j=0;j<failedSuite.failedExpectations.length;j++){var errorBarMessage="AfterAll "+failedSuite.failedExpectations[j].message;var errorBarClassName="bar errored";alert.appendChild(createDom("span",{className:errorBarClassName},errorBarMessage))}}var results=find(".results");results.appendChild(summary);summaryList(topResults,summary);function summaryList(resultsTree,domParent){var specListNode;for(var i=0;i<resultsTree.children.length;i++){var resultNode=resultsTree.children[i];if(resultNode.type=="suite"){var suiteListNode=createDom("ul",{className:"suite",id:"suite-"+resultNode.result.id},createDom("li",{className:"suite-detail"},createDom("a",{href:specHref(resultNode.result)},resultNode.result.description)));summaryList(resultNode,suiteListNode);domParent.appendChild(suiteListNode)}if(resultNode.type=="spec"){if(domParent.getAttribute("class")!="specs"){specListNode=createDom("ul",{className:"specs"});domParent.appendChild(specListNode)}var specDescription=resultNode.result.description;if(noExpectations(resultNode.result)){specDescription="SPEC HAS NO EXPECTATIONS "+specDescription}specListNode.appendChild(createDom("li",{className:resultNode.result.status,id:"spec-"+resultNode.result.id},createDom("a",{href:specHref(resultNode.result)},specDescription)))}}}if(failures.length){alert.appendChild(createDom("span",{className:"menu bar spec-list"},createDom("span",{},"Spec List | "),createDom("a",{className:"failures-menu",href:"#"},"Failures")));alert.appendChild(createDom("span",{className:"menu bar failure-list"},createDom("a",{className:"spec-list-menu",href:"#"},"Spec List"),createDom("span",{}," | Failures ")));find(".failures-menu").onclick=function(){setMenuModeTo("failure-list")};find(".spec-list-menu").onclick=function(){setMenuModeTo("spec-list")};setMenuModeTo("failure-list");var failureNode=find(".failures");for(var i=0;i<failures.length;i++){failureNode.appendChild(failures[i])}}};return this;function find(selector){return getContainer().querySelector(".jasmine_html-reporter "+selector)}function clearPrior(){var oldReporter=find("");if(oldReporter){getContainer().removeChild(oldReporter)}}function createDom(type,attrs,childrenVarArgs){var el=createElement(type);for(var i=2;i<arguments.length;i++){var child=arguments[i];if(typeof child==="string"){el.appendChild(createTextNode(child))}else{if(child){el.appendChild(child)}}}for(var attr in attrs){if(attr=="className"){el[attr]=attrs[attr]}else{el.setAttribute(attr,attrs[attr])}}return el}function pluralize(singular,count){var word=count==1?singular:singular+"s";return""+count+" "+word}function specHref(result){return"?jasmine="+encodeURIComponent(result.fullName)}function setMenuModeTo(mode){htmlReporterMain.setAttribute("class","jasmine_html-reporter "+mode)}function noExpectations(result){return result.failedExpectations.length+result.passedExpectations.length===0&&result.status==="passed"}}return HtmlReporter};jasmineRequire.HtmlSpecFilter=function(){function HtmlSpecFilter(options){var filterString=options&&options.filterString()&&options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");var filterPattern=new RegExp(filterString);this.matches=function(specName){return filterPattern.test(specName)}}return HtmlSpecFilter};jasmineRequire.ResultsNode=function(){function ResultsNode(result,type,parent){this.result=result;this.type=type;this.parent=parent;this.children=[];this.addChild=function(result,type){this.children.push(new ResultsNode(result,type,this))};this.last=function(){return this.children[this.children.length-1]}}return ResultsNode};jasmineRequire.QueryString=function(){function QueryString(options){this.setParam=function(key,value){var paramMap=queryStringToParamMap();paramMap[key]=value;options.getWindowLocation().search=toQueryString(paramMap)};this.getParam=function(key){return queryStringToParamMap()[key]};return this;function toQueryString(paramMap){var qStrPairs=[];for(var prop in paramMap){qStrPairs.push(encodeURIComponent(prop)+"="+encodeURIComponent(paramMap[prop]))}return"?"+qStrPairs.join("&")}function queryStringToParamMap(){var paramStr=options.getWindowLocation().search.substring(1),params=[],paramMap={};if(paramStr.length>0){params=paramStr.split("&");for(var i=0;i<params.length;i++){var p=params[i].split("=");var value=decodeURIComponent(p[1]);if(value==="true"||value==="false"){value=JSON.parse(value)}paramMap[decodeURIComponent(p[0])]=value}}return paramMap}}return QueryString};
(function(){window.jasmine=jasmineRequire.core(jasmineRequire);jasmineRequire.html(jasmine);var env=jasmine.getEnv();var jasmineInterface=jasmineRequire.interface(jasmine,env);if(typeof window=="undefined"&&typeof exports=="object"){extend(exports,jasmineInterface)}else{extend(window,jasmineInterface)}var queryString=new jasmine.QueryString({getWindowLocation:function(){return window.location}});var catchingExceptions=queryString.getParam("catch");env.catchExceptions(typeof catchingExceptions==="undefined"?true:catchingExceptions);var htmlReporter=new jasmine.HtmlReporter({env:env,onRaiseExceptionsClick:function(){queryString.setParam("catch",!env.catchingExceptions())},getContainer:function(){return $(".jasmine").get(0)},createElement:function(){return document.createElement.apply(document,arguments)},createTextNode:function(){return document.createTextNode.apply(document,arguments)},timer:new jasmine.Timer});env.addReporter(jasmineInterface.jsApiReporter);env.addReporter(htmlReporter);var specFilter=new jasmine.HtmlSpecFilter({filterString:function(){return queryString.getParam("jasmine")=="undefined"?undefined:queryString.getParam("jasmine")}});env.specFilter=function(spec){return specFilter.matches(spec.getFullName())};window.setTimeout=window.setTimeout;window.setInterval=window.setInterval;window.clearTimeout=window.clearTimeout;window.clearInterval=window.clearInterval;window.executeJasmine=function(){htmlReporter.initialize();env.execute()};function extend(destination,source){for(var property in source)destination[property]=source[property];return destination}})();
(function(){var localStorageDumps={};jasmine.helpers={dumpStorage:function(dumpName){var realDumpName=_.isString(dumpName)?dumpName:"";localStorageDumps[realDumpName]={};var dump=localStorageDumps[realDumpName];for(var i=0,len=localStorage.length;i<len;++i){dump[localStorage.key(i)]=localStorage.getItem(localStorage.key(i))}},clearStorage:function(){localStorage.clear()},restoreStorageFromDump:function(dumpName){var realDumpName=_.isString(dumpName)?dumpName:"";var localStorageDump=localStorageDumps[realDumpName];localStorage.clear();if(_.isObject(localStorageDump)){for(var key in localStorageDump){if(localStorageDump.hasOwnProperty(key)){localStorage.setItem(key,localStorageDump[key])}}}}}})();
describe("_.isSimpleObject()",function(){it("returns true for simple objects",function(){expect(_.isSimpleObject({})).toBe(true);expect(_.isSimpleObject({x:"y"})).toBe(true)});it("returns false for not simple objects (not objects + arrays, functions, etc.)",function(){expect(_.isSimpleObject(undefined)).toBe(false);expect(_.isSimpleObject(null)).toBe(false);expect(_.isSimpleObject(1)).toBe(false);expect(_.isSimpleObject("test")).toBe(false);expect(_.isSimpleObject([])).toBe(false);expect(_.isSimpleObject([1,2,3])).toBe(false);expect(_.isSimpleObject(["foo","bar"])).toBe(false);expect(_.isSimpleObject(function(){"test"})).toBe(false);expect(_.isSimpleObject(App)).toBe(false);expect(_.isSimpleObject(new App.ContextModule.Config)).toBe(false)})});
describe("ContextModule.Config",function(){it("is promptly created",function(){var testedConfig=new App.ContextModule.Config;expect(testedConfig).not.toBe(null);expect(testedConfig.get("parameters")).not.toBe(null);expect(testedConfig.get("parameters").keys().length).toEqual(0);expect(testedConfig.get("plannedParameterUpdates")).not.toBe(null);expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(0);expect(_.isString(testedConfig.getClientId())).toBe(true)});it("is promptly created with parameters",function(){var testedConfig=new App.ContextModule.Config({parameters:{a:10,b:"test"}});expect(testedConfig.getParameterValue("a")).toEqual(10);expect(testedConfig.getParameterValue("b")).toEqual("test");expect(testedConfig.getParameterValue("c")).toEqual(undefined)});it("is promptly created with parameters and planned parameter updates",function(){var testedConfig=new App.ContextModule.Config({parameters:{a:10,b:"test"},plannedParameterUpdates:{a:20,c:true}});expect(testedConfig.getParameterValue("a")).toEqual(10);expect(testedConfig.getParameterValue("b")).toEqual("test");expect(testedConfig.getParameterValue("c")).toEqual(undefined);expect(testedConfig.getPlannedParameterValue("a")).toEqual(20);expect(testedConfig.getPlannedParameterValue("b")).toEqual("test");expect(testedConfig.getPlannedParameterValue("c")).toEqual(true)});it("sets and gets parameters instantly one by one",function(){var testedConfig=new App.ContextModule.Config;testedConfig.updateParameter("p1",10);testedConfig.updateParameter("p2",null);testedConfig.updateParameter("p3","string");testedConfig.updateParameter("p4",false);testedConfig.updateParameter("p5",["array"]);expect(testedConfig.getParameterValue("p1")).toEqual(10);expect(testedConfig.getParameterValue("p2")).toEqual(null);expect(testedConfig.getParameterValue("p3")).toEqual("string");expect(testedConfig.getParameterValue("p4")).toEqual(false);expect(testedConfig.getParameterValue("p5")).toEqual(["array"]);expect(_.size(testedConfig.attributes.parameters.attributes)).toEqual(5);testedConfig.updateParameter("p5",undefined);expect(testedConfig.getParameterValue("p5")).toEqual(undefined);expect(_.size(testedConfig.attributes.parameters.attributes)).toEqual(4);expect(function(){testedConfig.updateParameter()}).toThrow();expect(function(){testedConfig.updateParameter(1,2)}).toThrow();expect(function(){testedConfig.updateParameter(["a","b","c"])}).toThrow();expect(function(){testedConfig.updateParameter({x:1,y:2})}).toThrow()});it("sets and gets parameters instantly in bulk",function(){var testedConfig=new App.ContextModule.Config;testedConfig.updateParameters({p1:10,p2:42,p3:false,p100:undefined});expect(_.size(testedConfig.attributes.parameters.attributes)).toEqual(3);testedConfig.updateParameters({p2:null,p3:"string",p4:false,p5:["array"]});expect(testedConfig.getParameterValue("p1")).toEqual(10);expect(testedConfig.getParameterValue("p2")).toEqual(null);expect(testedConfig.getParameterValue("p3")).toEqual("string");expect(testedConfig.getParameterValue("p4")).toEqual(false);expect(testedConfig.getParameterValue("p5")).toEqual(["array"]);expect(_.size(testedConfig.attributes.parameters.attributes)).toEqual(5);testedConfig.updateParameters({p3:undefined,p4:undefined,p5:undefined});expect(testedConfig.getParameterValue("p3")).toEqual(undefined);expect(testedConfig.getParameterValue("p4")).toEqual(undefined);expect(testedConfig.getParameterValue("p5")).toEqual(undefined);expect(_.size(testedConfig.attributes.parameters.attributes)).toEqual(2);expect(function(){testedConfig.updateParameters()}).toThrow();expect(function(){testedConfig.updateParameters("test",2)}).toThrow();expect(function(){testedConfig.updateParameters(["a","b","c"])}).toThrow()});it("sets and gets planned parameter updates and applies the updates one by one",function(){var testedConfig=new App.ContextModule.Config;testedConfig.planParameterUpdate("p1",10);expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(1);testedConfig.planParameterUpdate("p2","test");expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(2);testedConfig.planParameterUpdate("p3",undefined);expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(2);expect(testedConfig.get("parameters").keys().length).toEqual(0);expect(testedConfig.isPlannedToUpdate("p2")).toBe(true);testedConfig.cancelPlannedParameterUpdate("p2");expect(testedConfig.isPlannedToUpdate("p2")).toBe(false);expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(1);expect(testedConfig.isPlannedToUpdate("p1")).toBe(true);expect(testedConfig.isPlannedToUpdate("p3")).toBe(false);expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.applyPlannedParameterUpdates();testedConfig.getParameterValue("myVar");testedConfig.getPlannedParameterValue("myVar");testedConfig.isPlannedToUpdate("myVar");testedConfig.applyPlannedParameterUpdates();expect(function(){testedConfig.planParameterUpdate()}).toThrow();expect(function(){testedConfig.planParameterUpdate(1,2)}).toThrow();expect(function(){testedConfig.planParameterUpdate(["a","b","c"])}).toThrow();expect(function(){testedConfig.planParameterUpdate({x:1,y:2})}).toThrow()});it("sets and gets planned parameter updates and applies the updates in bulk",function(){var testedConfig=new App.ContextModule.Config;testedConfig.planParameterUpdates({p1:10});expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(1);testedConfig.planParameterUpdates({p2:"test",p3:false,p4:undefined});expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(3);expect(testedConfig.get("parameters").keys().length).toEqual(0);expect(testedConfig.isPlannedToUpdate("p2")).toBe(true);testedConfig.planParameterUpdates({p3:undefined});expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(2);expect(testedConfig.isPlannedToUpdate("p1")).toBe(true);expect(testedConfig.isPlannedToUpdate("p2")).toBe(true);expect(testedConfig.isPlannedToUpdate("p3")).toBe(false);expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.applyPlannedParameterUpdates();expect(function(){testedConfig.planParameterUpdates()}).toThrow();expect(function(){testedConfig.planParameterUpdates("test",2)}).toThrow();expect(function(){testedConfig.planParameterUpdates(["a","b","c"])}).toThrow()});it("sets planned parameter updates when they are undefined",function(){var testedConfig=new App.ContextModule.Config;testedConfig.updateParameters({p1:"a",p2:"b"});var spy=jasmine.createSpy();testedConfig.on("change:plannedParameterUpdates",spy);expect(spy.calls.count()).toEqual(0);var hashForPlannedParameterUpdatesBeforeUpdates1=testedConfig.getHashForPlannedParameterUpdates();testedConfig.planParameterUpdates({p2:undefined,p3:undefined});expect(spy.calls.count()).toEqual(1);expect(testedConfig.get("parameters").keys().length).toEqual(2);expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(1);expect(testedConfig.isPlannedToUpdate("p1")).toBe(false);expect(testedConfig.isPlannedToUpdate("p2")).toBe(true);expect(testedConfig.isPlannedToUpdate("p3")).toBe(false);expect(testedConfig.getPlannedParameterValue("p1")).toBe("a");expect(testedConfig.getPlannedParameterValue("p2")).toBe(undefined);expect(testedConfig.getPlannedParameterValue("p3")).toBe(undefined);var hashForPlannedParameterUpdatesBeforeUpdates2=testedConfig.getHashForPlannedParameterUpdates();expect(hashForPlannedParameterUpdatesBeforeUpdates2).not.toEqual(hashForPlannedParameterUpdatesBeforeUpdates1);testedConfig.applyPlannedParameterUpdates();expect(spy.calls.count()).toEqual(2);expect(testedConfig.get("parameters").keys().length).toEqual(1);expect(testedConfig.get("plannedParameterUpdates").keys().length).toEqual(0);var hashForPlannedParameterUpdatesBeforeUpdates3=testedConfig.getHashForPlannedParameterUpdates();expect(hashForPlannedParameterUpdatesBeforeUpdates3).not.toEqual(hashForPlannedParameterUpdatesBeforeUpdates2);expect(hashForPlannedParameterUpdatesBeforeUpdates3).toEqual(hashForPlannedParameterUpdatesBeforeUpdates1)});it("cancels planned changes on demand",function(){var testedConfig=new App.ContextModule.Config;testedConfig.updateParameter("p1",10);expect(testedConfig.hasPlannedParameterUpdates()).toBe(false);testedConfig.planParameterUpdate("p1",11);testedConfig.planParameterUpdate("p2","test");expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.cancelPlannedParameterUpdate("p2");expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.cancelPlannedParameterUpdate("p1");expect(testedConfig.hasPlannedParameterUpdates()).toBe(false);testedConfig.planParameterUpdate("p1",11);testedConfig.planParameterUpdate("p2","test");expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.cancelPlannedParameterUpdates();expect(testedConfig.hasPlannedParameterUpdates()).toBe(false);testedConfig.planParameterUpdate("p1",11);testedConfig.planParameterUpdate("p2","test");testedConfig.planParameterUpdate("p3","test");testedConfig.cancelPlannedParameterUpdates(["p2","p3"]);expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.cancelPlannedParameterUpdates(["p100"]);expect(testedConfig.hasPlannedParameterUpdates()).toBe(true);testedConfig.cancelPlannedParameterUpdates(["p1"]);expect(testedConfig.hasPlannedParameterUpdates()).toBe(false)});xit("returns config grid type and dimension",function(){});xit("calculates and obtains its own hashes",function(){});it("serializes and unserializes itself",function(){var testedConfig=new App.ContextModule.Config;var clientId=testedConfig.getClientId();var originalSerializedObject={clientId:clientId,parameters:{p1:10,p2:"test",p3:false,p4:null,p5:[1,"test"]},plannedParameterUpdates:{p1:11,p3:undefined,p4:["10",null]}};testedConfig.unserialize(originalSerializedObject);expect(testedConfig.getParameterValue("p1")).toEqual(10);expect(testedConfig.getParameterValue("p2")).toEqual("test");expect(testedConfig.getParameterValue("p3")).toEqual(false);expect(testedConfig.getParameterValue("p4")).toEqual(null);expect(testedConfig.getParameterValue("p5")).toEqual([1,"test"]);expect(testedConfig.getParameterValue("p9")).toEqual(undefined);expect(testedConfig.getPlannedParameterValue("p1")).toEqual(11);expect(testedConfig.getPlannedParameterValue("p2")).toEqual("test");expect(testedConfig.getPlannedParameterValue("p3")).toEqual(undefined);expect(testedConfig.getPlannedParameterValue("p4")).toEqual(["10",null]);expect(testedConfig.getPlannedParameterValue("p5")).toEqual([1,"test"]);expect(testedConfig.getPlannedParameterValue("p9")).toEqual(undefined);expect(testedConfig.isPlannedToUpdate("p1")).toEqual(true);expect(testedConfig.isPlannedToUpdate("p2")).toEqual(false);expect(testedConfig.isPlannedToUpdate("p3")).toEqual(true);expect(testedConfig.isPlannedToUpdate("p4")).toEqual(true);expect(testedConfig.isPlannedToUpdate("p5")).toEqual(false);expect(testedConfig.isPlannedToUpdate("p9")).toEqual(false);expect(testedConfig.serialize()).toEqual(originalSerializedObject);testedConfig.applyPlannedParameterUpdates();expect(testedConfig.serialize()).toEqual({clientId:clientId,parameters:{p1:11,p2:"test",p4:["10",null],p5:[1,"test"]},plannedParameterUpdates:{}});testedConfig.planParameterUpdate("p1",12);testedConfig.planParameterUpdate("p2",undefined);testedConfig.planParameterUpdate("p5",[1,2,3]);testedConfig.planParameterUpdate("p9",undefined);expect(testedConfig.serialize()).toEqual({clientId:clientId,parameters:{p1:11,p2:"test",p4:["10",null],p5:[1,"test"]},plannedParameterUpdates:{p1:12,p2:undefined,p5:[1,2,3]}});expect(function(){originalSerializedObject.clientId=42;testedConfig.unserialize(originalSerializedObject)}).toThrow()});it("unserializes itself from faulty serialized objects",function(){var faultySerializedObjectPairs=[[null,{parameters:{},plannedParameterUpdates:{}}],[undefined,{parameters:{},plannedParameterUpdates:{}}],[42,{parameters:{},plannedParameterUpdates:{}}],["test",{parameters:{},plannedParameterUpdates:{}}],[{parameters:42},{parameters:{},plannedParameterUpdates:{}}],[{parameters:["foo","bar"]},{parameters:{},plannedParameterUpdates:{}}],[{plannedParameterUpdates:10},{parameters:{},plannedParameterUpdates:{}}],[{plannedParameterUpdates:{x:10}},{parameters:{},plannedParameterUpdates:{x:10}}]];_.each(faultySerializedObjectPairs,function(faultySerializedObjectPair){var testedConfig=new App.ContextModule.Config(faultySerializedObjectPair[0]);faultySerializedObjectPair[1].clientId=testedConfig.getClientId();expect(testedConfig.serialize()).toEqual(faultySerializedObjectPair[1]);var testedConfig2=new App.ContextModule.Config;testedConfig2.unserialize(faultySerializedObjectPair[0]);faultySerializedObjectPair[1].clientId=testedConfig2.getClientId();expect(testedConfig2.serialize()).toEqual(faultySerializedObjectPair[1])});var faultySerializedObjects=[{clientId:"wrong"},{clientId:0},{parameters:42,clientId:"wrong"},{plannedParameterUpdates:{x:"y"},clientId:42}];var testedConfig=new App.ContextModule.Config;_.each(faultySerializedObjects,function(faultySerializedObject){expect(function(){testedConfig.unserialize(faultySerializedObject)}).toThrow()})});it("clones itself",function(){var testedConfig=new App.ContextModule.Config({parameters:{a:10,b:"test"},plannedParameterUpdates:{a:20,c:true}});var clonedConfig=testedConfig.clone();expect(clonedConfig.getClientId()).not.toEqual(testedConfig.getClientId());expect(clonedConfig.getParameterValue("a")).toEqual(10);expect(clonedConfig.getParameterValue("b")).toEqual("test");expect(clonedConfig.getParameterValue("c")).toEqual(undefined);expect(clonedConfig.getPlannedParameterValue("a")).toEqual(20);expect(clonedConfig.getPlannedParameterValue("b")).toEqual("test");expect(clonedConfig.getPlannedParameterValue("c")).toEqual(true);clonedConfig.updateParameter("a",42);clonedConfig.planParameterUpdate("a",43);expect(clonedConfig.getParameterValue("a")).toEqual(42);expect(clonedConfig.getPlannedParameterValue("a")).toEqual(43);expect(testedConfig.getParameterValue("a")).toEqual(10);expect(testedConfig.getPlannedParameterValue("a")).toEqual(20)});it("triggers events when real changes occur",function(){var testedConfig=new App.ContextModule.Config;var spy=jasmine.createSpyObj("listener",["change","changeParameters","changePlannedParameterUpdates"]);var expectSpyCallCountAndReset=function(one,two,three){expect(spy.change.calls.count()).toEqual(one);expect(spy.changeParameters.calls.count()).toEqual(two);expect(spy.changePlannedParameterUpdates.calls.count()).toEqual(three);spy.changeParameters.calls.reset();spy.changePlannedParameterUpdates.calls.reset();spy.change.calls.reset()};testedConfig.on("change",spy.change,spy);testedConfig.on("change:parameters",spy.changeParameters,spy);testedConfig.on("change:plannedParameterUpdates",spy.changePlannedParameterUpdates,spy);expect(spy.change.calls.count()).toEqual(0);expect(spy.changeParameters.calls.count()).toEqual(0);expect(spy.changePlannedParameterUpdates.calls.count()).toEqual(0);testedConfig.planParameterUpdate("p1",12);expectSpyCallCountAndReset(1,0,1);testedConfig.planParameterUpdate("p1",12);expectSpyCallCountAndReset(0,0,0);testedConfig.planParameterUpdate("p2",42);expectSpyCallCountAndReset(1,0,1);testedConfig.cancelPlannedParameterUpdate("p2");expectSpyCallCountAndReset(1,0,1);testedConfig.applyPlannedParameterUpdates();expectSpyCallCountAndReset(1,1,1);testedConfig.unserialize({clientId:testedConfig.getClientId(),parameters:{x:42},plannedParameterUpdates:{}});expectSpyCallCountAndReset(1,1,0);testedConfig.unserialize({clientId:testedConfig.getClientId(),parameters:{x:42},plannedParameterUpdates:{}});expectSpyCallCountAndReset(0,0,0);testedConfig.updateParameter("p10",10);expectSpyCallCountAndReset(1,1,0);testedConfig.planParameterUpdate("p1",12);expectSpyCallCountAndReset(1,0,1);testedConfig.updateParameter("p1",100);expectSpyCallCountAndReset(1,1,1);console.log("!!!",testedConfig);testedConfig.cancelPlannedParameterUpdates();expectSpyCallCountAndReset(0,0,0);testedConfig.planParameterUpdate("p1",12);expectSpyCallCountAndReset(1,0,1);testedConfig.unserialize(null);expectSpyCallCountAndReset(1,1,1);testedConfig.unserialize(null);expectSpyCallCountAndReset(0,0,0);testedConfig.updateParameters({p1:42,p2:0});expectSpyCallCountAndReset(1,1,0);testedConfig.planParameterUpdate("p1",42);expectSpyCallCountAndReset(0,0,0);testedConfig.planParameterUpdates({p1:42});expectSpyCallCountAndReset(0,0,0);testedConfig.planParameterUpdates({p1:4,p2:2,p3:3,p4:4});expectSpyCallCountAndReset(1,0,1);testedConfig.cancelPlannedParameterUpdates(["p3","p4"]);expectSpyCallCountAndReset(1,0,1);testedConfig.cancelPlannedParameterUpdates(["p3","p4","p42"]);expectSpyCallCountAndReset(0,0,0);testedConfig.applyPlannedParameterUpdates();expectSpyCallCountAndReset(1,1,1);testedConfig.planParameterUpdates({p1:4,p2:2,p3:3,p4:4});expectSpyCallCountAndReset(1,0,1);testedConfig.cancelPlannedParameterUpdates();expectSpyCallCountAndReset(1,0,1);expect(testedConfig.hasChanged()).toEqual(false);testedConfig.on("change",function(){expect(testedConfig.hasChanged()).toEqual(true)});testedConfig.updateParameter("test",42);expect(testedConfig.hasChanged()).toEqual(false)})});
"use strict";describe("ContextModule.ConfigGrid",function(){var testEntityConfigs=null;var testViewConfigs=null;var testIrrelevantEntityConfigs=null;var testIrrelevantViewConfigs=null;beforeEach(function(){testEntityConfigs=[new App.ContextModule.Config({parameters:{x:10,y:"test"}}),new App.ContextModule.Config({parameters:{x:10,y:"test"}}),new App.ContextModule.Config({parameters:{x:20}})];testViewConfigs=[new App.ContextModule.Config({parameters:{x:10,y:"test"}}),new App.ContextModule.Config({parameters:{x:10,y:"test"}}),new App.ContextModule.Config({parameters:{x:20}})];testIrrelevantEntityConfigs=[new App.ContextModule.Config({parameters:{x:10,y:"test"}})];testIrrelevantViewConfigs=[new App.ContextModule.Config({parameters:{x:10,y:"test"}})]});it("is promptly created",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;expect(testedConfigGrid).not.toBe(null);expect(testedConfigGrid.entityConfigs).not.toBe(null);expect(testedConfigGrid.entityConfigs.size()).toEqual(0);expect(testedConfigGrid.viewConfigs).not.toBe(null);expect(testedConfigGrid.viewConfigs.size()).toEqual(0);expect(testedConfigGrid.getType()).toBe(undefined)});it("is promptly created with type",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid("abc");expect(testedConfigGrid).not.toBe(null);expect(testedConfigGrid.getType()).toBe("abc")});it("can add parameter bags",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;testedConfigGrid.entityConfigs.add(testEntityConfigs[0]);testedConfigGrid.entityConfigs.add(testEntityConfigs[1]);testedConfigGrid.entityConfigs.add(testEntityConfigs[2]);testedConfigGrid.viewConfigs.add(testViewConfigs[0]);testedConfigGrid.viewConfigs.add(testViewConfigs[1]);testedConfigGrid.viewConfigs.add(testViewConfigs[2]);expect(testedConfigGrid.viewConfigs.size()).toEqual(3);expect(testedConfigGrid.entityConfigs.size()).toEqual(3);testedConfigGrid.entityConfigs.add(testEntityConfigs[2]);testedConfigGrid.viewConfigs.add(testViewConfigs[2]);expect(testedConfigGrid.viewConfigs.size()).toEqual(3);expect(testedConfigGrid.entityConfigs.size()).toEqual(3)});it("can add parameter bags at a particular place",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;testedConfigGrid.entityConfigs.add(testEntityConfigs[0]);testedConfigGrid.entityConfigs.add(testEntityConfigs[1]);testedConfigGrid.entityConfigs.add(testEntityConfigs[2],{at:0});testedConfigGrid.viewConfigs.add(testViewConfigs[0]);testedConfigGrid.viewConfigs.add(testViewConfigs[1]);testedConfigGrid.viewConfigs.add(testViewConfigs[2],{at:1});expect(testedConfigGrid.viewConfigs.size()).toEqual(3);expect(testedConfigGrid.entityConfigs.size()).toEqual(3);expect(testedConfigGrid.entityConfigs.at(0)).toEqual(testEntityConfigs[2]);expect(testedConfigGrid.entityConfigs.at(1)).toEqual(testEntityConfigs[0]);expect(testedConfigGrid.entityConfigs.at(2)).toEqual(testEntityConfigs[1]);expect(testedConfigGrid.viewConfigs.at(0)).toEqual(testViewConfigs[0]);expect(testedConfigGrid.viewConfigs.at(1)).toEqual(testViewConfigs[2]);expect(testedConfigGrid.viewConfigs.at(2)).toEqual(testViewConfigs[1])});it("can reset",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;testedConfigGrid.entityConfigs.add(testEntityConfigs[0]);testedConfigGrid.entityConfigs.add(testEntityConfigs[1]);testedConfigGrid.entityConfigs.add(testEntityConfigs[2]);testedConfigGrid.viewConfigs.add(testViewConfigs[0]);testedConfigGrid.viewConfigs.add(testViewConfigs[1]);testedConfigGrid.viewConfigs.add(testViewConfigs[2]);expect(testedConfigGrid.entityConfigs.size()).toEqual(3);expect(testedConfigGrid.viewConfigs.size()).toEqual(3);testedConfigGrid.entityConfigs.reset();testedConfigGrid.viewConfigs.reset();expect(testedConfigGrid.entityConfigs.size()).toEqual(0);expect(testedConfigGrid.viewConfigs.size()).toEqual(0);testedConfigGrid.entityConfigs.add(testEntityConfigs[0]);testedConfigGrid.entityConfigs.add(testEntityConfigs[1]);testedConfigGrid.entityConfigs.add(testEntityConfigs[2]);testedConfigGrid.viewConfigs.add(testViewConfigs[0]);testedConfigGrid.viewConfigs.add(testViewConfigs[1]);testedConfigGrid.viewConfigs.add(testViewConfigs[2])});it("retreives neighbour entityConfigs and viewConfigs",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;testedConfigGrid.entityConfigs.add(testEntityConfigs[0]);testedConfigGrid.entityConfigs.add(testEntityConfigs[1]);testedConfigGrid.entityConfigs.add(testEntityConfigs[2]);testedConfigGrid.viewConfigs.add(testViewConfigs[0]);testedConfigGrid.viewConfigs.add(testViewConfigs[1]);testedConfigGrid.viewConfigs.add(testViewConfigs[2]);expect(testedConfigGrid.getPrevEntityNeighbour(testEntityConfigs[0])).toBe(undefined);expect(testedConfigGrid.getPrevEntityNeighbour(testEntityConfigs[1])).toEqual(testEntityConfigs[0]);expect(testedConfigGrid.getPrevEntityNeighbour(testEntityConfigs[2])).toEqual(testEntityConfigs[1]);expect(testedConfigGrid.getNextEntityNeighbour(testEntityConfigs[0])).toEqual(testEntityConfigs[1]);expect(testedConfigGrid.getNextEntityNeighbour(testEntityConfigs[1])).toEqual(testEntityConfigs[2]);expect(testedConfigGrid.getNextEntityNeighbour(testEntityConfigs[2])).toBe(undefined);expect(function(){testedConfigGrid.getPrevEntityNeighbour(testIrrelevantEntityConfigs[0])}).toThrow();expect(function(){testedConfigGrid.getNextEntityNeighbour(testIrrelevantEntityConfigs[0])}).toThrow();expect(function(){testedConfigGrid.getPrevEntityNeighbour(testViewConfigs[0])}).toThrow();expect(function(){testedConfigGrid.getNextEntityNeighbour(testViewConfigs[0])}).toThrow();expect(testedConfigGrid.getPrevViewNeighbour(testViewConfigs[0])).toEqual(undefined);expect(testedConfigGrid.getPrevViewNeighbour(testViewConfigs[1])).toEqual(testViewConfigs[0]);expect(testedConfigGrid.getPrevViewNeighbour(testViewConfigs[2])).toEqual(testViewConfigs[1]);expect(testedConfigGrid.getNextViewNeighbour(testViewConfigs[0])).toEqual(testViewConfigs[1]);expect(testedConfigGrid.getNextViewNeighbour(testViewConfigs[1])).toEqual(testViewConfigs[2]);expect(testedConfigGrid.getNextViewNeighbour(testViewConfigs[2])).toEqual(undefined);expect(function(){testedConfigGrid.getPrevViewNeighbour(testIrrelevantViewConfigs[0])}).toThrow();expect(function(){testedConfigGrid.getNextViewNeighbour(testIrrelevantViewConfigs[0])}).toThrow();expect(function(){testedConfigGrid.getPrevViewNeighbour(testEntityConfigs[0])}).toThrow();expect(function(){testedConfigGrid.getNextViewNeighbour(testEntityConfigs[0])}).toThrow()});it("relocates entityConfigs and viewConfigs",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;_.each([{configCollection:testedConfigGrid.entityConfigs,relocateFunctionName:"relocateEntityConfig",relevantConfigs:testEntityConfigs,irrelevantConfigs:testIrrelevantEntityConfigs},{configCollection:testedConfigGrid.viewConfigs,relocateFunctionName:"relocateViewConfig",relevantConfigs:testViewConfigs,irrelevantConfigs:testIrrelevantViewConfigs}],function(currentDimension){currentDimension.configCollection.add(currentDimension.relevantConfigs[0]);currentDimension.configCollection.add(currentDimension.relevantConfigs[1]);currentDimension.configCollection.add(currentDimension.relevantConfigs[2]);expect(currentDimension.configCollection.size()).toEqual(3);testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.relevantConfigs[1],0);expect(currentDimension.configCollection.at(0)).toEqual(currentDimension.relevantConfigs[1]);expect(currentDimension.configCollection.at(1)).toEqual(currentDimension.relevantConfigs[0]);expect(currentDimension.configCollection.at(2)).toEqual(currentDimension.relevantConfigs[2]);testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.relevantConfigs[1],currentDimension.relevantConfigs[2]);expect(currentDimension.configCollection.at(0)).toEqual(currentDimension.relevantConfigs[0]);expect(currentDimension.configCollection.at(1)).toEqual(currentDimension.relevantConfigs[1]);expect(currentDimension.configCollection.at(2)).toEqual(currentDimension.relevantConfigs[2]);testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.relevantConfigs[2],currentDimension.relevantConfigs[0].getClientId());expect(currentDimension.configCollection.at(0)).toEqual(currentDimension.relevantConfigs[2]);expect(currentDimension.configCollection.at(1)).toEqual(currentDimension.relevantConfigs[0]);expect(currentDimension.configCollection.at(2)).toEqual(currentDimension.relevantConfigs[1]);expect(function(){testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.irrelevantConfigs[1],0)}).toThrow();expect(function(){testedConfigGrid[currentDimension.relocateFunctionName](relevantConfigs[1],currentDimension.irrelevantConfigs[1])}).toThrow();expect(function(){testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.relevantConfigs[1],-1)}).toThrow();expect(function(){testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.relevantConfigs[1],4)}).toThrow();testedConfigGrid[currentDimension.relocateFunctionName](currentDimension.relevantConfigs[1],3);expect(currentDimension.configCollection.at(0)).toEqual(currentDimension.relevantConfigs[2]);expect(currentDimension.configCollection.at(1)).toEqual(currentDimension.relevantConfigs[0]);expect(currentDimension.configCollection.at(2)).toEqual(currentDimension.relevantConfigs[1]);var clone=new App.ContextModule.Config(currentDimension.relevantConfigs[1].serialize());expect(function(){testedConfigGrid[currentDimension.relocateFunctionName](clone,0)}).toThrow()})});xit("works with selectedEntityConfigClientId and selectedViewConfigClientId",function(){});xit("performs combined actions: addEntityAndSelectIt, addViewAndSelectIt",function(){});xit("performs combined actions: removeEntityAndSelectNeighbour, removeViewAndSelectNeighbour",function(){});it("serializes and unserializes itself",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;var originalSerializedObject={entityConfigs:[testEntityConfigs[1].serialize(),testEntityConfigs[2].serialize(),testEntityConfigs[0].serialize()],viewConfigs:[testViewConfigs[0].serialize(),testViewConfigs[1].serialize()]};testedConfigGrid.unserialize(originalSerializedObject);expect(testedConfigGrid.entityConfigs.size()).toEqual(3);expect(testedConfigGrid.viewConfigs.size()).toEqual(2);expect(testedConfigGrid.entityConfigs.at(0).getClientId()).toEqual(testEntityConfigs[1].getClientId());expect(testedConfigGrid.entityConfigs.at(1).getClientId()).toEqual(testEntityConfigs[2].getClientId());expect(testedConfigGrid.entityConfigs.at(2).getClientId()).toEqual(testEntityConfigs[0].getClientId());expect(testedConfigGrid.viewConfigs.at(0).getClientId()).toEqual(testViewConfigs[0].getClientId());expect(testedConfigGrid.viewConfigs.at(1).getClientId()).toEqual(testViewConfigs[1].getClientId());expect(testedConfigGrid.serialize()).toEqual(originalSerializedObject);testedConfigGrid.relocateEntityConfig(testedConfigGrid.entityConfigs.at(2),0);testedConfigGrid.entityConfigs.remove(testedConfigGrid.entityConfigs.at(2));testedConfigGrid.entityConfigs.add(testIrrelevantEntityConfigs[0]);testedConfigGrid.viewConfigs.add(testViewConfigs[2]);testedConfigGrid.relocateViewConfig(testedConfigGrid.viewConfigs.at(2),0);testedConfigGrid.relocateViewConfig(testedConfigGrid.viewConfigs.at(1),3);testedConfigGrid.viewConfigs.add(testIrrelevantViewConfigs[0]);var newSerializedObject={entityConfigs:[testEntityConfigs[0].serialize(),testEntityConfigs[1].serialize(),testIrrelevantEntityConfigs[0].serialize()],viewConfigs:[testViewConfigs[2].serialize(),testViewConfigs[1].serialize(),testViewConfigs[0].serialize(),testIrrelevantViewConfigs[0].serialize()]};expect(testedConfigGrid.serialize()).toEqual(newSerializedObject)});it("unserializes itself from faulty serialized objects",function(){var faultySerializedObjects=[null,undefined,42,"test",{entityConfigs:42},{viewConfigs:[testViewConfigs[1].serialize()],foo:"bar"}];var testedConfigGrid=new App.ContextModule.ConfigGrid;_.each(faultySerializedObjects,function(faultySerializedObject){expect(function(){testedConfigGrid.unserialize(faultySerializedObject)}).not.toThrow()})});it("triggers events when real changes occur",function(){var testedConfigGrid=new App.ContextModule.ConfigGrid;_.each([{configCollection:testedConfigGrid.entityConfigs,relocateFunctionName:"relocateEntityConfig",relevantConfigs:testEntityConfigs,irrelevantConfigs:testIrrelevantEntityConfigs,changeLayoutEventName:"change_layout",changeConfigEventPrefix:"change_entity:",changeConfigNeighboursPrefix:"change_entity_neighbours:"},{configCollection:testedConfigGrid.viewConfigs,relocateFunctionName:"relocateViewConfig",relevantConfigs:testViewConfigs,irrelevantConfigs:testIrrelevantViewConfigs,changeLayoutEventName:"change_layout",changeConfigEventPrefix:"change_view:",changeConfigNeighboursPrefix:"change_view_neighbours:"}],function(currentDimension){var spyNames=["change","changeCollection","changeConfig0","changeConfig1","changeConfig2","changeConfigNeighbours0","changeConfigNeighbours1","changeConfigNeighbours2"];var spy=jasmine.createSpyObj("listener",spyNames);testedConfigGrid.on("change",spy.change,spy);testedConfigGrid.on(currentDimension.changeLayoutEventName,spy.changeCollection,spy);testedConfigGrid.on(currentDimension.changeConfigEventPrefix+currentDimension.relevantConfigs[0].getClientId(),spy.changeConfig0,spy);testedConfigGrid.on(currentDimension.changeConfigEventPrefix+currentDimension.relevantConfigs[1].getClientId(),spy.changeConfig1,spy);testedConfigGrid.on(currentDimension.changeConfigEventPrefix+currentDimension.relevantConfigs[2].getClientId(),spy.changeConfig2,spy);testedConfigGrid.on(currentDimension.changeConfigNeighboursPrefix+currentDimension.relevantConfigs[0].getClientId(),spy.changeConfigNeighbours0,spy);testedConfigGrid.on(currentDimension.changeConfigNeighboursPrefix+currentDimension.relevantConfigs[1].getClientId(),spy.changeConfigNeighbours1,spy);testedConfigGrid.on(currentDimension.changeConfigNeighboursPrefix+currentDimension.relevantConfigs[2].getClientId(),spy.changeConfigNeighbours2,spy);var expectSpyCallCount=function(){_.each(arguments,function(arg,i){expect(spy[spyNames[i]].calls.count()).toEqual(arg)});for(var i=arguments.length;i<spyNames.length;i++){expect(spy[spyNames[i]].calls.count()).toEqual(0)}};var resetSpyCallCount=function(){_.each(spyNames,function(spyName){spy[spyName].calls.reset()})};expectSpyCallCount(0);resetSpyCallCount();testedConfigGrid.unserialize(null);resetSpyCallCount();var defaultSerializedState={entityConfigs:[testEntityConfigs[0].serialize(),testEntityConfigs[1].serialize(),testEntityConfigs[2].serialize()],viewConfigs:[testViewConfigs[0].serialize(),testViewConfigs[1].serialize(),testViewConfigs[2].serialize()]};testedConfigGrid.unserialize(defaultSerializedState);expectSpyCallCount(1,1);resetSpyCallCount();testedConfigGrid.unserialize(defaultSerializedState);expectSpyCallCount(0,0);resetSpyCallCount();expectSpyCallCount(0);currentDimension.configCollection.at(1).updateParameter("my",1);expectSpyCallCount(1,0,0,1,0,1,0,1);resetSpyCallCount();currentDimension.configCollection.at(2).planParameterUpdate("my",1);expectSpyCallCount(1,0,0,0,1,0,1,0);resetSpyCallCount();currentDimension.configCollection.remove(currentDimension.configCollection.at(2));expect(currentDimension.configCollection.size()).toEqual(2);expectSpyCallCount(1,1,0,0,0,0,1,0);resetSpyCallCount();testedConfigGrid.unserialize(defaultSerializedState);expectSpyCallCount(1,1,0,1,0,1,1,0);resetSpyCallCount();expect(function(){testedConfigGrid.relocateEntityConfig(testEntityConfigs[2],0)}).toThrow();expect(function(){testedConfigGrid.relocateViewConfig(testViewConfigs[2],0)}).toThrow();testedConfigGrid.relocateEntityConfig(testedConfigGrid.entityConfigs.at(1),0);testedConfigGrid.relocateViewConfig(testedConfigGrid.viewConfigs.at(1),0);expectSpyCallCount(2,2,0,0,0,1,1,1);resetSpyCallCount();testedConfigGrid.unserialize(defaultSerializedState);expectSpyCallCount(1,1,0,0,0,1,1,1);resetSpyCallCount();currentDimension.configCollection.add(currentDimension.irrelevantConfigs[0],{at:0});expectSpyCallCount(1,1,0,0,0,1,0,0)})})});
"use strict";describe("ContextModule.State",function(){var serializedStates={empty:{musicCollectionGrid:{entityConfigs:[],viewConfigs:[]},musicRecordingGrid:{entityConfigs:[],viewConfigs:[]}},empty_faulty1:{},empty_faulty2:42,empty_faulty3:null,empty_incomplete1:{musicCollectionGrid:{entityConfigs:[],viewConfigs:[]}},empty_incomplete2:{musicRecordingGrid:{viewConfigs:[]}},"1by1":{musicCollectionGrid:{entityConfigs:[{clientId:"c10",parameters:{ce:1},plannedParameterUpdates:{}}],viewConfigs:[{clientId:"c20",parameters:{cv:2},plannedParameterUpdates:{}}]},musicRecordingGrid:{entityConfigs:[{clientId:"c30",parameters:{re:3},plannedParameterUpdates:{}}],viewConfigs:[{clientId:"c40",parameters:{rv:4},plannedParameterUpdates:{}}]}},"1by1_faulty1":{musicCollectionGrid:{entityConfigs:[{clientId:"c10",parameters:{ce:1},plannedParameterUpdates:null}],viewConfigs:[{clientId:"c20",parameters:{cv:2},plannedParameterUpdates:{}}]},musicRecordingGrid:{entityConfigs:[{clientId:"c30",parameters:{re:3},plannedParameterUpdates:42}],viewConfigs:[{clientId:"c40",parameters:{rv:4},plannedParameterUpdates:{}}]}},"1by1_incomplete1":{musicCollectionGrid:{entityConfigs:[{clientId:"c10",parameters:{ce:1}}],viewConfigs:[{clientId:"c20",parameters:{cv:2},plannedParameterUpdates:{}}]},musicRecordingGrid:{entityConfigs:[{clientId:"c30",parameters:{re:3}}],viewConfigs:[{clientId:"c40",parameters:{rv:4},plannedParameterUpdates:{}}]}}};it("is promptly created",function(){var testedState=new App.ContextModule.State;expect(testedState).not.toBe(null);expect(testedState.get("musicCollectionGrid")).not.toBe(null);expect(testedState.get("musicCollectionGrid")instanceof App.ContextModule.ConfigGrid).toBe(true);expect(testedState.get("musicRecordingGrid")).not.toBe(null);expect(testedState.get("musicRecordingGrid")instanceof App.ContextModule.ConfigGrid).toBe(true)});it("serializes and unserializes itself",function(){var testedState=new App.ContextModule.State;testedState.unserialize(serializedStates["empty"]);expect(testedState.serialize()).toEqual(serializedStates["empty"]);testedState.unserialize(serializedStates["empty_faulty1"]);expect(testedState.serialize()).toEqual(serializedStates["empty"]);testedState.unserialize(serializedStates["empty_faulty2"]);expect(testedState.serialize()).toEqual(serializedStates["empty"]);testedState.unserialize(serializedStates["empty_faulty3"]);expect(testedState.serialize()).toEqual(serializedStates["empty"]);testedState.unserialize(serializedStates["empty_incomplete1"]);expect(testedState.serialize()).toEqual(serializedStates["empty"]);testedState.unserialize(serializedStates["empty_incomplete2"]);expect(testedState.serialize()).toEqual(serializedStates["empty"]);testedState.unserialize(serializedStates["1by1"]);expect(testedState.serialize()).toEqual(serializedStates["1by1"]);testedState.unserialize(serializedStates["1by1_faulty1"]);expect(testedState.serialize()).toEqual(serializedStates["1by1"]);testedState.unserialize(serializedStates["1by1_incomplete1"]);expect(testedState.serialize()).toEqual(serializedStates["1by1"])});xit("returns grid by type",function(){});xit("works with property musicRecordingsGridIsShown",function(){});it("triggers change event when when config grids change",function(){var testedState=new App.ContextModule.State;var changeListener=jasmine.createSpy("changeListener");testedState.on("change",changeListener);expect(changeListener.calls.count()).toEqual(0);testedState.get("musicCollectionGrid").entityConfigs.add(new App.ContextModule.Config);expect(changeListener.calls.count()).toEqual(1);changeListener.calls.reset();testedState.get("musicRecordingGrid").entityConfigs.add(new App.ContextModule.Config);expect(changeListener.calls.count()).toEqual(1);changeListener.calls.reset();testedState.unserialize(serializedStates["empty"]);expect(changeListener.calls.count()).toEqual(1);changeListener.calls.reset();testedState.unserialize(serializedStates["empty_faulty1"]);expect(changeListener.calls.count()).toEqual(0);changeListener.calls.reset();testedState.unserialize(serializedStates["empty_incomplete1"]);expect(changeListener.calls.count()).toEqual(0);changeListener.calls.reset();testedState.unserialize(serializedStates["1by1"]);expect(changeListener.calls.count()).toEqual(1);changeListener.calls.reset();testedState.unserialize(serializedStates["1by1"]);expect(changeListener.calls.count()).toEqual(0);changeListener.calls.reset();testedState.unserialize(serializedStates["1by1_incomplete1"]);expect(changeListener.calls.count()).toEqual(0);changeListener.calls.reset()})});
"use strict";describe("ContextModule.StateHistory",function(){it("is promptly created",function(){var testedStateHistory=new App.ContextModule.StateHistory;expect(testedStateHistory).not.toBe(null);expect(testedStateHistory.get("maxStackSize")).toEqual(50);expect(testedStateHistory.get("currentSerializedState")).toEqual(undefined);expect(testedStateHistory.get("compoundChangeDetector")).toEqual(undefined)});it("is promptly created with attributes",function(){var testedStateHistory=new App.ContextModule.StateHistory({maxStackSize:40,currentSerializedState:42,compoundChangeDetector:function(){}});expect(testedStateHistory).not.toBe(null);expect(testedStateHistory.get("maxStackSize")).toEqual(40);expect(testedStateHistory.get("currentSerializedState")).toEqual(42);expect(typeof testedStateHistory.get("compoundChangeDetector")).toEqual("function")});it("undoes and redoes",function(){var testedStateHistory=new App.ContextModule.StateHistory({currentSerializedState:{a:42}});expect(testedStateHistory.canUndo()).toBe(false);expect(testedStateHistory.canRedo()).toBe(false);testedStateHistory.set("currentSerializedState",{a:42});expect(testedStateHistory.get("currentSerializedState")).toEqual({a:42});expect(testedStateHistory.canUndo()).toBe(false);expect(testedStateHistory.canRedo()).toBe(false);expect(function(){testedStateHistory.undo()}).toThrow();expect(function(){testedStateHistory.redo()}).toThrow();testedStateHistory.set("currentSerializedState",{a:43,b:44});expect(testedStateHistory.get("currentSerializedState")).toEqual({a:43,b:44});expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(false);testedStateHistory.set("currentSerializedState",{a:42});expect(testedStateHistory.get("currentSerializedState")).toEqual({a:42});expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(false);testedStateHistory.undo();expect(testedStateHistory.get("currentSerializedState")).toEqual({a:43,b:44});expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(true);testedStateHistory.undo();expect(testedStateHistory.get("currentSerializedState")).toEqual({a:42});expect(testedStateHistory.canUndo()).toBe(false);expect(testedStateHistory.canRedo()).toBe(true);expect(function(){testedStateHistory.undo()}).toThrow();testedStateHistory.redo();expect(testedStateHistory.get("currentSerializedState")).toEqual({a:43,b:44});expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(true);testedStateHistory.redo();expect(testedStateHistory.get("currentSerializedState")).toEqual({a:42});expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(false);testedStateHistory.undo();expect(testedStateHistory.get("currentSerializedState")).toEqual({a:43,b:44});testedStateHistory.set("currentSerializedState",{a:42});expect(testedStateHistory.get("currentSerializedState")).toEqual({a:42});expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(false)});it("resets",function(){var testedStateHistory=new App.ContextModule.StateHistory({currentSerializedState:{a:42}});testedStateHistory.set("currentSerializedState",{a:43,b:44});testedStateHistory.set("currentSerializedState",{a:43,b:45});testedStateHistory.undo();expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(true);testedStateHistory.reset();expect(testedStateHistory.canUndo()).toBe(false);expect(testedStateHistory.canRedo()).toBe(false)});it("trims undo and redo stacks",function(){var testedStateHistory=new App.ContextModule.StateHistory({maxStackSize:10});for(var i=20;i>=0;--i){testedStateHistory.set("currentSerializedState",{x:i})}for(var i=1;i<=10;i++){testedStateHistory.undo();expect(testedStateHistory.get("currentSerializedState")).toEqual({x:i})}expect(testedStateHistory.canUndo()).toBe(false);expect(testedStateHistory.canRedo()).toBe(true);expect(testedStateHistory.get("currentSerializedState")).toEqual({x:10});testedStateHistory.set("maxStackSize",5);for(var i=9;i>=5;--i){testedStateHistory.redo();expect(testedStateHistory.get("currentSerializedState")).toEqual({x:i})}expect(testedStateHistory.canUndo()).toBe(true);expect(testedStateHistory.canRedo()).toBe(false);testedStateHistory.set("maxStackSize",1);testedStateHistory.undo();expect(testedStateHistory.canUndo()).toBe(false);testedStateHistory.redo();expect(testedStateHistory.canRedo()).toBe(false);testedStateHistory.set("maxStackSize",3);testedStateHistory.set("currentSerializedState",{x:100});testedStateHistory.set("currentSerializedState",{x:200});testedStateHistory.set("currentSerializedState",{x:300});testedStateHistory.undo();testedStateHistory.undo();testedStateHistory.undo();expect(testedStateHistory.canUndo()).toBe(false)});it("triggers change:currentSerializedState when needed",function(){var spyNames=["change","change:currentSerializedState"];var spy=jasmine.createSpyObj("listener",spyNames);var expectSpyCallCount=function(){_.each(arguments,function(arg,i){expect(spy[spyNames[i]].calls.count()).toEqual(arg)});for(var i=arguments.length;i<spyNames.length;i++){expect(spy[spyNames[i]].calls.count()).toEqual(0)}};var resetSpyCallCount=function(){_.each(spyNames,function(spyName){spy[spyName].calls.reset()})};var expectSpyCallCountAndReset=function(){expectSpyCallCount.apply(null,arguments);resetSpyCallCount()};var testedStateHistory=new App.ContextModule.StateHistory({maxStackSize:10});_.each(spyNames,function(spyName){testedStateHistory.on(spyName,spy[spyName])});testedStateHistory.set("currentSerializedState",{test:true});expectSpyCallCountAndReset(1,1);testedStateHistory.set("currentSerializedState",{test:true});expectSpyCallCountAndReset(0,0);testedStateHistory.set("currentSerializedState",{test:false});expectSpyCallCountAndReset(1,1);testedStateHistory.undo();testedStateHistory.undo();expectSpyCallCountAndReset(2,2);testedStateHistory.redo();testedStateHistory.redo();expectSpyCallCountAndReset(2,2);testedStateHistory.undo();expectSpyCallCountAndReset(1,1);testedStateHistory.set("currentSerializedState",{test:true});expectSpyCallCountAndReset(0,0);testedStateHistory.reset();expectSpyCallCountAndReset(1,0);testedStateHistory.reset();expectSpyCallCountAndReset(0,0)})});
"use strict";describe("ContextModule.AppContext",function(){var serializedAppContexts={empty:{stateHistory:{currentSerializedState:{musicCollectionGrid:{entityConfigs:[],viewConfigs:[]},musicRecordingGrid:{entityConfigs:[],viewConfigs:[]}},undoStack:[],redoStack:[]},stateBookmarks:[]},empty_faulty1:{},empty_faulty2:42,empty_faulty3:null,empty_incomplete1:{stateHistory:{currentSerializedState:{musicCollectionGrid:{entityConfigs:[],viewConfigs:[]}},redoStack:[]},stateBookmarks:[]},empty_incomplete2:{stateHistory:{currentSerializedState:null,undoStack:[],redoStack:[]},stateBookmarks:[]}};it("is promptly created",function(){var testedAppContext=new App.ContextModule.AppContext;expect(testedAppContext).not.toBe(null);expect(testedAppContext.get("state")).not.toBe(null);expect(testedAppContext.get("state")instanceof App.ContextModule.State).toBe(true);expect(testedAppContext.get("stateHistory")).not.toBe(null);expect(testedAppContext.get("stateHistory")instanceof App.ContextModule.StateHistory).toBe(true);expect(testedAppContext.get("stateBookmarks")).not.toBe(null);expect(testedAppContext.get("stateBookmarks")instanceof App.ContextModule.StateBookmarkCollection).toBe(true)});it("serializes and unserializes itself",function(){var testedAppContext=new App.ContextModule.AppContext;testedAppContext.unserialize(serializedAppContexts["empty"]);expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]);testedAppContext.unserialize(serializedAppContexts["empty_faulty1"]);expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]);testedAppContext.unserialize(serializedAppContexts["empty_faulty2"]);expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]);testedAppContext.unserialize(serializedAppContexts["empty_faulty3"]);expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]);testedAppContext.unserialize(serializedAppContexts["empty_incomplete1"]);expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"]);testedAppContext.unserialize(serializedAppContexts["empty_incomplete2"]);expect(testedAppContext.serialize()).toEqual(serializedAppContexts["empty"])});it("triggers change events when something changes",function(){var testedAppContext=new App.ContextModule.AppContext;var spyNames=["change","changeState","changeStateHistory","changeStateBookmarks"];var spy=jasmine.createSpyObj("listener",spyNames);var expectSpyCallCount=function(){_.each(arguments,function(arg,i){expect(spy[spyNames[i]].calls.count()).toEqual(arg)});for(var i=arguments.length;i<spyNames.length;i++){expect(spy[spyNames[i]].calls.count()).toEqual(0)}};var resetSpyCallCount=function(){_.each(spyNames,function(spyName){spy[spyName].calls.reset()})};var expectSpyCallCountAndReset=function(){expectSpyCallCount.apply(null,arguments);resetSpyCallCount()};testedAppContext.on("change",spy["change"]);testedAppContext.get("state").on("change",spy["changeState"]);testedAppContext.get("stateHistory").on("change",spy["changeStateHistory"]);testedAppContext.get("stateBookmarks").on("change",spy["changeStateBookmarks"]);expectSpyCallCountAndReset(0);testedAppContext.unserialize(serializedAppContexts["empty"]);expectSpyCallCountAndReset(0);testedAppContext.unserialize(serializedAppContexts["empty_faulty1"]);expectSpyCallCountAndReset(0);expect(testedAppContext.get("stateHistory").canUndo()).toEqual(false);expect(testedAppContext.get("stateHistory").canRedo()).toEqual(false);testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.add(new App.ContextModule.Config({parameters:{x:2,y:3}}));expectSpyCallCountAndReset(1,1,1);testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).planParameterUpdate("x",10);expectSpyCallCountAndReset(1,1,1);testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).applyPlannedParameterUpdates();expectSpyCallCountAndReset(1,1,1);testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).planParameterUpdate("x",10);expectSpyCallCountAndReset(0,0,0);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getParameterValue("x")).toEqual(10);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getPlannedParameterValue("x")).toEqual(10);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).isPlannedToUpdate("x")).toEqual(false);testedAppContext.get("stateHistory").undo();expectSpyCallCountAndReset(1,1,1);expect(testedAppContext.get("stateHistory").canUndo()).toEqual(true);expect(testedAppContext.get("stateHistory").canRedo()).toEqual(true);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getParameterValue("x")).toEqual(2);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).getPlannedParameterValue("x")).toEqual(10);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.at(0).isPlannedToUpdate("x")).toEqual(true);testedAppContext.get("stateHistory").undo();testedAppContext.get("stateHistory").undo();expectSpyCallCountAndReset(2,2,2);expect(testedAppContext.get("stateHistory").canUndo()).toEqual(false);expect(testedAppContext.get("stateHistory").canRedo()).toEqual(true);expect(testedAppContext.get("state").get("musicCollectionGrid").entityConfigs.size()).toEqual(0);testedAppContext.get("stateHistory").redo();expectSpyCallCountAndReset(1,1,1);expect(testedAppContext.get("stateHistory").canUndo()).toEqual(true);expect(testedAppContext.get("stateHistory").canRedo()).toEqual(true);testedAppContext.unserialize(serializedAppContexts["empty"]);expectSpyCallCountAndReset(1,1,1);expect(testedAppContext.get("stateHistory").canUndo()).toEqual(false);expect(testedAppContext.get("stateHistory").canRedo()).toEqual(false)})});
"use strict";describe("ContextModule.AppContextManager",function(){var serializedAppContexts={empty:{stateHistory:{currentSerializedState:{musicCollectionGrid:{entityConfigs:[],viewConfigs:[]},musicRecordingGrid:{entityConfigs:[],viewConfigs:[]}},undoStack:[],redoStack:[]},stateBookmarks:[]},empty_faulty1:{},empty_faulty2:42,empty_faulty3:null,empty_incomplete1:{stateHistory:{currentSerializedState:{musicCollectionGrid:{entityConfigs:[],viewConfigs:[]}},redoStack:[]},stateBookmarks:[]},empty_incomplete2:{stateHistory:{currentSerializedState:null,undoStack:[],redoStack:[]},stateBookmarks:[]}};beforeAll(function(){jasmine.helpers.dumpStorage();jasmine.helpers.clearStorage()});beforeEach(function(){jasmine.helpers.clearStorage()});afterAll(function(){jasmine.helpers.restoreStorageFromDump()});it("is promptly created",function(){var testedAppContextManager=new App.ContextModule.AppContextManager;expect(testedAppContextManager instanceof Backbone.Marionette.Object).toBe(true)});it("restores context from default, saves it and reads it",function(){var testedAppContextManager=new App.ContextModule.AppContextManager;var testedAppContext=new App.ContextModule.AppContext;testedAppContextManager.restoreDefault(testedAppContext);var serializedAppContext=testedAppContext.serialize();expect(typeof serializedAppContext).toBe("object");expect(serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.entityConfigs.length).toBe(2);expect(serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.viewConfigs.length).toBe(2);expect(serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.entityConfigs.length).toBe(0);expect(serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.viewConfigs.length).toBe(0);testedAppContextManager.saveToStorage(testedAppContext);var serializedAppContext=App.DataModule.Storage.getObjCache(App.ContextModule,"context");expect(typeof serializedAppContext).toBe("object");expect(serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.entityConfigs.length).toBe(2);expect(serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.viewConfigs.length).toBe(2);expect(serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.entityConfigs.length).toBe(0);expect(serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.viewConfigs.length).toBe(0);serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.entityConfigs.pop();serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.viewConfigs.push({parameters:{x:1}});App.DataModule.Storage.setObjCache(App.ContextModule,"context",serializedAppContext);testedAppContextManager.restoreFromStorage(testedAppContext);var serializedAppContext=testedAppContext.serialize();expect(typeof serializedAppContext).toBe("object");expect(serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.entityConfigs.length).toBe(1);expect(serializedAppContext.stateHistory.currentSerializedState.musicCollectionGrid.viewConfigs.length).toBe(2);expect(serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.entityConfigs.length).toBe(0);expect(serializedAppContext.stateHistory.currentSerializedState.musicRecordingGrid.viewConfigs.length).toBe(1)})});
"use strict";describe("StorageModule",function(){var dummyModule=null;beforeAll(function(){jasmine.helpers.dumpStorage();jasmine.helpers.clearStorage();dummyModule=App.module("DummyModule")});beforeEach(function(){jasmine.helpers.clearStorage()});afterAll(function(){jasmine.helpers.restoreStorageFromDump()});it("works with strings: writes and reads",function(){var testVars=[["MyString","42"],["MyString2","test"]];var faultyVars=[["MyString",42],["MyString2",{}],["MyString3",[1,2,3]][("MyString4",null)]];for(var i=0;i<testVars.length;i++){var testVar=testVars[i];expect(localStorage.length).toEqual(0);expect(App.DataModule.Storage.setStrCache(dummyModule,testVar[0],testVar[1])).toEqual(true);expect(localStorage.getItem("dml.DummyModule."+testVar[0])).toEqual(testVar[1]);expect(localStorage.length).toEqual(1);expect(App.DataModule.Storage.setStrCache(dummyModule,testVar[0],undefined)).toEqual(true);expect(App.DataModule.Storage.getStrCache(dummyModule,testVar[0])).toEqual(undefined);expect(localStorage.getItem("dml.DummyModule."+testVar[0])).toEqual(null);expect(localStorage.length).toEqual(0)}for(var i=0;i<faultyVars.length;i++){var faultyVar=faultyVars[i];expect(function(){App.DataModule.Storage.setStrCache(dummyModule,faultyVar[0],faultyVar[1])}).toThrow();expect(localStorage.length).toEqual(0)}});it("works with strings: returns false when storage is full",function(){var storageBecameFull=false;var strToWrite=_.str.repeat("x",1e5);for(var i=0;i<1e3;i++){var result=App.DataModule.Storage.setStrCache(dummyModule,"test"+i,strToWrite);if(result===true){expect(localStorage.getItem("dml.DummyModule."+"test"+i)).toEqual(strToWrite)}else{storageBecameFull=true;expect(function(){localStorage.setItem("dml.DummyModule."+"test"+i,strToWrite)}).toThrow();break}}expect(storageBecameFull).toBe(true)});it("works with objects: writes and reads",function(){var testVars=[["MyString",{}],["MyString",[]],["MyString2",null],["MyString3",{x:2,y:null,z:undefined,a:"string",b:["array"],c:{object:true}}],["MyString2",[10,20,30]]];var faultyVars=[["MyString",42],["MyString3","test"],["MyString3","[1, 2, 3"],["MyString3","{x: 10"]];for(var i=0;i<testVars.length;i++){var testVar=testVars[i];expect(localStorage.length).toEqual(0);expect(App.DataModule.Storage.setObjCache(dummyModule,testVar[0],testVar[1])).toEqual(true);expect(localStorage.getItem("dml.DummyModule."+testVar[0])).toEqual(JSON.stringify(testVar[1]));expect(localStorage.length).toEqual(1);expect(App.DataModule.Storage.setObjCache(dummyModule,testVar[0],undefined)).toEqual(true);expect(App.DataModule.Storage.getObjCache(dummyModule,testVar[0])).toEqual(undefined);expect(localStorage.getItem("dml.DummyModule."+testVar[0])).toEqual(null);expect(localStorage.length).toEqual(0)}for(var i=0;i<faultyVars.length;i++){var faultyVar=faultyVars[i];expect(function(){App.DataModule.Storage.setObjCache(dummyModule,faultyVar[0],faultyVar[1])}).toThrow();expect(localStorage.length).toEqual(0);if(_.isString(faultyVar[1])){App.DataModule.Storage.setStrCache(dummyModule,faultyVar[0],faultyVar[1]);expect(App.DataModule.Storage.getObjCache(dummyModule,faultyVar[0])).toEqual(null);App.DataModule.Storage.setStrCache(dummyModule,faultyVar[0],undefined)}expect(localStorage.length).toEqual(0)}})});