'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('');
scope.$digest();
expect(sortedHtml(scope.$element)).toEqual('');
});
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('
');
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', function(){
var scope = compile('');
scope.$digest();
expect(element.hasClass('existing')).toBeTruthy();
expect(element.hasClass('A')).toBeTruthy();
expect(element.hasClass('B')).toBeTruthy();
});
});
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();
});
describe('ng:style', function(){
it('should set', function(){
var scope = compile('');
scope.$digest();
expect(element.css('height')).toEqual('40px');
});
it('should silently ignore undefined style', function() {
var scope = compile('');
scope.$digest();
expect(element.hasClass('ng-exception')).toBeFalsy();
});
it('should preserve and remove previous style', function(){
var scope = compile('');
scope.$digest();
expect(getStyle(element)).toEqual({height: '10px'});
scope.myStyle = {height: '20px', width: '10px'};
scope.$digest();
expect(getStyle(element)).toEqual({height: '20px', width: '10px'});
scope.myStyle = {};
scope.$digest();
expect(getStyle(element)).toEqual({height: '10px'});
});
});
it('should silently ignore undefined ng:style', function() {
var scope = compile('');
scope.$digest();
expect(element.hasClass('ng-exception')).toBeFalsy();
});
describe('ng:show', function() {
it('should show and hide an element', function(){
var element = jqLite(''),
scope = compile(element);
scope.$digest();
expect(isCssVisible(element)).toEqual(false);
scope.exp = true;
scope.$digest();
expect(isCssVisible(element)).toEqual(true);
});
it('should make hidden element visible', function() {
var element = jqLite(''),
scope = compile(element);
expect(isCssVisible(element)).toBe(false);
scope.exp = true;
scope.$digest();
expect(isCssVisible(element)).toBe(true);
});
});
describe('ng:hide', function() {
it('should hide an element', function(){
var element = jqLite(''),
scope = compile(element);
expect(isCssVisible(element)).toBe(true);
scope.exp = true;
scope.$digest();
expect(isCssVisible(element)).toBe(false);
});
});
describe('ng:controller', function(){
var temp;
beforeEach(function(){
temp = window.temp = {};
temp.Greeter = function(){
this.$root.greeter = this;
this.greeting = 'hello';
this.suffix = '!';
};
temp.Greeter.prototype = {
greet: function(name) {
return this.greeting + ' ' + name + this.suffix;
}
};
});
afterEach(function(){
window.temp = undefined;
});
it('should bind', function(){
var scope = compile('');
expect(scope.greeter.greeting).toEqual('hello');
expect(scope.greeter.greet('misko')).toEqual('hello misko!');
});
it('should support nested controllers', function(){
temp.ChildGreeter = function(){
this.greeting = 'hey';
this.$root.childGreeter = this;
};
temp.ChildGreeter.prototype = {
greet: function() {
return this.greeting + ' dude' + this.suffix;
}
};
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!');
});
});
});