Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions lib/mock/jquery.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
part of angular.mock;

// TODO(deboer): This belongs is a seperate unit testing package.

es(String html) {
var div = new DivElement();
div.setInnerHtml(html, treeSanitizer: new NullTreeSanitizer());
return div.nodes;
}

e(String html) => es(html).first;



$(selector) {
return new JQuery(selector);
}

// TODO(deboer): This class is not used in tests.
class GetterSetter {
Getter getter(String key) => null;
Setter setter(String key) => null;
}
var getterSetter = new GetterSetter();

class JQuery extends DelegatingList<Node> {
JQuery([selector]) : super([]) {
if (selector == null) {
// do nothing;
} else if (selector is String) {
addAll(es(selector));
} else if (selector is List) {
addAll(selector);
} else if (selector is Node) {
add(selector);
} else {
throw selector;
}
}

_toHtml(node, [bool outer = false]) {
if (node is Comment) {
return '<!--${node.text}-->';
} 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("");
}

if (n is Comment) return '';

if (!notShadow && n is Element && n.shadowRoot != null) {
var shadowText = n.shadowRoot.text;
var domText = _renderedText(n, true);
return shadowText.replaceFirst("SHADOW-CONTENT", domText);
}

if (n.nodes == null || n.nodes.length == 0) return n.text;

return n.nodes.map((cn) => _renderedText(cn)).join("");
}

accessor(Function getter, Function setter, [value, single=false]) {
// TODO(dart): ?value does not work, since value was passed. :-(
var setterMode = value != null;
var result = setterMode ? this : '';
forEach((node) {
if (setterMode) {
setter(node, value);
} else {
result = single ? getter(node) : '$result${getter(node)}';
}
});
return result;
}

html([String html]) => accessor(
(n) => _toHtml(n),
(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(
(n) => n.attributes[name],
(n, v) => n.attributes[name] = v,
value,
true);
prop([String name]) => accessor(
(n) => getterSetter.getter(name)(n),
(n, v) => getterSetter.setter(name)(n, v),
null,
true);
textWithShadow() => fold('', (t, n) => '${t}${_renderedText(n)}');
find(selector) => fold(new JQuery(), (jq, n) => jq..addAll(
(n is Element ? (n as Element).querySelectorAll(selector) : [])));
hasClass(String name) => fold(false, (hasClass, node) =>
hasClass || (node is Element && (node as Element).classes.contains(name)));
addClass(String name) => forEach((node) =>
(node is Element) ? (node as Element).classes.add(name) : null);
removeClass(String name) => forEach((node) =>
(node is Element) ? (node as Element).classes.remove(name) : null);
css(String name, [String value]) => accessor(
(Element n) => n.style.getPropertyValue(name),
(Element n, v) => n.style.setProperty(name, value), value);
children() => new JQuery(this[0].childNodes);
shadowRoot() => new JQuery((this[0] as Element).shadowRoot);

get classes => first.classes;
get className => first.className;
}
2 changes: 2 additions & 0 deletions lib/mock/module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'dart:html';
import 'dart:js' as js;
import 'package:angular/angular.dart';
import 'package:angular/utils.dart' as utils;
import 'package:collection/wrappers.dart' show DelegatingList;
import 'package:di/di.dart';
import 'package:di/dynamic_injector.dart';
import 'package:unittest/mock.dart';
Expand All @@ -16,6 +17,7 @@ export 'zone.dart';
part 'debug.dart';
part 'exception_handler.dart';
part 'http_backend.dart';
part 'jquery.dart';
part 'log.dart';
part 'probe.dart';
part 'test_bed.dart';
Expand Down
4 changes: 2 additions & 2 deletions lib/mock/test_bed.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class TestBed {
*
* An option [scope] parameter can be supplied to link it with non root scope.
*/
Element compile(html, {Scope scope, DirectiveMap directives}) {
JQuery compile(html, {Scope scope, DirectiveMap directives}) {
var injector = this.injector;
if (scope != null) {
injector = injector.createChild([new Module()..value(Scope, scope)]);
Expand All @@ -53,7 +53,7 @@ class TestBed {
directives = injector.get(DirectiveMap);
}
rootView = compiler(rootElements, directives)(injector, rootElements);
return rootElement;
return $(rootElement);
}

/**
Expand Down
125 changes: 0 additions & 125 deletions test/_specs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import 'dart:html';
import 'package:unittest/unittest.dart' as unit;
import 'package:angular/angular.dart';
import 'package:angular/mock/module.dart';
import 'package:collection/wrappers.dart' show DelegatingList;

import 'jasmine_syntax.dart' as jasmine_syntax;

Expand All @@ -17,14 +16,6 @@ export 'package:angular/animate/module.dart';
export 'package:angular/mock/module.dart';
export 'package:perf_api/perf_api.dart';

es(String html) {
var div = new DivElement();
div.setInnerHtml(html, treeSanitizer: new NullTreeSanitizer());
return div.nodes;
}

e(String html) => es(html).first;

Expect expect(actual, [unit.Matcher matcher = null]) {
if (matcher != null) {
unit.expect(actual, matcher);
Expand Down Expand Up @@ -129,122 +120,6 @@ class ExceptionContains extends unit.Matcher {
}
}

$(selector) {
return new JQuery(selector);
}


class GetterSetter {
Getter getter(String key) => null;
Setter setter(String key) => null;
}
var getterSetter = new GetterSetter();

class JQuery extends DelegatingList<Node> {
JQuery([selector]) : super([]) {
if (selector == null) {
// do nothing;
} else if (selector is String) {
addAll(es(selector));
} else if (selector is List) {
addAll(selector);
} else if (selector is Node) {
add(selector);
} else {
throw selector;
}
}

_toHtml(node, [bool outer = false]) {
if (node is Comment) {
return '<!--${node.text}-->';
} 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("");
}

if (n is Comment) return '';

if (!notShadow && n is Element && n.shadowRoot != null) {
var shadowText = n.shadowRoot.text;
var domText = _renderedText(n, true);
return shadowText.replaceFirst("SHADOW-CONTENT", domText);
}

if (n.nodes == null || n.nodes.length == 0) return n.text;

return n.nodes.map((cn) => _renderedText(cn)).join("");
}

accessor(Function getter, Function setter, [value, single=false]) {
// TODO(dart): ?value does not work, since value was passed. :-(
var setterMode = value != null;
var result = setterMode ? this : '';
forEach((node) {
if (setterMode) {
setter(node, value);
} else {
result = single ? getter(node) : '$result${getter(node)}';
}
});
return result;
}

html([String html]) => accessor(
(n) => _toHtml(n),
(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(
(n) => n.attributes[name],
(n, v) => n.attributes[name] = v,
value,
true);
prop([String name]) => accessor(
(n) => getterSetter.getter(name)(n),
(n, v) => getterSetter.setter(name)(n, v),
null,
true);
textWithShadow() => fold('', (t, n) => '${t}${_renderedText(n)}');
find(selector) => fold(new JQuery(), (jq, n) => jq..addAll(
(n is Element ? (n as Element).querySelectorAll(selector) : [])));
hasClass(String name) => fold(false, (hasClass, node) =>
hasClass || (node is Element && (node as Element).classes.contains(name)));
addClass(String name) => forEach((node) =>
(node is Element) ? (node as Element).classes.add(name) : null);
removeClass(String name) => forEach((node) =>
(node is Element) ? (node as Element).classes.remove(name) : null);
css(String name, [String value]) => accessor(
(Element n) => n.style.getPropertyValue(name),
(Element n, v) => n.style.setProperty(name, value), value);
children() => new JQuery(this[0].childNodes);
shadowRoot() => new JQuery((this[0] as Element).shadowRoot);
}

_injectify(fn) {
// The function does two things:
// First: if the it() passed a function, we wrap it in
Expand Down
2 changes: 1 addition & 1 deletion test/bootstrap_spec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ void main() {
it('should default to whole page', () {
var body = setBody('<div>{{"works"}}</div>');
ngBootstrap();
expect($(body).html()).toEqual('<div>works</div>');
expect(body.html()).toEqual('<div>works</div>');
});

it('should compile starting at ng-app node', () {
Expand Down
Loading