/*! * Ext JS Library 3.4.0 * Copyright(c) 2006-2011 Sencha Inc. * licensing@sencha.com * http://www.sencha.com/license */ (function() { var suite = Ext.test.session.getSuite('Ext.util.MixedCollection'), assert = Y.Assert; suite.add(new Y.Test.Case({ name: 'constructor', setUp: function() { this.mc = new Ext.util.MixedCollection(); }, tearDown: function() { this.mc.clear(); }, //test that a default getKey implementation is set testHasDefaultGetKey: function() { var item1 = {id: 1, data: 'first item' }, item2 = {id: 2, data: 'second item'}; this.mc.add(item1); this.mc.add(item2); assert.areSame(item1, this.mc.get(1)); assert.areSame(item2, this.mc.get(2)); }, //test that we can provide a getKey implementation testCanSetGetKey: function() { var collection = new Ext.util.MixedCollection(false, function(item) { return item.myKey; }); var item1 = {myKey: 'a', data: 'first item' }, item2 = {myKey: 'b', data: 'second item'}; collection.add(item1); collection.add(item2); assert.areSame(item2, collection.get('b')); assert.areSame(item1, collection.get('a')); } })); suite.add(new Y.Test.Case({ name: 'iterators', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.mc.addAll([ {id: 1, name: 'first'}, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, testEach: function() { var callCount = 0, callScope, total; this.mc.each(function(item, index, length) { //make sure that the function is called in the correct scope callScope = this; callCount ++; total = length; }, this); assert.areEqual(this, callScope); assert.areEqual(3, callCount); assert.areEqual(3, total); }, testEachKey: function() { var callCount = 0, callScope; this.mc.eachKey(function(key, index, length) { //make sure that the function is called in the correct scope callScope = this; callCount ++; }, this); assert.areEqual(this, callScope); assert.areEqual(3, callCount); } })); suite.add(new Y.Test.Case({ name: 'add and remove', setUp: function() { this.mc = new Ext.util.MixedCollection(); }, testAddAll: function() { var mc = this.mc; assert.areEqual(0, mc.length); mc.addAll([{id: 1}, {id: 2}, {id: 3}]); assert.areEqual(3, mc.length); }, testAddAndClear: function() { var mc = this.mc; mc.add({id: 1}); mc.add({id: 2}); mc.add({id: 3}); assert.areEqual(3, mc.length); mc.clear(); assert.areEqual(0, mc.length); }, testAddEventFired: function() { var mc = this.mc, fired = false; mc.on('add', function() {fired = true;}); mc.add({id: 1}); assert.isTrue(fired); }, testClearEventFired: function() { var mc = this.mc, fired = false; mc.on('clear', function() {fired = true;}, this); mc.clear(); assert.isTrue(fired); }, testGetCount: function() { this.mc.add({id: 1}); this.mc.add({id: 2}); this.mc.add({id: 3}); assert.areEqual(3, this.mc.getCount()); }, testRemove: function() { }, testRemoveFiresEvent: function() { } })); suite.add(new Y.Test.Case({ name: 'insert', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.mc.addAll([ {id: 1, name: 'first'}, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, doInsert: function() { this.mc.insert(1, {id: 4, name: 'fourth'}); }, testInsertsToCorrectLocation: function() { this.doInsert(); assert.areEqual(4, this.mc.itemAt(1).id); }, testOtherItemsPreserved: function() { var prevCount = this.mc.getCount(); this.doInsert(); assert.areEqual(prevCount + 1, this.mc.getCount()); }, testFiresAddEvent: function() { var fired = false; this.mc.on('add', function() { fired = true; }); this.doInsert(); assert.isTrue(fired); } })); suite.add(new Y.Test.Case({ name: 'replace', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.mc.addAll([ {id: 1, name: 'first'}, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, doReplace: function() { this.mc.replace(2, {id: 4, name: 'fourth'}); }, testReplacesCorrectItem: function() { this.doReplace(); assert.areEqual("fourth", this.mc.itemAt(1).name); }, testPreviousItemRemoved: function() { var prevCount = this.mc.getCount(); this.doReplace(); assert.areEqual(prevCount, this.mc.getCount()); }, testReplaceEventFired: function() { var fired = false; this.mc.on('replace', function() { fired = true; }); this.doReplace(); assert.isTrue(fired); } })); suite.add(new Y.Test.Case({ name: 'clone', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.mc.addAll([ {id: 1, name: 'first'}, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, //test that a shallow clone is completed correctly testClone: function() { var newMC = this.mc.clone(); assert.areEqual(3, newMC.getCount()); Ext.each([1, 2, 3], function(id) { assert.areEqual(this.mc.get(id).id, newMC.get(id).id); }, this); } })); suite.add(new Y.Test.Case({ name: 'getting items', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.item1 = {id: 1, name: 'first'}; this.mc.addAll([ this.item1, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, testFirst: function() { assert.areEqual(1, this.mc.first().id); }, testLast: function() { assert.areEqual(3, this.mc.last().id); }, testGet: function() { assert.areEqual(2, this.mc.get(2).id); }, testGetKey: function() { assert.areEqual(1, this.mc.getKey(this.item1)); }, //should return items in the given range testGetRange: function() { var items = this.mc.getRange(1, 2); assert.areEqual(2, items.length); assert.areEqual(2, items[0].id); assert.areEqual(3, items[1].id); }, //should get all items testGetRangeWithNoArguments: function() { var items = this.mc.getRange(); assert.areEqual(3, items.length); }, //should get all items after the provided start index testGetRangeWithNoEnd: function() { var items = this.mc.getRange(1); assert.areEqual(2, items.length); }, testIndexOf: function() { assert.areEqual(0, this.mc.indexOf(this.item1)); }, testIndexOfKey: function() { assert.areEqual(2, this.mc.indexOfKey(3)); }, testKey: function() { assert.areEqual(3, this.mc.key(3).id); }, testItemByIndex: function() { this.mc.add({id: 'a', name: 'another item'}); this.mc.add({id: 'b', name: 'yet another item'}); assert.areEqual('b', this.mc.item(4).id); }, //key should take priority over index testItemByKey: function() { this.mc.add({id: 'a', name: 'another item'}); assert.areEqual('a', this.mc.item('a').id); }, testItemAt: function() { assert.areEqual(3, this.mc.itemAt(2).id); } })); suite.add(new Y.Test.Case({ name: 'find functions', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.mc.addAll([ {id: 1, name: 'first'}, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, testFind: function() { var matched = this.mc.find(function(item) { return item.name == 'third'; }); assert.areEqual('third', matched.name); }, testFindIndex: function() { var matched = this.mc.findIndex('name', 'third'); assert.areEqual(2, matched); }, testFindIndexBy: function() { var matched = this.mc.findIndexBy(function(item) { return item.name == 'second'; }); assert.areEqual(1, matched); } })); suite.add(new Y.Test.Case({ name: 'contains', setUp: function() { this.mc = new Ext.util.MixedCollection(); this.item = {id: 1, name: 'first'}; this.mc.addAll([ this.item, {id: 2, name: 'second'}, {id: 3, name: 'third'} ]); }, tearDown: function() { delete this.item; }, testContains: function() { assert.isTrue(this.mc.contains(this.item)); }, testDoesNotContain: function() { assert.isFalse(this.mc.contains({some: 'object'})); }, testContainsKey: function() { assert.isTrue(this.mc.containsKey(1)); }, testDoesNotContainKey: function() { assert.isFalse(this.mc.containsKey('abc')); } })); suite.add(new Y.Test.Case({ name: 'single sorting', setUp: function() { this.mc = new Ext.util.MixedCollection(false, function(item) { return item['code']; }); this.mc.addAll([ {id: 1, name: 'first', code: 'C', modifier: 10}, {id: 2, name: 'second', code: 'A', modifier: 100}, {id: 3, name: 'third', code: 'B', modifier: 5} ]); }, testKeySort: function() { var mc = this.mc; mc.keySort(); assert.areEqual('A', mc.itemAt(0).code); assert.areEqual('B', mc.itemAt(1).code); assert.areEqual('C', mc.itemAt(2).code); }, testDirectionalKeySort: function() { var mc = this.mc; mc.keySort('DESC'); assert.areEqual('C', mc.itemAt(0).code); assert.areEqual('B', mc.itemAt(1).code); assert.areEqual('A', mc.itemAt(2).code); }, testSort: function() { var mc = new Ext.util.MixedCollection(); mc.addAll(3, 1, 4, 2); mc.sort(); assert.areEqual(1, mc.itemAt(0)); assert.areEqual(2, mc.itemAt(1)); assert.areEqual(3, mc.itemAt(2)); assert.areEqual(4, mc.itemAt(3)); }, testDirectionalSort: function() { }, testSortWithComparator: function() { var mc = this.mc; mc.sort('ASC', function(a, b) { return (a.id * a.modifier) - (b.id * b.modifier); }); assert.areEqual('C', mc.itemAt(0).code); assert.areEqual('B', mc.itemAt(1).code); assert.areEqual('A', mc.itemAt(2).code); }, testDirectionalSortWithComparator: function() { var mc = this.mc; mc.sort('DESC', function(a, b) { return (a.id * a.modifier) - (b.id * b.modifier); }); assert.areEqual('A', mc.itemAt(0).code); assert.areEqual('B', mc.itemAt(1).code); assert.areEqual('C', mc.itemAt(2).code); }, testSortEventFired: function() { var fired = false; this.mc.on('sort', function() { fired = true; }); this.mc.sort('name'); assert.isTrue(fired); } })); suite.add(new Y.Test.Case({ name: 'reordering', setUp: function() { this.mc = new Ext.util.MixedCollection(false, function(item) { return item['code']; }); this.mc.addAll([ {id: 1, name: 'first', code: 'C', modifier: 10}, {id: 2, name: 'second', code: 'A', modifier: 100}, {id: 3, name: 'third', code: 'B', modifier: 5} ]); }, testReordering: function() { var mc = this.mc; mc.reorder({ 1: 2, 2: 0 }); assert.areEqual('B', mc.itemAt(0).code); assert.areEqual('C', mc.itemAt(1).code); assert.areEqual('A', mc.itemAt(2).code); }, testSortEventFired: function() { var wasFired = false, mc = this.mc; mc.on('sort', function() { wasFired = true; }, this); mc.reorder({ 1: 2, 2: 0 }); assert.isTrue(wasFired); } })); })();