From d12df0d360fe0dabdca3591654327834bee2803b Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 25 Oct 2011 22:21:21 -0700 Subject: refactor(compiler) turn compiler into a service BREAK - remove angular.compile() since the compile method is now a service and needs to be injected --- test/service/compilerSpec.js | 140 +++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 71 deletions(-) (limited to 'test/service') diff --git a/test/service/compilerSpec.js b/test/service/compilerSpec.js index 2dec1396..4e0dbed6 100644 --- a/test/service/compilerSpec.js +++ b/test/service/compilerSpec.js @@ -1,10 +1,12 @@ 'use strict'; describe('compiler', function() { - var compiler, markup, attrMarkup, directives, widgets, compile, log, scope; + var compiler, textMmarkup, attrMarkup, directives, widgets, compile, log, $rootScope; - beforeEach(inject(function($rootScope) { - log = ""; + beforeEach(inject(function(service){ + textMmarkup = []; + attrMarkup = []; + widgets = extensionMap({}, 'widget'); directives = { hello: function(expression, element){ log += "hello "; @@ -23,29 +25,25 @@ describe('compiler', function() { } }; - markup = []; - attrMarkup = []; - widgets = extensionMap({}, 'widget'); - compiler = new Compiler(markup, attrMarkup, directives, widgets); - compile = function(html){ - var e = jqLite("
" + html + "
"); - compiler.compile(e)($rootScope); - return scope = $rootScope; - }; + log = ""; + service('$textMarkup', valueFn(textMmarkup)); + service('$attrMarkup', valueFn(attrMarkup)); + service('$directive', valueFn(directives)); + service('$widget', valueFn(widgets)); })); - it('should not allow compilation of multiple roots', function() { + it('should not allow compilation of multiple roots', inject(function($rootScope, $compile) { expect(function() { - compiler.compile('
A
'); + $compile('
A
'); }).toThrow("Cannot compile multiple element roots: " + ie("
A
")); function ie(text) { return msie < 9 ? uppercase(text) : text; } - }); + })); - it('should recognize a directive', inject(function($rootScope) { + it('should recognize a directive', inject(function($rootScope, $compile) { var e = jqLite('
'); directives.directive = function(expression, element){ log += "found"; @@ -55,42 +53,42 @@ describe('compiler', function() { log += ":init"; }; }; - var template = compiler.compile(e); + var linkFn = $compile(e); expect(log).toEqual("found"); - scope = template($rootScope); + linkFn($rootScope); expect(e.hasClass('ng-directive')).toEqual(true); expect(log).toEqual("found:init"); })); - it('should recurse to children', function() { - scope = compile('
'); + it('should recurse to children', inject(function($rootScope, $compile) { + $compile('
')($rootScope); expect(log).toEqual("hello misko"); - }); + })); - it('should observe scope', function() { - scope = compile(''); + it('should observe scope', inject(function($rootScope, $compile) { + $compile('')($rootScope); expect(log).toEqual(""); - scope.$digest(); - scope.name = 'misko'; - scope.$digest(); - scope.$digest(); - scope.name = 'adam'; - scope.$digest(); - scope.$digest(); + $rootScope.$digest(); + $rootScope.name = 'misko'; + $rootScope.$digest(); + $rootScope.$digest(); + $rootScope.name = 'adam'; + $rootScope.$digest(); + $rootScope.$digest(); expect(log).toEqual(":misko:adam"); - }); + })); - it('should prevent descend', function() { + it('should prevent descend', inject(function($rootScope, $compile) { directives.stop = function() { this.descend(false); }; - scope = compile(''); + $compile('')($rootScope); expect(log).toEqual("hello misko"); - }); + })); - it('should allow creation of templates', inject(function($rootScope) { + it('should allow creation of templates', inject(function($rootScope, $compile) { directives.duplicate = function(expr, element){ element.replaceWith(document.createComment("marker")); element.removeAttr("duplicate"); @@ -103,32 +101,32 @@ describe('compiler', function() { }); }; }; - scope = compile('beforexafter'); - expect(sortedHtml(scope.$element)). + $compile('
beforexafter
')($rootScope); + expect(sortedHtml($rootScope.$element)). toEqual('
' + 'before<#comment>' + 'after' + '
'); - scope.value = 1; - scope.$digest(); - expect(sortedHtml(scope.$element)). + $rootScope.value = 1; + $rootScope.$digest(); + expect(sortedHtml($rootScope.$element)). toEqual('
' + 'before<#comment>' + 'x' + 'after' + '
'); - scope.value = 2; - scope.$digest(); - expect(sortedHtml(scope.$element)). + $rootScope.value = 2; + $rootScope.$digest(); + expect(sortedHtml($rootScope.$element)). toEqual('
' + 'before<#comment>' + 'x' + 'x' + 'after' + '
'); - scope.value = 3; - scope.$digest(); - expect(sortedHtml(scope.$element)). + $rootScope.value = 3; + $rootScope.$digest(); + expect(sortedHtml($rootScope.$element)). toEqual('
' + 'before<#comment>' + 'x' + @@ -139,21 +137,22 @@ describe('compiler', function() { })); - it('should process markup before directives', function() { - markup.push(function(text, textNode, parentNode) { + it('should process markup before directives', inject(function($rootScope, $compile) { + textMmarkup.push(function(text, textNode, parentNode) { if (text == 'middle') { expect(textNode.text()).toEqual(text); parentNode.attr('hello', text); textNode[0].nodeValue = 'replaced'; } }); - scope = compile('beforemiddleafter'); - expect(sortedHtml(scope.$element[0], true)).toEqual('
beforereplacedafter
'); + $compile('
beforemiddleafter
')($rootScope); + expect(sortedHtml($rootScope.$element[0], true)). + toEqual('
beforereplacedafter
'); expect(log).toEqual("hello middle"); - }); + })); - it('should replace widgets', function() { + it('should replace widgets', inject(function($rootScope, $compile) { widgets['NG:BUTTON'] = function(element) { expect(element.hasClass('ng-widget')).toEqual(true); element.replaceWith('
button
'); @@ -161,13 +160,13 @@ describe('compiler', function() { log += 'init'; }; }; - scope = compile('push me'); - expect(lowercase(scope.$element[0].innerHTML)).toEqual('
button
'); + $compile('
push me
')($rootScope); + expect(lowercase($rootScope.$element[0].innerHTML)).toEqual('
button
'); expect(log).toEqual('init'); - }); + })); - it('should use the replaced element after calling widget', function() { + it('should use the replaced element after calling widget', inject(function($rootScope, $compile) { widgets['H1'] = function(element) { // HTML elements which are augmented by acting as widgets, should not be marked as so expect(element.hasClass('ng-widget')).toEqual(false); @@ -177,17 +176,17 @@ describe('compiler', function() { this.directives(true); return noop; }; - markup.push(function(text, textNode, parent){ + textMmarkup.push(function(text, textNode, parent){ if (text == '{{1+2}}') parent.text('3'); }); - scope = compile('

ignore me

'); - expect(scope.$element.text()).toEqual('3'); - }); + $compile('

ignore me

')($rootScope); + expect($rootScope.$element.text()).toEqual('3'); + })); - it('should allow multiple markups per text element', function() { - markup.push(function(text, textNode, parent){ + it('should allow multiple markups per text element', inject(function($rootScope, $compile) { + textMmarkup.push(function(text, textNode, parent){ var index = text.indexOf('---'); if (index > -1) { textNode.after(text.substring(index + 3)); @@ -196,7 +195,7 @@ describe('compiler', function() { textNode.remove(); } }); - markup.push(function(text, textNode, parent){ + textMmarkup.push(function(text, textNode, parent){ var index = text.indexOf('==='); if (index > -1) { textNode.after(text.substring(index + 3)); @@ -205,14 +204,13 @@ describe('compiler', function() { textNode.remove(); } }); - scope = compile('A---B---C===D'); - expect(sortedHtml(scope.$element)).toEqual('
A
B
C

D
'); - }); + $compile('
A---B---C===D
')($rootScope); + expect(sortedHtml($rootScope.$element)).toEqual('
A
B
C

D
'); + })); - it('should add class for namespace elements', function() { - scope = compile('abc'); - var space = jqLite(scope.$element[0].firstChild); - expect(space.hasClass('ng-space')).toEqual(true); - }); + it('should add class for namespace elements', inject(function($rootScope, $compile) { + var element = $compile('abc')($rootScope); + expect(element.hasClass('ng-space')).toEqual(true); + })); }); -- cgit v1.2.3