1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {defer} from './deferred'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {DisposableStack} from './disposable_stack'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {EvtSource} from './events'; 18*6dbdd20aSAndroid Build Coastguard Worker 19*6dbdd20aSAndroid Build Coastguard Workerdescribe('Events', () => { 20*6dbdd20aSAndroid Build Coastguard Worker test('voidEvent', () => { 21*6dbdd20aSAndroid Build Coastguard Worker const ev = new EvtSource<void>(); 22*6dbdd20aSAndroid Build Coastguard Worker const calls: string[] = []; 23*6dbdd20aSAndroid Build Coastguard Worker ev.addListener(() => calls.push('listener1')); 24*6dbdd20aSAndroid Build Coastguard Worker ev.addListener(() => calls.push('listener2')); 25*6dbdd20aSAndroid Build Coastguard Worker ev.notify(); 26*6dbdd20aSAndroid Build Coastguard Worker expect(calls).toEqual(['listener1', 'listener2']); 27*6dbdd20aSAndroid Build Coastguard Worker ev.notify(); 28*6dbdd20aSAndroid Build Coastguard Worker expect(calls).toEqual(['listener1', 'listener2', 'listener1', 'listener2']); 29*6dbdd20aSAndroid Build Coastguard Worker }); 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker test('eventWithArgs', () => { 32*6dbdd20aSAndroid Build Coastguard Worker const ev = new EvtSource<number>(); 33*6dbdd20aSAndroid Build Coastguard Worker const argsReceived = new Array<number>(); 34*6dbdd20aSAndroid Build Coastguard Worker ev.addListener((n: number) => argsReceived.push(n)); 35*6dbdd20aSAndroid Build Coastguard Worker ev.notify(1); 36*6dbdd20aSAndroid Build Coastguard Worker ev.notify(2); 37*6dbdd20aSAndroid Build Coastguard Worker expect(argsReceived).toEqual([1, 2]); 38*6dbdd20aSAndroid Build Coastguard Worker }); 39*6dbdd20aSAndroid Build Coastguard Worker 40*6dbdd20aSAndroid Build Coastguard Worker test('asyncEvent', async () => { 41*6dbdd20aSAndroid Build Coastguard Worker const ev = new EvtSource<number>(); 42*6dbdd20aSAndroid Build Coastguard Worker const argsReceived = new Array<number>(); 43*6dbdd20aSAndroid Build Coastguard Worker ev.addListener((n: number) => { 44*6dbdd20aSAndroid Build Coastguard Worker const promise = defer<void>(); 45*6dbdd20aSAndroid Build Coastguard Worker setTimeout(() => { 46*6dbdd20aSAndroid Build Coastguard Worker argsReceived.push(n); 47*6dbdd20aSAndroid Build Coastguard Worker promise.resolve(); 48*6dbdd20aSAndroid Build Coastguard Worker }, 0); 49*6dbdd20aSAndroid Build Coastguard Worker return promise; 50*6dbdd20aSAndroid Build Coastguard Worker }); 51*6dbdd20aSAndroid Build Coastguard Worker await ev.notify(1); 52*6dbdd20aSAndroid Build Coastguard Worker await ev.notify(2); 53*6dbdd20aSAndroid Build Coastguard Worker await ev.notify(3); 54*6dbdd20aSAndroid Build Coastguard Worker expect(argsReceived).toEqual([1, 2, 3]); 55*6dbdd20aSAndroid Build Coastguard Worker }); 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker test('dispose', () => { 58*6dbdd20aSAndroid Build Coastguard Worker const ev = new EvtSource<void>(); 59*6dbdd20aSAndroid Build Coastguard Worker const calls: string[] = []; 60*6dbdd20aSAndroid Build Coastguard Worker const trash = new DisposableStack(); 61*6dbdd20aSAndroid Build Coastguard Worker trash.use(ev.addListener(() => calls.push('listener1'))); 62*6dbdd20aSAndroid Build Coastguard Worker trash.use(ev.addListener(() => calls.push('listener2'))); 63*6dbdd20aSAndroid Build Coastguard Worker ev.notify(); 64*6dbdd20aSAndroid Build Coastguard Worker expect(calls).toEqual(['listener1', 'listener2']); 65*6dbdd20aSAndroid Build Coastguard Worker calls.splice(0); 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker trash.dispose(); 68*6dbdd20aSAndroid Build Coastguard Worker ev.notify(); 69*6dbdd20aSAndroid Build Coastguard Worker expect(calls).toEqual([]); 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker trash.use(ev.addListener(() => calls.push('listener3'))); 72*6dbdd20aSAndroid Build Coastguard Worker ev.notify(); 73*6dbdd20aSAndroid Build Coastguard Worker expect(calls).toEqual(['listener3']); 74*6dbdd20aSAndroid Build Coastguard Worker }); 75*6dbdd20aSAndroid Build Coastguard Worker}); 76