diff --git a/espresso/CHANGELOG.md b/espresso/CHANGELOG.md index 8d9140570..41eba945b 100644 --- a/espresso/CHANGELOG.md +++ b/espresso/CHANGELOG.md @@ -23,6 +23,8 @@ The following artifacts were released: **New Features** +* Add `doesNotHaveFlag` and `doesNotHaveFlags` matchers to `IntentMatchers`. + **Breaking Changes** **API Changes** diff --git a/espresso/intents/java/androidx/test/espresso/intent/api/current_public.txt b/espresso/intents/java/androidx/test/espresso/intent/api/current_public.txt index d35408ca5..c552a7ef2 100644 --- a/espresso/intents/java/androidx/test/espresso/intent/api/current_public.txt +++ b/espresso/intents/java/androidx/test/espresso/intent/api/current_public.txt @@ -125,6 +125,9 @@ package androidx.test.espresso.intent.matcher { method public static org.hamcrest.Matcher! anyIntent(); method public static org.hamcrest.Matcher doesNotHaveExtraWithKey(String); method public static org.hamcrest.Matcher doesNotHaveExtraWithKey(org.hamcrest.Matcher); + method public static org.hamcrest.Matcher! doesNotHaveFlag(int); + method public static org.hamcrest.Matcher! doesNotHaveFlags(int); + method public static org.hamcrest.Matcher! doesNotHaveFlags(int...!); method public static org.hamcrest.Matcher! filterEquals(android.content.Intent!); method public static org.hamcrest.Matcher! hasAction(String!); method public static org.hamcrest.Matcher! hasAction(org.hamcrest.Matcher!); diff --git a/espresso/intents/java/androidx/test/espresso/intent/matcher/IntentMatchers.java b/espresso/intents/java/androidx/test/espresso/intent/matcher/IntentMatchers.java index 1f0b544b9..15416273a 100644 --- a/espresso/intents/java/androidx/test/espresso/intent/matcher/IntentMatchers.java +++ b/espresso/intents/java/androidx/test/espresso/intent/matcher/IntentMatchers.java @@ -340,6 +340,34 @@ public boolean matchesSafely(Intent intent) { }; } + public static Matcher doesNotHaveFlag(int flag) { + return doesNotHaveFlags(flag); + } + + public static Matcher doesNotHaveFlags(int... flags) { + int allFlags = 0; + for (int i : flags) { + allFlags |= i; + } + return doesNotHaveFlags(allFlags); + } + + public static Matcher doesNotHaveFlags(final int flags) { + + return new TypeSafeMatcher() { + @Override + public void describeTo(Description description) { + description.appendText("does not have flags: " + Integer.toHexString(flags)); + } + + @Override + public boolean matchesSafely(Intent intent) { + int intentFlags = intent.getFlags(); + return ((intentFlags & flags) == 0); + } + }; + } + /** Matches an intent if it {@link Intent#filterEquals(Intent)} the expected intent. */ public static Matcher filterEquals(Intent expectedIntent) { return new TypeSafeMatcher() { diff --git a/espresso/intents/javatests/androidx/test/espresso/intent/matcher/IntentMatchersTest.java b/espresso/intents/javatests/androidx/test/espresso/intent/matcher/IntentMatchersTest.java index 58770405c..afa15dab9 100644 --- a/espresso/intents/javatests/androidx/test/espresso/intent/matcher/IntentMatchersTest.java +++ b/espresso/intents/javatests/androidx/test/espresso/intent/matcher/IntentMatchersTest.java @@ -19,6 +19,8 @@ import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static androidx.test.espresso.intent.matcher.BundleMatchers.hasEntry; import static androidx.test.espresso.intent.matcher.IntentMatchers.doesNotHaveExtraWithKey; +import static androidx.test.espresso.intent.matcher.IntentMatchers.doesNotHaveFlag; +import static androidx.test.espresso.intent.matcher.IntentMatchers.doesNotHaveFlags; import static androidx.test.espresso.intent.matcher.IntentMatchers.filterEquals; import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction; import static androidx.test.espresso.intent.matcher.IntentMatchers.hasCategories; @@ -473,6 +475,50 @@ public void hasFlagsWithCustomFlagsDoesNotMatch() { assertFalse((hasFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | 8)).matches(intent)); } + @Test + public void doesNotHaveFlagsWithSingleFlag() { + Intent intent = new Intent(); + assertTrue(doesNotHaveFlags(0).matches(intent)); + assertTrue(doesNotHaveFlags(0).matches(new Intent().setFlags(1))); + assertTrue(doesNotHaveFlag(Intent.FLAG_GRANT_READ_URI_PERMISSION).matches(intent)); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + assertFalse(doesNotHaveFlag(Intent.FLAG_GRANT_READ_URI_PERMISSION).matches(intent)); + assertFalse(doesNotHaveFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).matches(intent)); + } + + @Test + public void doesNotHaveFlagsWithMultipleFlags() { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION | Intent.FLAG_ACTIVITY_NO_HISTORY); + assertTrue(doesNotHaveFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS).matches(intent)); + assertFalse(doesNotHaveFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION).matches(intent)); + assertFalse(doesNotHaveFlags(Intent.FLAG_ACTIVITY_NO_HISTORY).matches(intent)); + assertFalse( + doesNotHaveFlags( + Intent.FLAG_DEBUG_LOG_RESOLUTION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + .matches(intent)); + assertFalse( + doesNotHaveFlags( + Intent.FLAG_DEBUG_LOG_RESOLUTION, Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + .matches(intent)); + assertTrue( + doesNotHaveFlags( + Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, + Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) + .matches(intent)); + } + + @Test + public void doesNotHaveFlagsWithCustomFlags() { + Intent intent = new Intent(); + intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION | 8); + assertTrue((doesNotHaveFlags(16)).matches(intent)); + assertTrue((doesNotHaveFlags(Intent.FLAG_ACTIVITY_NO_HISTORY, 16)).matches(intent)); + assertFalse((doesNotHaveFlags(8 | 2)).matches(intent)); + assertFalse((doesNotHaveFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION, 4)).matches(intent)); + assertFalse((doesNotHaveFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION, 8, 4)).matches(intent)); + } + @Test public void filterEqualsMatches() { Intent intent =