'use strict'; describe('ngClass', function() { var element; beforeEach(module(function($compileProvider) { $compileProvider.debugInfoEnabled(false); })); afterEach(function() { dealoc(element); }); it('should add new and remove old classes dynamically', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynClass = 'A'; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(true); $rootScope.dynClass = 'B'; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(false); expect(element.hasClass('B')).toBe(true); delete $rootScope.dynClass; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(false); expect(element.hasClass('B')).toBe(false); })); it('should add new and remove old classes with same names as Object.prototype properties dynamically', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynClass = { watch: true, hasOwnProperty: true, isPrototypeOf: true }; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('watch')).toBe(true); expect(element.hasClass('hasOwnProperty')).toBe(true); expect(element.hasClass('isPrototypeOf')).toBe(true); $rootScope.dynClass.watch = false; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('watch')).toBe(false); expect(element.hasClass('hasOwnProperty')).toBe(true); expect(element.hasClass('isPrototypeOf')).toBe(true); delete $rootScope.dynClass; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('watch')).toBe(false); expect(element.hasClass('hasOwnProperty')).toBe(false); expect(element.hasClass('isPrototypeOf')).toBe(false); })); it('should support adding multiple classes via an array', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); })); it('should support adding multiple classes conditionally via a map of class names to boolean ' + 'expressions', inject(function($rootScope, $compile) { element = $compile( '
' + '
')($rootScope); $rootScope.conditionA = true; $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeFalsy(); expect(element.hasClass('AnotB')).toBeTruthy(); $rootScope.conditionB = function() { return true; }; $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); expect(element.hasClass('AnotB')).toBeFalsy(); })); it('should support adding multiple classes via an array mixed with conditionally via a map', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeFalsy(); $rootScope.condition = true; $rootScope.$digest(); expect(element.hasClass('B')).toBeTruthy(); })); it('should remove classes when the referenced object is the same but its property is changed', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.classes = { A: true, B: true }; $rootScope.$digest(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); $rootScope.classes.A = false; $rootScope.$digest(); expect(element.hasClass('A')).toBeFalsy(); expect(element.hasClass('B')).toBeTruthy(); }) ); it('should support adding multiple classes via a space delimited string', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); })); it('should support adding multiple classes via a space delimited string inside an array', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); expect(element.hasClass('C')).toBeTruthy(); })); it('should preserve class added post compilation with pre-existing classes', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynClass = 'A'; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); // add extra class, change model and eval element.addClass('newClass'); $rootScope.dynClass = 'B'; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('B')).toBe(true); expect(element.hasClass('newClass')).toBe(true); })); it('should preserve class added post compilation without pre-existing classes"', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynClass = 'A'; $rootScope.$digest(); expect(element.hasClass('A')).toBe(true); // add extra class, change model and eval element.addClass('newClass'); $rootScope.dynClass = 'B'; $rootScope.$digest(); expect(element.hasClass('B')).toBe(true); expect(element.hasClass('newClass')).toBe(true); })); it('should preserve other classes with similar name"', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynCls = 'panel'; $rootScope.$digest(); $rootScope.dynCls = 'foo'; $rootScope.$digest(); expect(element[0].className).toBe('ui-panel ui-selected foo'); })); it('should not add duplicate classes', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynCls = 'panel'; $rootScope.$digest(); expect(element[0].className).toBe('panel bar'); })); it('should remove classes even if it was specified via class attribute', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynCls = 'panel'; $rootScope.$digest(); $rootScope.dynCls = 'window'; $rootScope.$digest(); expect(element[0].className).toBe('bar window'); })); it('should remove classes even if they were added by another code', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynCls = 'foo'; $rootScope.$digest(); element.addClass('foo'); $rootScope.dynCls = ''; $rootScope.$digest(); expect(element[0].className).toBe(''); })); it('should convert undefined and null values to an empty string', inject(function($rootScope, $compile) { element = $compile('
')($rootScope); $rootScope.dynCls = [undefined, null]; $rootScope.$digest(); expect(element[0].className).toBe(''); })); it('should ngClass odd/even', inject(function($rootScope, $compile) { element = $compile('