xref: /aosp_15_r20/external/perfetto/ui/src/base/events_unittest.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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