diff --git a/README.md b/README.md index 1c32ed697..ace5df381 100644 --- a/README.md +++ b/README.md @@ -245,6 +245,13 @@ assertHasBackground(R.id.view, R.drawable.ic_barista); assertHasNoBackground(R.id.view); ``` +#### Does this View have content description? +```java +assertHasContentDescription(R.id.anyView); +assertContentDescription(R.id.anyView, R.string.content_description); +assertContentDescription(R.id.anyView, "Some text"); +``` + #### What's the state of the Drawer? ```java assertDrawerIsOpen(); diff --git a/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaAssistiveTextAssertions.kt b/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaAssistiveTextAssertions.kt index 6092764d7..5a1463b0a 100644 --- a/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaAssistiveTextAssertions.kt +++ b/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaAssistiveTextAssertions.kt @@ -3,8 +3,8 @@ package com.schibsted.spain.barista.assertion import android.view.View import androidx.annotation.IdRes import androidx.annotation.StringRes -import androidx.test.InstrumentationRegistry import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.platform.app.InstrumentationRegistry import com.google.android.material.textfield.TextInputLayout import com.schibsted.spain.barista.internal.assertAny import org.hamcrest.Description @@ -14,8 +14,8 @@ import org.hamcrest.TypeSafeMatcher object BaristaAssistiveTextAssertions { @JvmStatic fun assertAssistiveText(@IdRes viewId: Int, @StringRes text: Int) { - val resourceString = InstrumentationRegistry.getTargetContext().resources.getString(text) - assertAssistiveText(viewId, resourceString) + val resourceString = InstrumentationRegistry.getInstrumentation().targetContext.resources.getString(text) + assertAssistiveText(viewId, resourceString) } @JvmStatic diff --git a/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaContentDescriptionAssertions.kt b/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaContentDescriptionAssertions.kt new file mode 100644 index 000000000..28656636c --- /dev/null +++ b/library/src/main/java/com/schibsted/spain/barista/assertion/BaristaContentDescriptionAssertions.kt @@ -0,0 +1,54 @@ +package com.schibsted.spain.barista.assertion + +import android.view.View +import androidx.annotation.IdRes +import androidx.annotation.StringRes +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.platform.app.InstrumentationRegistry +import com.schibsted.spain.barista.internal.assertAny +import org.hamcrest.Description +import org.hamcrest.Matcher +import org.hamcrest.TypeSafeMatcher + +object BaristaContentDescriptionAssertions { + + @JvmStatic + fun assertHasContentDescription(@IdRes viewId: Int) { + ViewMatchers.withId(viewId).assertAny(matchHasContentDescription()) + } + + @JvmStatic + fun assertContentDescription(@IdRes viewId: Int, @StringRes text: Int) { + val resourceString = InstrumentationRegistry.getInstrumentation().targetContext.resources.getString(text) + assertContentDescription(viewId, resourceString) + } + + @JvmStatic + fun assertContentDescription(@IdRes viewId: Int, text: String) { + ViewMatchers.withId(viewId).assertAny(matchContentDescription(text)) + } + + private fun matchHasContentDescription(): Matcher { + return object : TypeSafeMatcher() { + override fun describeTo(description: Description) { + description.appendText("with content description") + } + + override fun matchesSafely(item: View): Boolean { + return item.contentDescription.isNotBlank() + } + } + } + + private fun matchContentDescription(expectedContentDescription: String): Matcher { + return object : TypeSafeMatcher() { + override fun describeTo(description: Description) { + description.appendText("with content description: ").appendText(expectedContentDescription) + } + + override fun matchesSafely(item: View): Boolean { + return item.contentDescription == expectedContentDescription + } + } + } +} \ No newline at end of file diff --git a/sample/src/androidTest/java/com/schibsted/spain/barista/sample/ContentDescriptionTest.kt b/sample/src/androidTest/java/com/schibsted/spain/barista/sample/ContentDescriptionTest.kt new file mode 100644 index 000000000..ae2a5e0d7 --- /dev/null +++ b/sample/src/androidTest/java/com/schibsted/spain/barista/sample/ContentDescriptionTest.kt @@ -0,0 +1,73 @@ +package com.schibsted.spain.barista.sample + +import androidx.test.rule.ActivityTestRule +import com.schibsted.spain.barista.assertion.BaristaContentDescriptionAssertions.assertContentDescription +import com.schibsted.spain.barista.assertion.BaristaContentDescriptionAssertions.assertHasContentDescription +import com.schibsted.spain.barista.internal.failurehandler.BaristaException +import com.schibsted.spain.barista.sample.util.SpyFailureHandlerRule +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.catchThrowable +import org.junit.Rule +import org.junit.Test + +class ContentDescriptionTest { + + @get:Rule + var activityRule = ActivityTestRule(ContentDescriptionActivity::class.java) + + @get:Rule + var spyFailureHandlerRule = SpyFailureHandlerRule() + + @Test + fun assertContentDescriptionString() { + assertContentDescription(R.id.imageRed, "Image color red") + assertContentDescription(R.id.textRed, "Text red") + + spyFailureHandlerRule.assertNoEspressoFailures() + } + + @Test + fun assertFailsIfNoContentDescription() { + val thrown = catchThrowable { + assertContentDescription(R.id.imageGreen, R.string.content_description_image_color_green) + } + + spyFailureHandlerRule.assertEspressoFailures(1) + + assertThat(thrown).isInstanceOf(BaristaException::class.java) + .hasMessage("View (with id: com.schibsted.spain.barista.sample:id/imageGreen) " + + "didn't match condition (with content description: Image color green)") + } + + @Test + fun assertFailsIfNotHasContentDescription() { + val thrown = catchThrowable { + assertHasContentDescription(R.id.imageGreen) + } + + spyFailureHandlerRule.assertEspressoFailures(1) + + assertThat(thrown).isInstanceOf(BaristaException::class.java) + .hasMessage("View (with id: com.schibsted.spain.barista.sample:id/imageGreen) " + + "didn't match condition (with content description)") + } + + @Test + fun assertContentDescriptionStringResource() { + assertContentDescription(R.id.imageBlue, R.string.content_description_image_color_blue) + assertContentDescription(R.id.textBlue, R.string.content_description_text_blue) + + spyFailureHandlerRule.assertNoEspressoFailures() + } + + @Test + fun assertViewsHasContentDescription() { + assertHasContentDescription(R.id.imageRed) + assertHasContentDescription(R.id.textRed) + assertHasContentDescription(R.id.imageBlue) + assertHasContentDescription(R.id.textBlue) + + spyFailureHandlerRule.assertNoEspressoFailures() + } + +} \ No newline at end of file diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 140a759cb..ad1df3fe4 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -76,6 +76,7 @@ + diff --git a/sample/src/main/java/com/schibsted/spain/barista/sample/ContentDescriptionActivity.kt b/sample/src/main/java/com/schibsted/spain/barista/sample/ContentDescriptionActivity.kt new file mode 100644 index 000000000..cf405e3a3 --- /dev/null +++ b/sample/src/main/java/com/schibsted/spain/barista/sample/ContentDescriptionActivity.kt @@ -0,0 +1,13 @@ +package com.schibsted.spain.barista.sample + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity + +class ContentDescriptionActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_content_description) + } + +} diff --git a/sample/src/main/res/layout/activity_content_description.xml b/sample/src/main/res/layout/activity_content_description.xml new file mode 100644 index 000000000..0a65693c2 --- /dev/null +++ b/sample/src/main/res/layout/activity_content_description.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml index 2fb997df0..676d86e17 100644 --- a/sample/src/main/res/values/colors.xml +++ b/sample/src/main/res/values/colors.xml @@ -9,4 +9,5 @@ #FFC107 #F44336 #0D47A1 + #69F436 diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index ee2db1d94..d00d9ec01 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -42,5 +42,10 @@ unexisting text + Image color blue + Text blue + + Image color green + Text green