detox 20.10.0 → 20.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. package/Detox-android/com/wix/detox/{20.10.0/detox-20.10.0-javadoc.jar → 20.11.0/detox-20.11.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.10.0/detox-20.10.0-sources.jar → 20.11.0/detox-20.11.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.aar +0 -0
  12. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.10.0/detox-20.10.0.pom → 20.11.0/detox-20.11.0.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.11.0/detox-20.11.0.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/android/detox/src/full/java/com/wix/detox/espresso/DetoxMatcher.java +12 -12
  29. package/android/detox/src/full/java/com/wix/detox/espresso/matcher/RegexMatcher.kt +56 -0
  30. package/android/detox/src/full/java/com/wix/detox/espresso/matcher/ViewMatchers.kt +16 -4
  31. package/android/detox/src/testFull/java/com/wix/detox/espresso/matcher/RegexMatcherTest.kt +52 -0
  32. package/index.d.ts +10 -5
  33. package/package.json +2 -2
  34. package/src/android/espressoapi/DetoxMatcher.js +24 -8
  35. package/src/android/matchers/native.js +9 -4
  36. package/src/ios/expectTwo.js +8 -7
  37. package/src/utils/isRegExp.js +7 -0
  38. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-javadoc.jar.md5 +0 -1
  39. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-javadoc.jar.sha1 +0 -1
  40. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-javadoc.jar.sha256 +0 -1
  41. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-javadoc.jar.sha512 +0 -1
  42. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-sources.jar.md5 +0 -1
  43. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-sources.jar.sha1 +0 -1
  44. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-sources.jar.sha256 +0 -1
  45. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0-sources.jar.sha512 +0 -1
  46. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.aar +0 -0
  47. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.aar.md5 +0 -1
  48. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.aar.sha1 +0 -1
  49. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.aar.sha256 +0 -1
  50. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.aar.sha512 +0 -1
  51. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.pom.md5 +0 -1
  52. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.pom.sha1 +0 -1
  53. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.pom.sha256 +0 -1
  54. package/Detox-android/com/wix/detox/20.10.0/detox-20.10.0.pom.sha512 +0 -1
@@ -0,0 +1 @@
1
+ f0cf6ad0def43fbab5ba6fae7b4e5441
@@ -0,0 +1 @@
1
+ 48b29f67227c7b45844172ffdc0b25c7e5bd4f05
@@ -0,0 +1 @@
1
+ 0dbfb89e22024b3c3f45e0941a9fd3421d6a4f4041b76f8f54edd4259a9092a8
@@ -0,0 +1 @@
1
+ a1a2706b699d0c9217252c287a3d82b679bb206423ebbee820a261cd5925970426596f99a16fdcd8d37107185c3d5ec80628dd48309d0c31c89a00a37f7bf292
@@ -0,0 +1 @@
1
+ 3579eb8ea896facf3fd7e2be627cdc03
@@ -0,0 +1 @@
1
+ 1fb720e2b0f0da39406134aabcdafec756f9cbe5
@@ -0,0 +1 @@
1
+ f1c18496d23e09cffc96ef1b3bcbf349b1ae0a020ed5a6707b64bf22e30d9180
@@ -0,0 +1 @@
1
+ ebfcaef97fb6aa02bbda14d12a26eaac823620766c7e3b84eee7fa0115edb17463ea59ac689d07ffc97e84d2dbdbbd7db3014fdd976d0b2dd207c6278494f523
@@ -0,0 +1 @@
1
+ 518f621bfc037203c5ddd30c3f62c8ad
@@ -0,0 +1 @@
1
+ 65065fce4ddace8e95d235b60cf5a27f93e1162b
@@ -0,0 +1 @@
1
+ cd516e30305ad672e7ed0e8b4f77e992482c9a2979ce92d88a074dc45524cbe9
@@ -0,0 +1 @@
1
+ 00ff273c46cb32923f574fd00189459e9dff6d4782ac561f30583c9610427e270450783485aece4e9ebeb52c12bd3eec1560521d5a0535965dd278c7b44f3848
@@ -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.10.0</version>
6
+ <version>20.11.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
+ 72868177d685cfd9912ca8fe3c08da3a
@@ -0,0 +1 @@
1
+ ad0ed20f218ec25f055f5c668c9b6dcd875069bf
@@ -0,0 +1 @@
1
+ b1c48d9cf1df54b6cbe27c45a4c8834162b04a783601a3d4b030fd3ac12e723e
@@ -0,0 +1 @@
1
+ c68e22610d04ad949b65cffe6305e30bab93ca1a10d53d0cd3ded77dee8f64d7d14f1b250cbdde553a06a4fe5b50738af7ae363b5f7ad836f816f48ca845d189
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.10.0</latest>
7
- <release>20.10.0</release>
6
+ <latest>20.11.0</latest>
7
+ <release>20.11.0</release>
8
8
  <versions>
9
- <version>20.10.0</version>
9
+ <version>20.11.0</version>
10
10
  </versions>
11
- <lastUpdated>20230704082454</lastUpdated>
11
+ <lastUpdated>20230704204300</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- f0baacbf3f6fb75c70d83dabb4b06c60
1
+ e930da2d4686f5b8bbe2fe5638fab155
@@ -1 +1 @@
1
- 6a96763b5310ae9c905925c15e79b663c187dbba
1
+ 7ec428486d1d978a16101aedc506e79483ccf63a
@@ -1 +1 @@
1
- 39e62aa1ae54eac08710ba5938504e819520756b9b79afde34c340e8ec04378c
1
+ 469a65278a6ed368df597dfb505c150591e4ab587b190dbee2bb12c50b41a6ef
@@ -1 +1 @@
1
- f5094c145c34cd8b4e376d6550d878d0a0b020a994e39cf595a4718caa7ca467cfb66402ca621cf0bbc05f03d0b874a91e962c9a4ef8204c5dfc94c625dd84c1
1
+ dfc9bd1f96626dee848008639fc467b70d4653f57761c30cff16f41550d1f2a79dcd9aefd64c7313b8672c503e1a12dc360b1742faba6e2946878f6b2f8bbaac
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
@@ -14,10 +14,10 @@ import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
14
14
  import static androidx.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
15
15
  import static androidx.test.espresso.matcher.ViewMatchers.isFocused;
16
16
  import static androidx.test.espresso.matcher.ViewMatchers.isNotChecked;
17
- import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
18
17
  import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
19
- import static androidx.test.espresso.matcher.ViewMatchers.withTagValue;
20
- import static androidx.test.espresso.matcher.ViewMatchers.withText;
18
+ import static com.wix.detox.espresso.matcher.ViewMatchers.withTagValue;
19
+ import static com.wix.detox.espresso.matcher.ViewMatchers.withContentDescription;
20
+ import static com.wix.detox.espresso.matcher.ViewMatchers.withText;
21
21
  import static com.wix.detox.espresso.matcher.ViewMatchers.isMatchingAtIndex;
22
22
  import static com.wix.detox.espresso.matcher.ViewMatchers.isOfClassName;
23
23
  import static com.wix.detox.espresso.matcher.ViewMatchers.toHaveSliderPosition;
@@ -40,25 +40,25 @@ public class DetoxMatcher {
40
40
  // static class
41
41
  }
42
42
 
43
- public static Matcher<View> matcherForText(String text) {
43
+ public static Matcher<View> matcherForText(String text, boolean isRegex) {
44
44
  // return anyOf(withText(text), withContentDescription(text));
45
- return allOf(withText(text), withEffectiveVisibility(Visibility.VISIBLE));
45
+ return allOf(withText(text, isRegex), withEffectiveVisibility(Visibility.VISIBLE));
46
46
  }
47
47
 
48
- public static Matcher<View> matcherForAccessibilityLabel(String label) {
49
- return allOf(withAccessibilityLabel(label), withEffectiveVisibility(Visibility.VISIBLE));
48
+ public static Matcher<View> matcherForAccessibilityLabel(String label, boolean isRegex) {
49
+ return allOf(withAccessibilityLabel(label, isRegex), withEffectiveVisibility(Visibility.VISIBLE));
50
50
  }
51
51
 
52
- public static Matcher<View> matcherForShallowAccessibilityLabel(String label) {
53
- return allOf(withShallowAccessibilityLabel(label), withEffectiveVisibility(Visibility.VISIBLE));
52
+ public static Matcher<View> matcherForShallowAccessibilityLabel(String label, boolean isRegex) {
53
+ return allOf(withShallowAccessibilityLabel(label, isRegex), withEffectiveVisibility(Visibility.VISIBLE));
54
54
  }
55
55
 
56
56
  public static Matcher<View> matcherForContentDescription(String contentDescription) {
57
- return allOf(withContentDescription(contentDescription), withEffectiveVisibility(Visibility.VISIBLE));
57
+ return allOf(withContentDescription(contentDescription, false), withEffectiveVisibility(Visibility.VISIBLE));
58
58
  }
59
59
 
60
- public static Matcher<View> matcherForTestId(String testId) {
61
- return allOf(withTagValue(is((Object) testId)), withEffectiveVisibility(Visibility.VISIBLE));
60
+ public static Matcher<View> matcherForTestId(String testId, boolean isRegex) {
61
+ return allOf(withTagValue(testId, isRegex), withEffectiveVisibility(Visibility.VISIBLE));
62
62
  }
63
63
 
64
64
  public static Matcher<View> matcherForToggleable(boolean value) {
@@ -0,0 +1,56 @@
1
+ package com.wix.detox.espresso.matcher
2
+
3
+ import org.hamcrest.Description
4
+ import org.hamcrest.TypeSafeMatcher
5
+
6
+ class RegexMatcher<T>(private val jsRegex: String) : TypeSafeMatcher<T>() {
7
+ override fun matchesSafely(item: T): Boolean {
8
+ val stringItem = item.toString()
9
+ return stringItem.matchesJSRegex(jsRegex)
10
+ }
11
+
12
+ override fun describeTo(description: Description) {
13
+ description.appendText("should match the pattern: $jsRegex")
14
+ }
15
+ }
16
+
17
+ // Returns whether the whole string matches the given `jsRegex`.
18
+ // JS flags has the format of `/<pattern>/<flags>`.
19
+ // Flags can be either:
20
+ // - i: With this flag the search is case-insensitive: no difference between A and a (see the example below).
21
+ // - s: Enables “dotall” mode, that allows a dot . to match newline character \n (covered in the chapter Character classes).
22
+ // - m: Multiline mode (covered in the chapter Multiline mode of anchors ^ $, flag "m").
23
+ // Other flags (e.g. g,u,s) are not supported as they do not have equivalents in Kotlin.
24
+ //
25
+ // - See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
26
+ fun String.matchesJSRegex(jsRegex: String): Boolean {
27
+ val flagsChars = getRegexFlags(jsRegex)
28
+ val options = getRegexOptions(flagsChars)
29
+ val pattern = getRegexPattern(jsRegex)
30
+ return Regex(pattern, options).matches(this)
31
+ }
32
+
33
+ private fun getRegexFlags(jsRegex: String): CharSequence {
34
+ return jsRegex.substringAfterLast("/")
35
+ }
36
+
37
+ private fun getRegexPattern(jsRegex: String): String {
38
+ val pattern = jsRegex.substringAfter("/")
39
+ return pattern.substringBeforeLast("/")
40
+ }
41
+
42
+ private fun getRegexOptions(flagsChars: CharSequence): MutableSet<RegexOption> {
43
+ val options = mutableSetOf<RegexOption>()
44
+
45
+ if (flagsChars.contains('i', ignoreCase = true)) {
46
+ options.add(RegexOption.IGNORE_CASE)
47
+ }
48
+ if (flagsChars.contains('s', ignoreCase = true)) {
49
+ options.add(RegexOption.DOT_MATCHES_ALL)
50
+ }
51
+ if (flagsChars.contains('m', ignoreCase = true)) {
52
+ options.add(RegexOption.MULTILINE)
53
+ }
54
+
55
+ return options
56
+ }
@@ -11,16 +11,28 @@ import com.wix.detox.espresso.common.SliderHelper
11
11
  import org.hamcrest.*
12
12
  import org.hamcrest.Matchers.*
13
13
  import kotlin.math.abs
14
+ import org.hamcrest.CoreMatchers.`is`
14
15
 
15
16
  /*
16
17
  * An extension of [androidx.test.espresso.matcher.ViewMatchers].
17
18
  */
19
+ fun <T> getRelevantMatcher(value: T, isRegex: Boolean): Matcher<T> =
20
+ if (isRegex) RegexMatcher(value.toString()) else `is`(value)
18
21
 
19
- fun withAccessibilityLabel(text: String) =
20
- WithAccessibilityLabelMatcher(`is`(text))
22
+ fun withAccessibilityLabel(text: String, isRegex: Boolean): Matcher<View> =
23
+ WithAccessibilityLabelMatcher(getRelevantMatcher(text, isRegex))
21
24
 
22
- fun withShallowAccessibilityLabel(label: String): Matcher<View>
23
- = anyOf(ViewMatchers.withContentDescription(label), ViewMatchers.withText(label))
25
+ fun withShallowAccessibilityLabel(label: String, isRegex: Boolean): Matcher<View> =
26
+ anyOf(withContentDescription(label, isRegex), withText(label, isRegex))
27
+
28
+ fun withText(text: String, isRegex: Boolean): Matcher<View> =
29
+ ViewMatchers.withText(getRelevantMatcher(text, isRegex))
30
+
31
+ fun withContentDescription(label: String, isRegex: Boolean): Matcher<View> =
32
+ ViewMatchers.withContentDescription(getRelevantMatcher(label, isRegex))
33
+
34
+ fun withTagValue(testId: String, isRegex: Boolean): Matcher<View> =
35
+ ViewMatchers.withTagValue(getRelevantMatcher<Any>(testId, isRegex))
24
36
 
25
37
  fun isOfClassName(className: String): Matcher<View> {
26
38
  try {
@@ -0,0 +1,52 @@
1
+ package com.wix.detox.espresso.matcher
2
+
3
+ import org.junit.Test
4
+ import kotlin.test.assertFalse
5
+ import kotlin.test.assertTrue
6
+ import org.junit.runner.RunWith
7
+ import org.robolectric.RobolectricTestRunner
8
+
9
+ @RunWith(RobolectricTestRunner::class)
10
+ class RegexMatcherTest {
11
+ @Test
12
+ fun `should work with string matching regex`() {
13
+ val input = "Hello, world!"
14
+ val regex = "/[A-Z][a-z]+, world!/"
15
+ assertTrue(input.matchesJSRegex(regex))
16
+ }
17
+
18
+ @Test
19
+ fun `should work with string not matching regex`() {
20
+ val input = "Hello, world!"
21
+ val regex = "/[A-Z]+, world!/"
22
+ assertFalse(input.matchesJSRegex(regex))
23
+ }
24
+
25
+ @Test
26
+ fun `should work with the 'i' flag`() {
27
+ val input = "Hello, world!"
28
+ val regex = "/[A-Z]+, woRlD!/i"
29
+ assertTrue(input.matchesJSRegex(regex))
30
+ }
31
+
32
+ @Test
33
+ fun `should work with the 's' flag`() {
34
+ val input = "Hello,\nworld!"
35
+ val regex = "/Hello,\\sworld!/s"
36
+ assertTrue(input.matchesJSRegex(regex))
37
+ }
38
+
39
+ @Test
40
+ fun `should work with the 'm' flag`() {
41
+ val input = "Hello,\nworld!"
42
+ val regex = "/^Hello,\\s.*!$/m"
43
+ assertTrue(input.matchesJSRegex(regex))
44
+ }
45
+
46
+ @Test
47
+ fun `should work with multiple flags, ignore casing`() {
48
+ val input = "Hello,\nworld!"
49
+ val regex = "/^heLLo,\\swOrld!/ISM"
50
+ assertTrue(input.matchesJSRegex(regex))
51
+ }
52
+ }
package/index.d.ts CHANGED
@@ -971,20 +971,25 @@ declare global {
971
971
  * <TouchableOpacity testID={'tap_me'}>
972
972
  * // Then match with by.id:
973
973
  * await element(by.id('tap_me'));
974
+ * await element(by.id(/^tap_[a-z]+$/));
974
975
  */
975
- id(id: string): NativeMatcher;
976
+ id(id: string | RegExp): NativeMatcher;
976
977
 
977
978
  /**
978
979
  * Find an element by text, useful for text fields, buttons.
979
- * @example await element(by.text('Tap Me'));
980
+ * @example
981
+ * await element(by.text('Tap Me'));
982
+ * await element(by.text(/^Tap .*$/));
980
983
  */
981
- text(text: string): NativeMatcher;
984
+ text(text: string | RegExp): NativeMatcher;
982
985
 
983
986
  /**
984
987
  * Find an element by accessibilityLabel on iOS, or by contentDescription on Android.
985
- * @example await element(by.label('Welcome'));
988
+ * @example
989
+ * await element(by.label('Welcome'));
990
+ * await element(by.label(/[a-z]+/i));
986
991
  */
987
- label(label: string): NativeMatcher;
992
+ label(label: string | RegExp): NativeMatcher;
988
993
 
989
994
  /**
990
995
  * Find an element by native view type.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "detox",
3
3
  "description": "E2E tests and automation for mobile",
4
- "version": "20.10.0",
4
+ "version": "20.11.0",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -206,5 +206,5 @@
206
206
  "browserslist": [
207
207
  "node 14"
208
208
  ],
209
- "gitHead": "db03432bab0f009ffda7a65b3062d9678c557a78"
209
+ "gitHead": "e132a02242f1a4ebcf1775ba4ceb782d5b1a855c"
210
210
  }
@@ -14,39 +14,51 @@ function sanitize_matcher(matcher) {
14
14
  return originalMatcher.type ? originalMatcher.value : originalMatcher;
15
15
  }
16
16
  class DetoxMatcher {
17
- static matcherForText(text) {
17
+ static matcherForText(text, isRegex) {
18
18
  if (typeof text !== "string") throw new Error("text should be a string, but got " + (text + (" (" + (typeof text + ")"))));
19
+ if (typeof isRegex !== "boolean") throw new Error("isRegex should be a boolean, but got " + (isRegex + (" (" + (typeof isRegex + ")"))));
19
20
  return {
20
21
  target: {
21
22
  type: "Class",
22
23
  value: "com.wix.detox.espresso.DetoxMatcher"
23
24
  },
24
25
  method: "matcherForText",
25
- args: [text]
26
+ args: [text, {
27
+ type: "boolean",
28
+ value: isRegex
29
+ }]
26
30
  };
27
31
  }
28
32
 
29
- static matcherForAccessibilityLabel(label) {
33
+ static matcherForAccessibilityLabel(label, isRegex) {
30
34
  if (typeof label !== "string") throw new Error("label should be a string, but got " + (label + (" (" + (typeof label + ")"))));
35
+ if (typeof isRegex !== "boolean") throw new Error("isRegex should be a boolean, but got " + (isRegex + (" (" + (typeof isRegex + ")"))));
31
36
  return {
32
37
  target: {
33
38
  type: "Class",
34
39
  value: "com.wix.detox.espresso.DetoxMatcher"
35
40
  },
36
41
  method: "matcherForAccessibilityLabel",
37
- args: [label]
42
+ args: [label, {
43
+ type: "boolean",
44
+ value: isRegex
45
+ }]
38
46
  };
39
47
  }
40
48
 
41
- static matcherForShallowAccessibilityLabel(label) {
49
+ static matcherForShallowAccessibilityLabel(label, isRegex) {
42
50
  if (typeof label !== "string") throw new Error("label should be a string, but got " + (label + (" (" + (typeof label + ")"))));
51
+ if (typeof isRegex !== "boolean") throw new Error("isRegex should be a boolean, but got " + (isRegex + (" (" + (typeof isRegex + ")"))));
43
52
  return {
44
53
  target: {
45
54
  type: "Class",
46
55
  value: "com.wix.detox.espresso.DetoxMatcher"
47
56
  },
48
57
  method: "matcherForShallowAccessibilityLabel",
49
- args: [label]
58
+ args: [label, {
59
+ type: "boolean",
60
+ value: isRegex
61
+ }]
50
62
  };
51
63
  }
52
64
 
@@ -62,15 +74,19 @@ class DetoxMatcher {
62
74
  };
63
75
  }
64
76
 
65
- static matcherForTestId(testId) {
77
+ static matcherForTestId(testId, isRegex) {
66
78
  if (typeof testId !== "string") throw new Error("testId should be a string, but got " + (testId + (" (" + (typeof testId + ")"))));
79
+ if (typeof isRegex !== "boolean") throw new Error("isRegex should be a boolean, but got " + (isRegex + (" (" + (typeof isRegex + ")"))));
67
80
  return {
68
81
  target: {
69
82
  type: "Class",
70
83
  value: "com.wix.detox.espresso.DetoxMatcher"
71
84
  },
72
85
  method: "matcherForTestId",
73
- args: [testId]
86
+ args: [testId, {
87
+ type: "boolean",
88
+ value: isRegex
89
+ }]
74
90
  };
75
91
  }
76
92
 
@@ -1,26 +1,30 @@
1
1
  const DetoxRuntimeError = require('../../errors/DetoxRuntimeError');
2
2
  const invoke = require('../../invoke');
3
+ const { isRegExp } = require('../../utils/isRegExp');
3
4
  const { NativeMatcher } = require('../core/NativeMatcher');
4
5
  const DetoxMatcherApi = require('../espressoapi/DetoxMatcher');
5
6
 
6
7
  class LabelMatcher extends NativeMatcher {
7
8
  constructor(value) {
8
9
  super();
9
- this._call = invoke.callDirectly(DetoxMatcherApi.matcherForAccessibilityLabel(value));
10
+ const isRegex = isRegExp(value);
11
+ this._call = invoke.callDirectly(DetoxMatcherApi.matcherForAccessibilityLabel(isRegex ? value.toString() : value, isRegex));
10
12
  }
11
13
  }
12
14
 
13
15
  class ShallowLabelMatcher extends NativeMatcher {
14
16
  constructor(value) {
15
17
  super();
16
- this._call = invoke.callDirectly(DetoxMatcherApi.matcherForShallowAccessibilityLabel(value));
18
+ const isRegex = isRegExp(value);
19
+ this._call = invoke.callDirectly(DetoxMatcherApi.matcherForShallowAccessibilityLabel(isRegex ? value.toString() : value, isRegex));
17
20
  }
18
21
  }
19
22
 
20
23
  class IdMatcher extends NativeMatcher {
21
24
  constructor(value) {
22
25
  super();
23
- this._call = invoke.callDirectly(DetoxMatcherApi.matcherForTestId(value));
26
+ const isRegex = isRegExp(value);
27
+ this._call = invoke.callDirectly(DetoxMatcherApi.matcherForTestId(isRegex ? value.toString() : value, isRegex));
24
28
  }
25
29
  }
26
30
 
@@ -53,7 +57,8 @@ class ExistsMatcher extends NativeMatcher {
53
57
  class TextMatcher extends NativeMatcher {
54
58
  constructor(value) {
55
59
  super();
56
- this._call = invoke.callDirectly(DetoxMatcherApi.matcherForText(value));
60
+ const isRegex = isRegExp(value);
61
+ this._call = invoke.callDirectly(DetoxMatcherApi.matcherForText(isRegex ? value.toString() : value, isRegex));
57
62
  }
58
63
  }
59
64
 
@@ -9,6 +9,7 @@ const tempfile = require('tempfile');
9
9
  const { assertEnum, assertNormalized } = require('../utils/assertArgument');
10
10
  const { removeMilliseconds } = require('../utils/dateUtils');
11
11
  const { actionDescription, expectDescription } = require('../utils/invocationTraceDescriptions');
12
+ const { isRegExp } = require('../utils/isRegExp');
12
13
  const log = require('../utils/logger').child({ cat: 'ws-client, ws' });
13
14
  const traceInvocationCall = require('../utils/traceInvocationCall').bind(null, log);
14
15
 
@@ -231,7 +232,7 @@ class Element {
231
232
 
232
233
  performAccessibilityAction(actionName) {
233
234
  if (typeof actionName !== 'string') throw new Error('actionName should be a string, but got ' + (actionName + (' (' + (typeof actionName + ')'))));
234
-
235
+
235
236
  const traceDescription = actionDescription.performAccessibilityAction(actionName);
236
237
  return this.withAction('accessibilityAction', traceDescription, actionName);
237
238
  }
@@ -409,14 +410,14 @@ class Matcher {
409
410
  }
410
411
 
411
412
  label(label) {
412
- if (typeof label !== 'string') throw new Error('label should be a string, but got ' + (label + (' (' + (typeof label + ')'))));
413
- this.predicate = { type: 'label', value: label };
413
+ if (typeof label !== 'string' && !isRegExp(label)) throw new Error('label should be a string or regex, but got ' + (label + (' (' + (typeof label + ')'))));
414
+ this.predicate = { type: 'label', value: label.toString(), isRegex: isRegExp(label) };
414
415
  return this;
415
416
  }
416
417
 
417
418
  id(id) {
418
- if (typeof id !== 'string') throw new Error('id should be a string, but got ' + (id + (' (' + (typeof id + ')'))));
419
- this.predicate = { type: 'id', value: id };
419
+ if (typeof id !== 'string' && !isRegExp(id)) throw new Error('id should be a string or regex, but got ' + (id + (' (' + (typeof id + ')'))));
420
+ this.predicate = { type: 'id', value: id.toString(), isRegex: isRegExp(id) };
420
421
  return this;
421
422
  }
422
423
 
@@ -439,8 +440,8 @@ class Matcher {
439
440
  }
440
441
 
441
442
  text(text) {
442
- if (typeof text !== 'string') throw new Error('text should be a string, but got ' + (text + (' (' + (typeof text + ')'))));
443
- this.predicate = { type: 'text', value: text };
443
+ if (typeof text !== 'string' && !isRegExp(text)) throw new Error(`text should be a string or regex, but got ` + (text + (' (' + (typeof text + ')'))));
444
+ this.predicate = { type: 'text', value: text.toString(), isRegex: isRegExp(text) };
444
445
  return this;
445
446
  }
446
447
 
@@ -0,0 +1,7 @@
1
+ function isRegExp(obj) {
2
+ return Object.prototype.toString.call(obj) === '[object RegExp]';
3
+ }
4
+
5
+ module.exports = {
6
+ isRegExp,
7
+ };
@@ -1 +0,0 @@
1
- ccec694db9b1c0c103c091b99e7ee9df
@@ -1 +0,0 @@
1
- 802f3fb4dd671a6541a6eca43689bc8601886e9b
@@ -1 +0,0 @@
1
- 11a86d1948d439bc47acdc0418dfa08494d571845cbfb3689eadc2da28cf5836
@@ -1 +0,0 @@
1
- fe9e28217fa01605deb67e3df29773a045d6aa29ffa7f63d2e982df79dfd6a5e6afc54ce48f486ec056f93004a481e0c7ec302f5674c4038feab8ba1c2f96fda
@@ -1 +0,0 @@
1
- 5cdc018bfde6bf33c25761e6a5ed339b
@@ -1 +0,0 @@
1
- cd978c712a0737b5d5873c4fe60f2a1417617421
@@ -1 +0,0 @@
1
- 2288f87a57ef315c097ace78d834b5f29cbe7db7d96daaab40379b14e269681a
@@ -1 +0,0 @@
1
- 2f85eadd8a1447747c1a260d256d56c6dc42fa9d315e9bca09dc7dec5f212b2ea00fd570ee2000bd473c506b38dc7b7557ddddd98376ecb14ba9bc4f63ac9122
@@ -1 +0,0 @@
1
- b1d894d9d707154e6edb6f993adae08a
@@ -1 +0,0 @@
1
- f25b33bfa236d17cc6600fe6adb5df32faefa70e
@@ -1 +0,0 @@
1
- 0621fa6efd25f58c71db3b666b109de6dd838c16a833dd2f9f6f3d3aaceb2017
@@ -1 +0,0 @@
1
- 6166f3c56b5d4d7ab27f77dd70cf17335d3e6a44875ffded704ca56872a2ba7e36a3e2a4450bf751cf5c19d71fe65fb23a8d702d847398b90c7c7531186c0ab7
@@ -1 +0,0 @@
1
- 692cbd42d3869003441e9aa9386fbddd
@@ -1 +0,0 @@
1
- d9e2fbaff2dd25b569381c0f415841d5705a5e85
@@ -1 +0,0 @@
1
- 57ce34871cc1b500ba04fc4a11e51521862d79c0a03cc69807723266e64d5b45
@@ -1 +0,0 @@
1
- 8e513071ae098fd57278692d0dcea073a498f649ef76c8f1c12a88fd53e1ed893e082623b5ae760aa74f301c60779335b18d71f729876885b18a9aa48b0db827