Skip to content

Commit e896565

Browse files
committed
feat(directives/forms): run tests in NodeJS
Closes angular#921
1 parent 7322ed7 commit e896565

File tree

6 files changed

+184
-146
lines changed

6 files changed

+184
-146
lines changed

gulpfile.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,18 @@ var CONFIG = {
229229
formatDart: {
230230
packageName: 'dart_style',
231231
args: ['dart_style:format', '-w', 'dist/dart']
232+
},
233+
test: {
234+
js: {
235+
cjs: [
236+
'/angular2/test/core/compiler/**/*_spec.js',
237+
'/angular2/test/directives/**/*_spec.js',
238+
'/angular2/test/forms/**/*_spec.js'
239+
]
240+
}
232241
}
233242
};
243+
CONFIG.test.js.cjs = CONFIG.test.js.cjs.map(function(s) {return CONFIG.dest.js.cjs + s});
234244

235245
// ------------
236246
// clean
@@ -553,7 +563,7 @@ gulp.task('test.unit.dart/ci', function (done) {
553563
singleRun: true, reporters: ['dots'], browsers: getBrowsersFromCLI()}, done);
554564
});
555565
gulp.task('test.unit.cjs', function (done) {
556-
return gulp.src(CONFIG.dest.js.cjs + '/angular2/test/core/compiler/**/*_spec.js').pipe(jasmine({verbose: true, includeStackTrace: true}));
566+
return gulp.src(CONFIG.test.js.cjs).pipe(jasmine(/*{verbose: true, includeStackTrace: true}*/));
557567
});
558568

559569
// ------------------

modules/angular2/src/dom/parse5_adapter.cjs

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var url = require('url');
1010
import {List, MapWrapper, ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection';
1111
import {DomAdapter, setRootDomAdapter} from './dom_adapter';
1212
import {BaseException, isPresent, isBlank} from 'angular2/src/facade/lang';
13+
import {SelectorMatcher, CssSelector} from 'angular2/src/core/compiler/selector';
1314

1415
var _attrToPropMap = {
1516
'inner-html': 'innerHTML',
@@ -35,27 +36,55 @@ export class Parse5DomAdapter extends DomAdapter {
3536
throw _notImplemented('query');
3637
}
3738
querySelector(el, selector:string) {
38-
throw _notImplemented('querySelector');
39+
return this.querySelectorAll(el, selector)[0];
3940
}
4041
querySelectorAll(el, selector:string) {
41-
//TODO: use selector class from core. For now, only works for .classname ...
4242
var res = ListWrapper.create();
43-
var _recursive = (result, node, className) => {
44-
if (this.hasClass(node, className)) {
43+
var _recursive = (result, node, selector, matcher) => {
44+
if (this.elementMatches(node, selector, matcher)) {
4545
ListWrapper.push(result, node);
4646
}
4747
var cNodes = node.childNodes;
4848
if (cNodes && cNodes.length > 0) {
4949
for (var i = 0; i < cNodes.length; i++) {
50-
_recursive(result, cNodes[i], className);
50+
_recursive(result, cNodes[i], selector, matcher);
5151
}
5252
}
5353
};
54-
_recursive(res, el, selector.substring(1));
54+
var matcher = new SelectorMatcher();
55+
matcher.addSelectable(CssSelector.parse(selector));
56+
_recursive(res, el, selector, matcher);
5557
return res;
5658
}
59+
elementMatches(node, selector:string, matcher = null):boolean {
60+
var result = false;
61+
if (selector && selector.charAt(0) == "#") {
62+
result = this.getAttribute(node, 'id') == selector.substring(1);
63+
} else if (selector) {
64+
var result = false;
65+
if (matcher == null) {
66+
matcher = new SelectorMatcher();
67+
matcher.addSelectable(CssSelector.parse(selector));
68+
}
69+
70+
var cssSelector = new CssSelector();
71+
cssSelector.setElement(this.tagName(node));
72+
if (node.attribs) {
73+
for (var attrName in node.attribs) {
74+
cssSelector.addAttribute(attrName, node.attribs[attrName]);
75+
}
76+
}
77+
var classList = this.classList(node);
78+
for (var i = 0; i < classList.length; i++) {
79+
cssSelector.addClassName(classList[i]);
80+
}
81+
82+
matcher.match(cssSelector, function(selector, cb) {result = true;});
83+
}
84+
return result;
85+
}
5786
on(el, evt, listener) {
58-
throw _notImplemented('on');
87+
//Do nothing, in order to not break forms integration tests
5988
}
6089
dispatchEvent(el, evt) {
6190
throw _notImplemented('dispatchEvent');
@@ -316,7 +345,7 @@ export class Parse5DomAdapter extends DomAdapter {
316345
return res;
317346
}
318347
getAttribute(element, attribute:string) {
319-
return element.attribs.hasOwnProperty(attribute) ? element.attribs[attribute] : null;
348+
return element.attribs && element.attribs.hasOwnProperty(attribute)? element.attribs[attribute]: null;
320349
}
321350
setAttribute(element, attribute:string, value:string) {
322351
if (attribute) {
@@ -341,14 +370,6 @@ export class Parse5DomAdapter extends DomAdapter {
341370
}
342371
return defDoc;
343372
}
344-
elementMatches(n, selector:string):boolean {
345-
//TODO: use selector class from core.
346-
if (selector && selector.charAt(0) == ".") {
347-
return this.hasClass(n, selector.substring(1));
348-
} else {
349-
return n.tagName == selector;
350-
}
351-
}
352373
isTemplateElement(el:any):boolean {
353374
return this.isElementNode(el) && this.tagName(el) === "template";
354375
}

modules/angular2/src/forms/form_builder.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection';
22
import {isPresent} from 'angular2/src/facade/lang';
3-
import {ControlGroup, Control, OptionalControl, OptionalControlGroup} from 'angular2/forms';
3+
import * as modelModule from './model';
44

55

66
export class FormBuilder {
7-
group(controlsConfig, extra = null):ControlGroup {
7+
group(controlsConfig, extra = null):modelModule.ControlGroup {
88
var controls = this._reduceControls(controlsConfig);
99
var optionals = isPresent(extra) ? StringMapWrapper.get(extra, "optionals") : null;
1010
var validator = isPresent(extra) ? StringMapWrapper.get(extra, "validator") : null;
1111

1212
if (isPresent(validator)) {
13-
return new ControlGroup(controls, optionals, validator);
13+
return new modelModule.ControlGroup(controls, optionals, validator);
1414
} else {
15-
return new ControlGroup(controls, optionals);
15+
return new modelModule.ControlGroup(controls, optionals);
1616
}
1717
}
1818

19-
control(value, validator:Function = null):Control {
19+
control(value, validator:Function = null):modelModule.Control {
2020
if (isPresent(validator)) {
21-
return new Control(value, validator);
21+
return new modelModule.Control(value, validator);
2222
} else {
23-
return new Control(value);
23+
return new modelModule.Control(value);
2424
}
2525
}
2626

@@ -33,7 +33,7 @@ export class FormBuilder {
3333
}
3434

3535
_createControl(controlConfig) {
36-
if (controlConfig instanceof Control || controlConfig instanceof ControlGroup) {
36+
if (controlConfig instanceof modelModule.Control || controlConfig instanceof modelModule.ControlGroup) {
3737
return controlConfig;
3838

3939
} else if (ListWrapper.isList(controlConfig)) {

modules/angular2/src/forms/validators.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import {isBlank, isPresent} from 'angular2/src/facade/lang';
22
import {List, ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection';
33

4-
import {ControlGroup, Control} from 'angular2/forms';
4+
import * as modelModule from './model';
55

6-
export function required(c:Control) {
6+
export function required(c:modelModule.Control) {
77
return isBlank(c.value) || c.value == "" ? {"required" : true} : null;
88
}
99

10-
export function nullValidator(c:Control) {
10+
export function nullValidator(c:modelModule.Control) {
1111
return null;
1212
}
1313

1414
export function compose(validators:List<Function>):Function {
15-
return function(c:Control) {
15+
return function(c:modelModule.Control) {
1616
var res = ListWrapper.reduce(validators, (res, validator) => {
1717
var errors = validator(c);
1818
return isPresent(errors) ? StringMapWrapper.merge(res, errors) : res;
@@ -21,7 +21,7 @@ export function compose(validators:List<Function>):Function {
2121
}
2222
}
2323

24-
export function controlGroupValidator(c:ControlGroup) {
24+
export function controlGroupValidator(c:modelModule.ControlGroup) {
2525
var res = {};
2626
StringMapWrapper.forEach(c.controls, (control, name) => {
2727
if (c.contains(name) && isPresent(control.errors)) {

modules/angular2/test/directives/if_spec.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export function main() {
7575
createView(pv);
7676
cd.detectChanges();
7777

78-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
78+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
7979
expect(DOM.getText(view.nodes[0])).toEqual('hello');
8080
async.done();
8181
});
@@ -86,7 +86,7 @@ export function main() {
8686
createView(pv);
8787
cd.detectChanges();
8888

89-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
89+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
9090
expect(DOM.getText(view.nodes[0])).toEqual('hello2');
9191
async.done();
9292
});
@@ -98,18 +98,18 @@ export function main() {
9898

9999
component.booleanCondition = false;
100100
cd.detectChanges();
101-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(0);
101+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(0);
102102
expect(DOM.getText(view.nodes[0])).toEqual('');
103103

104104

105105
component.booleanCondition = true;
106106
cd.detectChanges();
107-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
107+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
108108
expect(DOM.getText(view.nodes[0])).toEqual('hello');
109109

110110
component.booleanCondition = false;
111111
cd.detectChanges();
112-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(0);
112+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(0);
113113
expect(DOM.getText(view.nodes[0])).toEqual('');
114114

115115
async.done();
@@ -127,18 +127,18 @@ export function main() {
127127
createView(pv);
128128

129129
cd.detectChanges();
130-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(3);
130+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(3);
131131
expect(DOM.getText(view.nodes[0])).toEqual('helloNumberhelloStringhelloFunction');
132132

133133
component.numberCondition = 0;
134134
cd.detectChanges();
135-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
135+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
136136
expect(DOM.getText(view.nodes[0])).toEqual('helloString');
137137

138138
component.numberCondition = 1;
139139
component.stringCondition = "bar";
140140
cd.detectChanges();
141-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
141+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
142142
expect(DOM.getText(view.nodes[0])).toEqual('helloNumber');
143143
async.done();
144144
});
@@ -151,7 +151,7 @@ export function main() {
151151
createView(pv);
152152
cd.detectChanges();
153153

154-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
154+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
155155
expect(DOM.getText(view.nodes[0])).toEqual('hello');
156156
async.done();
157157
});
@@ -162,7 +162,7 @@ export function main() {
162162
createView(pv);
163163
cd.detectChanges();
164164

165-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
165+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
166166
expect(DOM.getText(view.nodes[0])).toEqual('hello');
167167
async.done();
168168
});
@@ -173,7 +173,7 @@ export function main() {
173173
createView(pv);
174174
cd.detectChanges();
175175

176-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(0);
176+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(0);
177177
expect(DOM.getText(view.nodes[0])).toEqual('');
178178
async.done();
179179
});
@@ -184,12 +184,12 @@ export function main() {
184184
createView(pv);
185185

186186
cd.detectChanges();
187-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
187+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
188188
expect(DOM.getText(view.nodes[0])).toEqual('hello');
189189

190190
component.numberCondition = 2;
191191
cd.detectChanges();
192-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(1);
192+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(1);
193193
expect(DOM.getText(view.nodes[0])).toEqual('hello');
194194

195195
async.done();
@@ -215,7 +215,7 @@ export function main() {
215215
compileWithTemplate('<div><copy-me template="if numberCondition">hello</copy-me></div>').then((pv) => {
216216
createView(pv);
217217
expect(function(){cd.detectChanges();}).toThrowError();
218-
expect(view.nodes[0].querySelectorAll('copy-me').length).toEqual(0);
218+
expect(DOM.querySelectorAll(view.nodes[0], 'copy-me').length).toEqual(0);
219219
expect(DOM.getText(view.nodes[0])).toEqual('');
220220
async.done();
221221
});

0 commit comments

Comments
 (0)