'use strict'; describe("directive", function() { var compile, model, element; beforeEach(function() { compile = function(html) { element = jqLite(html); return model = angular.compile(element)(); }; }); afterEach(function() { dealoc(model); }); it("should ng:init", function() { var scope = compile('
'); expect(scope.a).toEqual(123); }); describe('ng:bind', function() { it('should set text', function() { var scope = compile('
'); expect(element.text()).toEqual(''); scope.a = 'misko'; scope.$digest(); expect(element.hasClass('ng-binding')).toEqual(true); expect(element.text()).toEqual('misko'); }); it('should set text to blank if undefined', function() { var scope = compile('
'); scope.a = 'misko'; scope.$digest(); expect(element.text()).toEqual('misko'); scope.a = undefined; scope.$digest(); expect(element.text()).toEqual(''); }); it('should set html', function() { var scope = compile('
'); scope.html = '
hello
'; scope.$digest(); expect(lowercase(element.html())).toEqual('
hello
'); }); it('should set unsafe html', function() { var scope = compile('
'); scope.html = '
hello
'; scope.$digest(); expect(lowercase(element.html())).toEqual('
hello
'); }); it('should set element element', function() { angularFilter.myElement = function() { return jqLite('hello'); }; var scope = compile('
'); scope.$digest(); expect(lowercase(element.html())).toEqual('hello'); }); it('should have $element set to current bind element', function(){ angularFilter.myFilter = function(){ this.$element.addClass("filter"); return 'HELLO'; }; var scope = compile('
before
after
'); scope.$digest(); expect(sortedHtml(scope.$element)).toEqual('
before
HELLO
after
'); }); it('should suppress rendering of falsy values', function() { var scope = compile('
{{ null }}{{ undefined }}{{ "" }}-{{ 0 }}{{ false }}
'); scope.$digest(); expect(scope.$element.text()).toEqual('-0false'); }); }); describe('ng:bind-template', function() { it('should ng:bind-template', function() { var scope = compile('
'); scope.name = 'Misko'; scope.$digest(); expect(element.hasClass('ng-binding')).toEqual(true); expect(element.text()).toEqual('Hello Misko!'); }); it('should have $element set to current bind element', function() { var innerText; angularFilter.myFilter = function(text) { innerText = innerText || this.$element.text(); return text; }; var scope = compile('
beforeINNERafter
'); scope.$digest(); expect(scope.$element.text()).toEqual("beforeHELLOafter"); expect(innerText).toEqual('INNER'); }); }); describe('ng:bind-attr', function() { it('should bind attributes', function() { var scope = compile('
'); scope.$digest(); expect(element.attr('src')).toEqual('http://localhost/mysrc'); expect(element.attr('alt')).toEqual('myalt'); }); it('should not pretty print JSON in attributes', function() { var scope = compile('{{ {a:1} }}'); scope.$digest(); expect(element.attr('alt')).toEqual('{"a":1}'); }); }); it('should remove special attributes on false', function() { var scope = compile(''); var input = scope.$element[0]; expect(input.disabled).toEqual(false); expect(input.readOnly).toEqual(false); expect(input.checked).toEqual(false); scope.disabled = true; scope.readonly = true; scope.checked = true; scope.$digest(); expect(input.disabled).toEqual(true); expect(input.readOnly).toEqual(true); expect(input.checked).toEqual(true); }); describe('ng:click', function(){ it('should get called on a click', function() { var scope = compile('
'); scope.$digest(); expect(scope.clicked).toBeFalsy(); browserTrigger(element, 'click'); expect(scope.clicked).toEqual(true); }); it('should stop event propagation', function() { var scope = compile('
'); scope.$digest(); expect(scope.outer).not.toBeDefined(); expect(scope.inner).not.toBeDefined(); var innerDiv = element.children()[0]; browserTrigger(innerDiv, 'click'); expect(scope.outer).not.toBeDefined(); expect(scope.inner).toEqual(true); }); }); describe('ng:submit', function() { it('should get called on form submit', function() { var scope = compile('
' + '' + '
'); scope.$digest(); expect(scope.submitted).not.toBeDefined(); browserTrigger(element.children()[0]); expect(scope.submitted).toEqual(true); }); }); describe('ng:class', function() { it('should add new and remove old classes dynamically', function() { var scope = compile('
'); scope.dynClass = 'A'; scope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(true); scope.dynClass = 'B'; scope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(false); expect(element.hasClass('B')).toBe(true); delete scope.dynClass; scope.$digest(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(false); expect(element.hasClass('B')).toBe(false); }); it('should support adding multiple classes via an array', function(){ var scope = compile('
'); scope.$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', function(){ var scope = compile('
'); scope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); }); it('should preserve class added post compilation with pre-existing classes', function() { var scope = compile('
'); scope.dynClass = 'A'; scope.$digest(); expect(element.hasClass('existing')).toBe(true); // add extra class, change model and eval element.addClass('newClass'); scope.dynClass = 'B'; scope.$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"', function() { var scope = compile('
'); scope.dynClass = 'A'; scope.$digest(); expect(element.hasClass('A')).toBe(true); // add extra class, change model and eval element.addClass('newClass'); scope.dynClass = 'B'; scope.$digest(); expect(element.hasClass('B')).toBe(true); expect(element.hasClass('newClass')).toBe(true); }); it('should preserve other classes with similar name"', function() { var scope = compile('
'); scope.dynCls = 'panel'; scope.$digest(); scope.dynCls = 'foo'; scope.$digest(); expect(element[0].className).toBe('ui-panel ui-selected ng-directive foo'); }); it('should not add duplicate classes', function() { var scope = compile('
'); scope.dynCls = 'panel'; scope.$digest(); expect(element[0].className).toBe('panel bar ng-directive'); }); it('should remove classes even if it was specified via class attribute', function() { var scope = compile('
'); scope.dynCls = 'panel'; scope.$digest(); scope.dynCls = 'window'; scope.$digest(); expect(element[0].className).toBe('bar ng-directive window'); }); it('should remove classes even if they were added by another code', function() { var scope = compile('
'); scope.dynCls = 'foo'; scope.$digest(); element.addClass('foo'); scope.dynCls = ''; scope.$digest(); expect(element[0].className).toBe('ng-directive'); }); it('should convert undefined and null values to an empty string', function() { var scope = compile('
'); scope.dynCls = [undefined, null]; scope.$digest(); expect(element[0].className).toBe('ng-directive'); }); }); it('should ng:class odd/even', function() { var scope = compile('