xref: /aosp_15_r20/development/tools/winscope/src/test/utils.ts (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker/*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker
17*90c8c64dSAndroid Build Coastguard Workerimport {ComponentFixture, flush} from '@angular/core/testing';
18*90c8c64dSAndroid Build Coastguard Worker
19*90c8c64dSAndroid Build Coastguard Workerexport function dispatchMouseEvent(
20*90c8c64dSAndroid Build Coastguard Worker  source: Node,
21*90c8c64dSAndroid Build Coastguard Worker  type: string,
22*90c8c64dSAndroid Build Coastguard Worker  screenX: number,
23*90c8c64dSAndroid Build Coastguard Worker  screenY: number,
24*90c8c64dSAndroid Build Coastguard Worker  clientX: number,
25*90c8c64dSAndroid Build Coastguard Worker  clientY: number,
26*90c8c64dSAndroid Build Coastguard Worker) {
27*90c8c64dSAndroid Build Coastguard Worker  const event = document.createEvent('MouseEvent');
28*90c8c64dSAndroid Build Coastguard Worker
29*90c8c64dSAndroid Build Coastguard Worker  event.initMouseEvent(
30*90c8c64dSAndroid Build Coastguard Worker    type,
31*90c8c64dSAndroid Build Coastguard Worker    true /* canBubble */,
32*90c8c64dSAndroid Build Coastguard Worker    false /* cancelable */,
33*90c8c64dSAndroid Build Coastguard Worker    window /* view */,
34*90c8c64dSAndroid Build Coastguard Worker    0 /* detail */,
35*90c8c64dSAndroid Build Coastguard Worker    screenX /* screenX */,
36*90c8c64dSAndroid Build Coastguard Worker    screenY /* screenY */,
37*90c8c64dSAndroid Build Coastguard Worker    clientX /* clientX */,
38*90c8c64dSAndroid Build Coastguard Worker    clientY /* clientY */,
39*90c8c64dSAndroid Build Coastguard Worker    false /* ctrlKey */,
40*90c8c64dSAndroid Build Coastguard Worker    false /* altKey */,
41*90c8c64dSAndroid Build Coastguard Worker    false /* shiftKey */,
42*90c8c64dSAndroid Build Coastguard Worker    false /* metaKey */,
43*90c8c64dSAndroid Build Coastguard Worker    0 /* button */,
44*90c8c64dSAndroid Build Coastguard Worker    null /* relatedTarget */,
45*90c8c64dSAndroid Build Coastguard Worker  );
46*90c8c64dSAndroid Build Coastguard Worker  Object.defineProperty(event, 'buttons', {get: () => 1});
47*90c8c64dSAndroid Build Coastguard Worker
48*90c8c64dSAndroid Build Coastguard Worker  source.dispatchEvent(event);
49*90c8c64dSAndroid Build Coastguard Worker}
50*90c8c64dSAndroid Build Coastguard Worker
51*90c8c64dSAndroid Build Coastguard Workerexport function dragElement<T>(
52*90c8c64dSAndroid Build Coastguard Worker  fixture: ComponentFixture<T>,
53*90c8c64dSAndroid Build Coastguard Worker  target: Element,
54*90c8c64dSAndroid Build Coastguard Worker  x: number,
55*90c8c64dSAndroid Build Coastguard Worker  y: number,
56*90c8c64dSAndroid Build Coastguard Worker) {
57*90c8c64dSAndroid Build Coastguard Worker  const {left, top} = target.getBoundingClientRect();
58*90c8c64dSAndroid Build Coastguard Worker
59*90c8c64dSAndroid Build Coastguard Worker  dispatchMouseEvent(target, 'mousedown', left, top, 0, 0);
60*90c8c64dSAndroid Build Coastguard Worker  fixture.detectChanges();
61*90c8c64dSAndroid Build Coastguard Worker  flush();
62*90c8c64dSAndroid Build Coastguard Worker  dispatchMouseEvent(document, 'mousemove', left + 1, top + 0, 1, y);
63*90c8c64dSAndroid Build Coastguard Worker  fixture.detectChanges();
64*90c8c64dSAndroid Build Coastguard Worker  flush();
65*90c8c64dSAndroid Build Coastguard Worker  dispatchMouseEvent(document, 'mousemove', left + x, top + y, x, y);
66*90c8c64dSAndroid Build Coastguard Worker  fixture.detectChanges();
67*90c8c64dSAndroid Build Coastguard Worker  flush();
68*90c8c64dSAndroid Build Coastguard Worker  dispatchMouseEvent(document, 'mouseup', left + x, top + y, x, y);
69*90c8c64dSAndroid Build Coastguard Worker  fixture.detectChanges();
70*90c8c64dSAndroid Build Coastguard Worker
71*90c8c64dSAndroid Build Coastguard Worker  flush();
72*90c8c64dSAndroid Build Coastguard Worker}
73*90c8c64dSAndroid Build Coastguard Worker
74*90c8c64dSAndroid Build Coastguard Workerexport async function waitToBeCalled(
75*90c8c64dSAndroid Build Coastguard Worker  spy: jasmine.Spy,
76*90c8c64dSAndroid Build Coastguard Worker  times: number = 1,
77*90c8c64dSAndroid Build Coastguard Worker  timeout = 10000,
78*90c8c64dSAndroid Build Coastguard Worker) {
79*90c8c64dSAndroid Build Coastguard Worker  return new Promise<void>((resolve, reject) => {
80*90c8c64dSAndroid Build Coastguard Worker    let called = 0;
81*90c8c64dSAndroid Build Coastguard Worker    spy.and.callThrough().and.callFake(() => {
82*90c8c64dSAndroid Build Coastguard Worker      called++;
83*90c8c64dSAndroid Build Coastguard Worker      if (called === times) {
84*90c8c64dSAndroid Build Coastguard Worker        resolve();
85*90c8c64dSAndroid Build Coastguard Worker      }
86*90c8c64dSAndroid Build Coastguard Worker    });
87*90c8c64dSAndroid Build Coastguard Worker
88*90c8c64dSAndroid Build Coastguard Worker    setTimeout(
89*90c8c64dSAndroid Build Coastguard Worker      () => reject(`not called ${times} times within ${timeout}ms`),
90*90c8c64dSAndroid Build Coastguard Worker      timeout,
91*90c8c64dSAndroid Build Coastguard Worker    );
92*90c8c64dSAndroid Build Coastguard Worker  });
93*90c8c64dSAndroid Build Coastguard Worker}
94