1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
describe('compiler', function(){
function element(html) {
return jQuery(html)[0];
}
var compiler, markup, directives, compile, log;
beforeEach(function(){
log = "";
directives = {
hello: function(expression, element){
log += "hello ";
return function() {
log += expression;
};
},
watch: function(expression, element){
return function() {
this.$watch(expression, function(val){
log += ":" + val;
});
};
}
};
markup = [];
compiler = new Compiler(markup, directives);
compile = function(html){
var e = element("<div>" + html + "</div>");
var view = compiler.compile(e)(e);
view.init();
return view.scope;
};
});
it('should recognize a directive', function(){
var e = element('<div ng-directive="expr" ignore="me"></div>');
directives.directive = function(expression, element){
log += "found";
expect(expression).toEqual("expr");
expect(element).toEqual(e);
return function initFn() {
log += ":init";
};
};
var template = compiler.compile(e);
var init = template(e).init;
expect(log).toEqual("found");
init();
expect(log).toEqual("found:init");
});
it('should recurse to children', function(){
var scope = compile('<div><span ng-hello="misko"/></div>');
expect(log).toEqual("hello misko");
});
it('should watch scope', function(){
var scope = compile('<span ng-watch="name"/>');
expect(log).toEqual("");
scope.updateView();
scope.set('name', 'misko');
scope.updateView();
scope.updateView();
scope.set('name', 'adam');
scope.updateView();
scope.updateView();
expect(log).toEqual(":misko:adam");
});
it('should prevent recursion', function(){
directives.stop = function(){ return false; };
var scope = compile('<span ng-hello="misko" ng-stop="true"><span ng-hello="adam"/></span>');
expect(log).toEqual("hello misko");
});
it('should allow creation of templates', function(){
directives.duplicate = function(expr, element){
var template,
marker = document.createComment("marker"),
parentNode = element.parentNode;
parentNode.insertBefore(marker, element);
parentNode.removeChild(element);
element.removeAttribute("ng-duplicate");
template = this.compile(element);
return function(marker) {
var parentNode = marker.parentNode;
this.$eval(function() {
parentNode.insertBefore(
template(element.cloneNode(true)).element,
marker.nextSibling);
});
};
};
var scope = compile('before<span ng-duplicate="expr">x</span>after');
expect($(scope.element).html()).toEqual('before<!--marker-->after');
scope.updateView();
expect($(scope.element).html()).toEqual('before<!--marker--><span>x</span>after');
scope.updateView();
expect($(scope.element).html()).toEqual('before<!--marker--><span>x</span><span>x</span>after');
});
it('should allow for exculsive tags which suppress others', function(){
directives.exclusive = function(){
return function() {
log += ('exclusive');
};
};
directives.exclusive.exclusive = true;
compile('<span ng-hello="misko", ng-exclusive/>');
expect(log).toEqual('exclusive');
});
it('should process markup before directives', function(){
markup.push(function(text, textNode, parentNode) {
if (text == 'middle') {
expect(textNode.nodeValue).toEqual(text);
parentNode.setAttribute('ng-hello', text);
textNode.nodeValue = 'replaced';
}
});
var scope = compile('before<span>middle</span>after');
expect(scope.element.innerHTML).toEqual('before<span ng-hello="middle">replaced</span>after');
expect(log).toEqual("hello middle");
});
});
|