micromodel
Version:
Model that can be used on both Client & Server
119 lines (98 loc) • 3.9 kB
text/coffeescript
require './helper'
{BaseModel, Model, FullModel, BaseCollection, Collection, FullCollection} = require '../micromodel'
describe "Collection", ->
beforeEach ->
= new BaseModel name: 'Probe', id: 'probe'
= new BaseModel name: 'SCV', id: 'scv'
it "should add, delete and get by id and index", ->
units = new BaseCollection
expect(units).to.have.length 1
units.add
expect(units).to.have.length 2
expect(units.at(0)).to.eql
expect(units.at(1)).to.eql
expect(units.get(.id)).to.eql
units.delete
units.delete
expect(units).to.have.length 1
units.delete
expect(units).to.have.length 0
it "should not add twice", ->
units = new BaseCollection ,
units.add
expect(units).to.have.length 1
it "should check for equality", ->
group1 = new BaseCollection
group2 = new BaseCollection
group3 = new BaseCollection
expect(group1.isEqual(group2)).to.equal true
expect(group1.isEqual(group3)).to.equal false
it "should compare with non collections", ->
group = new BaseCollection
expect(group.isEqual(1)).to.equal false
expect(group.isEqual(null)).to.equal false
expect(group.isEqual({})).to.equal false
expect(group.isEqual([])).to.equal false
it "should track changes", ->
units = new BaseCollection()
expect(units.add(, )).to.eql [, ]
expect(units.delete()).to.eql []
expect(units.clear()).to.eql []
it "should not track not changed elements", ->
units = new BaseCollection()
expect(units.add()).to.eql []
expect(units.add(, )).to.eql []
expect(units.delete()).to.eql []
expect(units.delete()).to.eql []
it "should convert to JSON", ->
group = new BaseCollection
expect(JSON.parse(JSON.stringify(group))).to.eql [{id: 'probe', name: 'Probe'}]
describe "Events", ->
it "should emit add, delete and change events", ->
group = new FullCollection()
events = []
group.on 'add', (model) -> events.push 'add', model
group.on 'delete', (model) -> events.push 'delete', model
group.on 'change', (model) -> events.push 'change'
group.add
group.add
group.add
group.delete
expect(events).to.eql [
'add', ,
'change',
'add', ,
'change',
'delete', ,
'change'
]
it "should proxy model events", ->
probe = new FullModel name: 'Probe', id: 'probe'
group = new FullCollection()
events = []
group.on 'model:change', (model) -> events.push 'change', model
group.add probe
probe.set race: 'Protoss'
expect(events).to.eql ['change', probe]
it "should emit change on sort", ->
group = new FullCollection ,
events = []
group.on 'change', (model) -> events.push 'change'
expect(group.sort(comparator: 'name')).to.eql true
expect(events).to.eql ['change']
it "should not emit change on sort if order not changed", ->
group = new FullCollection ,
events = []
group.on 'change', (model) -> events.push 'change'
expect(group.sort(comparator: 'name')).to.eql false
expect(events).to.eql []
describe "Sorting", ->
it "should sort and preserve order", ->
group = new FullCollection()
group.add ,
expect([group.at(0), group.at(1)]).to.eql [, ]
expect(group.sort(comparator: 'name')).to.eql true
expect([group.at(0), group.at(1)]).to.eql [, ]
group = new FullCollection [], comparator: 'name'
group.add ,
expect([group.at(0), group.at(1)]).to.eql [, ]