From 9ee2cdff44e7d496774b340de816344126c457b3 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 22 Nov 2011 21:28:39 -0800 Subject: refactor(directives): connect new compiler - turn everything into a directive --- test/AngularSpec.js | 49 +++----- test/BinderSpec.js | 130 +++++++------------ test/ScenarioSpec.js | 13 +- test/directivesSpec.js | 247 ++++++++++++++++++------------------- test/markupSpec.js | 72 ++++++----- test/sanitizerSpec.js | 10 +- test/scenario/dslSpec.js | 82 +++++++----- test/service/filter/filtersSpec.js | 16 +-- test/service/logSpec.js | 2 +- test/testabilityPatch.js | 16 ++- test/widget/inputSpec.js | 79 ++++++------ test/widget/selectSpec.js | 4 +- test/widgetsSpec.js | 94 +++++++------- 13 files changed, 397 insertions(+), 417 deletions(-) (limited to 'test') diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 2d469698..10f5fd2a 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -1,6 +1,12 @@ 'use strict'; describe('angular', function() { + var element; + + afterEach(function(){ + dealoc(element); + }); + describe('case', function() { it('should change case', function() { expect(lowercase('ABC90')).toEqual('abc90'); @@ -382,28 +388,6 @@ describe('angular', function() { }); - describe('directive', function() { - it('should register directives with case-insensitive id', inject(function($compile) { - angularDirective('ALLCAPS', function(val, el) {el.text('+' + val + '+')}); - angularDirective('lowercase', function(val, el) {el.text('-' + val + '-')}); - - var el = jqLite('
' + - '' + - '' + - '' + - 'xx4' + - '
'); - $compile(el); - expect(lowercase(sortedHtml(el))).toBe('
' + - '+xx1+' + - '+xx2+' + - '+xx3+' + - '-xx4-' + - '
'); - })); - }); - - describe('isDate', function() { it('should return true for Date object', function() { expect(isDate(new Date())).toBe(true); @@ -420,7 +404,7 @@ describe('angular', function() { describe('compile', function() { it('should link to existing node and create scope', inject(function($rootScope, $compile) { var template = angular.element('
{{greeting = "hello world"}}
'); - $compile(template)($rootScope); + element = $compile(template)($rootScope); $rootScope.$digest(); expect(template.text()).toEqual('hello world'); expect($rootScope.greeting).toEqual('hello world'); @@ -428,7 +412,7 @@ describe('angular', function() { it('should link to existing node and given scope', inject(function($rootScope, $compile) { var template = angular.element('
{{greeting = "hello world"}}
'); - $compile(template)($rootScope); + element = $compile(template)($rootScope); $rootScope.$digest(); expect(template.text()).toEqual('hello world'); })); @@ -436,15 +420,15 @@ describe('angular', function() { it('should link to new node and given scope', inject(function($rootScope, $compile) { var template = jqLite('
{{greeting = "hello world"}}
'); - var templateFn = $compile(template); + var compile = $compile(template); var templateClone = template.clone(); - var element = templateFn($rootScope, function(clone){ + element = compile($rootScope, function(clone){ templateClone = clone; }); $rootScope.$digest(); - expect(template.text()).toEqual(''); + expect(template.text()).toEqual('{{greeting = "hello world"}}'); expect(element.text()).toEqual('hello world'); expect(element).toEqual(templateClone); expect($rootScope.greeting).toEqual('hello world'); @@ -452,9 +436,9 @@ describe('angular', function() { it('should link to cloned node and create scope', inject(function($rootScope, $compile) { var template = jqLite('
{{greeting = "hello world"}}
'); - var element = $compile(template)($rootScope, noop); + element = $compile(template)($rootScope, noop); $rootScope.$digest(); - expect(template.text()).toEqual(''); + expect(template.text()).toEqual('{{greeting = "hello world"}}'); expect(element.text()).toEqual('hello world'); expect($rootScope.greeting).toEqual('hello world'); })); @@ -524,4 +508,11 @@ describe('angular', function() { expect(startingTag('
text
')).toEqual(''); }); }); + + describe('snake_case', function(){ + it('should convert to snake_case', function() { + expect(snake_case('ABC')).toEqual('a_b_c'); + expect(snake_case('alanBobCharles')).toEqual('alan_bob_charles'); + }); + }); }); diff --git a/test/BinderSpec.js b/test/BinderSpec.js index a94e5eb2..84deca35 100644 --- a/test/BinderSpec.js +++ b/test/BinderSpec.js @@ -2,6 +2,8 @@ describe('Binder', function() { + var element; + function childNode(element, index) { return jqLite(element[0].childNodes[index]); } @@ -19,9 +21,8 @@ describe('Binder', function() { }); afterEach(function() { - if (this.element && this.element.dealoc) { - this.element.dealoc(); - } + dealoc(element); + dealoc(this.element); }); it('BindUpdate', inject(function($rootScope, $compile) { @@ -42,60 +43,18 @@ describe('Binder', function() { })); it('ApplyTextBindings', inject(function($rootScope, $compile) { - var element = $compile('
x
')($rootScope); + element = $compile('
x
')($rootScope); $rootScope.model = {a:123}; $rootScope.$apply(); expect(element.text()).toBe('123'); })); - it('ReplaceBindingInTextWithSpan preserve surounding text', function() { - expect(this.compileToHtml('a{{b}}c')).toBe('ac'); - }); - - it('ReplaceBindingInTextWithSpan', function() { - expect(this.compileToHtml('{{b}}')).toBe(''); - }); - - it('BindingSpaceConfusesIE', inject(function($rootScope, $compile) { - if (!msie) return; - var span = document.createElement('span'); - span.innerHTML = ' '; - var nbsp = span.firstChild.nodeValue; - expect(this.compileToHtml('{{a}} {{b}}')). - toBe('' + nbsp + ''); - dealoc(($rootScope)); - expect(this.compileToHtml('{{A}} x {{B}} ({{C}})')). - toBe('' + nbsp + 'x ' + - '' + nbsp + '()'); - })); - - it('BindingOfAttributes', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope); - var attrbinding = element.attr('ng:bind-attr'); - var bindings = fromJson(attrbinding); - expect(decodeURI(bindings.href)).toBe('http://s/a{{b}}c'); - expect(bindings.foo).toBeFalsy(); - })); - - it('MarkMultipleAttributes', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope); - var attrbinding = element.attr('ng:bind-attr'); - var bindings = fromJson(attrbinding); - expect(bindings.foo).toBe('{{d}}'); - expect(decodeURI(bindings.href)).toBe('http://s/a{{b}}c'); - })); - it('AttributesNoneBound', inject(function($rootScope, $compile) { var a = $compile('')($rootScope); expect(a[0].nodeName).toBe('A'); expect(a.attr('ng:bind-attr')).toBeFalsy(); })); - it('ExistingAttrbindingIsAppended', inject(function($rootScope, $compile) { - var a = $compile('')($rootScope); - expect(a.attr('ng:bind-attr')).toBe('{"b":"{{def}}","href":"http://s/{{abc}}"}'); - })); - it('AttributesAreEvaluated', inject(function($rootScope, $compile) { var a = $compile('')($rootScope); $rootScope.$eval('a=1;b=2'); @@ -106,7 +65,7 @@ describe('Binder', function() { it('InputTypeButtonActionExecutesInScope', inject(function($rootScope, $compile) { var savedCalled = false; - var element = $compile( + element = $compile( '')($rootScope); $rootScope.person = {}; $rootScope.person.save = function() { @@ -117,8 +76,8 @@ describe('Binder', function() { })); it('InputTypeButtonActionExecutesInScope2', inject(function($rootScope, $compile) { - var log = ''; - var element = $compile('')($rootScope); + var log = ""; + element = $compile('')($rootScope); $rootScope.action = function() { log += 'click;'; }; @@ -129,7 +88,7 @@ describe('Binder', function() { it('ButtonElementActionExecutesInScope', inject(function($rootScope, $compile) { var savedCalled = false; - var element = $compile('')($rootScope); + element = $compile('')($rootScope); $rootScope.person = {}; $rootScope.person.save = function() { savedCalled = true; @@ -179,7 +138,7 @@ describe('Binder', function() { })); it('RepeaterContentDoesNotBind', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '')($rootScope); @@ -198,8 +157,8 @@ describe('Binder', function() { }); it('RepeaterAdd', inject(function($rootScope, $compile, $browser) { - var element = $compile('
')($rootScope); - $rootScope.items = [{x: 'a'}, {x: 'b'}]; + element = $compile('
')($rootScope); + $rootScope.items = [{x:'a'}, {x:'b'}]; $rootScope.$apply(); var first = childNode(element, 1); var second = childNode(element, 2); @@ -213,7 +172,7 @@ describe('Binder', function() { })); it('ItShouldRemoveExtraChildrenWhenIteratingOverHash', inject(function($rootScope, $compile) { - var element = $compile('
{{i}}
')($rootScope); + element = $compile('
{{i}}
')($rootScope); var items = {}; $rootScope.items = items; @@ -234,7 +193,7 @@ describe('Binder', function() { $exceptionHandlerProvider.mode('log'); }); inject(function($rootScope, $exceptionHandler, $compile) { - $compile('
{{error.throw()}}
', null, true)($rootScope); + element = $compile('
{{error.throw()}}
', null, true)($rootScope); var errorLogs = $exceptionHandler.errors; $rootScope.error = { @@ -277,7 +236,7 @@ describe('Binder', function() { }); it('NestedRepeater', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
' + '
' + '
    ' + @@ -290,21 +249,21 @@ describe('Binder', function() { expect(sortedHtml(element)).toBe( '
    '+ '<#comment>'+ - '
    '+ + '
    '+ '<#comment>'+ - '
      '+ - '
        '+ + '
          '+ + '
            '+ '
            '+ - '
            '+ + '
            '+ '<#comment>'+ - '
              '+ - '
                '+ + '
                  '+ + '
                    '+ '
                    ' + '
                    '); })); it('HideBindingExpression', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.hidden = 3; $rootScope.$apply(); @@ -318,7 +277,7 @@ describe('Binder', function() { })); it('HideBinding', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.hidden = 'true'; $rootScope.$apply(); @@ -337,7 +296,7 @@ describe('Binder', function() { })); it('ShowBinding', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.show = 'true'; $rootScope.$apply(); @@ -357,7 +316,7 @@ describe('Binder', function() { it('BindClass', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.clazz = 'testClass'; $rootScope.$apply(); @@ -371,7 +330,7 @@ describe('Binder', function() { })); it('BindClassEvenOdd', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                    ' + '
                    ' + '
                    ')($rootScope); @@ -387,7 +346,7 @@ describe('Binder', function() { })); it('BindStyle', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.$eval('style={height: "10px"}'); $rootScope.$apply(); @@ -413,28 +372,29 @@ describe('Binder', function() { }); it('ShoulIgnoreVbNonBindable', inject(function($rootScope, $compile) { - var element = $compile( - '
                    {{a}}' + - '
                    {{a}}
                    ' + - '
                    {{b}}
                    ' + - '
                    {{c}}
                    ' + - '
                    ')($rootScope); + element = $compile( + "
                    {{a}}" + + "
                    {{a}}
                    " + + "
                    {{b}}
                    " + + "
                    {{c}}
                    " + + "
                    ")($rootScope); $rootScope.a = 123; $rootScope.$apply(); expect(element.text()).toBe('123{{a}}{{b}}{{c}}'); })); it('ShouldTemplateBindPreElements', inject(function ($rootScope, $compile) { - var element = $compile('
                    Hello {{name}}!
                    ')($rootScope); - $rootScope.name = 'World'; + element = $compile('
                    Hello {{name}}!
                    ')($rootScope); + $rootScope.name = "World"; $rootScope.$apply(); - expect( sortedHtml(element)).toBe( - '
                    Hello World!
                    '); + assertEquals( + '
                    Hello World!
                    ', + sortedHtml(element)); })); it('FillInOptionValueWhenMissing', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '' + '' + @@ -485,7 +445,7 @@ describe('Binder', function() { $exceptionHandlerProvider.mode('log'); }); inject(function($rootScope, $exceptionHandler, $log, $compile) { - var element = $compile( + element = $compile( '
                    ' + '' + '' + @@ -505,7 +465,7 @@ describe('Binder', function() { }); it('ItShouldSelectTheCorrectRadioBox', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                    ' + '' + '' + @@ -527,7 +487,7 @@ describe('Binder', function() { })); it('ItShouldRepeatOnHashes', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                      ' + '
                    • ' + '
                    ')($rootScope); @@ -541,7 +501,7 @@ describe('Binder', function() { })); it('ItShouldFireChangeListenersBeforeUpdate', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.name = ''; $rootScope.$watch('watched', 'name=123'); $rootScope.watched = 'change'; @@ -551,7 +511,7 @@ describe('Binder', function() { })); it('ItShouldHandleMultilineBindings', inject(function($rootScope, $compile) { - var element = $compile('
                    {{\n 1 \n + \n 2 \n}}
                    ')($rootScope); + element = $compile('
                    {{\n 1 \n + \n 2 \n}}
                    ')($rootScope); $rootScope.$apply(); expect(element.text()).toBe('3'); })); diff --git a/test/ScenarioSpec.js b/test/ScenarioSpec.js index 986e2121..2070d301 100644 --- a/test/ScenarioSpec.js +++ b/test/ScenarioSpec.js @@ -1,23 +1,30 @@ 'use strict'; describe("ScenarioSpec: Compilation", function() { + var element; + + afterEach(function() { + dealoc(element); + }); + + describe('compilation', function() { it("should compile dom node and return scope", inject(function($rootScope, $compile) { var node = jqLite('
                    {{b=a+1}}
                    ')[0]; - $compile(node)($rootScope); + element = $compile(node)($rootScope); $rootScope.$digest(); expect($rootScope.a).toEqual(1); expect($rootScope.b).toEqual(2); })); it("should compile jQuery node and return scope", inject(function($rootScope, $compile) { - var element = $compile(jqLite('
                    {{a=123}}
                    '))($rootScope); + element = $compile(jqLite('
                    {{a=123}}
                    '))($rootScope); $rootScope.$digest(); expect(jqLite(element).text()).toEqual('123'); })); it("should compile text node and return scope", inject(function($rootScope, $compile) { - var element = $compile('
                    {{a=123}}
                    ')($rootScope); + element = $compile('
                    {{a=123}}
                    ')($rootScope); $rootScope.$digest(); expect(jqLite(element).text()).toEqual('123'); })); diff --git a/test/directivesSpec.js b/test/directivesSpec.js index 5bd5f5bd..9dee4860 100644 --- a/test/directivesSpec.js +++ b/test/directivesSpec.js @@ -1,6 +1,16 @@ 'use strict'; describe("directive", function() { + var element; + + beforeEach(function() { + element = null; + }); + + afterEach(function() { + dealoc(element); + }); + var $filterProvider, element; @@ -19,7 +29,7 @@ describe("directive", function() { describe('ng:bind', function() { it('should set text', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); expect(element.text()).toEqual(''); $rootScope.a = 'misko'; $rootScope.$digest(); @@ -28,47 +38,40 @@ describe("directive", function() { })); it('should set text to blank if undefined', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.a = 'misko'; $rootScope.$digest(); expect(element.text()).toEqual('misko'); $rootScope.a = undefined; $rootScope.$digest(); expect(element.text()).toEqual(''); + $rootScope.a = null; + $rootScope.$digest(); + expect(element.text()).toEqual(''); })); it('should set html', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.html = '
                    hello
                    '; $rootScope.$digest(); expect(lowercase(element.html())).toEqual('
                    hello
                    '); })); it('should set unsafe html', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.html = '
                    hello
                    '; $rootScope.$digest(); expect(lowercase(element.html())).toEqual('
                    hello
                    '); })); - it('should set element element', inject(function($rootScope, $compile) { - $filterProvider.register('myElement', valueFn(function() { - return jqLite('hello'); - })); - var element = $compile('
                    ')($rootScope); - $rootScope.$digest(); - expect(lowercase(element.html())).toEqual('hello'); - })); - - it('should suppress rendering of falsy values', inject(function($rootScope, $compile) { - var element = $compile('
                    {{ null }}{{ undefined }}{{ "" }}-{{ 0 }}{{ false }}
                    ')($rootScope); + element = $compile('
                    {{ null }}{{ undefined }}{{ "" }}-{{ 0 }}{{ false }}
                    ')($rootScope); $rootScope.$digest(); expect(element.text()).toEqual('-0false'); })); it('should render object as JSON ignore $$', inject(function($rootScope, $compile) { - var element = $compile('
                    {{ {key:"value", $$key:"hide"} }}
                    ')($rootScope); + element = $compile('
                    {{ {key:"value", $$key:"hide"} }}
                    ')($rootScope); $rootScope.$digest(); expect(fromJson(element.text())).toEqual({key:'value'}); })); @@ -76,27 +79,15 @@ describe("directive", function() { describe('ng:bind-template', function() { it('should ng:bind-template', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.name = 'Misko'; $rootScope.$digest(); expect(element.hasClass('ng-binding')).toEqual(true); expect(element.text()).toEqual('Hello Misko!'); })); - it('should have $element set to current bind element', inject(function($rootScope, $compile) { - var innerText; - $filterProvider.register('myFilter', valueFn(function(text) { - innerText = innerText || this.$element.text(); - return text; - })); - var element = $compile('
                    beforeINNERafter
                    ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual("beforeHELLOafter"); - expect(innerText).toEqual('INNER'); - })); - it('should render object as JSON ignore $$', inject(function($rootScope, $compile) { - var element = $compile('
                    {{ {key:"value", $$key:"hide"}  }}
                    ')($rootScope); + element = $compile('
                    {{ {key:"value", $$key:"hide"}  }}
                    ')($rootScope); $rootScope.$digest(); expect(fromJson(element.text())).toEqual({key:'value'}); })); @@ -105,39 +96,40 @@ describe("directive", function() { describe('ng:bind-attr', function() { it('should bind attributes', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.$digest(); expect(element.attr('src')).toEqual('http://localhost/mysrc'); expect(element.attr('alt')).toEqual('myalt'); })); it('should not pretty print JSON in attributes', inject(function($rootScope, $compile) { - var element = $compile('{{ {a:1} }}')($rootScope); + element = $compile('{{ {a:1} }}')($rootScope); $rootScope.$digest(); expect(element.attr('alt')).toEqual('{"a":1}'); })); - }); - it('should remove special attributes on false', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope); - var input = element[0]; - expect(input.disabled).toEqual(false); - expect(input.readOnly).toEqual(false); - expect(input.checked).toEqual(false); - - $rootScope.disabled = true; - $rootScope.readonly = true; - $rootScope.checked = true; - $rootScope.$digest(); - - expect(input.disabled).toEqual(true); - expect(input.readOnly).toEqual(true); - expect(input.checked).toEqual(true); - })); + it('should remove special attributes on false', inject(function($rootScope, $compile) { + element = $compile('')($rootScope); + var input = element[0]; + expect(input.disabled).toEqual(false); + expect(input.readOnly).toEqual(false); + expect(input.checked).toEqual(false); + + $rootScope.disabled = true; + $rootScope.readonly = true; + $rootScope.checked = true; + $rootScope.$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', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.$digest(); expect($rootScope.clicked).toBeFalsy(); @@ -146,14 +138,12 @@ describe("directive", function() { })); it('should stop event propagation', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.$digest(); expect($rootScope.outer).not.toBeDefined(); expect($rootScope.inner).not.toBeDefined(); - var innerDiv = element.children()[0]; - - browserTrigger(innerDiv, 'click'); + browserTrigger(element.find('div'), 'click'); expect($rootScope.outer).not.toBeDefined(); expect($rootScope.inner).toEqual(true); })); @@ -162,7 +152,7 @@ describe("directive", function() { describe('ng:submit', function() { it('should get called on form submit', inject(function($rootScope, $compile) { - var element = $compile('
                    ' + + element = $compile('' + '' + '
                    ')($rootScope); $rootScope.$digest(); @@ -175,7 +165,7 @@ describe("directive", function() { describe('ng:class', function() { it('should add new and remove old classes dynamically', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynClass = 'A'; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); @@ -196,7 +186,7 @@ describe("directive", function() { it('should support adding multiple classes via an array', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); @@ -227,7 +217,7 @@ describe("directive", function() { it('should support adding multiple classes via a space delimited string', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.$digest(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); @@ -236,7 +226,7 @@ describe("directive", function() { it('should preserve class added post compilation with pre-existing classes', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynClass = 'A'; $rootScope.$digest(); expect(element.hasClass('existing')).toBe(true); @@ -253,7 +243,7 @@ describe("directive", function() { it('should preserve class added post compilation without pre-existing classes"', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynClass = 'A'; $rootScope.$digest(); expect(element.hasClass('A')).toBe(true); @@ -269,119 +259,116 @@ describe("directive", function() { it('should preserve other classes with similar name"', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynCls = 'panel'; $rootScope.$digest(); $rootScope.dynCls = 'foo'; $rootScope.$digest(); - expect(element[0].className).toBe('ui-panel ui-selected ng-directive foo'); + expect(element[0].className).toBe('ui-panel ui-selected foo'); })); it('should not add duplicate classes', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynCls = 'panel'; $rootScope.$digest(); - expect(element[0].className).toBe('panel bar ng-directive'); + expect(element[0].className).toBe('panel bar'); })); it('should remove classes even if it was specified via class attribute', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynCls = 'panel'; $rootScope.$digest(); $rootScope.dynCls = 'window'; $rootScope.$digest(); - expect(element[0].className).toBe('bar ng-directive window'); + expect(element[0].className).toBe('bar window'); })); it('should remove classes even if they were added by another code', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynCls = 'foo'; $rootScope.$digest(); element.addClass('foo'); $rootScope.dynCls = ''; $rootScope.$digest(); - expect(element[0].className).toBe('ng-directive'); })); it('should convert undefined and null values to an empty string', inject(function($rootScope, $compile) { - var element = $compile('
                    ')($rootScope); + element = $compile('
                    ')($rootScope); $rootScope.dynCls = [undefined, null]; $rootScope.$digest(); - expect(element[0].className).toBe('ng-directive'); })); - }); - it('should ng:class odd/even', inject(function($rootScope, $compile) { - var element = $compile('
                      • ')($rootScope); - $rootScope.$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 ng:class odd/even', inject(function($rootScope, $compile) { + element = $compile('
                          • ')($rootScope); + $rootScope.$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', inject(function($rootScope, $compile) { - var element = $compile('
                              ' + - '
                            • ' + - '
                                ')($rootScope); - $rootScope.$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 on the same element', inject(function($rootScope, $compile) { + element = $compile('
                                  ' + + '
                                • ' + + '
                                    ')($rootScope); + $rootScope.$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', inject(function($rootScope, $compile) { - var element = $compile('
                                      ' + - '
                                    • ' + - '
                                        ')($rootScope); - $rootScope.$apply(); - var e1 = jqLite(element[0].childNodes[1]); - var e2 = jqLite(element[0].childNodes[2]); - - expect(e1.hasClass('A')).toBeTruthy(); - expect(e1.hasClass('B')).toBeTruthy(); - expect(e1.hasClass('C')).toBeTruthy(); - expect(e1.hasClass('D')).toBeTruthy(); - expect(e1.hasClass('E')).toBeFalsy(); - expect(e1.hasClass('F')).toBeFalsy(); - - expect(e2.hasClass('A')).toBeTruthy(); - expect(e2.hasClass('B')).toBeTruthy(); - expect(e2.hasClass('E')).toBeTruthy(); - expect(e2.hasClass('F')).toBeTruthy(); - expect(e2.hasClass('C')).toBeFalsy(); - expect(e2.hasClass('D')).toBeFalsy(); - })); + it('should allow both ng:class and ng:class-odd/even with multiple classes', inject(function($rootScope, $compile) { + element = $compile('
                                          ' + + '
                                        • ' + + '
                                            ')($rootScope); + $rootScope.$apply(); + var e1 = jqLite(element[0].childNodes[1]); + var e2 = jqLite(element[0].childNodes[2]); + + expect(e1.hasClass('A')).toBeTruthy(); + expect(e1.hasClass('B')).toBeTruthy(); + expect(e1.hasClass('C')).toBeTruthy(); + expect(e1.hasClass('D')).toBeTruthy(); + expect(e1.hasClass('E')).toBeFalsy(); + expect(e1.hasClass('F')).toBeFalsy(); + + expect(e2.hasClass('A')).toBeTruthy(); + expect(e2.hasClass('B')).toBeTruthy(); + expect(e2.hasClass('E')).toBeTruthy(); + expect(e2.hasClass('F')).toBeTruthy(); + expect(e2.hasClass('C')).toBeFalsy(); + expect(e2.hasClass('D')).toBeFalsy(); + })); + }); describe('ng:style', function() { it('should set', inject(function($rootScope, $compile) { - var element = $compile('
                                            ')($rootScope); + element = $compile('
                                            ')($rootScope); $rootScope.$digest(); expect(element.css('height')).toEqual('40px'); })); it('should silently ignore undefined style', inject(function($rootScope, $compile) { - var element = $compile('
                                            ')($rootScope); + element = $compile('
                                            ')($rootScope); $rootScope.$digest(); expect(element.hasClass('ng-exception')).toBeFalsy(); })); @@ -454,8 +441,8 @@ describe("directive", function() { describe('ng:show', function() { it('should show and hide an element', inject(function($rootScope, $compile) { - var element = jqLite('
                                            '); - var element = $compile(element)($rootScope); + element = jqLite('
                                            '); + element = $compile(element)($rootScope); $rootScope.$digest(); expect(isCssVisible(element)).toEqual(false); $rootScope.exp = true; @@ -465,8 +452,8 @@ describe("directive", function() { it('should make hidden element visible', inject(function($rootScope, $compile) { - var element = jqLite('
                                            '); - var element = $compile(element)($rootScope); + element = jqLite('
                                            '); + element = $compile(element)($rootScope); expect(isCssVisible(element)).toBe(false); $rootScope.exp = true; $rootScope.$digest(); @@ -476,8 +463,8 @@ describe("directive", function() { describe('ng:hide', function() { it('should hide an element', inject(function($rootScope, $compile) { - var element = jqLite('
                                            '); - var element = $compile(element)($rootScope); + element = jqLite('
                                            '); + element = $compile(element)($rootScope); expect(isCssVisible(element)).toBe(true); $rootScope.exp = true; $rootScope.$digest(); @@ -552,7 +539,7 @@ describe("directive", function() { describe('ng:cloak', function() { it('should get removed when an element is compiled', inject(function($rootScope, $compile) { - var element = jqLite('
                                            '); + element = jqLite('
                                            '); expect(element.attr('ng:cloak')).toBe(''); $compile(element); expect(element.attr('ng:cloak')).toBeUndefined(); @@ -560,7 +547,7 @@ describe("directive", function() { it('should remove ng-cloak class from a compiled element', inject(function($rootScope, $compile) { - var element = jqLite('
                                            '); + element = jqLite('
                                            '); expect(element.hasClass('foo')).toBe(true); expect(element.hasClass('ng-cloak')).toBe(true); diff --git a/test/markupSpec.js b/test/markupSpec.js index 0dcbbfe9..6f8e518e 100644 --- a/test/markupSpec.js +++ b/test/markupSpec.js @@ -1,33 +1,38 @@ 'use strict'; describe("markups", function() { + var element; + + afterEach(function() { + dealoc(element); + }); it('should translate {{}} in text', inject(function($rootScope, $compile) { - var element = $compile('
                                            hello {{name}}!
                                            ')($rootScope) - expect(sortedHtml(element)).toEqual('
                                            hello !
                                            '); + element = $compile('
                                            hello {{name}}!
                                            ')($rootScope) + $rootScope.$digest(); + expect(sortedHtml(element)).toEqual('
                                            hello !
                                            '); $rootScope.name = 'Misko'; $rootScope.$digest(); - expect(sortedHtml(element)).toEqual('
                                            hello Misko!
                                            '); + expect(sortedHtml(element)).toEqual('
                                            hello Misko!
                                            '); })); it('should translate {{}} in terminal nodes', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) $rootScope.$digest(); expect(sortedHtml(element).replace(' selected="true"', '')). toEqual(''); $rootScope.name = 'Misko'; $rootScope.$digest(); expect(sortedHtml(element).replace(' selected="true"', '')). toEqual(''); })); it('should translate {{}} in attributes', inject(function($rootScope, $compile) { - var element = $compile('
                                            ')($rootScope) - expect(element.attr('ng:bind-attr')).toEqual('{"src":"http://server/{{path}}.png"}'); + element = $compile('
                                            ')($rootScope) $rootScope.path = 'a/b'; $rootScope.$digest(); expect(element.attr('src')).toEqual("http://server/a/b.png"); @@ -56,36 +61,38 @@ describe("markups", function() { it('should populate value attribute on OPTION', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) expect(element).toHaveValue('abc'); })); it('should ignore value if already exists', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) expect(element).toHaveValue('abc'); })); it('should set value even if newlines present', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) expect(element).toHaveValue('\nabc\n'); })); it('should set value even if self closing HTML', inject(function($rootScope, $compile) { // IE removes the \n from option, which makes this test pointless if (msie) return; - var element = $compile('')($rootScope) + element = $compile('')($rootScope) expect(element).toHaveValue('\n'); })); }); it('should bind href', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) - expect(sortedHtml(element)).toEqual(''); + element = $compile('')($rootScope) + $rootScope.url = 'http://server' + $rootScope.$digest(); + expect(element.attr('href')).toEqual('http://server'); })); it('should bind disabled', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) $rootScope.isDisabled = false; $rootScope.$digest(); expect(element.attr('disabled')).toBeFalsy(); @@ -95,7 +102,7 @@ describe("markups", function() { })); it('should bind checked', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) $rootScope.isChecked = false; $rootScope.$digest(); expect(element.attr('checked')).toBeFalsy(); @@ -105,7 +112,7 @@ describe("markups", function() { })); it('should bind selected', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) jqLite(document.body).append(element) $rootScope.isSelected=false; $rootScope.$digest(); @@ -116,7 +123,7 @@ describe("markups", function() { })); it('should bind readonly', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) $rootScope.isReadonly=false; $rootScope.$digest(); expect(element.attr('readOnly')).toBeFalsy(); @@ -126,7 +133,7 @@ describe("markups", function() { })); it('should bind multiple', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) + element = $compile('')($rootScope) $rootScope.isMultiple=false; $rootScope.$digest(); expect(element.attr('multiple')).toBeFalsy(); @@ -136,38 +143,37 @@ describe("markups", function() { })); it('should bind src', inject(function($rootScope, $compile) { - var element = $compile('
                                            ')($rootScope) + element = $compile('
                                            ')($rootScope) $rootScope.url = 'http://localhost/'; $rootScope.$digest(); expect(element.attr('src')).toEqual('http://localhost/'); })); it('should bind href and merge with other attrs', inject(function($rootScope, $compile) { - var element = $compile('')($rootScope) - expect(sortedHtml(element)).toEqual(''); + element = $compile('')($rootScope); + $rootScope.url = 'http://server'; + $rootScope.rel = 'REL'; + $rootScope.$digest(); + expect(element.attr('href')).toEqual('http://server'); + expect(element.attr('rel')).toEqual('REL'); })); - it('should bind Text with no Bindings', inject(function($compile) { - var $rootScope; - function newScope (){ - return $rootScope = angular.injector(['ng']).get('$rootScope'); - } + it('should bind Text with no Bindings', inject(function($compile, $rootScope) { forEach(['checked', 'disabled', 'multiple', 'readonly', 'selected'], function(name) { - var element = $compile('
                                            ')(newScope()) - expect(element.attr('ng:bind-attr')).toBe('{"' + name +'":"some"}'); + element = $compile('
                                            ')($rootScope) $rootScope.$digest(); expect(element.attr(name)).toBe(name); dealoc(element); }); - var element = $compile('
                                            ')(newScope()) + element = $compile('
                                            ')($rootScope) $rootScope.$digest(); - expect(sortedHtml(element)).toEqual('
                                            '); + expect(element.attr('src')).toEqual('some'); dealoc(element); - var element = $compile('
                                            ')(newScope()) + element = $compile('
                                            ')($rootScope) $rootScope.$digest(); - expect(sortedHtml(element)).toEqual('
                                            '); + expect(element.attr('href')).toEqual('some'); dealoc(element); })); }); diff --git a/test/sanitizerSpec.js b/test/sanitizerSpec.js index 7467a833..a33d8992 100644 --- a/test/sanitizerSpec.js +++ b/test/sanitizerSpec.js @@ -2,9 +2,13 @@ describe('HTML', function() { - function expectHTML(html) { - return expect(new HTML(html).get()); - } + var expectHTML; + + beforeEach(inject(function($sanitize) { + expectHTML = function(html){ + return expect($sanitize(html)); + }; + })); describe('htmlParser', function() { var handler, start, text; diff --git a/test/scenario/dslSpec.js b/test/scenario/dslSpec.js index 79d479bb..c757d8a4 100644 --- a/test/scenario/dslSpec.js +++ b/test/scenario/dslSpec.js @@ -1,8 +1,13 @@ 'use strict'; describe("angular.scenario.dsl", function() { + var element; var $window, $root; - var application, eventLog; + var eventLog; + + afterEach(function() { + dealoc(element); + }); beforeEach(inject(function($injector) { eventLog = []; @@ -393,28 +398,26 @@ describe("angular.scenario.dsl", function() { describe('Repeater', function() { var chain; - beforeEach(function() { - doc.append( - '
                                              ' + - '
                                            • misko' + - ' male
                                            • ' + - '
                                            • felisa' + - ' female
                                            • ' + - '
                                            ' - ); + beforeEach(inject(function($compile, $rootScope) { + element = $compile( + '
                                            • {{i.name}} {{i.gender}}
                                            ')($rootScope); + $rootScope.items = [{name:'misko', gender:'male'}, {name:'felisa', gender:'female'}]; + $rootScope.$apply(); + doc.append(element); chain = $root.dsl.repeater('ul li'); - }); + })); it('should get the row count', function() { chain.count(); expect($root.futureResult).toEqual(2); }); - it('should return 0 if repeater doesnt match', function() { - doc.find('ul').html(''); + it('should return 0 if repeater doesnt match', inject(function($rootScope) { + $rootScope.items = []; + $rootScope.$apply(); chain.count(); expect($root.futureResult).toEqual(0); - }); + })); it('should get a row of bindings', function() { chain.row(1); @@ -422,7 +425,7 @@ describe("angular.scenario.dsl", function() { }); it('should get a column of bindings', function() { - chain.column('gender'); + chain.column('i.gender'); expect($root.futureResult).toEqual(['male', 'female']); }); @@ -437,45 +440,60 @@ describe("angular.scenario.dsl", function() { }); describe('Binding', function() { - it('should select binding by name', function() { - doc.append('some value'); + var compile; + + beforeEach(inject(function($compile, $rootScope) { + compile = function(html, value) { + element = $compile(html)($rootScope); + doc.append(element); + $rootScope.foo = {bar: value || 'some value'}; + $rootScope.$apply(); + }; + })); + + + it('should select binding in interpolation', function() { + compile('{{ foo.bar }}'); $root.dsl.binding('foo.bar'); expect($root.futureResult).toEqual('some value'); }); - it('should select binding by regexp', function() { - doc.append('some value'); - $root.dsl.binding(/^foo\..+/); + it('should select binding in multiple interpolations', function() { + compile('{{ foo.bar }}
                                            {{ true }}
                                            '); + $root.dsl.binding('foo.bar'); expect($root.futureResult).toEqual('some value'); + + $root.dsl.binding('true'); + expect($root.futureResult).toEqual('true'); }); - it('should return value for input elements', function() { - doc.append(''); + it('should select binding by name', function() { + compile(''); $root.dsl.binding('foo.bar'); expect($root.futureResult).toEqual('some value'); }); - it('should return value for textarea elements', function() { - doc.append(''); - $root.dsl.binding('foo.bar'); + it('should select binding by regexp', function() { + compile('some value'); + $root.dsl.binding(/^foo\..+/); expect($root.futureResult).toEqual('some value'); }); it('should return innerHTML for all the other elements', function() { - doc.append('
                                            some value
                                            '); + compile('
                                            ', 'some value'); $root.dsl.binding('foo.bar'); expect($root.futureResult.toLowerCase()).toEqual('some value'); }); it('should select binding in template by name', function() { - doc.append('
                                            foo some baz
                                            '); - $root.dsl.binding('bar'); - expect($root.futureResult).toEqual('foo some baz'); + compile('
                                            ', 'bar');
                                            +        $root.dsl.binding('foo.bar');
                                            +        expect($root.futureResult).toEqual('bar');
                                                   });
                                             
                                                   it('should match bindings by substring match', function() {
                                            -        doc.append('
                                            binding value
                                            '); - $root.dsl.binding('test.baz'); + compile('
                                            ', 'binding value');
                                            +        $root.dsl.binding('foo . bar');
                                                     expect($root.futureResult).toEqual('binding value');
                                                   });
                                             
                                            @@ -485,7 +503,7 @@ describe("angular.scenario.dsl", function() {
                                                   });
                                             
                                                   it('should return error if no binding matches', function() {
                                            -        doc.append('some value');
                                            +        compile('some value');
                                                     $root.dsl.binding('foo.bar');
                                                     expect($root.futureError).toMatch(/did not match/);
                                                   });
                                            diff --git a/test/service/filter/filtersSpec.js b/test/service/filter/filtersSpec.js
                                            index cc006447..98651c58 100644
                                            --- a/test/service/filter/filtersSpec.js
                                            +++ b/test/service/filter/filtersSpec.js
                                            @@ -153,14 +153,6 @@ describe('filters', function() {
                                                 });
                                               });
                                             
                                            -  describe('html', function() {
                                            -    it('should do basic filter', function() {
                                            -      var html = filter('html')("acd");
                                            -      expect(html instanceof HTML).toBeTruthy();
                                            -      expect(html.html).toEqual("acd");
                                            -    });
                                            -  });
                                            -
                                               describe('linky', function() {
                                                 var linky;
                                             
                                            @@ -169,7 +161,7 @@ describe('filters', function() {
                                                 }));
                                             
                                                 it('should do basic filter', function() {
                                            -      expect(linky("http://ab/ (http://a/)  http://1.2/v:~-123. c").html).
                                            +      expect(linky("http://ab/ (http://a/)  http://1.2/v:~-123. c")).
                                                     toEqual('http://ab/ ' +
                                                             '(http://a/) ' +
                                                             '<http://a/> ' +
                                            @@ -178,11 +170,11 @@ describe('filters', function() {
                                                 });
                                             
                                                 it('should handle mailto:', function() {
                                            -      expect(linky("mailto:me@example.com").html).
                                            +      expect(linky("mailto:me@example.com")).
                                                                   toEqual('me@example.com');
                                            -      expect(linky("me@example.com").html).
                                            +      expect(linky("me@example.com")).
                                                                   toEqual('me@example.com');
                                            -      expect(linky("send email to me@example.com, but").html).
                                            +      expect(linky("send email to me@example.com, but")).
                                                     toEqual('send email to me@example.com, but');
                                                 });
                                               });
                                            diff --git a/test/service/logSpec.js b/test/service/logSpec.js
                                            index 98158ae0..df2bc933 100644
                                            --- a/test/service/logSpec.js
                                            +++ b/test/service/logSpec.js
                                            @@ -69,7 +69,7 @@ describe('$log', function() {
                                                   e.stack = undefined;
                                             
                                                   $log = new $LogProvider().$get[1]({console:{error:function() {
                                            -        errorArgs = arguments;
                                            +        errorArgs = [].slice.call(arguments, 0);
                                                   }}});
                                                 });
                                             
                                            diff --git a/test/testabilityPatch.js b/test/testabilityPatch.js
                                            index 85c844cb..1b4f11ba 100644
                                            --- a/test/testabilityPatch.js
                                            +++ b/test/testabilityPatch.js
                                            @@ -61,9 +61,19 @@ afterEach(function() {
                                             
                                             function dealoc(obj) {
                                               if (obj) {
                                            -    var element = obj.$element || obj || {};
                                            -    if (element.nodeName) element = jqLite(element);
                                            -    if (element.dealoc) element.dealoc();
                                            +    if (isElement(obj)) {
                                            +      var element = obj;
                                            +      if (element.nodeName) element = jqLite(element);
                                            +      if (element.dealoc) element.dealoc();
                                            +    } else {
                                            +      for(var key in jqCache) {
                                            +        var value = jqCache[key];
                                            +        if (value.$scope == obj) {
                                            +          delete jqCache[key];
                                            +        }
                                            +      }
                                            +    }
                                            +
                                               }
                                             }
                                             
                                            diff --git a/test/widget/inputSpec.js b/test/widget/inputSpec.js
                                            index 3e073d95..3b3aa282 100644
                                            --- a/test/widget/inputSpec.js
                                            +++ b/test/widget/inputSpec.js
                                            @@ -51,7 +51,6 @@ describe('widget: input', function() {
                                             
                                                 it('should bind update scope from model', function() {
                                                   createInput();
                                            -      expect(scope.form.name.$required).toBe(false);
                                                   scope.name = 'misko';
                                                   scope.$digest();
                                                   expect(inputElement.val()).toEqual('misko');
                                            @@ -60,7 +59,6 @@ describe('widget: input', function() {
                                             
                                                 it('should require', function() {
                                                   createInput({required:''});
                                            -      expect(scope.form.name.$required).toBe(true);
                                                   scope.$digest();
                                                   expect(scope.form.name.$valid).toBe(false);
                                                   scope.name = 'misko';
                                            @@ -159,7 +157,7 @@ describe('widget: input', function() {
                                                             '
                                            '); scope.obj = { abc: { name: 'Misko'} }; scope.$digest(); - expect(scope.$element.find('input').val()).toEqual('Misko'); + expect(element.find('input').val()).toEqual('Misko'); }); @@ -181,7 +179,7 @@ describe('widget: input', function() { it("should render as blank if null", function() { compile(''); expect(scope.age).toBeNull(); - expect(scope.$element[0].value).toEqual(''); + expect(element[0].value).toEqual(''); }); @@ -189,19 +187,19 @@ describe('widget: input', function() { compile(''); scope.age = 123; scope.$digest(); - expect(scope.$element.val()).toEqual('123'); + expect(element.val()).toEqual('123'); try { // to allow non-number values, we have to change type so that // the browser which have number validation will not interfere with // this test. IE8 won't allow it hence the catch. - scope.$element[0].setAttribute('type', 'text'); + element[0].setAttribute('type', 'text'); } catch (e){} - scope.$element.val('123X'); - browserTrigger(scope.$element, 'change'); + element.val('123X'); + browserTrigger(element, 'change'); defer.flush(); - expect(scope.$element.val()).toEqual('123X'); + expect(element.val()).toEqual('123X'); expect(scope.age).toEqual(123); - expect(scope.$element).toBeInvalid(); + expect(element).toBeInvalid(); }); @@ -211,28 +209,28 @@ describe('widget: input', function() { // the user from ever typying ','. compile(''); - scope.$element.val('a '); - browserTrigger(scope.$element, 'change'); + element.val('a '); + browserTrigger(element, 'change'); defer.flush(); - expect(scope.$element.val()).toEqual('a '); + expect(element.val()).toEqual('a '); expect(scope.list).toEqual(['a']); - scope.$element.val('a ,'); - browserTrigger(scope.$element, 'change'); + element.val('a ,'); + browserTrigger(element, 'change'); defer.flush(); - expect(scope.$element.val()).toEqual('a ,'); + expect(element.val()).toEqual('a ,'); expect(scope.list).toEqual(['a']); - scope.$element.val('a , '); - browserTrigger(scope.$element, 'change'); + element.val('a , '); + browserTrigger(element, 'change'); defer.flush(); - expect(scope.$element.val()).toEqual('a , '); + expect(element.val()).toEqual('a , '); expect(scope.list).toEqual(['a']); - scope.$element.val('a , b'); - browserTrigger(scope.$element, 'change'); + element.val('a , b'); + browserTrigger(element, 'change'); defer.flush(); - expect(scope.$element.val()).toEqual('a , b'); + expect(element.val()).toEqual('a , b'); expect(scope.list).toEqual(['a', 'b']); }); @@ -240,7 +238,7 @@ describe('widget: input', function() { it("should come up blank when no value specified", function() { compile(''); scope.$digest(); - expect(scope.$element.val()).toEqual(''); + expect(element.val()).toEqual(''); expect(scope.age).toEqual(null); }); }); @@ -250,7 +248,7 @@ describe('widget: input', function() { it("should format booleans", function() { compile(''); expect(scope.name).toBe(false); - expect(scope.$element[0].checked).toBe(false); + expect(element[0].checked).toBe(false); }); @@ -270,15 +268,15 @@ describe('widget: input', function() { scope.name='y'; scope.$digest(); - expect(scope.$element[0].checked).toBe(true); + expect(element[0].checked).toBe(true); scope.name='n'; scope.$digest(); - expect(scope.$element[0].checked).toBe(false); + expect(element[0].checked).toBe(false); scope.name='abc'; scope.$digest(); - expect(scope.$element[0].checked).toBe(false); + expect(element[0].checked).toBe(false); browserTrigger(element); expect(scope.name).toEqual('y'); @@ -302,7 +300,6 @@ describe('widget: input', function() { it("should process required", inject(function($formFactory) { compile('', jqLite(document.body)); - expect($formFactory.rootForm.p.$required).toBe(true); expect(element.hasClass('ng-invalid')).toBeTruthy(); scope.price = 'xxx'; @@ -394,7 +391,7 @@ describe('widget: input', function() { '
                                            '); expect(scope.choose).toEqual('C'); - var inputs = scope.$element.find('input'); + var inputs = element.find('input'); expect(inputs[1].checked).toBe(false); expect(inputs[2].checked).toBe(true); }); @@ -408,7 +405,7 @@ describe('widget: input', function() { '
                                            '); expect(scope.choose).toEqual('A'); - var inputs = scope.$element.find('input'); + var inputs = element.find('input'); expect(inputs[0].checked).toBe(true); expect(inputs[1].checked).toBe(false); }); @@ -421,7 +418,7 @@ describe('widget: input', function() { ' type="radio" ng:model="choice" value="{{item}}" name="choice">'+ ''); - var inputs = scope.$element.find('input'); + var inputs = element.find('input'); expect(inputs[0].checked).toBe(false); expect(inputs[1].checked).toBe(false); @@ -435,7 +432,7 @@ describe('widget: input', function() { function($rootScope, $compile){ $rootScope.choice = 'b'; $rootScope.items = ['a', 'b']; - var element = $compile( + element = $compile( '
                                          • '+ ''+ @@ -465,21 +462,22 @@ describe('widget: input', function() { $rootScope.value = undefined; $rootScope.$digest(); expect(element.val()).toEqual(''); + dealoc(element); })); }); it('should ignore text widget which have no name', function() { compile(''); - expect(scope.$element.attr('ng-exception')).toBeFalsy(); - expect(scope.$element.hasClass('ng-exception')).toBeFalsy(); + expect(element.attr('ng-exception')).toBeFalsy(); + expect(element.hasClass('ng-exception')).toBeFalsy(); }); it('should ignore checkbox widget which have no name', function() { compile(''); - expect(scope.$element.attr('ng-exception')).toBeFalsy(); - expect(scope.$element.hasClass('ng-exception')).toBeFalsy(); + expect(element.attr('ng-exception')).toBeFalsy(); + expect(element.hasClass('ng-exception')).toBeFalsy(); }); @@ -506,6 +504,7 @@ describe('widget: input', function() { expect(formFactory).toBe($formFactory); expect(input[0]).toBe(element[0]); + dealoc(element); })); it('should throw an error of Controller not declared in scope', inject(function($rootScope, $compile) { @@ -530,13 +529,13 @@ describe('widget: input', function() { forEach(validList, function(value){ it('should validate "' + value + '"', function() { setup(value); - expect(scope.$element).toBeValid(); + expect(element).toBeValid(); }); }); forEach(invalidList, function(value){ it('should NOT validate "' + value + '"', function() { setup(value); - expect(scope.$element).toBeInvalid(); + expect(element).toBeInvalid(); }); }); @@ -553,10 +552,10 @@ describe('widget: input', function() { // to allow non-number values, we have to change type so that // the browser which have number validation will not interfere with // this test. IE8 won't allow it hence the catch. - scope.$element[0].setAttribute('type', 'text'); + element[0].setAttribute('type', 'text'); } catch (e){} if (value != undefined) { - scope.$element.val(value); + element.val(value); browserTrigger(element, 'keydown'); defer.flush(); } diff --git a/test/widget/selectSpec.js b/test/widget/selectSpec.js index 5d92e674..7206ade8 100644 --- a/test/widget/selectSpec.js +++ b/test/widget/selectSpec.js @@ -13,7 +13,7 @@ describe('select', function() { } else { element = jqLite(html); } - $compile(element)($rootScope); + element = $compile(element)($rootScope); scope.$apply(); return scope; }; @@ -37,7 +37,7 @@ describe('select', function() { scope.b = 'bar'; scope.$digest(); - expect(scope.$element.text()).toBe('foobarC'); + expect(element.text()).toBe('foobarC'); }); it('should require', inject(function($formFactory) { diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 88d9e1b8..6e115a36 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -1,9 +1,15 @@ 'use strict'; describe('widget', function() { - describe('ng:switch', function() { + var element; + + afterEach(function(){ + dealoc(element); + }); + + describe('ng:switch', inject(function($rootScope, $compile) { it('should switch on value change', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '' + '
                                            first:{{name}}
                                            ' + '
                                            second:{{name}}
                                            ' + @@ -29,7 +35,7 @@ describe('widget', function() { it('should switch on switch-when-default', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '' + '
                                            one
                                            ' + '
                                            other
                                            ' + @@ -43,7 +49,7 @@ describe('widget', function() { it('should call change on switch', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '' + '
                                            {{name}}
                                            ' + '
                                            ')($rootScope); @@ -52,7 +58,7 @@ describe('widget', function() { expect($rootScope.name).toEqual(undefined); expect(element.text()).toEqual('works'); })); - }); + })); describe('ng:include', function() { @@ -66,7 +72,7 @@ describe('widget', function() { it('should include on external file', inject(putIntoCache('myUrl', '{{name}}'), function($rootScope, $compile, $browser) { - var element = jqLite(''); + element = jqLite(''); element = $compile(element)($rootScope); $rootScope.childScope = $rootScope.$new(); $rootScope.childScope.name = 'misko'; @@ -79,7 +85,7 @@ describe('widget', function() { it('should remove previously included text if a falsy value is bound to src', inject( putIntoCache('myUrl', '{{name}}'), function($rootScope, $compile, $browser) { - var element = jqLite(''); + element = jqLite(''); element = $compile(element)($rootScope); $rootScope.childScope = $rootScope.$new(); $rootScope.childScope.name = 'igor'; @@ -97,7 +103,7 @@ describe('widget', function() { it('should allow this for scope', inject(putIntoCache('myUrl', '{{"abc"}}'), function($rootScope, $compile, $browser) { - var element = jqLite(''); + element = jqLite(''); element = $compile(element)($rootScope); $rootScope.url = 'myUrl'; $rootScope.$digest(); @@ -115,7 +121,7 @@ describe('widget', function() { it('should evaluate onload expression when a partial is loaded', inject( putIntoCache('myUrl', 'my partial'), function($rootScope, $compile, $browser) { - var element = jqLite(''); + element = jqLite(''); element = $compile(element)($rootScope); expect($rootScope.loaded).not.toBeDefined(); @@ -130,7 +136,7 @@ describe('widget', function() { it('should destroy old scope', inject(putIntoCache('myUrl', 'my partial'), function($rootScope, $compile, $browser) { - var element = jqLite(''); + element = jqLite(''); element = $compile(element)($rootScope); expect($rootScope.$$childHead).toBeFalsy(); @@ -147,7 +153,7 @@ describe('widget', function() { it('should do xhr request and cache it', inject(function($rootScope, $httpBackend, $compile, $browser) { - var element = $compile('')($rootScope); + element = $compile('')($rootScope); $httpBackend.expect('GET', 'myUrl').respond('my partial'); $rootScope.url = 'myUrl'; @@ -168,7 +174,7 @@ describe('widget', function() { it('should clear content when error during xhr request', inject(function($httpBackend, $compile, $rootScope) { - var element = $compile('content')($rootScope); + element = $compile('content')($rootScope); $httpBackend.expect('GET', 'myUrl').respond(404, ''); $rootScope.url = 'myUrl'; @@ -182,7 +188,7 @@ describe('widget', function() { it('should be async even if served from cache', inject( putIntoCache('myUrl', 'my partial'), function($rootScope, $compile, $browser) { - var element = $compile('')($rootScope); + element = $compile('')($rootScope); $rootScope.url = 'myUrl'; @@ -199,8 +205,8 @@ describe('widget', function() { it('should discard pending xhr callbacks if a new template is requested before the current ' + 'finished loading', inject(function($rootScope, $compile, $httpBackend) { - var element = jqLite(""), - log = []; + element = jqLite(""); + var log = []; $rootScope.templateUrl = 'myUrl1'; $rootScope.logger = function(msg) { @@ -234,7 +240,7 @@ describe('widget', function() { function compileAndLink(tpl) { return function($compile, $rootScope) { - $compile(tpl)($rootScope); + element = $compile(tpl)($rootScope); }; } @@ -294,7 +300,7 @@ describe('widget', function() { preventDefaultCalled = false, event; - var element = $compile('empty link')($rootScope); + element = $compile('empty link')($rootScope); if (msie < 9) { @@ -327,7 +333,7 @@ describe('widget', function() { describe('@ng:repeat', function() { it('should ng:repeat over array', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            ')($rootScope); @@ -355,7 +361,7 @@ describe('widget', function() { it('should ng:repeat over object', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            ')($rootScope); @@ -370,7 +376,7 @@ describe('widget', function() { Class.prototype.abc = function() {}; Class.prototype.value = 'abc'; - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            ')($rootScope); @@ -383,7 +389,7 @@ describe('widget', function() { it('should error on wrong parsing of ng:repeat', inject(function($rootScope, $compile, $log) { expect(function() { - var element = $compile('
                                            ')($rootScope); + element = $compile('
                                            ')($rootScope); }).toThrow("Expected ng:repeat in form of '_item_ in _collection_' but got 'i dont parse'."); $log.error.logs.shift(); @@ -392,7 +398,7 @@ describe('widget', function() { it('should expose iterator offset as $index when iterating over arrays', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            ')($rootScope); @@ -404,7 +410,7 @@ describe('widget', function() { it('should expose iterator offset as $index when iterating over objects', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            ')($rootScope); @@ -416,7 +422,7 @@ describe('widget', function() { it('should expose iterator position as $position when iterating over arrays', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            ')($rootScope); @@ -437,7 +443,7 @@ describe('widget', function() { it('should expose iterator position as $position when iterating over objects', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                              ' + '
                                            • ' + '
                                            • ' + @@ -454,7 +460,7 @@ describe('widget', function() { it('should ignore $ and $$ properties', inject(function($rootScope, $compile) { - var element = $compile('
                                              • {{i}}|
                                              ')($rootScope); + element = $compile('
                                              • {{i}}|
                                              ')($rootScope); $rootScope.items = ['a', 'b', 'c']; $rootScope.items.$$hashkey = 'xxx'; $rootScope.items.$root = 'yyy'; @@ -465,7 +471,7 @@ describe('widget', function() { it('should repeat over nested arrays', inject(function($rootScope, $compile) { - var element = $compile( + element = $compile( '
                                                ' + '
                                              • ' + '
                                                {{group}}|
                                                X' + @@ -480,7 +486,7 @@ describe('widget', function() { it('should ignore non-array element properties when iterating over an array', inject(function($rootScope, $compile) { - var element = $compile('
                                                • {{item}}|
                                                ')($rootScope); + element = $compile('
                                                • {{item}}|
                                                ')($rootScope); $rootScope.array = ['a', 'b', 'c']; $rootScope.array.foo = '23'; $rootScope.array.bar = function() {}; @@ -492,7 +498,7 @@ describe('widget', function() { it('should iterate over non-existent elements of a sparse array', inject(function($rootScope, $compile) { - var element = $compile('
                                                • {{item}}|
                                                ')($rootScope); + element = $compile('
                                                • {{item}}|
                                                ')($rootScope); $rootScope.array = ['a', 'b']; $rootScope.array[4] = 'c'; $rootScope.array[6] = 'd'; @@ -503,7 +509,7 @@ describe('widget', function() { it('should iterate over all kinds of types', inject(function($rootScope, $compile) { - var element = $compile('
                                                • {{item}}|
                                                ')($rootScope); + element = $compile('
                                                • {{item}}|
                                                ')($rootScope); $rootScope.array = ['a', 1, null, undefined, {}]; $rootScope.$digest(); @@ -512,7 +518,7 @@ describe('widget', function() { describe('stability', function() { - var a, b, c, d, lis, element; + var a, b, c, d, lis; beforeEach(inject(function($rootScope, $compile) { element = $compile( @@ -602,7 +608,7 @@ describe('widget', function() { describe('@ng:non-bindable', function() { it('should prevent compilation of the owning element and its children', inject(function($rootScope, $compile) { - var element = $compile('
                                                ')($rootScope); + element = $compile('
                                                ')($rootScope); $rootScope.name = 'misko'; $rootScope.$digest(); expect(element.text()).toEqual(''); @@ -611,7 +617,6 @@ describe('widget', function() { describe('ng:view', function() { - var element; beforeEach(inject(function($rootScope, $compile) { element = $compile('')($rootScope); })); @@ -658,7 +663,7 @@ describe('widget', function() { $location.path('/unknown'); $rootScope.$digest(); - expect($rootScope.$element.text()).toEqual(''); + expect(element.text()).toEqual(''); })); @@ -675,12 +680,13 @@ describe('widget', function() { $rootScope.parentVar = 'new parent'; $rootScope.$digest(); - expect($rootScope.$element.text()).toEqual('new parent'); + expect(element.text()).toEqual('new parent'); })); it('should be possible to nest ng:view in ng:include', inject(function() { // TODO(vojta): refactor this test + dealoc(element); var injector = angular.injector(['ng', 'ngMock']); var myApp = injector.get('$rootScope'); var $httpBackend = injector.get('$httpBackend'); @@ -690,7 +696,7 @@ describe('widget', function() { var $route = injector.get('$route'); $route.when('/foo', {controller: angular.noop, template: 'viewPartial.html'}); - var element = injector.get('$compile')( + element = injector.get('$compile')( '
                                                ' + 'include: ' + '
                                                ')(myApp); @@ -699,15 +705,16 @@ describe('widget', function() { $httpBackend.expect('GET', 'viewPartial.html').respond('content'); $httpBackend.flush(); - expect(myApp.$element.text()).toEqual('include: view: content'); + expect(element.text()).toEqual('include: view: content'); expect($route.current.template).toEqual('viewPartial.html'); dealoc(myApp); + dealoc(element); })); it('should initialize view template after the view controller was initialized even when ' + 'templates were cached', - inject(function($rootScope, $compile, $location, $httpBackend, $route, $browser) { + inject(function($rootScope, $compile, $location, $httpBackend, $route) { //this is a test for a regression that was introduced by making the ng:view cache sync $route.when('/foo', {controller: ParentCtrl, template: 'viewPartial.html'}); @@ -750,7 +757,7 @@ describe('widget', function() { $route.when('/foo', {template: 'myUrl1'}); $route.when('/bar', {template: 'myUrl2'}); - expect($rootScope.$element.text()).toEqual(''); + expect(element.text()).toEqual(''); $location.path('/foo'); $httpBackend.expect('GET', 'myUrl1').respond('
                                                {{1+3}}
                                                '); @@ -760,7 +767,7 @@ describe('widget', function() { $rootScope.$digest(); $httpBackend.flush(); // now that we have two requests pending, flush! - expect($rootScope.$element.text()).toEqual('2'); + expect(element.text()).toEqual('2'); })); @@ -770,12 +777,12 @@ describe('widget', function() { $location.path('/foo'); $httpBackend.expect('GET', 'myUrl1').respond(404, ''); - $rootScope.$element.text('content'); + element.text('content'); $rootScope.$digest(); $httpBackend.flush(); - expect($rootScope.$element.text()).toBe(''); + expect(element.text()).toBe(''); })); @@ -800,7 +807,6 @@ describe('widget', function() { describe('ng:pluralize', function() { describe('deal with pluralized strings without offset', function() { - var element; beforeEach(inject(function($rootScope, $compile) { element = $compile( '