Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(835)

Side by Side Diff: third_party/pkg/angular/test/_specs.dart

Issue 124053002: Adding Angular and dependent packages for testing (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 library ng_specs;
2
3
4 import 'dart:html';
5 import 'dart:mirrors' as mirror;
6 import 'package:unittest/unittest.dart' as unit;
7 import 'package:angular/angular.dart';
8 import 'package:angular/mock/module.dart';
9
10 import 'jasmine_syntax.dart';
11
12 export 'dart:html';
13 export 'jasmine_syntax.dart' hide main;
14 export 'package:unittest/unittest.dart';
15 export 'package:unittest/mock.dart';
16 export 'package:di/dynamic_injector.dart';
17 export 'package:angular/angular.dart';
18 export 'package:angular/mock/module.dart';
19 export 'package:perf_api/perf_api.dart';
20
21 es(String html) {
22 var div = new DivElement();
23 div.setInnerHtml(html, treeSanitizer: new NullTreeSanitizer());
24 return div.nodes;
25 }
26
27 e(String html) => es(html).first;
28
29 renderedText(n, [bool notShadow = false]) {
30 if (n is List) {
31 return n.map((nn) => renderedText(nn)).join("");
32 }
33
34 if (n is Comment) return '';
35
36 if (!notShadow && n is Element && n.shadowRoot != null) {
37 var shadowText = n.shadowRoot.text;
38 var domText = renderedText(n, true);
39 return shadowText.replaceFirst("SHADOW-CONTENT", domText);
40 }
41
42 if (n.nodes == null || n.nodes.length == 0) return n.text;
43
44 return n.nodes.map((cn) => renderedText(cn)).join("");
45 }
46
47 Expect expect(actual, [unit.Matcher matcher = null]) {
48 if (matcher != null) {
49 unit.expect(actual, matcher);
50 }
51 return new Expect(actual);
52 }
53
54 class Expect {
55 var actual;
56 var not;
57 Expect(this.actual) {
58 not = new NotExpect(this);
59 }
60
61 toEqual(expected) => unit.expect(actual, unit.equals(expected));
62 toContain(expected) => unit.expect(actual, unit.contains(expected));
63 toBe(expected) => unit.expect(actual,
64 unit.predicate((actual) => identical(expected, actual), '$expected'));
65 toThrow([exception]) => unit.expect(actual, exception == null ? unit.throws : unit.throwsA(new ExceptionContains(exception)));
66 toBeFalsy() => unit.expect(actual, (v) => v == null ? true : v is bool ? v == false : false);
67 toBeTruthy() => unit.expect(actual, (v) => v is bool ? v == true : true);
68 toBeDefined() => unit.expect(actual, (v) => v != null);
69 toBeNull() => unit.expect(actual, unit.isNull);
70 toBeNotNull() => unit.expect(actual, unit.isNotNull);
71
72 toHaveBeenCalled() => unit.expect(actual.called, true, reason: 'method not cal led');
73 toHaveBeenCalledOnce() => unit.expect(actual.count, 1, reason: 'method invoked ${actual.count} expected once');
74 toHaveBeenCalledWith([a,b,c,d,e,f]) =>
75 unit.expect(actual.firstArgsMatch(a,b,c,d,e,f), true,
76 reason: 'method invoked with correct arguments');
77 toHaveBeenCalledOnceWith([a,b,c,d,e,f]) =>
78 unit.expect(actual.count == 1 && actual.firstArgsMatch(a,b,c,d,e,f),
79 true,
80 reason: 'method invoked once with correct arguments. (Called ${ actual.count} times)');
81
82 toHaveClass(cls) => unit.expect(actual.classes.contains(cls), true, reason: ' Expected ${actual} to have css class ${cls}');
83
84 toEqualSelect(options) {
85 var actualOptions = [];
86
87 for(var option in actual.querySelectorAll('option')) {
88 if (option.selected) {
89 actualOptions.add([option.value]);
90 } else {
91 actualOptions.add(option.value);
92 }
93 }
94 return unit.expect(actualOptions, options);
95 }
96
97 toEqualValid() {
98 // TODO: implement onece we have forms
99 }
100 toEqualInvalid() {
101 // TODO: implement onece we have forms
102 }
103 toEqualPristine() {
104 // TODO: implement onece we have forms
105 }
106 toEqualDirty() {
107 // TODO: implement onece we have forms
108 }
109 }
110
111 class NotExpect {
112 Expect expect;
113 get actual => expect.actual;
114 NotExpect(this.expect);
115
116 toHaveBeenCalled() => unit.expect(actual.called, false, reason: 'method called ');
117 toThrow() => actual();
118
119 toHaveClass(cls) => unit.expect(actual.classes.contains(cls), false, reason: ' Expected ${actual} to not have css class ${cls}');
120 toBe(expected) => unit.expect(actual,
121 unit.predicate((actual) => !identical(expected, actual), '$expected'));
122 toEqual(expected) => unit.expect(actual,
123 unit.predicate((actual) => expected != actual, '$expected'));
124 toContain(expected) => unit.expect(actual,
125 unit.predicate((actual) => !actual.contains(expected), '$expected'));
126 }
127
128 class ExceptionContains extends unit.Matcher {
129
130 final _expected;
131
132 const ExceptionContains(this._expected);
133
134 bool matches(item, Map matchState) {
135 if (item is String) {
136 return item.indexOf(_expected) >= 0;
137 }
138 return matches('$item', matchState);
139 }
140
141 unit.Description describe(unit.Description description) =>
142 description.add('exception contains ').addDescriptionOf(_expected);
143
144 unit.Description describeMismatch(item, unit.Description mismatchDescription,
145 Map matchState, bool verbose) {
146 return super.describeMismatch('$item', mismatchDescription, matchState,
147 verbose);
148 }
149 }
150
151 $(selector) {
152 return new JQuery(selector);
153 }
154
155 var getterSetter = new GetterSetter();
156
157 class JQuery implements List<Node> {
158 List<Node> _list = [];
159
160 JQuery([selector]) {
161 if (selector == null) {
162 // do nothing;
163 } else if (selector is String) {
164 _list.addAll(es(selector));
165 } else if (selector is List) {
166 _list.addAll(selector);
167 } else if (selector is Node) {
168 add(selector);
169 } else {
170 throw selector;
171 }
172 }
173
174 noSuchMethod(Invocation invocation) => mirror.reflect(_list).delegate(invocati on);
175
176 _toHtml(node, [bool outer = false]) {
177 if (node is Comment) {
178 return '<!--${node.text}-->';
179 } else {
180 return outer ? node.outerHtml : node.innerHtml;
181 }
182 }
183
184 accessor(Function getter, Function setter, [value, single=false]) {
185 // TODO(dart): ?value does not work, since value was passed. :-(
186 var setterMode = value != null;
187 var result = setterMode ? this : '';
188 _list.forEach((node) {
189 if (setterMode) {
190 setter(node, value);
191 } else {
192 result = single ? getter(node) : '$result${getter(node)}';
193 }
194 });
195 return result;
196 }
197
198 html([String html]) => accessor(
199 (n) => _toHtml(n),
200 (n, v) => n.setInnerHtml(v, treeSanitizer: new NullTreeSanitizer()),
201 html);
202 val([String text]) => accessor((n) => n.value, (n, v) => n.value = v);
203 text([String text]) => accessor((n) => n.text, (n, v) => n.text = v, text);
204 contents() => fold(new JQuery(), (jq, node) => jq..addAll(node.nodes));
205 toString() => fold('', (html, node) => '$html${_toHtml(node, true)}');
206 eq(num childIndex) => $(this[childIndex]);
207 remove(_) => forEach((n) => n.remove());
208 attr([String name, String value]) => accessor(
209 (n) => n.attributes[name],
210 (n, v) => n.attributes[name] = v,
211 value,
212 true);
213 prop([String name]) => accessor(
214 (n) => getterSetter.getter(name)(n),
215 (n, v) => getterSetter.setter(name)(n, v),
216 null,
217 true);
218 textWithShadow() => fold('', (t, n) => '${t}${renderedText(n)}');
219 find(selector) => fold(new JQuery(), (jq, n) => jq..addAll(
220 (n is Element ? (n as Element).querySelectorAll(selector) : [])));
221 hasClass(String name) => fold(false, (hasClass, node) =>
222 hasClass || (node is Element && (node as Element).classes.contains(name))) ;
223 addClass(String name) => _list.forEach((node) =>
224 (node is Element) ? (node as Element).classes.add(name) : null);
225 removeClass(String name) => _list.forEach((node) =>
226 (node is Element) ? (node as Element).classes.remove(name) : null);
227 css(String name, [String value]) => accessor(
228 (Element n) => n.style.getPropertyValue(name),
229 (Element n, v) => n.style.setProperty(name, value), value);
230 children() => new JQuery(this[0].childNodes);
231 }
232
233
234 main() {
235 beforeEach(setUpInjector);
236 beforeEach(() => wrapFn(sync));
237 afterEach(tearDownInjector);
238 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698