Skip to content

Commit 22c6c09

Browse files
marclavalmhevery
authored andcommitted
chore(build): run event tests in Node
Closes angular#1476
1 parent e70a2f2 commit 22c6c09

File tree

6 files changed

+364
-326
lines changed

6 files changed

+364
-326
lines changed

gulpfile.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ var CONFIG = {
215215
};
216216
CONFIG.test.js.cjs = CONFIG.test.js.cjs.map(function(s) {return CONFIG.dest.js.cjs + s});
217217
CONFIG.test.js.cjs.push('!**/core/zone/vm_turn_zone_spec.js'); //Disabled in nodejs because it relies on Zone.js
218-
CONFIG.test.js.cjs.push('!**/render/dom/events/event_manager_spec.js'); //Disabled in nodejs because it relies on DOM events
219218

220219
// ------------
221220
// clean

modules/angular2/src/dom/parse5_adapter.cjs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,46 @@ export class Parse5DomAdapter extends DomAdapter {
8484
return result;
8585
}
8686
on(el, evt, listener) {
87-
//Do nothing, in order to not break forms integration tests
87+
var listenersMap = el._eventListenersMap;
88+
if (isBlank(listenersMap)) {
89+
var listenersMap = StringMapWrapper.create();
90+
el._eventListenersMap = listenersMap;
91+
}
92+
var listeners = StringMapWrapper.get(listenersMap, evt);
93+
if (isBlank(listeners)) {
94+
listeners = ListWrapper.create();
95+
}
96+
ListWrapper.push(listeners, listener);
97+
StringMapWrapper.set(listenersMap, evt, listeners);
8898
}
8999
onAndCancel(el, evt, listener): Function {
90-
//Do nothing, in order to not break forms integration tests
100+
this.on(el, evt, listener);
101+
return () => {ListWrapper.remove(StringMapWrapper.get(el._eventListenersMap, evt), listener);};
91102
}
92103
dispatchEvent(el, evt) {
93-
throw _notImplemented('dispatchEvent');
104+
if (isBlank(evt.target)) {
105+
evt.target = el;
106+
}
107+
if (isPresent(el._eventListenersMap)) {
108+
var listeners = StringMapWrapper.get(el._eventListenersMap, evt.type);
109+
if (isPresent(listeners)) {
110+
for (var i = 0; i < listeners.length; i++) {
111+
listeners[i](evt);
112+
}
113+
}
114+
}
115+
if (isPresent(el.parent)) {
116+
this.dispatchEvent(el.parent, evt);
117+
}
118+
if (isPresent(el._window)) {
119+
this.dispatchEvent(el._window, evt);
120+
}
94121
}
95122
createMouseEvent(eventType) {
96-
throw _notImplemented('createMouseEvent');
123+
return this.createEvent(eventType);
97124
}
98125
createEvent(eventType) {
99-
throw _notImplemented('createEvent');
126+
return {type: eventType};
100127
}
101128
getInnerHTML(el) {
102129
return serializer.serialize(this.templateAwareRoot(el));
@@ -378,6 +405,7 @@ export class Parse5DomAdapter extends DomAdapter {
378405
this.appendChild(newDoc, body);
379406
StringMapWrapper.set(newDoc, "head", head);
380407
StringMapWrapper.set(newDoc, "body", body);
408+
StringMapWrapper.set(newDoc, "_window", StringMapWrapper.create());
381409
return newDoc;
382410
}
383411
defaultDoc() {
@@ -482,6 +510,15 @@ export class Parse5DomAdapter extends DomAdapter {
482510
supportsNativeShadowDOM(): boolean {
483511
return false;
484512
}
513+
getGlobalEventTarget(target:string) {
514+
if (target == "window") {
515+
return this.defaultDoc()._window;
516+
} else if (target == "document") {
517+
return this.defaultDoc();
518+
} else if (target == "body") {
519+
return this.defaultDoc().body;
520+
}
521+
}
485522
}
486523

487524
//TODO: build a proper list, this one is all the keys of a HTMLInputElement

modules/angular2/src/forms/validator_directives.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Decorator} from 'angular2/angular2';
22

3-
import {ControlDirective, Validators} from 'angular2/forms';
3+
import {Validators} from './validators';
4+
import {ControlDirective} from './directives';
45

56
@Decorator({
67
selector: '[required]'

modules/angular2/test/core/compiler/integration_spec.js

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -545,53 +545,53 @@ export function main() {
545545
});
546546
}));
547547

548-
if (DOM.supportsDOMEvents()) {
549-
it('should support render events', inject([TestBed, AsyncTestCompleter], (tb, async) => {
550-
tb.overrideView(MyComp, new View({
551-
template: '<div listener></div>',
552-
directives: [DecoratorListeningDomEvent]
553-
}));
548+
it('should support render events', inject([TestBed, AsyncTestCompleter], (tb, async) => {
549+
tb.overrideView(MyComp, new View({
550+
template: '<div listener></div>',
551+
directives: [DecoratorListeningDomEvent]
552+
}));
554553

555-
tb.createView(MyComp, {context: ctx}).then((view) => {
554+
tb.createView(MyComp, {context: ctx}).then((view) => {
556555

557-
var injector = view.rawView.elementInjectors[0];
556+
var injector = view.rawView.elementInjectors[0];
558557

559-
var listener = injector.get(DecoratorListeningDomEvent);
558+
var listener = injector.get(DecoratorListeningDomEvent);
560559

561-
dispatchEvent(view.rootNodes[0], 'domEvent');
560+
dispatchEvent(view.rootNodes[0], 'domEvent');
562561

563-
expect(listener.eventType).toEqual('domEvent');
562+
expect(listener.eventType).toEqual('domEvent');
564563

565-
async.done();
566-
});
567-
}));
564+
async.done();
565+
});
566+
}));
568567

569-
it('should support render global events', inject([TestBed, AsyncTestCompleter], (tb, async) => {
570-
tb.overrideView(MyComp, new View({
571-
template: '<div listener></div>',
572-
directives: [DecoratorListeningDomEvent]
573-
}));
568+
it('should support render global events', inject([TestBed, AsyncTestCompleter], (tb, async) => {
569+
tb.overrideView(MyComp, new View({
570+
template: '<div listener></div>',
571+
directives: [DecoratorListeningDomEvent]
572+
}));
574573

575-
tb.createView(MyComp, {context: ctx}).then((view) => {
576-
var injector = view.rawView.elementInjectors[0];
574+
tb.createView(MyComp, {context: ctx}).then((view) => {
575+
var injector = view.rawView.elementInjectors[0];
577576

578-
var listener = injector.get(DecoratorListeningDomEvent);
579-
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
580-
expect(listener.eventType).toEqual('window_domEvent');
577+
var listener = injector.get(DecoratorListeningDomEvent);
578+
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
579+
expect(listener.eventType).toEqual('window_domEvent');
581580

582-
listener = injector.get(DecoratorListeningDomEvent);
583-
dispatchEvent(DOM.getGlobalEventTarget("document"), 'domEvent');
584-
expect(listener.eventType).toEqual('document_domEvent');
581+
listener = injector.get(DecoratorListeningDomEvent);
582+
dispatchEvent(DOM.getGlobalEventTarget("document"), 'domEvent');
583+
expect(listener.eventType).toEqual('document_domEvent');
585584

586-
view.destroy();
587-
listener = injector.get(DecoratorListeningDomEvent);
588-
dispatchEvent(DOM.getGlobalEventTarget("body"), 'domEvent');
589-
expect(listener.eventType).toEqual('');
585+
view.destroy();
586+
listener = injector.get(DecoratorListeningDomEvent);
587+
dispatchEvent(DOM.getGlobalEventTarget("body"), 'domEvent');
588+
expect(listener.eventType).toEqual('');
590589

591-
async.done();
592-
});
593-
}));
590+
async.done();
591+
});
592+
}));
594593

594+
if (DOM.supportsDOMEvents()) {
595595
it('should support preventing default on render events', inject([TestBed, AsyncTestCompleter], (tb, async) => {
596596
tb.overrideView(MyComp, new View({
597597
template: '<input type="checkbox" listenerprevent></input><input type="checkbox" listenernoprevent></input>',
@@ -608,41 +608,41 @@ export function main() {
608608
async.done();
609609
});
610610
}));
611+
}
611612

612-
it('should support render global events from multiple directives', inject([TestBed, AsyncTestCompleter], (tb, async) => {
613-
tb.overrideView(MyComp, new View({
614-
template: '<div *if="ctxBoolProp" listener listenerother></div>',
615-
directives: [If, DecoratorListeningDomEvent, DecoratorListeningDomEventOther]
616-
}));
613+
it('should support render global events from multiple directives', inject([TestBed, AsyncTestCompleter], (tb, async) => {
614+
tb.overrideView(MyComp, new View({
615+
template: '<div *if="ctxBoolProp" listener listenerother></div>',
616+
directives: [If, DecoratorListeningDomEvent, DecoratorListeningDomEventOther]
617+
}));
617618

618-
tb.createView(MyComp, {context: ctx}).then((view) => {
619-
globalCounter = 0;
620-
ctx.ctxBoolProp = true;
621-
view.detectChanges();
619+
tb.createView(MyComp, {context: ctx}).then((view) => {
620+
globalCounter = 0;
621+
ctx.ctxBoolProp = true;
622+
view.detectChanges();
622623

623-
var subview = view.rawView.viewContainers[0].get(0);
624-
var injector = subview.elementInjectors[0];
625-
var listener = injector.get(DecoratorListeningDomEvent);
626-
var listenerother = injector.get(DecoratorListeningDomEventOther);
627-
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
628-
expect(listener.eventType).toEqual('window_domEvent');
629-
expect(listenerother.eventType).toEqual('other_domEvent');
630-
expect(globalCounter).toEqual(1);
624+
var subview = view.rawView.viewContainers[0].get(0);
625+
var injector = subview.elementInjectors[0];
626+
var listener = injector.get(DecoratorListeningDomEvent);
627+
var listenerother = injector.get(DecoratorListeningDomEventOther);
628+
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
629+
expect(listener.eventType).toEqual('window_domEvent');
630+
expect(listenerother.eventType).toEqual('other_domEvent');
631+
expect(globalCounter).toEqual(1);
631632

632-
ctx.ctxBoolProp = false;
633-
view.detectChanges();
634-
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
635-
expect(globalCounter).toEqual(1);
633+
ctx.ctxBoolProp = false;
634+
view.detectChanges();
635+
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
636+
expect(globalCounter).toEqual(1);
636637

637-
ctx.ctxBoolProp = true;
638-
view.detectChanges();
639-
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
640-
expect(globalCounter).toEqual(2);
638+
ctx.ctxBoolProp = true;
639+
view.detectChanges();
640+
dispatchEvent(DOM.getGlobalEventTarget("window"), 'domEvent');
641+
expect(globalCounter).toEqual(2);
641642

642-
async.done();
643-
});
644-
}));
645-
}
643+
async.done();
644+
});
645+
}));
646646

647647
describe('dynamic ViewContainers', () => {
648648

0 commit comments

Comments
 (0)