UNPKG

oj

Version:

A unified templating language for the people. Thirsty people.

649 lines (498 loc) 16.4 kB
# oj.List.coffee # ============================================================================== path = require 'path' fs = require 'fs' Backbone = require 'backbone' oj = require '../oj.js' contains = (control, args...) -> html = oj.toHTML control for arg in args expect(html).to.contain arg jsonify = (any) -> if oj.isString(any) or oj.isNumber(any) or oj.isBoolean(any) '' + any else JSON.stringify any describe 'oj.List', -> beforeEach -> $('body').html '' it 'exists', -> expect(oj.List).to.be.a 'function' it 'construct default', -> control = oj.List() expect(oj.isOJ control).to.equal true expect(control.typeName).to.equal 'List' expect(control.count).to.equal 0 expect(control.items).to.deep.equal [] it 'construct with id', -> id = 'my-id' control = oj.List id:id expect(control.count).to.equal 0 expect(control.id).to.equal id expect(control.attributes.id).to.equal id it 'construct with name', -> name = 'my-name' control = oj.List name:name expect(control.count).to.equal 0 expect(control.name).to.not.exist expect(control.attributes.name).to.equal name it 'construct with one argument', -> control = oj.List 1 expect(control.typeName).to.equal 'List' expect(control.count).to.equal 1 expect(control.items).to.deep.equal [1] contains control, 'class="oj-List"' '<div' '<div>1</div>' '</div>' it 'construct with two arguments', -> control = oj.List 1,2 expect(control.typeName).to.equal 'List' expect(control.count).to.equal 2 expect(control.items).to.deep.equal [1,2] contains control, 'class="oj-List"' '<div' '<div>1</div>' '<div>2</div>' '</div>' it 'construct with empty models argument', -> control = oj.List models:[] expect(control.count).to.equal 0 expect(control.typeName).to.equal 'List' expect(control.items).to.deep.equal [] it 'tagName and itemTagName', -> control = oj.List 1, 2, tagName:'span', itemTagName:'div' expect(control.typeName).to.equal 'List' expect(control.count).to.equal 2 expect(control.items).to.deep.equal [1,2] contains control, 'class="oj-List"' '<span' '<div>1</div>' '<div>2</div>' '</span>' it 'remove, add', -> control = oj.List 1,2,3 expect(control.count).to.equal 3 expect(control.typeName).to.equal 'List' expect(control.items).to.deep.equal [1,2,3] r = control.remove(1) expect(r).to.equal 2 expect(control.items).to.deep.equal [1,3] r = control.remove(1) expect(r).to.equal 3 expect(control.items).to.deep.equal [1] r = control.remove(0) expect(r).to.equal 1 expect(control.items).to.deep.equal [] expect(-> control.remove(1)).to.throw Error expect(-> control.add(1,4)).to.throw Error control.add(0,4) expect(control.items).to.deep.equal [4] control.add(1,5) expect(control.items).to.deep.equal [4,5] control.add(1,6) expect(control.items).to.deep.equal [4,6,5] it 'remove, add (w/default index)', -> control = oj.List 1,2,3 expect(control.count).to.equal 3 expect(control.typeName).to.equal 'List' expect(control.items).to.deep.equal [1,2,3] r = control.remove() expect(r).to.equal 3 expect(control.items).to.deep.equal [1,2] r = control.remove() expect(r).to.equal 2 expect(control.items).to.deep.equal [1] r = control.remove() expect(r).to.equal 1 expect(control.items).to.deep.equal [] expect(-> control.remove()).to.throw Error expect(-> control.add(1,4)).to.throw Error control.add(4) expect(control.items).to.deep.equal [4] control.add(5) expect(control.items).to.deep.equal [4,5] control.add(6) expect(control.items).to.deep.equal [4,5,6] it 'shift, unshift', -> control = oj.List 1,2,3 expect(control.count).to.equal 3 expect(control.typeName).to.equal 'List' expect(control.items).to.deep.equal [1,2,3] r = control.shift() expect(r).to.equal 1 expect(control.items).to.deep.equal [2,3] r = control.shift() expect(r).to.equal 2 expect(control.items).to.deep.equal [3] r = control.shift() expect(r).to.equal 3 expect(control.items).to.deep.equal [] expect(-> control.shift()).to.throw Error control.unshift(4) expect(control.items).to.deep.equal [4] control.unshift(5) expect(control.items).to.deep.equal [5,4] it 'pop, push', -> control = oj.List 1,2,3 expect(control.count).to.equal 3 expect(control.typeName).to.equal 'List' expect(control.items).to.deep.equal [1,2,3] r = control.pop() expect(r).to.equal 3 expect(control.items).to.deep.equal [1,2] r = control.pop() expect(r).to.equal 2 expect(control.items).to.deep.equal [1] r = control.pop() expect(r).to.equal 1 expect(control.items).to.deep.equal [] expect(-> control.pop()).to.throw Error control.push(4) expect(control.items).to.deep.equal [4] control.push(5) expect(control.items).to.deep.equal [4,5] it 'NumberList', -> control = oj.NumberList 1,2 expect(control.typeName).to.equal 'NumberList' expect(control.count).to.equal 2 expect(control.items).to.deep.equal [1,2] contains control, 'class="oj-NumberList"' '<ol' '<li>1</li>' '<li>2</li>' '</ol>' it 'BulletList', -> control = oj.BulletList 1,2 expect(control.typeName).to.equal 'BulletList' expect(control.count).to.equal 2 expect(control.items).to.deep.equal [1,2] contains control, 'class="oj-BulletList"' '<ul' '<li>1</li>' '<li>2</li>' '</ul>' it 'construct with one model argument (default each)', -> control = oj.List models:[1] expect(control.count).to.equal 1 expect(control.typeName).to.equal 'List' expect(control.typeName).to.equal 'List' contains control, '<div>1</div>' expect(control.items).to.deep.equal [1] it 'construct with many models (default each)', -> user1 = name:'Alfred', strength: 11 user2 = name:'Batman', strength: 22 user3 = name:'Catwoman', strength: 33 user4 = name:'Gordan', strength: 44 control = oj.List models:[user1,user2,user3] expect(control.count).to.equal 3 expect(control.typeName).to.equal 'List' expect(control.typeName).to.equal 'List' contains control, "<div>#{jsonify user1}</div>" "<div>#{jsonify user2}</div>" "<div>#{jsonify user3}</div>" expect(control.items).to.deep.equal [ jsonify user1 jsonify user2 jsonify user3 ] it 'construct with list of backbone models (default each)', -> class UserModel extends Backbone.Model user1 = new UserModel name:'Alfred', strength: 11 user2 = new UserModel name:'Batman', strength: 22 user3 = new UserModel name:'Catwoman', strength: 33 user4 = new UserModel name:'Gordan', strength: 44 control = oj.List models:[user1,user2,user3] expect(control.count).to.equal 3 expect(control.typeName).to.equal 'List' expect(control.typeName).to.equal 'List' contains control, "<div>#{jsonify user1}</div>" "<div>#{jsonify user2}</div>" "<div>#{jsonify user3}</div>" expect(control.items).to.deep.equal [ jsonify user1 jsonify user2 jsonify user3 ] it 'construct with collection of backbone models (default each)', -> class UserModel extends Backbone.Model class UserCollection extends Backbone.Collection model: UserModel comparator: (m) -> m.get 'name' user1 = new UserModel name:'Alfred', strength: 11 user2 = new UserModel name:'Batman', strength: 22 user3 = new UserModel name:'Catwoman', strength: 33 user4 = new UserModel name:'Gordan', strength: 44 users = new UserCollection [user3, user1] control = oj.List models:users expect(control.count).to.equal 2 expect(control.typeName).to.equal 'List' expect(control.typeName).to.equal 'List' contains control, "<div>#{jsonify user1}</div>" "<div>#{jsonify user3}</div>" expect(control.items).to.deep.equal [ jsonify user1 jsonify user3 ] # Add element users.add [user2] contains control, "<div>#{jsonify user1}</div>" "<div>#{jsonify user2}</div>" "<div>#{jsonify user3}</div>" expect(control.items).to.deep.equal [ jsonify user1 jsonify user2 jsonify user3 ] # Remove element users.remove user1 contains control, "<div>#{jsonify user2}</div>" "<div>#{jsonify user3}</div>" expect(control.items).to.deep.equal [ jsonify user2 jsonify user3 ] # Reset elements users.reset user4 contains control, "<div>#{jsonify user4}</div>" expect(control.items).to.deep.equal [ jsonify user4 ] it 'construct with collection of backbone models (manual each)', -> namify = (model) -> model.get 'name' class UserModel extends Backbone.Model class UserCollection extends Backbone.Collection model: UserModel comparator: namify user1 = new UserModel name:'Alfred', strength: 11 user2 = new UserModel name:'Batman', strength: 22 user3 = new UserModel name:'Catwoman', strength: 33 user4 = new UserModel name:'Gordan', strength: 44 users = new UserCollection [user3, user1] control = oj.List models:users, each:namify expect(control.count).to.equal 2 expect(control.typeName).to.equal 'List' expect(control.typeName).to.equal 'List' contains control, "<div>#{namify user1}</div>" "<div>#{namify user3}</div>" expect(control.items).to.deep.equal [ namify user1 namify user3 ] # Add element users.add [user2] contains control, "<div>#{namify user1}</div>" "<div>#{namify user2}</div>" "<div>#{namify user3}</div>" expect(control.items).to.deep.equal [ namify user1 namify user2 namify user3 ] # Remove element users.remove user1 contains control, "<div>#{namify user2}</div>" "<div>#{namify user3}</div>" expect(control.items).to.deep.equal [ namify user2 namify user3 ] # Reset elements users.reset user4 contains control, "<div>#{namify user4}</div>" expect(control.items).to.deep.equal [ namify user4 ] it 'BulletList from element', -> $('body').html """ <ul> <li>one</li> <li>2</li> <li></li> </ul> """ $list = $('ul') control = oj.BulletList el:$list[0] expect(control.typeName).to.equal 'BulletList' expect(control.count).to.equal 3 expect(control.item(0)).to.equal 'one' expect(control.item(1)).to.equal 2 expect(control.item(2)).to.not.exist expect(control.items).to.deep.equal ['one', 2, undefined] it 'construct with collection of backbone models (modelView each)', -> NameModelView = oj.createType 'NameModelView', base: oj.ModelView constructor: (model) -> @model = model @el = oj => oj.li -> namify model NameModelView.base.constructor.apply(this, []); properties: isListItem: true model: get: -> @_model set:(v) -> @_model = v return namify = (model) -> model.get 'name' class UserModel extends Backbone.Model class UserCollection extends Backbone.Collection model: UserModel comparator: namify user1 = new UserModel name:'Alfred', strength: 11 user2 = new UserModel name:'Batman', strength: 22 user3 = new UserModel name:'Catwoman', strength: 33 user4 = new UserModel name:'Gordan', strength: 44 users = new UserCollection [user3, user1] control = oj.List models:users, each:NameModelView expect(control.count).to.equal 2 expect(control.typeName).to.equal 'List' contains control, "<li class=\"oj-NameModelView\">#{namify user1}</li>" "<li class=\"oj-NameModelView\">#{namify user3}</li>" # Verify items are all views with models that match our models expect(control.items.map((view) ->view.model)).to.deep.equal [ user1 user3 ] # Add element users.add [user2] contains control, "<li class=\"oj-NameModelView\">#{namify user1}</li>" "<li class=\"oj-NameModelView\">#{namify user2}</li>" "<li class=\"oj-NameModelView\">#{namify user3}</li>" expect(control.items.map((view) ->view.model)).to.deep.equal [ user1 user2 user3 ] # Remove element users.remove user1 contains control, "<li class=\"oj-NameModelView\">#{namify user2}</li>" "<li class=\"oj-NameModelView\">#{namify user3}</li>" # Reset elements users.reset user4 contains control, "<li class=\"oj-NameModelView\">#{namify user4}</li>" expect(control.items.map((view) ->view.model)).to.deep.equal [ user4 ] it 'construct with views that replace li elements', -> namify = (model) -> model.get 'name' NameModelView = oj.createType 'NameModelView', base: oj.View constructor: (model) -> @model = model @el = oj => oj.li -> namify model return NameModelView.base.constructor.apply(this, []); properties: isListItem: true model: get: -> @_model set:(v) -> @_model = v return class UserModel extends Backbone.Model user1 = new UserModel name:'Alfred', strength: 11 user2 = new UserModel name:'Batman', strength: 22 user3 = new UserModel name:'Catwoman', strength: 33 user4 = new UserModel name:'Gordan', strength: 44 control = oj.List new NameModelView(user1), new NameModelView(user2) expect(control.count).to.equal 2 expect(control.typeName).to.equal 'List' contains control, "<li class=\"oj-NameModelView\">#{namify user1}</li>" "<li class=\"oj-NameModelView\">#{namify user2}</li>" expect(control.items.map((view) -> view.model)).to.deep.equal [ user1 user2 ] # Add element control.add new NameModelView(user3) contains control, "<li class=\"oj-NameModelView\">#{namify user1}</li>" "<li class=\"oj-NameModelView\">#{namify user2}</li>" "<li class=\"oj-NameModelView\">#{namify user3}</li>" expect(control.items.map((view) -> view.model)).to.deep.equal [ user1 user2 user3 ] # Remove last element control.remove 1 contains control, "<li class=\"oj-NameModelView\">#{namify user1}</li>" "<li class=\"oj-NameModelView\">#{namify user3}</li>" expect(control.items.map((view) -> view.model)).to.deep.equal [ user1 user3 ] # Change item control.item 1, new NameModelView(user4) contains control, "<li class=\"oj-NameModelView\">#{namify user1}</li>" "<li class=\"oj-NameModelView\">#{namify user4}</li>" expect(control.items.map((view) -> view.model)).to.deep.equal [ user1 user4 ] # Get item c = control.item(1) expect(c.model).to.deep.equal user4 it 'NumberList from element', -> $('body').html """ <ol> <li>one</li> <li>2</li> <li></li> </ol> """ $list = $('ol') control = oj.NumberList el:$list[0] expect(control.typeName).to.equal 'NumberList' expect(control.count).to.equal 3 expect(control.item(0)).to.equal 'one' expect(control.item(1)).to.equal 2 expect(control.item(2)).to.not.exist expect(control.items).to.deep.equal ['one', 2, undefined] it 'List from element', -> $('body').html """ <div> <div>one</div> <div>2</div> <div></div> </div> """ $list = $('body > div') control = oj.List el:$list[0] expect(control.typeName).to.equal 'List' expect(control.count).to.equal 3 expect(control.item(0)).to.equal 'one' expect(control.item(1)).to.equal 2 expect(control.item(2)).to.not.exist expect(control.items).to.deep.equal ['one', 2, undefined]