| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561 |
- describe('Model', function() {
- var Model = $.fullCalendar.Model
- describe('set/get', function() {
- it('retrieves a previously set value', function() {
- var funcs = {
- change: function(val) {
- expect(val).toBe(5)
- }
- }
- var spy = spyOn(funcs, 'change').and.callThrough()
- var m = new Model()
- m.on('change:myvar', funcs.change)
- m.set('myvar', 5)
- expect(m.get('myvar')).toBe(5)
- expect(spy).toHaveBeenCalled()
- })
- it('retrieves values previously set in bulk', function() {
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6
- })
- expect(m.get('myvar')).toBe(5)
- expect(m.get('myothervar')).toBe(6)
- })
- it('retrieves undefined when not previously set', function() {
- var m = new Model()
- expect(m.get('myvar')).toBeUndefined()
- })
- it('can retreive whole internal object', function() {
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6
- })
- expect(m.get()).toEqual({
- myvar: 5,
- myothervar: 6
- })
- })
- it('fires all before:change events beforehand when setting in bulk', function() {
- var ops = []
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6
- })
- m.on('before:change:myvar', function(val) {
- ops.push('before:change:myvar')
- })
- m.on('before:change:myothervar', function(val) {
- ops.push('before:change:myothervar')
- })
- m.on('change:myvar', function(val) {
- ops.push('change:myvar')
- })
- m.on('change:myothervar', function(val) {
- ops.push('change:myothervar')
- })
- m.set({
- myvar: 7,
- myothervar: 8
- })
- expect(ops).toEqual([
- 'before:change:myvar',
- 'before:change:myothervar',
- 'change:myvar',
- 'change:myothervar'
- ])
- })
- })
- describe('unset', function() {
- it('can unset a single prop', function() {
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6
- })
- m.unset('myvar')
- expect(m.get()).toEqual({
- myothervar: 6
- })
- })
- it('can unset multiple props', function() {
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6,
- myothervarr: 7
- })
- m.unset([ 'myvar', 'myothervar' ])
- expect(m.get()).toEqual({
- myothervarr: 7
- })
- })
- })
- describe('reset', function() {
- it('will change all props', function() {
- var m = new Model()
- m.set({
- foo1: 5,
- foo2: 6
- })
- m.reset({
- bar1: 7,
- bar2: 8
- })
- expect(m.get()).toEqual({
- bar1: 7,
- bar2: 8
- })
- })
- })
- describe('has', function() {
- it('reports false when not previously set', function() {
- var m = new Model()
- expect(m.has('myvar')).toBe(false)
- })
- it('reports true when previously set', function() {
- var m = new Model()
- m.set('myvar', 5)
- expect(m.has('myvar')).toBe(true)
- })
- })
- describe('watch', function() {
- describe('when called as a task', function() {
- describe('when no deps', function() {
- it('resolves immediately', function() {
- var funcs = {
- start: function() { }
- }
- var spy = spyOn(funcs, 'start')
- var m = new Model()
- m.watch('myid', [], funcs.start)
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- })
- })
- describe('when all deps already satisfied', function() {
- it('resolves immediately', function() {
- var funcs = {
- start: function() { }
- }
- var spy = spyOn(funcs, 'start')
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6
- })
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.start)
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- })
- })
- describe('when not all deps satisfied', function() {
- it('resolves only after all deps are set', function() {
- var funcs = {
- start: function() { }
- }
- var spy = spyOn(funcs, 'start')
- var m = new Model()
- m.set('myvar', 5)
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.start)
- expect(spy).not.toHaveBeenCalled()
- expect(m.has('myid')).toBe(false)
- m.set('myothervar', 6)
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- })
- })
- describe('when previously resolved dep is unset', function() {
- it('calls the stop function', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.set('myvar', 5)
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.start, funcs.stop)
- m.set('myothervar', 6)
- expect(startSpy).toHaveBeenCalled()
- expect(stopSpy).not.toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- m.unset('myothervar')
- expect(stopSpy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(false)
- })
- })
- describe('when resetting a dependency', function() {
- it('calls all shutdown funcs before all startup funcs', function() {
- var m = new Model()
- var ops = []
- m.set('var1', 5)
- m.watch('doingSomething1', [ 'var1' ], function() {
- ops.push('start1')
- }, function() {
- ops.push('stop1')
- })
- m.watch('doingSomething2', [ 'var1' ], function() {
- ops.push('start2')
- }, function() {
- ops.push('stop2')
- })
- expect(ops).toEqual([
- 'start1', 'start2'
- ])
- m.set('var1', 6)
- expect(ops).toEqual([
- 'start1', 'start2',
- 'stop1', 'stop2',
- 'start1', 'start2'
- ])
- })
- })
- describe('with an optional value', function() {
- it('resolves immediately', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.watch('myid', [ '?optvar' ], funcs.start, funcs.stop)
- expect(startSpy).toHaveBeenCalled()
- expect(stopSpy).not.toHaveBeenCalled()
- })
- it('calls stop/start when value changed', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.set('optvar', 5)
- m.watch('myid', [ '?optvar' ], funcs.start, funcs.stop)
- expect(stopSpy).not.toHaveBeenCalled()
- expect(startSpy).toHaveBeenCalledTimes(1)
- m.set('optvar', 6)
- expect(stopSpy).toHaveBeenCalledTimes(1)
- expect(startSpy).toHaveBeenCalledTimes(2)
- })
- it('calls stop/start when value unset', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.set('optvar', 5)
- m.watch('myid', [ '?optvar' ], funcs.start, funcs.stop)
- expect(stopSpy).not.toHaveBeenCalled()
- expect(startSpy).toHaveBeenCalledTimes(1)
- m.unset('optvar')
- expect(stopSpy).toHaveBeenCalledTimes(1)
- expect(startSpy).toHaveBeenCalledTimes(2)
- })
- })
- describe('when multiple deps changed atomically', function() {
- it('fires stop/start only once per change', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.set({
- myvar1: 5,
- myvar2: 6
- })
- m.watch('taskid', [ 'myvar1', 'myvar2' ], funcs.start, funcs.stop)
- m.set({
- myvar1: 7,
- myvar2: 8
- })
- expect(stopSpy).toHaveBeenCalledTimes(1)
- expect(startSpy).toHaveBeenCalledTimes(2)
- })
- })
- })
- describe('when called as a computed value', function() {
- describe('when it has no deps', function() {
- it('resolves immediately', function() {
- var funcs = {
- generator: function() {
- return 9
- },
- change: function(val) {
- expect(val).toBe(9)
- }
- }
- var generatorSpy = spyOn(funcs, 'generator').and.callThrough()
- var changeSpy = spyOn(funcs, 'change').and.callThrough()
- var m = new Model()
- m.on('change:myid', funcs.change)
- m.watch('myid', [], funcs.generator)
- expect(generatorSpy).toHaveBeenCalled()
- expect(changeSpy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- expect(m.get('myid')).toBe(9)
- })
- })
- describe('when all deps already satisfied', function() {
- it('resolves immediately', function() {
- var funcs = {
- generator: function(deps) {
- return deps.myvar + deps.myothervar
- }
- }
- var spy = spyOn(funcs, 'generator').and.callThrough()
- var m = new Model()
- m.set({
- myvar: 5,
- myothervar: 6
- })
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.generator)
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- expect(m.get('myid')).toBe(11)
- })
- })
- describe('when not all deps satisfied', function() {
- it('resolves only after all deps are set', function() {
- var funcs = {
- generator: function(deps) {
- return deps.myvar + deps.myothervar
- }
- }
- var spy = spyOn(funcs, 'generator').and.callThrough()
- var m = new Model()
- m.set('myvar', 5)
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.generator)
- expect(spy).not.toHaveBeenCalled()
- expect(m.has('myid')).toBe(false)
- m.set('myothervar', 6)
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- expect(m.get('myid')).toBe(11)
- })
- describe('when watching an instance', function() {
- it('resolves only after final async dep resolves', function(done) {
- var funcs = {
- generator: function(deps) {
- return deps.myvar + deps.myothervar
- }
- }
- var spy = spyOn(funcs, 'generator').and.callThrough()
- var m = new Model()
- m.set('myvar', 5)
- m.watch('myothervar', [ 'myvar' ], function(deps) {
- var deferred = $.Deferred()
- setTimeout(function() {
- deferred.resolve(deps.myvar * 2)
- }, 100)
- return deferred.promise()
- })
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.generator)
- expect(spy).not.toHaveBeenCalled()
- expect(m.has('myid')).toBe(false)
- setTimeout(function() {
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- expect(m.get('myid')).toBe(15)
- done()
- }, 200)
- })
- })
- describe('when using class-methods', function() {
- it('resolves only after final async dep resolves', function(done) {
- var funcs = {
- generator: function(deps) {
- return deps.myvar + deps.myothervar
- }
- }
- var spy = spyOn(funcs, 'generator').and.callThrough()
- var MyClass = Model.extend()
- MyClass.watch('myothervar', [ 'myvar' ], function(deps) {
- var deferred = $.Deferred()
- setTimeout(function() {
- deferred.resolve(deps.myvar * 2)
- }, 100)
- return deferred.promise()
- })
- MyClass.watch('myid', [ 'myvar', 'myothervar' ], funcs.generator)
- var m = new MyClass()
- m.set({
- myvar: 5
- })
- expect(spy).not.toHaveBeenCalled()
- expect(m.has('myid')).toBe(false)
- setTimeout(function() {
- expect(spy).toHaveBeenCalled()
- expect(m.has('myid')).toBe(true)
- expect(m.get('myid')).toBe(15)
- done()
- }, 200)
- })
- })
- })
- })
- })
- describe('unwatch', function() {
- it('calls the stop function and won\'t call the start function again', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.set('myvar', 5)
- m.watch('myid', [ 'myvar', 'myothervar' ], funcs.start, funcs.stop)
- expect(startSpy).not.toHaveBeenCalled()
- m.set('myothervar', 6)
- expect(startSpy).toHaveBeenCalledTimes(1)
- m.unwatch('myid')
- expect(stopSpy).toHaveBeenCalledTimes(1)
- // doesn't call it again
- m.set('myvar', 5)
- expect(startSpy).toHaveBeenCalledTimes(1)
- })
- })
- describe('flash', function() {
- describe('if already satisfied', function() {
- it('calls stop+start', function() {
- var funcs = {
- start: function(deps) {
- expect(deps.dep1).toBe(6)
- },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start').and.callThrough()
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.set({ dep1: 6 })
- m.watch('task1', [ 'dep1' ], startSpy, stopSpy)
- expect(stopSpy).toHaveBeenCalledTimes(0)
- expect(startSpy).toHaveBeenCalledTimes(1)
- m.flash('task1')
- expect(stopSpy).toHaveBeenCalledTimes(1)
- expect(startSpy).toHaveBeenCalledTimes(2)
- })
- })
- describe('if not satisfied', function() {
- it('does not call stop+start', function() {
- var funcs = {
- start: function() { },
- stop: function() { }
- }
- var startSpy = spyOn(funcs, 'start')
- var stopSpy = spyOn(funcs, 'stop')
- var m = new Model()
- m.watch('task1', [ 'dep1' ], startSpy, stopSpy)
- expect(stopSpy).toHaveBeenCalledTimes(0)
- expect(startSpy).toHaveBeenCalledTimes(0)
- m.flash('task1')
- expect(stopSpy).toHaveBeenCalledTimes(0)
- expect(startSpy).toHaveBeenCalledTimes(0)
- })
- })
- })
- })
|