diff --git a/demos/collection-repeat/index.html b/demos/collection-repeat/index.html index 0d954ee87a..f859fbd408 100644 --- a/demos/collection-repeat/index.html +++ b/demos/collection-repeat/index.html @@ -23,8 +23,6 @@ ')($rootScope.$new()); + $rootScope.$apply(); + angular.extend( + content.controller('$ionicScroll').scrollView.options, + scrollViewOpts || {} + ); + el = angular.element(''); + content.append(el); + $compile(el)(content.scope()); + $rootScope.$apply(); + }); + return el; + } + + describe('errors', function() { + it('should error if scrollView is x and y', function() { + expect(function() { + setup('collection-repeat', {scrollingX:true, scrollingY:true}); + }).toThrow(COLLECTION_REPEAT_SCROLLVIEW_XY_ERROR); + }); + it('should error if scrollView is x and no width', function() { + expect(function() { + setup('collection-repeat collection-item-height', { + scrollingX:true, + scrollingY:false + }); + }).toThrow(COLLECTION_REPEAT_ATTR_WIDTH_ERROR); + }); + it('should error if scrollView is y and no height', function() { + expect(function() { + setup('collection-repeat collection-item-width', { + scrollingX:false, + scrollingY:true + }); + }).toThrow(COLLECTION_REPEAT_ATTR_HEIGHT_ERROR); + }); + it('should error if no repeat expression', function() { + expect(function() { + setup('collection-repeat="bad" collection-item-height="1"'); + }).toThrow(COLLECTION_REPEAT_ATTR_REPEAT_ERROR.replace('%', 'bad')); + }); + }); + + describe('widthGetter & heightGetter', function() { + it('should work with given amounts', function() { + var el = setup('collection-repeat="a in b" collection-item-height="5" collection-item-width="10"'); + expect(dataSource.options.heightGetter()).toBe(5); + expect(dataSource.options.widthGetter()).toBe(10); + }); + it('should default width of y-scroller to 100%', function() { + var el = setup('collection-repeat="a in b" collection-item-height="5"'); + el.controller('$ionicScroll').scrollView.__clientWidth = 200; + expect(dataSource.options.widthGetter()).toBe(200); + }); + it('should default height of x-scroller to 100%', function() { + var el = setup('collection-repeat="a in b" collection-item-width="5"', { + scrollingX: true, + scrollingY: false + }); + el.controller('$ionicScroll').scrollView.__clientHeight = 199; + expect(dataSource.options.heightGetter()).toBe(199); + }); + it('should work with user-inputted percentage height', function() { + var el = setup('collection-repeat="a in b" collection-item-height="\'23%\'"'); + el.controller('$ionicScroll').scrollView.__clientHeight = 300; + expect(dataSource.options.heightGetter()).toEqual(0.23 * 300); + }); + it('should work with user-inputted percentage width', function() { + var el = setup('collection-repeat="a in b" collection-item-width="\'23%\'"', { + scrollingX: true, + scrollingY: false + }); + el.controller('$ionicScroll').scrollView.__clientWidth = 300; + expect(dataSource.options.widthGetter()).toEqual(0.23 * 300); + }); + }); + + it('should error if list is not an array and is truthy', function() { + var el = setup('collection-repeat="item in items" collection-item-height="50"'); + expect(function() { + el.scope().$apply('items = "string"'); + }).toThrow(); + expect(function() { + el.scope().$apply('items = 123'); + }).toThrow(); + expect(function() { + el.scope().$apply('items = {}'); + }).toThrow(); + expect(function() { + el.scope().$apply('items = []'); + }).not.toThrow(); + }); + + it('should rerender on list change', function() { + var el = setup('collection-repeat="item in items" collection-item-height="50"'); + var scrollView = el.controller('$ionicScroll').scrollView; + spyOn(scrollView, 'resize'); + dataSource.setData.reset(); + repeatManager.resize.reset(); + + el.scope().$apply('items = [ 1,2,3 ]'); + expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items); + expect(repeatManager.resize.callCount).toBe(1); + expect(scrollView.resize.callCount).toBe(1); + el.scope().$apply('items = null'); + expect(dataSource.setData).toHaveBeenCalledWith(null); + expect(repeatManager.resize.callCount).toBe(2); + expect(scrollView.resize.callCount).toBe(2); + }); + + it('should rerender on window resize', function() { + var el = setup('collection-repeat="item in items" collection-item-height="50"'); + var scrollView = el.controller('$ionicScroll').scrollView; + spyOn(scrollView, 'resize'); + dataSource.setData.reset(); + repeatManager.resize.reset(); + + el.scope().items = [1,2,3]; + + ionic.trigger('resize', { target: window }); + expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items); + expect(repeatManager.resize.callCount).toBe(1); + expect(scrollView.resize.callCount).toBe(1); + }); + + it('$destroy', function() { + var el = setup('collection-repeat="item in items" collection-item-height="50"'); + dataSource.destroy = jasmine.createSpy('dataSourceDestroy'); + repeatManager.destroy = jasmine.createSpy('repeatManagerDestroy'); + spyOn(ionic, 'off'); + + el.scope().$destroy(); + expect(dataSource.destroy).toHaveBeenCalled(); + expect(repeatManager.destroy).toHaveBeenCalled(); + expect(ionic.off).toHaveBeenCalledWith('resize', jasmine.any(Function), window); + }); +});