Skip to content

Commit 1d65b38

Browse files
TedSandertbosch
authored andcommitted
feat(test): find testabilities across dart js applications
Find angular testability objects across different dart js contexts by registering each application in a global array and interrogating each for testabilities. Closes angular#3611
1 parent 64ebf27 commit 1d65b38

File tree

1 file changed

+37
-19
lines changed

1 file changed

+37
-19
lines changed

modules/angular2/src/core/testability/get_testability.dart

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,8 @@ import 'dart:js' as js;
1010
// Proxies a Dart function that accepts up to 10 parameters.
1111
js.JsFunction _jsFunction(Function fn) {
1212
const Object X = __varargSentinel;
13-
return new js.JsFunction.withThis((thisArg,
14-
[o1 = X,
15-
o2 = X,
16-
o3 = X,
17-
o4 = X,
18-
o5 = X,
19-
o6 = X,
20-
o7 = X,
21-
o8 = X,
22-
o9 = X,
23-
o10 = X]) {
13+
return new js.JsFunction.withThis((thisArg, [o1 = X, o2 = X, o3 = X, o4 = X,
14+
o5 = X, o6 = X, o7 = X, o8 = X, o9 = X, o10 = X]) {
2415
return __invokeFn(fn, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10);
2516
});
2617
}
@@ -91,19 +82,46 @@ class PublicTestability implements _JsObjectProxyable {
9182

9283
class GetTestability {
9384
static addToWindow(TestabilityRegistry registry) {
94-
js.context['getAngularTestability'] = _jsify((Element elem,
95-
[bool findInAncestors = true]) {
96-
Testability testability = registry.findTestabilityInTree(elem, findInAncestors);
97-
if (testability == null) {
85+
var jsRegistry = js.context['ngTestabilityRegistries'];
86+
if (jsRegistry == null) {
87+
js.context['ngTestabilityRegistries'] = jsRegistry = new js.JsArray();
88+
js.context['getAngularTestability'] = _jsify((Element elem,
89+
[bool findInAncestors = true]) {
90+
var registry = js.context['ngTestabilityRegistries'];
91+
for (int i = 0; i < registry.length; i++) {
92+
var result = registry[i].callMethod(
93+
'getAngularTestability', [elem, findInAncestors]);
94+
if (result != null) return result;
95+
}
9896
throw 'Could not find testability for element.';
99-
}
97+
});
98+
js.context['getAllAngularTestabilities'] = _jsify(() {
99+
var registry = js.context['ngTestabilityRegistries'];
100+
var result = [];
101+
for (int i = 0; i < registry.length; i++) {
102+
var testabilities =
103+
registry[i].callMethod('getAllAngularTestabilities');
104+
if (testabilities != null) result.addAll(testabilities);
105+
}
106+
return _jsify(result);
107+
});
108+
}
109+
jsRegistry.add(_createRegistry(registry));
110+
}
111+
112+
static js.JsObject _createRegistry(TestabilityRegistry registry) {
113+
var object = new js.JsObject(js.context['Object']);
114+
object['getAngularTestability'] = _jsify((Element elem,
115+
bool findInAncestors) {
116+
var testability = registry.findTestabilityInTree(elem, findInAncestors);
100117
return _jsify(new PublicTestability(testability));
101118
});
102-
js.context['getAllAngularTestabilities'] = _jsify(() {
103-
List<Testability> testabilities = registry.getAllTestabilities();
104-
var publicTestabilities = testabilities
119+
object['getAllAngularTestabilities'] = _jsify(() {
120+
var publicTestabilities = registry
121+
.getAllTestabilities()
105122
.map((testability) => new PublicTestability(testability));
106123
return _jsify(publicTestabilities);
107124
});
125+
return object;
108126
}
109127
}

0 commit comments

Comments
 (0)