detox 20.20.2 → 20.21.0
Sign up to get free protection for your applications and to get access to all the features.
- package/Detox-android/com/wix/detox/{20.20.2/detox-20.20.2-sources.jar → 20.21.0/detox-20.21.0-sources.jar} +0 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.aar +0 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{20.20.2/detox-20.20.2.pom → 20.21.0/detox-20.21.0.pom} +1 -1
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/20.21.0/detox-20.21.0.pom.sha512 +1 -0
- package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
- package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
- package/Detox-android/com/wix/detox-legacy/{20.20.2/detox-legacy-20.20.2-sources.jar → 20.21.0/detox-legacy-20.21.0-sources.jar} +0 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.aar +0 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.aar.md5 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox-legacy/{20.20.2/detox-legacy-20.20.2.pom → 20.21.0/detox-legacy-20.21.0.pom} +1 -1
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.pom.md5 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox-legacy/20.21.0/detox-legacy-20.21.0.pom.sha512 +1 -0
- package/Detox-android/com/wix/detox-legacy/maven-metadata.xml +4 -4
- package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.md5 +1 -1
- package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.sha1 +1 -1
- package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.sha256 +1 -1
- package/Detox-android/com/wix/detox-legacy/maven-metadata.xml.sha512 +1 -1
- package/Detox-ios-src.tbz +0 -0
- package/Detox-ios.tbz +0 -0
- package/android/detox/src/coreNative/java/com/wix/detox/actions/DetoxViewActions.kt +2 -2
- package/android/detox/src/full/java/com/wix/detox/espresso/DetoxAction.java +39 -15
- package/android/detox/src/full/java/com/wix/detox/espresso/action/RNClickAction.java +13 -11
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactMarkersLogger.kt +3 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/action/{DetoxMultiTap.kt → DetoxCustomTapper.kt} +8 -6
- package/android/detox/src/main/java/com/wix/detox/espresso/action/DetoxSingleTap.kt +1 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/action/common/DetoxViewConfiguration.kt +10 -0
- package/android/detox/src/main/java/com/wix/detox/espresso/action/common/TapEvents.kt +12 -4
- package/android/detox/src/main/java/com/wix/detox/espresso/scroll/DetoxScrollActions.kt +3 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/scroll/DetoxSwipe.kt +1 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/scroll/ScrollHelper.java +2 -2
- package/android/detox/src/testFull/java/com/wix/detox/common/TapEventsSpec.kt +15 -3
- package/android/detox/src/testFull/java/com/wix/detox/espresso/action/{DetoxMultiTapSpec.kt → DetoxCustomTapperSpec.kt} +21 -11
- package/detox.d.ts +34 -22
- package/jest.config.js +1 -1
- package/package.json +3 -3
- package/src/android/actions/native.js +4 -2
- package/src/android/core/NativeElement.js +6 -3
- package/src/android/espressoapi/DetoxAction.js +105 -0
- package/src/ios/expectTwo.js +23 -12
- package/src/utils/assertArgument.js +28 -0
- package/src/utils/invocationTraceDescriptions.js +1 -1
- package/src/utils/mapLongPressArguments.js +32 -0
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.aar +0 -0
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/20.20.2/detox-20.20.2.pom.sha512 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.aar +0 -0
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.aar.md5 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.pom.md5 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox-legacy/20.20.2/detox-legacy-20.20.2.pom.sha512 +0 -1
- package/android/detox/src/main/java/com/wix/detox/espresso/scroll/FlinglessSwiper.kt +0 -50
- package/android/detox/src/testFull/java/com/wix/detox/espresso/scroll/FlinglessSwiperSpec.kt +0 -237
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
3387de0925b210d074f132cf01ac3de0
|
@@ -0,0 +1 @@
|
|
1
|
+
559b5fbefe99b614d2a1dd80e0ad47f06ffc5408
|
@@ -0,0 +1 @@
|
|
1
|
+
c3b9ef703b247428ada96d85eacf933c8c2b7d274335c75f9d4d32dd25028e9d
|
@@ -0,0 +1 @@
|
|
1
|
+
492d5dbb4ffc6c504fcc121021595d03221c7ede4d2ef61bc5c959df19968d732baf6940a2b839a551a52b65ef721c08e7b9f4028d4b90808b224a8d80bbc984
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
31bc3655525c5e1de60651828dbe4b23
|
@@ -0,0 +1 @@
|
|
1
|
+
05e3d3c1fb1dfe0ef619885bd89f3e23ad265c14
|
@@ -0,0 +1 @@
|
|
1
|
+
4c664be552f9844c390dcf9843c16195ee71ae5fac82340fc2fa26d7f98f97da
|
@@ -0,0 +1 @@
|
|
1
|
+
b9a385a9b94cf5b0bec34751c9c7e03fd7cd8f6f094beac31df31bed89dbe93895289e45a08cf230a9806c71786ae74c75e8f58f3f57814624af8fa28e6b76d6
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<modelVersion>4.0.0</modelVersion>
|
4
4
|
<groupId>com.wix</groupId>
|
5
5
|
<artifactId>detox</artifactId>
|
6
|
-
<version>20.
|
6
|
+
<version>20.21.0</version>
|
7
7
|
<packaging>aar</packaging>
|
8
8
|
<name>Detox</name>
|
9
9
|
<description>Gray box end-to-end testing and automation library for mobile apps</description>
|
@@ -0,0 +1 @@
|
|
1
|
+
05807a16588292d8975405f31295b594
|
@@ -0,0 +1 @@
|
|
1
|
+
f0ad65330c51d3a57e1e381edc64ddd7f10d5d11
|
@@ -0,0 +1 @@
|
|
1
|
+
720b6a69502a1047d143f23b5db0793c965f04f1d6fccd04b3472f64eac38d67
|
@@ -0,0 +1 @@
|
|
1
|
+
4857f694c3a4ba4c0a0e3a14e78906032687be8062d9630b658bbd7bedd3fb1098a989f86b11f7fc00ffad1b9927ff2dbaf48dfd74818f5e1c08ed9d26a267a5
|
@@ -3,11 +3,11 @@
|
|
3
3
|
<groupId>com.wix</groupId>
|
4
4
|
<artifactId>detox</artifactId>
|
5
5
|
<versioning>
|
6
|
-
<latest>20.
|
7
|
-
<release>20.
|
6
|
+
<latest>20.21.0</latest>
|
7
|
+
<release>20.21.0</release>
|
8
8
|
<versions>
|
9
|
-
<version>20.
|
9
|
+
<version>20.21.0</version>
|
10
10
|
</versions>
|
11
|
-
<lastUpdated>
|
11
|
+
<lastUpdated>20240513104458</lastUpdated>
|
12
12
|
</versioning>
|
13
13
|
</metadata>
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
ee4539794be82f984845b866ce47d797
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
047da11f8d7764ce83a44415f5ca14150b0d26e8
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
aa8c3fb9036b5f238114a0cc799621647355991b7b8d2d45653a4f283d2a1426
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
749a441df252d5a784d527cfb9e9179724c3bdfc95f10f40c305a7e260f717a63813b933921861a8593f61ea548f70bf7f9f8f4a5c19aaa1cd3b3480b081fc8e
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
f297dccee1b070c04339c6d3a44aaf98
|
@@ -0,0 +1 @@
|
|
1
|
+
67a54cce54b41b23776bb74111f65aa2690445c1
|
@@ -0,0 +1 @@
|
|
1
|
+
54663486b8606482cc50334d106f99584d8ed62a030a7599d3a74328606e2175
|
@@ -0,0 +1 @@
|
|
1
|
+
79ac3563b92cd6ac25acc93885c0e866a2f1190d08988499261cfdf247f5fa4c5f8d3f5aa297f8682e822fdf751f89196fe4e0556d7328a40b39f7079179cddb
|
@@ -0,0 +1 @@
|
|
1
|
+
f35c1d0b6e6002973dc3a27dcd693666
|
@@ -0,0 +1 @@
|
|
1
|
+
95b13b9d33524b8c704258c314a3e21572086d45
|
@@ -0,0 +1 @@
|
|
1
|
+
a40f50e7629a8076af5698aa1a533523ea1bc53782240ff01be641911d8865b2
|
@@ -0,0 +1 @@
|
|
1
|
+
c3c9d8eca84ce4da0e1a75a7364ec0a8df8fd1b910db22769b719d4c222fbb726ba973a41c35eeab77db3603c87a31d8b85bb71cd6c5d25bdb36d48f72733fa4
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<modelVersion>4.0.0</modelVersion>
|
4
4
|
<groupId>com.wix</groupId>
|
5
5
|
<artifactId>detox-legacy</artifactId>
|
6
|
-
<version>20.
|
6
|
+
<version>20.21.0</version>
|
7
7
|
<packaging>aar</packaging>
|
8
8
|
<name>Detox</name>
|
9
9
|
<description>Gray box end-to-end testing and automation library for mobile apps</description>
|
@@ -0,0 +1 @@
|
|
1
|
+
16fb38e9f0b98073b38adbc235fe3be4
|
@@ -0,0 +1 @@
|
|
1
|
+
043d16e8f617a51b47e9f9f53f96acd4a7bd5958
|
@@ -0,0 +1 @@
|
|
1
|
+
a31050af14f97ee5232e932d0ff9c7e6f7703b6eb07c528da9c86ddc6b9e7670
|
@@ -0,0 +1 @@
|
|
1
|
+
037112076433da9365a46eeffd53e9556da255f081a7af4b781b902d9f52508242d0a9d8bb1e5f6a64ad2e243bdb54cab48c301b1c3e39853dde2ed0c1deffe1
|
@@ -3,11 +3,11 @@
|
|
3
3
|
<groupId>com.wix</groupId>
|
4
4
|
<artifactId>detox-legacy</artifactId>
|
5
5
|
<versioning>
|
6
|
-
<latest>20.
|
7
|
-
<release>20.
|
6
|
+
<latest>20.21.0</latest>
|
7
|
+
<release>20.21.0</release>
|
8
8
|
<versions>
|
9
|
-
<version>20.
|
9
|
+
<version>20.21.0</version>
|
10
10
|
</versions>
|
11
|
-
<lastUpdated>
|
11
|
+
<lastUpdated>20240513104609</lastUpdated>
|
12
12
|
</versioning>
|
13
13
|
</metadata>
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
d545ee1d9b3d980031a6d7f23ae6622e
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
bf54a3a7dc2ac2d25d618a4c0426024abbec7163
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
d4d8c6d7ec27c61a5846b9cfe99277edaf6fa785c41e33ac1b5fc91d263696a1
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
6b6bff10ef38514b6e3c3898837a22e219ca01d19f77e98b95cc317ec857713435d0392e5a49147b9db41397f6cf7f7cabc006b5bf641d341e144288291a19a7
|
package/Detox-ios-src.tbz
CHANGED
Binary file
|
package/Detox-ios.tbz
CHANGED
Binary file
|
@@ -9,14 +9,14 @@ import com.wix.detox.action.common.MOTION_DIR_DOWN
|
|
9
9
|
import com.wix.detox.action.common.MOTION_DIR_LEFT
|
10
10
|
import com.wix.detox.action.common.MOTION_DIR_RIGHT
|
11
11
|
import com.wix.detox.action.common.MOTION_DIR_UP
|
12
|
-
import com.wix.detox.espresso.action.
|
12
|
+
import com.wix.detox.espresso.action.DetoxCustomTapper
|
13
13
|
import com.wix.detox.espresso.scroll.DetoxScrollAction
|
14
14
|
|
15
15
|
public object DetoxViewActions {
|
16
16
|
public fun tap() = multiTap(1)
|
17
17
|
public fun doubleTap() = multiTap(2)
|
18
18
|
public fun multiTap(times: Int): ViewAction =
|
19
|
-
actionWithAssertions(GeneralClickAction(
|
19
|
+
actionWithAssertions(GeneralClickAction(DetoxCustomTapper(times), GeneralLocation.CENTER, Press.FINGER, 0, 0))
|
20
20
|
|
21
21
|
public fun scrollUpBy(amountInDp: Double, startOffsetPercentX: Float? = null, startOffsetPercentY: Float? = null): ViewAction =
|
22
22
|
actionWithAssertions(DetoxScrollAction(MOTION_DIR_UP, amountInDp, startOffsetPercentX, startOffsetPercentY))
|
@@ -20,7 +20,7 @@ import com.wix.detox.action.common.MotionDir;
|
|
20
20
|
import com.wix.detox.common.DetoxErrors.DetoxRuntimeException;
|
21
21
|
import com.wix.detox.common.DetoxErrors.StaleActionException;
|
22
22
|
import com.wix.detox.espresso.action.AdjustSliderToPositionAction;
|
23
|
-
import com.wix.detox.espresso.action.
|
23
|
+
import com.wix.detox.espresso.action.DetoxCustomTapper;
|
24
24
|
import com.wix.detox.espresso.action.GetAttributesAction;
|
25
25
|
import com.wix.detox.espresso.action.LongPressAndDragAction;
|
26
26
|
import com.wix.detox.espresso.action.RNClickAction;
|
@@ -29,6 +29,7 @@ import com.wix.detox.espresso.action.ScreenshotResult;
|
|
29
29
|
import com.wix.detox.espresso.action.ScrollToIndexAction;
|
30
30
|
import com.wix.detox.espresso.action.TakeViewScreenshotAction;
|
31
31
|
import com.wix.detox.espresso.action.common.utils.ViewInteractionExt;
|
32
|
+
import com.wix.detox.espresso.action.common.DetoxViewConfigurations;
|
32
33
|
import com.wix.detox.espresso.scroll.DetoxScrollAction;
|
33
34
|
import com.wix.detox.espresso.scroll.DetoxScrollActionStaleAtEdge;
|
34
35
|
import com.wix.detox.espresso.scroll.ScrollEdgeException;
|
@@ -42,7 +43,6 @@ import java.text.SimpleDateFormat;
|
|
42
43
|
import java.util.Calendar;
|
43
44
|
import java.util.Date;
|
44
45
|
|
45
|
-
|
46
46
|
/**
|
47
47
|
* Created by simonracz on 10/07/2017.
|
48
48
|
*/
|
@@ -57,24 +57,29 @@ public class DetoxAction {
|
|
57
57
|
}
|
58
58
|
|
59
59
|
public static ViewAction multiClick(int times) {
|
60
|
-
return actionWithAssertions(new GeneralClickAction(new
|
60
|
+
return actionWithAssertions(new GeneralClickAction(new DetoxCustomTapper(times), GeneralLocation.CENTER, Press.FINGER, 0, 0));
|
61
61
|
}
|
62
62
|
|
63
63
|
public static ViewAction tapAtLocation(final int x, final int y) {
|
64
|
+
CoordinatesProvider coordinatesProvider = createCoordinatesProvider(x, y);
|
65
|
+
return actionWithAssertions(new RNClickAction(coordinatesProvider));
|
66
|
+
}
|
67
|
+
|
68
|
+
private static CoordinatesProvider createCoordinatesProvider(final int x, final int y) {
|
64
69
|
final int px = DeviceDisplay.convertDpiToPx(x);
|
65
70
|
final int py = DeviceDisplay.convertDpiToPx(y);
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
71
|
+
|
72
|
+
return new CoordinatesProvider() {
|
73
|
+
@Override
|
74
|
+
public float[] calculateCoordinates(View view) {
|
75
|
+
final int[] xy = new int[2];
|
76
|
+
view.getLocationOnScreen(xy);
|
77
|
+
final float fx = xy[0] + px;
|
78
|
+
final float fy = xy[1] + py;
|
79
|
+
return new float[]{fx, fy};
|
80
|
+
}
|
81
|
+
};
|
82
|
+
};
|
78
83
|
|
79
84
|
/**
|
80
85
|
* Scrolls to the edge of the given scrollable view.
|
@@ -208,6 +213,25 @@ public class DetoxAction {
|
|
208
213
|
));
|
209
214
|
}
|
210
215
|
|
216
|
+
public static ViewAction longPress() {
|
217
|
+
return longPress(null, null, null);
|
218
|
+
}
|
219
|
+
|
220
|
+
public static ViewAction longPress(Integer duration) {
|
221
|
+
return longPress(null, null, duration);
|
222
|
+
}
|
223
|
+
|
224
|
+
public static ViewAction longPress(Integer x, Integer y) {
|
225
|
+
return longPress(x, y, null);
|
226
|
+
}
|
227
|
+
|
228
|
+
public static ViewAction longPress(Integer x, Integer y, Integer duration) {
|
229
|
+
Long finalDuration = duration != null ? duration : DetoxViewConfigurations.getLongPressTimeout();
|
230
|
+
CoordinatesProvider coordinatesProvider = x == null || y == null ? null : createCoordinatesProvider(x, y);
|
231
|
+
|
232
|
+
return actionWithAssertions(new RNClickAction(coordinatesProvider, finalDuration));
|
233
|
+
}
|
234
|
+
|
211
235
|
public static ViewAction takeViewScreenshot() {
|
212
236
|
return new ViewActionWithResult<String>() {
|
213
237
|
private final TakeViewScreenshotAction action = new TakeViewScreenshotAction();
|
@@ -21,21 +21,23 @@ public class RNClickAction implements ViewAction {
|
|
21
21
|
private final GeneralClickAction clickAction;
|
22
22
|
|
23
23
|
public RNClickAction() {
|
24
|
-
|
25
|
-
new DetoxSingleTap(),
|
26
|
-
GeneralLocation.VISIBLE_CENTER,
|
27
|
-
Press.FINGER,
|
28
|
-
InputDevice.SOURCE_UNKNOWN,
|
29
|
-
MotionEvent.BUTTON_PRIMARY);
|
24
|
+
this(null, null);
|
30
25
|
}
|
31
26
|
|
32
27
|
public RNClickAction(CoordinatesProvider coordinatesProvider) {
|
28
|
+
this(coordinatesProvider, null);
|
29
|
+
}
|
30
|
+
|
31
|
+
public RNClickAction(CoordinatesProvider coordinatesProvider, Long duration) {
|
32
|
+
coordinatesProvider = coordinatesProvider != null ? coordinatesProvider : GeneralLocation.VISIBLE_CENTER;
|
33
|
+
|
33
34
|
clickAction = new GeneralClickAction(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
new DetoxSingleTap(duration),
|
36
|
+
coordinatesProvider,
|
37
|
+
Press.FINGER,
|
38
|
+
InputDevice.SOURCE_UNKNOWN,
|
39
|
+
MotionEvent.BUTTON_PRIMARY
|
40
|
+
);
|
39
41
|
}
|
40
42
|
|
41
43
|
@Override
|
@@ -8,7 +8,9 @@ import com.facebook.react.bridge.ReactMarkerConstants.*
|
|
8
8
|
object ReactMarkersLogger : ReactMarker.MarkerListener {
|
9
9
|
|
10
10
|
fun attach() {
|
11
|
-
|
11
|
+
if (ReactNativeInfo.rnVersion().minor >= 71) {
|
12
|
+
ReactMarker.addListener(this)
|
13
|
+
}
|
12
14
|
}
|
13
15
|
|
14
16
|
override fun logMarker(marker: ReactMarkerConstants, p1: String?, p2: Int) {
|
@@ -29,7 +29,7 @@ import com.wix.detox.espresso.action.common.TapEvents
|
|
29
29
|
*
|
30
30
|
* This should be Espresso's default implementation IMO.
|
31
31
|
*/
|
32
|
-
open class
|
32
|
+
open class DetoxCustomTapper
|
33
33
|
@JvmOverloads constructor(
|
34
34
|
private val times: Int,
|
35
35
|
private val interTapsDelayMs: Long = getDoubleTapMinTime(),
|
@@ -37,8 +37,9 @@ open class DetoxMultiTap
|
|
37
37
|
private val longTapMinTimeMs: Long = getLongTapMinTime(),
|
38
38
|
private val tapEvents: TapEvents = TapEvents(),
|
39
39
|
private val uiControllerCallSpy: UiControllerSpy = UiControllerSpy.instance,
|
40
|
-
private val log: DetoxLog = DetoxLog.instance
|
41
|
-
|
40
|
+
private val log: DetoxLog = DetoxLog.instance,
|
41
|
+
private val duration: Long? = null
|
42
|
+
) : Tapper {
|
42
43
|
|
43
44
|
override fun sendTap(uiController: UiController?, coordinates: FloatArray?, precision: FloatArray?)
|
44
45
|
= sendTap(uiController, coordinates, precision, 0, 0)
|
@@ -69,11 +70,12 @@ open class DetoxMultiTap
|
|
69
70
|
var downTimestamp: Long? = null
|
70
71
|
|
71
72
|
for (i in 1..times) {
|
72
|
-
val tapEvents = tapEvents.createEventsSeq(coordinates, precision, downTimestamp)
|
73
|
+
val tapEvents = tapEvents.createEventsSeq(coordinates, precision, downTimestamp, duration)
|
73
74
|
eventSequence.addAll(tapEvents)
|
74
75
|
|
75
76
|
downTimestamp = tapEvents.last().eventTime + interTapsDelayMs
|
76
77
|
}
|
78
|
+
|
77
79
|
return eventSequence
|
78
80
|
}
|
79
81
|
|
@@ -104,8 +106,8 @@ open class DetoxMultiTap
|
|
104
106
|
|
105
107
|
private fun verifyTapEventTimes(upEvent: CallInfo, downEvent: CallInfo) {
|
106
108
|
val delta: Long = (upEvent - downEvent)!!
|
107
|
-
if (delta >= longTapMinTimeMs) {
|
109
|
+
if (delta >= longTapMinTimeMs && duration == null) {
|
108
110
|
log.warn(LOG_TAG, "Tap handled too slowly, and turned into a long-tap!") // TODO conditionally turn into an error, based on a global strict-mode detox config
|
109
111
|
}
|
110
112
|
}
|
111
|
-
}
|
113
|
+
}
|
package/android/detox/src/main/java/com/wix/detox/espresso/action/common/DetoxViewConfiguration.kt
CHANGED
@@ -9,6 +9,16 @@ private const val LOG_TAG = "Detox-ViewConfig"
|
|
9
9
|
|
10
10
|
object DetoxViewConfigurations {
|
11
11
|
|
12
|
+
/**
|
13
|
+
* Duration before a press turns into a long press.
|
14
|
+
* Due to `Tap.LONG`, factor 1.5 is needed, otherwise a long press is not safely detected.
|
15
|
+
*
|
16
|
+
* @see androidx.test.espresso.action.Tap.LONG
|
17
|
+
* @see android.test.TouchUtils.longClickView
|
18
|
+
*/
|
19
|
+
@JvmStatic
|
20
|
+
fun getLongPressTimeout(): Long = (ViewConfiguration.getLongPressTimeout() * 1.5).toLong()
|
21
|
+
|
12
22
|
fun getPostTapCoolDownTime() = ViewConfiguration.getDoubleTapTimeout().toLong()
|
13
23
|
|
14
24
|
/**
|
@@ -15,16 +15,24 @@ import android.view.MotionEvent
|
|
15
15
|
* Lastly, With the case of _that_ specific bug, we implicitly indirectly work around it with this approach, because we highly increase
|
16
16
|
* the chance of allowing a frame to be drawn in between the _down_ and _up_ events.
|
17
17
|
*/
|
18
|
-
private const val EVENTS_TIME_GAP_MS =
|
18
|
+
private const val EVENTS_TIME_GAP_MS = 30L
|
19
19
|
|
20
20
|
class TapEvents(private val motionEvents: MotionEvents = MotionEvents()) {
|
21
21
|
fun createEventsSeq(coordinates: FloatArray, precision: FloatArray)
|
22
|
-
= createEventsSeq(coordinates, precision, null)
|
22
|
+
= createEventsSeq(coordinates, precision, null, null)
|
23
23
|
|
24
|
-
fun createEventsSeq(
|
24
|
+
fun createEventsSeq(
|
25
|
+
coordinates: FloatArray,
|
26
|
+
precision: FloatArray,
|
27
|
+
downTimestamp: Long?,
|
28
|
+
duration: Long?
|
29
|
+
): List<MotionEvent> {
|
25
30
|
val (x, y) = coordinates
|
26
31
|
val downEvent = motionEvents.obtainDownEvent(x, y, precision, downTimestamp)
|
27
|
-
|
32
|
+
|
33
|
+
val upEventDuration = duration ?: EVENTS_TIME_GAP_MS
|
34
|
+
val upEvent = motionEvents.obtainUpEvent(downEvent, downEvent.eventTime + upEventDuration, x, y)
|
35
|
+
|
28
36
|
return arrayListOf(downEvent, upEvent)
|
29
37
|
}
|
30
38
|
}
|
@@ -20,7 +20,7 @@ abstract class DetoxScrollActionBase internal constructor(
|
|
20
20
|
: ViewAction {
|
21
21
|
override fun getConstraints(): Matcher<View> = allOf(isAssignableFrom(View::class.java), isDisplayed())
|
22
22
|
override fun perform(uiController: UiController?, view: View?) =
|
23
|
-
|
23
|
+
ScrollHelper.perform(uiController, view, direction, amountInDp, startOffsetPercentX, startOffsetPercentY)
|
24
24
|
}
|
25
25
|
|
26
26
|
class DetoxScrollAction(@MotionDir direction: Int, amountInDp: Double, startOffsetPercentX: Float?, startOffsetPercentY: Float?)
|
@@ -30,6 +30,8 @@ class DetoxScrollAction(@MotionDir direction: Int, amountInDp: Double, startOffs
|
|
30
30
|
override fun perform(uiController: UiController?, view: View?) {
|
31
31
|
try {
|
32
32
|
super.perform(uiController, view)
|
33
|
+
} catch (e: ScrollEdgeException) {
|
34
|
+
// Hit the edge
|
33
35
|
} catch (e: Exception) {
|
34
36
|
throw DetoxRuntimeException(e)
|
35
37
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
package com.wix.detox.espresso.scroll
|
2
2
|
|
3
3
|
/**
|
4
|
-
* Along with [
|
4
|
+
* Along with [LinearSwiper], this is based on from Espresso's implementation of Swiping
|
5
5
|
* (i.e. in [androidx.test.espresso.action.Swipe] - typically dispatched via the
|
6
6
|
* [androidx.test.espresso.action.GeneralSwipeAction] action class).
|
7
7
|
*
|
@@ -29,7 +29,7 @@ import static com.wix.detox.espresso.scroll.ScrollProbes.getScrollableProbe;
|
|
29
29
|
public class ScrollHelper {
|
30
30
|
private static final String LOG_TAG = "DetoxScrollHelper";
|
31
31
|
|
32
|
-
private static final int SCROLL_MOTIONS =
|
32
|
+
private static final int SCROLL_MOTIONS = 40;
|
33
33
|
private static final int MAX_FLING_WAITS = 3;
|
34
34
|
|
35
35
|
private static final double DEFAULT_DEADZONE_PERCENT = 0.05;
|
@@ -95,7 +95,7 @@ public class ScrollHelper {
|
|
95
95
|
}
|
96
96
|
|
97
97
|
private static void doScroll(final Context context, final UiController uiController, int downX, int downY, int upX, int upY) {
|
98
|
-
final DetoxSwiper swiper = new
|
98
|
+
final DetoxSwiper swiper = new LinearSwiper(uiController);
|
99
99
|
final DetoxSwipe swipe = new DetoxSwipe(downX, downY, upX, upY, SCROLL_MOTIONS, swiper);
|
100
100
|
swipe.perform();
|
101
101
|
}
|
@@ -90,16 +90,28 @@ object TapEventsSpec: Spek({
|
|
90
90
|
val precision = fancyPrecision()
|
91
91
|
val downTimestamp = 10203040L
|
92
92
|
|
93
|
-
uut().createEventsSeq(coordinates, precision, downTimestamp)
|
93
|
+
uut().createEventsSeq(coordinates, precision, downTimestamp, null)
|
94
94
|
|
95
95
|
verifyDownEventObtainedWithDownTimestamp(coordinates, precision, downTimestamp)
|
96
96
|
}
|
97
97
|
|
98
|
-
it("should allow for
|
98
|
+
it("should allow for duration to be set") {
|
99
|
+
val duration = 1000L
|
100
|
+
val expectedUpEventTime = DEFAULT_EVENT_TIME + duration
|
99
101
|
val coordinates = dontCareCoordinates()
|
100
102
|
val precision = dontCarePrecision()
|
101
103
|
|
102
|
-
uut().createEventsSeq(coordinates, precision,
|
104
|
+
uut().createEventsSeq(coordinates, precision, null, duration)
|
105
|
+
|
106
|
+
verifyDownEventObtainedWithDownTimestamp(coordinates, precision, null)
|
107
|
+
verifyUpEventObtainedWithTimestamp(expectedUpEventTime)
|
108
|
+
}
|
109
|
+
|
110
|
+
it("should allow for down-time and duration to be null") {
|
111
|
+
val coordinates = dontCareCoordinates()
|
112
|
+
val precision = dontCarePrecision()
|
113
|
+
|
114
|
+
uut().createEventsSeq(coordinates, precision, null, null)
|
103
115
|
|
104
116
|
verifyDownEventObtainedWithDownTimestamp(coordinates, precision, null)
|
105
117
|
}
|
@@ -14,8 +14,8 @@ import org.spekframework.spek2.style.specification.describe
|
|
14
14
|
import java.lang.NullPointerException
|
15
15
|
import kotlin.test.assertFailsWith
|
16
16
|
|
17
|
-
object
|
18
|
-
describe("Detox
|
17
|
+
object DetoxCustomTapperSpec: Spek({
|
18
|
+
describe("Detox custom-tapper replacement for Espresso") {
|
19
19
|
|
20
20
|
val coolDownTimeMs = 111L
|
21
21
|
val interTapsDelayMs = 667L
|
@@ -41,8 +41,10 @@ object DetoxMultiTapSpec: Spek({
|
|
41
41
|
mock1stTapEventsSeq = arrayListOf(downEvent, upEvent)
|
42
42
|
mock2ndTapEventsSeq = arrayListOf(mock(name = "mockSeq2Event1"), mock(name = "mockSeq2Event2"))
|
43
43
|
tapEvents = mock {
|
44
|
-
on { createEventsSeq(any(), any(), isNull()) }.doReturn(mock1stTapEventsSeq)
|
45
|
-
on { createEventsSeq(any(), any(), any()) }.doReturn(
|
44
|
+
on { createEventsSeq(any(), any(), isNull(), isNull()) }.doReturn(mock1stTapEventsSeq)
|
45
|
+
on { createEventsSeq(any(), any(), isNull(), any()) }.doReturn(mock1stTapEventsSeq)
|
46
|
+
on { createEventsSeq(any(), any(), any(), isNull()) }.doReturn(mock2ndTapEventsSeq)
|
47
|
+
on { createEventsSeq(any(), any(), any(), any()) }.doReturn(mock2ndTapEventsSeq)
|
46
48
|
}
|
47
49
|
|
48
50
|
uiControllerCallSpy = mock() {
|
@@ -52,9 +54,10 @@ object DetoxMultiTapSpec: Spek({
|
|
52
54
|
log = mock()
|
53
55
|
}
|
54
56
|
|
55
|
-
fun verify1stTapEventsSeqGenerated() = verify(tapEvents).createEventsSeq(coordinates, precision,
|
56
|
-
fun verify2ndTapEventsSeqGenerated() = verify(tapEvents).createEventsSeq(eq(coordinates), eq(precision),
|
57
|
-
fun verify2ndTapEventsGenerateWithTimestamp(downTimestamp: Long) = verify(tapEvents).createEventsSeq(
|
57
|
+
fun verify1stTapEventsSeqGenerated(duration: Long? = null) = verify(tapEvents).createEventsSeq(eq(coordinates), eq(precision), isNull(), eq(duration))
|
58
|
+
fun verify2ndTapEventsSeqGenerated() = verify(tapEvents).createEventsSeq(eq(coordinates), eq(precision), isNull(), isNull())
|
59
|
+
fun verify2ndTapEventsGenerateWithTimestamp(downTimestamp: Long) = verify(tapEvents).createEventsSeq(eq(coordinates), eq(precision), eq(downTimestamp), isNull())
|
60
|
+
|
58
61
|
fun verifyAllTapEventsInjected() = verify(uiController).injectMotionEventSequence(arrayListOf(mock1stTapEventsSeq, mock2ndTapEventsSeq).flatten())
|
59
62
|
fun verifyMainThreadSynced() = verify(uiController).loopMainThreadForAtLeast(eq(coolDownTimeMs))
|
60
63
|
fun verifyMainThreadNeverSynced() = verify(uiController, never()).loopMainThreadForAtLeast(any())
|
@@ -64,17 +67,24 @@ object DetoxMultiTapSpec: Spek({
|
|
64
67
|
fun givenInjectionError() = whenever(uiController.injectMotionEventSequence(any())).doThrow(RuntimeException("exceptionMock"))
|
65
68
|
|
66
69
|
fun givenInjectionCallsHistory(injectionsHistory: List<CallInfo?>) =
|
67
|
-
|
70
|
+
whenever(uiControllerCallSpy.eventInjectionsIterator()).thenReturn(injectionsHistory.iterator())
|
71
|
+
|
72
|
+
fun uut(times: Int, duration: Long? = null) =
|
73
|
+
DetoxCustomTapper(times, interTapsDelayMs, coolDownTimeMs, longTapMinTimeMs, tapEvents, uiControllerCallSpy, log, duration)
|
68
74
|
|
69
|
-
fun
|
70
|
-
fun
|
71
|
-
fun sendTwoTaps(uut: DetoxMultiTap = uut(2)) = uut.sendTap(uiController, coordinates, precision, -1, -1)
|
75
|
+
fun sendOneTap(duration: Long? = null) = uut(1, duration).sendTap(uiController, coordinates, precision, -1, -1)
|
76
|
+
fun sendTwoTaps(uut: DetoxCustomTapper = uut(2)) = uut.sendTap(uiController, coordinates, precision, -1, -1)
|
72
77
|
|
73
78
|
it("should generate a single-tap events sequence using tap-events helper") {
|
74
79
|
sendOneTap()
|
75
80
|
verify1stTapEventsSeqGenerated()
|
76
81
|
}
|
77
82
|
|
83
|
+
it("should generate a single-tap events sequence with a custom duration") {
|
84
|
+
sendOneTap(1000L)
|
85
|
+
verify1stTapEventsSeqGenerated(1000L)
|
86
|
+
}
|
87
|
+
|
78
88
|
it("should generate multiple sets of single-tap event sequences using tap-events helper") {
|
79
89
|
sendTwoTaps()
|
80
90
|
verify1stTapEventsSeqGenerated()
|