Update the license headers throughout the repository to reference Google LLC rather than Google Inc, for the required license headers. PR Close #37205
		
			
				
	
	
		
			216 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google LLC All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import {AsyncTestCompleter, beforeEach, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal';
 | |
| import {filter} from 'rxjs/operators';
 | |
| 
 | |
| import {EventEmitter} from '../src/event_emitter';
 | |
| 
 | |
| {
 | |
|   describe('EventEmitter', () => {
 | |
|     let emitter: EventEmitter<any>;
 | |
| 
 | |
|     beforeEach(() => {
 | |
|       emitter = new EventEmitter();
 | |
|     });
 | |
| 
 | |
|     it('should call the next callback',
 | |
|        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|          emitter.subscribe({
 | |
|            next: (value: any) => {
 | |
|              expect(value).toEqual(99);
 | |
|              async.done();
 | |
|            }
 | |
|          });
 | |
|          emitter.emit(99);
 | |
|        }));
 | |
| 
 | |
|     it('should call the throw callback',
 | |
|        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|          emitter.subscribe({
 | |
|            next: () => {},
 | |
|            error: (error: any) => {
 | |
|              expect(error).toEqual('Boom');
 | |
|              async.done();
 | |
|            }
 | |
|          });
 | |
|          emitter.error('Boom');
 | |
|        }));
 | |
| 
 | |
|     it('should work when no throw callback is provided',
 | |
|        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|          emitter.subscribe({
 | |
|            next: () => {},
 | |
|            error: (_: any) => {
 | |
|              async.done();
 | |
|            }
 | |
|          });
 | |
|          emitter.error('Boom');
 | |
|        }));
 | |
| 
 | |
|     it('should call the return callback',
 | |
|        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|          emitter.subscribe({
 | |
|            next: () => {},
 | |
|            error: (_: any) => {},
 | |
|            complete: () => {
 | |
|              async.done();
 | |
|            }
 | |
|          });
 | |
|          emitter.complete();
 | |
|        }));
 | |
| 
 | |
|     it('should subscribe to the wrapper synchronously', () => {
 | |
|       let called = false;
 | |
|       emitter.subscribe({
 | |
|         next: (value: any) => {
 | |
|           called = true;
 | |
|         }
 | |
|       });
 | |
|       emitter.emit(99);
 | |
| 
 | |
|       expect(called).toBe(true);
 | |
|     });
 | |
| 
 | |
|     it('delivers next and error events synchronously',
 | |
|        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|          const log: any[] /** TODO #9100 */ = [];
 | |
| 
 | |
|          emitter.subscribe({
 | |
|            next: (x: any) => {
 | |
|              log.push(x);
 | |
|              expect(log).toEqual([1, 2]);
 | |
|            },
 | |
|            error: (err: any) => {
 | |
|              log.push(err);
 | |
|              expect(log).toEqual([1, 2, 3, 4]);
 | |
|              async.done();
 | |
|            }
 | |
|          });
 | |
|          log.push(1);
 | |
|          emitter.emit(2);
 | |
|          log.push(3);
 | |
|          emitter.error(4);
 | |
|          log.push(5);
 | |
|        }));
 | |
| 
 | |
|     it('delivers next and complete events synchronously', () => {
 | |
|       const log: any[] /** TODO #9100 */ = [];
 | |
| 
 | |
|       emitter.subscribe({
 | |
|         next: (x: any) => {
 | |
|           log.push(x);
 | |
|           expect(log).toEqual([1, 2]);
 | |
|         },
 | |
|         error: null,
 | |
|         complete: () => {
 | |
|           log.push(4);
 | |
|           expect(log).toEqual([1, 2, 3, 4]);
 | |
|         }
 | |
|       });
 | |
|       log.push(1);
 | |
|       emitter.emit(2);
 | |
|       log.push(3);
 | |
|       emitter.complete();
 | |
|       log.push(5);
 | |
|       expect(log).toEqual([1, 2, 3, 4, 5]);
 | |
|     });
 | |
| 
 | |
|     it('delivers events asynchronously when forced to async mode',
 | |
|        inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|          const e = new EventEmitter(true);
 | |
|          const log: any[] /** TODO #9100 */ = [];
 | |
|          e.subscribe((x: any) => {
 | |
|            log.push(x);
 | |
|            expect(log).toEqual([1, 3, 2]);
 | |
|            async.done();
 | |
|          });
 | |
|          log.push(1);
 | |
|          e.emit(2);
 | |
|          log.push(3);
 | |
|        }));
 | |
| 
 | |
|     it('reports whether it has subscribers', () => {
 | |
|       const e = new EventEmitter(false);
 | |
|       expect(e.observers.length > 0).toBe(false);
 | |
|       e.subscribe({next: () => {}});
 | |
|       expect(e.observers.length > 0).toBe(true);
 | |
|     });
 | |
| 
 | |
|     it('remove a subscriber subscribed directly to EventEmitter', () => {
 | |
|       const sub = emitter.subscribe();
 | |
|       expect(emitter.observers.length).toBe(1);
 | |
|       sub.unsubscribe();
 | |
|       expect(emitter.observers.length).toBe(0);
 | |
|     });
 | |
| 
 | |
|     it('remove a subscriber subscribed after applying operators with pipe()', () => {
 | |
|       const sub = emitter.pipe(filter(() => true)).subscribe();
 | |
|       expect(emitter.observers.length).toBe(1);
 | |
|       sub.unsubscribe();
 | |
|       expect(emitter.observers.length).toBe(0);
 | |
|     });
 | |
| 
 | |
|     it('unsubscribing a subscriber invokes the dispose method', () => {
 | |
|       inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|         const sub = emitter.subscribe();
 | |
|         sub.add(() => async.done());
 | |
|         sub.unsubscribe();
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     it('unsubscribing a subscriber after applying operators with pipe() invokes the dispose method',
 | |
|        () => {
 | |
|          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
 | |
|            const sub = emitter.pipe(filter(() => true)).subscribe();
 | |
|            sub.add(() => async.done());
 | |
|            sub.unsubscribe();
 | |
|          });
 | |
|        });
 | |
| 
 | |
|     it('error thrown inside an Rx chain propagates to the error handler and disposes the chain',
 | |
|        () => {
 | |
|          let errorPropagated = false;
 | |
|          emitter
 | |
|              .pipe(
 | |
|                  filter(() => {
 | |
|                    throw new Error();
 | |
|                  }),
 | |
|                  )
 | |
|              .subscribe(
 | |
|                  () => {},
 | |
|                  err => errorPropagated = true,
 | |
|              );
 | |
| 
 | |
|          emitter.next(1);
 | |
| 
 | |
|          expect(errorPropagated).toBe(true);
 | |
|          expect(emitter.observers.length).toBe(0);
 | |
|        });
 | |
| 
 | |
|     it('error sent by EventEmitter should dispose the Rx chain and remove subscribers', () => {
 | |
|       let errorPropagated = false;
 | |
|       emitter.pipe(filter(() => true))
 | |
|           .subscribe(
 | |
|               () => {},
 | |
|               err => errorPropagated = true,
 | |
|           );
 | |
| 
 | |
|       emitter.error(1);
 | |
| 
 | |
|       expect(errorPropagated).toBe(true);
 | |
|       expect(emitter.observers.length).toBe(0);
 | |
|     });
 | |
| 
 | |
|     // TODO: vsavkin: add tests cases
 | |
|     // should call dispose on the subscription if generator returns {done:true}
 | |
|     // should call dispose on the subscription on throw
 | |
|     // should call dispose on the subscription on return
 | |
|   });
 | |
| }
 |