');
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('');
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('
');
scope.$digest();
var e1 = jqLite(element[0].childNodes[1]);
var e2 = jqLite(element[0].childNodes[2]);
expect(e1.hasClass('existing')).toBeTruthy();
expect(e1.hasClass('odd')).toBeTruthy();
expect(e2.hasClass('existing')).toBeTruthy();
expect(e2.hasClass('even')).toBeTruthy();
});
it('should allow both ng:class and ng:class-odd/even on the same element', function() {
var scope = compile('
' +
'' +
'
');
scope.$apply();
var e1 = jqLite(element[0].childNodes[1]);
var e2 = jqLite(element[0].childNodes[2]);
expect(e1.hasClass('plainClass')).toBeTruthy();
expect(e1.hasClass('odd')).toBeTruthy();
expect(e1.hasClass('even')).toBeFalsy();
expect(e2.hasClass('plainClass')).toBeTruthy();
expect(e2.hasClass('even')).toBeTruthy();
expect(e2.hasClass('odd')).toBeFalsy();
});
it('should allow both ng:class and ng:class-odd/even with multiple classes', function() {
var scope = compile('
');
expect(scope.greeting).not.toBeDefined();
expect(scope.greeter.greeting).toEqual('hello');
expect(scope.greeter.greet('misko')).toEqual('hello misko!');
expect(scope.greeter.greeting).toEqual('hello');
expect(scope.childGreeter.greeting).toEqual('hey');
expect(scope.childGreeter.$parent.greeting).toEqual('hello');
scope.$digest();
expect(scope.$element.text()).toEqual('hey dude!');
});
});
describe('ng:cloak', function() {
it('should get removed when an element is compiled', function() {
var element = jqLite('');
expect(element.attr('ng:cloak')).toBe('');
angular.compile(element);
expect(element.attr('ng:cloak')).toBeUndefined();
});
it('should remove ng-cloak class from a compiled element', function() {
var element = jqLite('');
expect(element.hasClass('foo')).toBe(true);
expect(element.hasClass('ng-cloak')).toBe(true);
expect(element.hasClass('bar')).toBe(true);
angular.compile(element);
expect(element.hasClass('foo')).toBe(true);
expect(element.hasClass('ng-cloak')).toBe(false);
expect(element.hasClass('bar')).toBe(true);
});
});
});