1 /*
<lambda>null2  * Copyright 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.commands.monkey
18 
19 import android.view.MotionEvent.ACTION_DOWN
20 import android.view.MotionEvent.ACTION_MOVE
21 import android.view.MotionEvent.ACTION_POINTER_DOWN
22 import android.view.MotionEvent.ACTION_POINTER_INDEX_SHIFT
23 import android.view.MotionEvent.ACTION_POINTER_UP
24 import android.view.MotionEvent.ACTION_UP
25 
26 import java.io.BufferedWriter
27 import java.io.FileWriter
28 import java.io.File
29 import java.util.Random
30 
31 import org.junit.Assert.assertEquals
32 import org.junit.Assert.assertNotNull
33 import org.junit.Assert.assertNull
34 
35 import org.junit.Test
36 
37 private fun receiveEvent(script: MonkeySourceScript, type: Int): MonkeyEvent {
38     val event = script.getNextEvent()
39     assertNotNull("Should receive a valid event", event)
40     assertEquals("Wrong event type", type, event.getEventType())
41     return event
42 }
43 
assertTouchEventnull44 private fun assertTouchEvent(script: MonkeySourceScript, action: Int) {
45     val motionEvent = receiveEvent(script, MonkeyEvent.EVENT_TYPE_TOUCH) as MonkeyMotionEvent
46     assertEquals(action, motionEvent.action)
47 }
48 
49 /**
50  * Test for class MonkeySourceScript
51  */
52 class MonkeySourceScriptTest {
53     companion object {
54         const val ACTION_POINTER_1_DOWN = ACTION_POINTER_DOWN.or(1.shl(ACTION_POINTER_INDEX_SHIFT))
55         const val ACTION_POINTER_1_UP = ACTION_POINTER_UP.or(1.shl(ACTION_POINTER_INDEX_SHIFT))
56     }
57 
58     /**
59      * Send a PinchZoom command and check the resulting event stream.
60      * Since ACTION_UP is a throttlable event, an event with TYPE_THROTTLE is expected at the end.
61      */
62     @Test
pinchZoomnull63     fun pinchZoom() {
64         val file = File.createTempFile("pinch_zoom", null)
65         val fileName = file.absolutePath
66         BufferedWriter(FileWriter(fileName)).use { writer ->
67             writer.write("start data >>\n")
68             writer.write("PinchZoom(100,100,200,200,50,50,10,10,5)\n")
69         }
70 
71         val script = MonkeySourceScript(Random(), fileName, 0, false, 0, 0)
72 
73         assertTouchEvent(script, ACTION_DOWN)
74         assertTouchEvent(script, ACTION_POINTER_1_DOWN)
75         assertTouchEvent(script, ACTION_MOVE)
76         assertTouchEvent(script, ACTION_MOVE)
77         assertTouchEvent(script, ACTION_MOVE)
78         assertTouchEvent(script, ACTION_MOVE)
79         assertTouchEvent(script, ACTION_MOVE)
80         assertTouchEvent(script, ACTION_POINTER_1_UP)
81         assertTouchEvent(script, ACTION_UP)
82         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
83         assertNull(script.getNextEvent())
84 
85         file.deleteOnExit()
86     }
87 
88     /**
89      * Send two PressAndHold commands in a row and ensure that the injected stream is consistent.
90      */
91     @Test
pressAndHoldTwicenull92     fun pressAndHoldTwice() {
93         val file = File.createTempFile("press_and_hold_twice", null)
94         val fileName = file.absolutePath
95         BufferedWriter(FileWriter(fileName)).use { writer ->
96             writer.write("start data >>\n")
97             writer.write("PressAndHold(100,100,10)\n")
98             writer.write("PressAndHold(200,200,10)\n")
99         }
100 
101         val script = MonkeySourceScript(Random(), fileName, 0, false, 0, 0)
102 
103         assertTouchEvent(script, ACTION_DOWN)
104         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
105         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
106         assertTouchEvent(script, ACTION_UP)
107         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
108 
109         assertTouchEvent(script, ACTION_DOWN)
110         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
111         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
112         assertTouchEvent(script, ACTION_UP)
113         receiveEvent(script, MonkeyEvent.EVENT_TYPE_THROTTLE)
114         assertNull(script.getNextEvent())
115 
116         file.deleteOnExit()
117     }
118 }
119