|
1 | 1 | import { expect } from 'chai';
|
2 | 2 | import { expectObservable } from '../helpers/marble-testing';
|
3 |
| -import { fromEvent, NEVER, timer, pipe } from 'rxjs'; |
| 3 | +import { Observable, fromEvent, NEVER, timer, pipe } from 'rxjs'; |
| 4 | +import { NodeStyleEventEmitter, NodeCompatibleEventEmitter, NodeEventHandler } from 'rxjs/internal/observable/fromEvent'; |
4 | 5 | import { mapTo, take, concat } from 'rxjs/operators';
|
5 | 6 | import { TestScheduler } from 'rxjs/testing';
|
6 | 7 |
|
| 8 | +declare const type: Function; |
| 9 | + |
7 | 10 | declare function asDiagram(arg: string): Function;
|
8 | 11 | declare const rxTestScheduler: TestScheduler;
|
9 | 12 |
|
@@ -89,7 +92,7 @@ describe('fromEvent', () => {
|
89 | 92 | expect(offHandler).to.equal(onHandler);
|
90 | 93 | });
|
91 | 94 |
|
92 |
| - it('should setup an event observable on objects with "addListener" and "removeListener" ', () => { |
| 95 | + it('should setup an event observable on objects with "addListener" and "removeListener" returning event emitter', () => { |
93 | 96 | let onEventName;
|
94 | 97 | let onHandler;
|
95 | 98 | let offEventName;
|
@@ -121,6 +124,37 @@ describe('fromEvent', () => {
|
121 | 124 | expect(offHandler).to.equal(onHandler);
|
122 | 125 | });
|
123 | 126 |
|
| 127 | + it('should setup an event observable on objects with "addListener" and "removeListener" returning nothing', () => { |
| 128 | + let onEventName; |
| 129 | + let onHandler; |
| 130 | + let offEventName; |
| 131 | + let offHandler; |
| 132 | + |
| 133 | + const obj = { |
| 134 | + addListener(a: string, b: (...args: any[]) => any, context?: any): { context: any } { |
| 135 | + onEventName = a; |
| 136 | + onHandler = b; |
| 137 | + return { context: '' }; |
| 138 | + }, |
| 139 | + removeListener(a: string, b: (...args: any[]) => void) { |
| 140 | + offEventName = a; |
| 141 | + offHandler = b; |
| 142 | + } |
| 143 | + }; |
| 144 | + |
| 145 | + const subscription = fromEvent(obj, 'click') |
| 146 | + .subscribe(() => { |
| 147 | + //noop |
| 148 | + }); |
| 149 | + |
| 150 | + subscription.unsubscribe(); |
| 151 | + |
| 152 | + expect(onEventName).to.equal('click'); |
| 153 | + expect(typeof onHandler).to.equal('function'); |
| 154 | + expect(offEventName).to.equal(onEventName); |
| 155 | + expect(offHandler).to.equal(onHandler); |
| 156 | + }); |
| 157 | + |
124 | 158 | it('should setup an event observable on objects with "addListener" and "removeListener" and "length" ', () => {
|
125 | 159 | let onEventName;
|
126 | 160 | let onHandler;
|
@@ -363,4 +397,45 @@ describe('fromEvent', () => {
|
363 | 397 | }).to.not.throw(TypeError);
|
364 | 398 | });
|
365 | 399 |
|
| 400 | + type('should support node style event emitters interfaces', () => { |
| 401 | + /* tslint:disable:no-unused-variable */ |
| 402 | + let a: NodeStyleEventEmitter; |
| 403 | + let b: Observable<any> = fromEvent(a, 'mock'); |
| 404 | + /* tslint:enable:no-unused-variable */ |
| 405 | + }); |
| 406 | + |
| 407 | + type('should support node compatible event emitters interfaces', () => { |
| 408 | + /* tslint:disable:no-unused-variable */ |
| 409 | + let a: NodeCompatibleEventEmitter; |
| 410 | + let b: Observable<any> = fromEvent(a, 'mock'); |
| 411 | + /* tslint:enable:no-unused-variable */ |
| 412 | + }); |
| 413 | + |
| 414 | + type('should support node style event emitters objects', () => { |
| 415 | + /* tslint:disable:no-unused-variable */ |
| 416 | + interface NodeEventEmitter { |
| 417 | + addListener(eventType: string | symbol, handler: NodeEventHandler): this; |
| 418 | + removeListener(eventType: string | symbol, handler: NodeEventHandler): this; |
| 419 | + } |
| 420 | + let a: NodeEventEmitter; |
| 421 | + let b: Observable<any> = fromEvent(a, 'mock'); |
| 422 | + /* tslint:enable:no-unused-variable */ |
| 423 | + }); |
| 424 | + |
| 425 | + type('should support React Native event emitters', () => { |
| 426 | + /* tslint:disable:no-unused-variable */ |
| 427 | + interface EmitterSubscription { |
| 428 | + context: any; |
| 429 | + } |
| 430 | + interface ReactNativeEventEmitterListener { |
| 431 | + addListener(eventType: string, listener: (...args: any[]) => any, context?: any): EmitterSubscription; |
| 432 | + } |
| 433 | + interface ReactNativeEventEmitter extends ReactNativeEventEmitterListener { |
| 434 | + removeListener(eventType: string, listener: (...args: any[]) => any): void; |
| 435 | + } |
| 436 | + let a: ReactNativeEventEmitter; |
| 437 | + let b: Observable<any> = fromEvent(a, 'mock'); |
| 438 | + /* tslint:enable:no-unused-variable */ |
| 439 | + }); |
| 440 | + |
366 | 441 | });
|
0 commit comments