From 750525e3767ed93662e36051c6e5b2aaa04391b1 Mon Sep 17 00:00:00 2001 From: James deBoer Date: Thu, 20 Mar 2014 11:46:05 -0700 Subject: [PATCH] feat(expect): Move JQuery.html to Expect.toHaveHtml() For #219 --- test/_specs.dart | 55 +++++++++++++----------- test/_specs_spec.dart | 27 +++++------- test/bootstrap_spec.dart | 10 ++--- test/core/templateurl_spec.dart | 6 +-- test/core_dom/compiler_spec.dart | 24 +++++------ test/core_dom/ng_mustache_spec.dart | 6 +-- test/core_dom/view_spec.dart | 12 +++--- test/directive/ng_bind_html_spec.dart | 8 ++-- test/directive/ng_if_spec.dart | 24 +++++------ test/directive/ng_non_bindable_spec.dart | 2 +- 10 files changed, 87 insertions(+), 87 deletions(-) diff --git a/test/_specs.dart b/test/_specs.dart index 75d7906e6..a7b3c1544 100644 --- a/test/_specs.dart +++ b/test/_specs.dart @@ -50,6 +50,8 @@ class Expect { toBeNull() => unit.expect(actual, unit.isNull); toBeNotNull() => unit.expect(actual, unit.isNotNull); + toHaveHtml(expected) => unit.expect(_toHtml(actual), unit.equals(expected)); + toHaveBeenCalled() => unit.expect(actual.called, true, reason: 'method not called'); toHaveBeenCalledOnce() => unit.expect(actual.count, 1, reason: 'method invoked ${actual.count} expected once'); toHaveBeenCalledWith([a,b,c,d,e,f]) => @@ -87,6 +89,34 @@ class Expect { toEqualDirty() { // TODO: implement onece we have forms } + + + _toHtml(node, [bool outer = false]) { + if (node is Comment) { + return ''; + } else if (node is DocumentFragment) { + var acc = ''; + node.childNodes.forEach((n) { acc += _toHtml(n, true); }); + return acc; + } else if (node is List) { + var acc = ''; + node.forEach((n) { acc += _toHtml(n); }); + return acc; + } else if (node is Element) { + // Remove all the "ng-binding" internal classes + node = node.clone(true) as Element; + node.classes.remove('ng-binding'); + node.querySelectorAll(".ng-binding").forEach((Element e) { + e.classes.remove('ng-binding'); + }); + var htmlString = outer ? node.outerHtml : node.innerHtml; + // Strip out empty class attributes. This seems like a Dart bug... + return htmlString.replaceAll(' class=""', '').trim(); + } else { + throw "JQuery._toHtml not implemented for node type [${node.nodeType}]"; + } + } + } class NotExpect { @@ -155,28 +185,6 @@ class JQuery extends DelegatingList { } } - _toHtml(node, [bool outer = false]) { - if (node is Comment) { - return ''; - } else if (node is DocumentFragment) { - var acc = ''; - node.childNodes.forEach((n) { acc += _toHtml(n, true); }); - return acc; - } else if (node is Element) { - // Remove all the "ng-binding" internal classes - node = node.clone(true) as Element; - node.classes.remove('ng-binding'); - node.querySelectorAll(".ng-binding").forEach((Element e) { - e.classes.remove('ng-binding'); - }); - var htmlString = outer ? node.outerHtml : node.innerHtml; - // Strip out empty class attributes. This seems like a Dart bug... - return htmlString.replaceAll(' class=""', ''); - } else { - throw "JQuery._toHtml not implemented for node type [${node.nodeType}]"; - } - } - _renderedText(n, [bool notShadow = false]) { if (n is List) { return n.map((nn) => _renderedText(nn)).join(""); @@ -210,13 +218,12 @@ class JQuery extends DelegatingList { } html([String html]) => accessor( - (n) => _toHtml(n), + (n) { throw "Not implemented"; }, (n, v) => n.setInnerHtml(v, treeSanitizer: new NullTreeSanitizer()), html); val([String text]) => accessor((n) => n.value, (n, v) => n.value = v); text([String text]) => accessor((n) => n.text, (n, v) => n.text = v, text); contents() => fold(new JQuery(), (jq, node) => jq..addAll(node.nodes)); - toString() => fold('', (html, node) => '$html${_toHtml(node, true)}'); eq(num childIndex) => $(this[childIndex]); remove(_) => forEach((n) => n.remove()); attr([String name, String value]) => accessor( diff --git a/test/_specs_spec.dart b/test/_specs_spec.dart index 9d4aec4bf..d9d096432 100644 --- a/test/_specs_spec.dart +++ b/test/_specs_spec.dart @@ -3,28 +3,21 @@ library _specs_spec; import '_specs.dart'; main() { - - - - describe('jquery', () { - describe('html', () { - it('get', (){ - var div = $('
'); - expect(div.html()).toEqual(''); + describe('expect', () { + describe('toHaveHtml', () { + it('should return html', (){ + var div = es('
'); + expect(es('
')).toHaveHtml(''); }); it('should strip ng-binding', () { - var div = $('
'); - expect(div.html()).toEqual(''); - }); - - it('set', (){ - var div = $('
'); - expect(div.html('text')).toBe(div); - expect(div.html()).toEqual('text'); + var div = es('
'); + expect(div).toHaveHtml(''); }); }); + }); + describe('jquery', () { describe('shadowRoot', () { it('should return the shadowRoot if one exists', () { var elts = $('
'); @@ -39,7 +32,7 @@ main() { it('should print the html for the shadowRoot', () { var elts = $('
'); elts[0].createShadowRoot().innerHtml = '
Hello shadow
'; - expect(elts.shadowRoot().html()).toEqual('
Hello shadow
'); + expect(elts.shadowRoot()[0]).toHaveHtml('
Hello shadow
'); }); }); diff --git a/test/bootstrap_spec.dart b/test/bootstrap_spec.dart index dc3d986f2..fad0cd10f 100644 --- a/test/bootstrap_spec.dart +++ b/test/bootstrap_spec.dart @@ -7,27 +7,27 @@ void main() { setBody(String html) { var body = window.document.querySelector('body'); body.setInnerHtml(html, treeSanitizer: new NullTreeSanitizer()); - return $(body); + return body; } it('should default to whole page', () { var body = setBody('
{{"works"}}
'); ngBootstrap(); - expect($(body).html()).toEqual('
works
'); + expect(body).toHaveHtml('
works
'); }); it('should compile starting at ng-app node', () { var body = setBody( '
{{ignor me}}
'); ngBootstrap(); - expect(body.text()).toEqual('{{ignor me}}works'); + expect(body.text).toEqual('{{ignor me}}works'); }); it('should compile starting at ng-app node', () { var body = setBody( '
{{ignor me}}
'); - ngBootstrap(element:body.find('div[ng-bind]').first); - expect(body.text()).toEqual('{{ignor me}}works'); + ngBootstrap(element:body.querySelector('div[ng-bind]')); + expect(body.text).toEqual('{{ignor me}}works'); }); }); } diff --git a/test/core/templateurl_spec.dart b/test/core/templateurl_spec.dart index 974868d83..f6346d137 100644 --- a/test/core/templateurl_spec.dart +++ b/test/core/templateurl_spec.dart @@ -70,7 +70,7 @@ void main() { microLeap(); expect(element.textWithShadow()).toEqual('.hello{}Simple!'); - expect(element.children().shadowRoot().html()).toEqual( + expect(element.children().shadowRoot()[0]).toHaveHtml( '
Simple!
' ); }))); @@ -139,7 +139,7 @@ void main() { microLeap(); expect(element.textWithShadow()).toEqual('.hello{}Simple!'); - expect(element.children().shadowRoot().html()).toEqual( + expect(element.children().shadowRoot()[0]).toHaveHtml( '
Simple!
' ); $rootScope.apply(); @@ -225,7 +225,7 @@ void main() { microLeap(); expect(element.textWithShadow()).toEqual('.hello{}.world{}Simple!'); - expect(element.children().shadowRoot().html()).toEqual( + expect(element.children().shadowRoot()[0]).toHaveHtml( '
Simple!
' ); $rootScope.apply(); diff --git a/test/core_dom/compiler_spec.dart b/test/core_dom/compiler_spec.dart index 28433aada..c88634fe9 100644 --- a/test/core_dom/compiler_spec.dart +++ b/test/core_dom/compiler_spec.dart @@ -59,13 +59,13 @@ void main() { }); it('should compile a comment with no directives around', () { - var element = $(_.compile('
')); - expect(element.html()).toEqual(''); + var element = _.compile('
'); + expect(element).toHaveHtml(''); }); it('should compile a comment when the parent has a directive', () { - var element = $(_.compile('
')); - expect(element.html()).toEqual(''); + var element = _.compile('
'); + expect(element).toHaveHtml(''); }); it('should compile a directive in a child', () { @@ -79,17 +79,17 @@ void main() { }); it('should compile repeater', () { - var element = $(_.compile('
')); + var element = _.compile('
'); _.rootScope.context['items'] = ['A', 'b']; - expect(element.text()).toEqual(''); + expect(element.text).toEqual(''); _.rootScope.apply(); - expect(element.text()).toEqual('Ab'); + expect(element.text).toEqual('Ab'); _.rootScope.context['items'] = []; _.rootScope.apply(); - expect(element.html()).toEqual(''); + expect(element).toHaveHtml(''); }); it('should compile a text child of a basic repeater', () { @@ -120,17 +120,17 @@ void main() { }); it('should compile repeater with children', (Compiler $compile) { - var element = $(_.compile('
')); + var element = _.compile('
'); _.rootScope.context['items'] = ['A', 'b']; - expect(element.text()).toEqual(''); + expect(element.text).toEqual(''); _.rootScope.apply(); - expect(element.text()).toEqual('Ab'); + expect(element.text).toEqual('Ab'); _.rootScope.context['items'] = []; _.rootScope.apply(); - expect(element.html()).toEqual(''); + expect(element).toHaveHtml(''); }); it('should compile text', (Compiler $compile) { diff --git a/test/core_dom/ng_mustache_spec.dart b/test/core_dom/ng_mustache_spec.dart index 0191ae6f5..6008e44b2 100644 --- a/test/core_dom/ng_mustache_spec.dart +++ b/test/core_dom/ng_mustache_spec.dart @@ -56,14 +56,14 @@ main() { it('should handle filters', inject((Compiler $compile, RootScope rootScope, Injector injector, DirectiveMap directives) { - var element = $('
{{"World" | hello}}
'); + var element = es('
{{"World" | hello}}
'); var template = $compile(element, directives); var view = template(injector); rootScope.apply(); - element = $(view.nodes); + element = view.nodes; - expect(element.html()).toEqual('Hello, World!'); + expect(element).toHaveHtml('Hello, World!'); })); }); diff --git a/test/core_dom/view_spec.dart b/test/core_dom/view_spec.dart index e3bc8ea35..bb19e83e7 100644 --- a/test/core_dom/view_spec.dart +++ b/test/core_dom/view_spec.dart @@ -87,7 +87,7 @@ main() { it('should insert block after anchor view', () { anchor.insert(a); - expect($rootElement.html()).toEqual('Aa'); + expect($rootElement[0]).toHaveHtml('Aa'); }); @@ -95,7 +95,7 @@ main() { anchor.insert(a); anchor.insert(b, insertAfter: a); - expect($rootElement.html()).toEqual('AaBb'); + expect($rootElement[0]).toHaveHtml('AaBb'); }); @@ -103,7 +103,7 @@ main() { anchor.insert(b); anchor.insert(a); - expect($rootElement.html()).toEqual('AaBb'); + expect($rootElement[0]).toHaveHtml('AaBb'); }); }); @@ -118,12 +118,12 @@ main() { it('should remove the last view', () { anchor.remove(b); - expect($rootElement.html()).toEqual('Aa'); + expect($rootElement[0]).toHaveHtml('Aa'); }); it('should remove child views from parent pseudo black', () { anchor.remove(a); - expect($rootElement.html()).toEqual('Bb'); + expect($rootElement[0]).toHaveHtml('Bb'); }); // TODO(deboer): Make this work again. @@ -183,7 +183,7 @@ main() { it('should move last to middle', () { anchor.move(a, moveAfter: b); - expect($rootElement.html()).toEqual('BbAa'); + expect($rootElement[0]).toHaveHtml('BbAa'); }); }); }); diff --git a/test/directive/ng_bind_html_spec.dart b/test/directive/ng_bind_html_spec.dart index eba4fc98f..db71a575e 100644 --- a/test/directive/ng_bind_html_spec.dart +++ b/test/directive/ng_bind_html_spec.dart @@ -8,12 +8,12 @@ main() { it('should sanitize and set innerHtml and sanitize and set html', (Scope scope, Injector injector, Compiler compiler, DirectiveMap directives) { - var element = $('
'); + var element = es('
'); compiler(element, directives)(injector, element); scope.context['htmlVar'] = 'Google!'; scope.apply(); // Sanitization removes the href attribute on the tag. - expect(element.html()).toEqual('Google!'); + expect(element).toHaveHtml('Google!'); }); describe('injected NodeValidator', () { @@ -27,12 +27,12 @@ main() { }); it('should use injected NodeValidator and override default sanitize behavior', (Scope scope, Injector injector, Compiler compiler, DirectiveMap directives) { - var element = $('
'); + var element = es('
'); compiler(element, directives)(injector, element); scope.context['htmlVar'] = 'Google!'; scope.apply(); // Sanitation allows href attributes per injected sanitizer. - expect(element.html()).toEqual('Google!'); + expect(element).toHaveHtml('Google!'); }); }); }); diff --git a/test/directive/ng_if_spec.dart b/test/directive/ng_if_spec.dart index 576851232..1c2991e1f 100644 --- a/test/directive/ng_if_spec.dart +++ b/test/directive/ng_if_spec.dart @@ -54,7 +54,7 @@ main() { compile(html); // The span node should NOT exist in the DOM. expect(element.contents().length).toEqual(1); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); rootScope.apply(() { rootScope.context['isVisible'] = true; @@ -62,13 +62,13 @@ main() { // The span node SHOULD exist in the DOM. expect(element.contents().length).toEqual(2); - expect(element.find('span').html()).toEqual('content'); + expect(element.find('span')[0]).toHaveHtml('content'); rootScope.apply(() { rootScope.context['isVisible'] = false; }); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); } ); @@ -99,9 +99,9 @@ main() { expect(element.contents().length).toEqual(3); // The value on the parent scope.context['should'] be unchanged. expect(rootScope.context['setBy']).toEqual('topLevel'); - expect(element.find('#outside').html()).toEqual('topLevel'); + expect(element.find('#outside')[0]).toHaveHtml('topLevel'); // A child scope.context['must'] have been created and hold a different value. - expect(element.find('#inside').html()).toEqual('childController'); + expect(element.find('#inside')[0]).toHaveHtml('childController'); } ); @@ -165,7 +165,7 @@ main() { rootScope.apply(() { rootScope.context['isVisible'] = false; }); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); } ); @@ -175,19 +175,19 @@ main() { '
  • content
    '], (html) { compile(html); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); rootScope.apply(() { rootScope.context['isVisible'] = false; }); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); expect(logger.result()).toEqual('ALWAYS'); rootScope.apply(() { rootScope.context['isVisible'] = true; }); - expect(element.find('span').html()).toEqual('content'); + expect(element.find('span')[0]).toHaveHtml('content'); expect(logger.result()).toEqual('ALWAYS; JAMES'); } ); @@ -198,7 +198,7 @@ main() { '
    content
    '], (html) { compile(html); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); expect(() { rootScope.apply(() { @@ -206,7 +206,7 @@ main() { rootScope.context['b'] = false; }); }).not.toThrow(); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); expect(() { @@ -215,7 +215,7 @@ main() { rootScope.context['b'] = true; }); }).not.toThrow(); - expect(element.find('span').html()).toEqual(''); + expect(element.find('span').length).toEqual(0); } ); } diff --git a/test/directive/ng_non_bindable_spec.dart b/test/directive/ng_non_bindable_spec.dart index a03d7d416..9015a1386 100644 --- a/test/directive/ng_non_bindable_spec.dart +++ b/test/directive/ng_non_bindable_spec.dart @@ -30,7 +30,7 @@ main() { expect(element.find("#s4").text().trim()).toEqual('two'); // Bindings contained by ng-non-bindable should be left alone. var nonBindableDiv = element.find("div"); - expect(nonBindableDiv.html().trim()).toEqual('{{b}}'); + expect(nonBindableDiv[0]).toHaveHtml('{{b}}'); expect(nonBindableDiv.text().trim()).toEqual('{{b}}'); // Bindings on the same node are processed. expect(nonBindableDiv.attr('foo')).toEqual('one');