From 9572079cf3ea3bbdfcf1be7db975b2515bb04ccb Mon Sep 17 00:00:00 2001 From: John Rodriguez Date: Tue, 13 Dec 2022 13:01:38 -0500 Subject: [PATCH] Migrate tests from #497 --- .../src/test/projects/widgets/build.gradle | 25 +++ .../plugin/test/RenderingModesTest.kt | 105 ++++++++++++ .../app/cash/paparazzi/RenderingModeTest.kt | 159 ------------------ .../app/cash/paparazzi/sample/WidgetTest.kt | 89 ++++++++++ 4 files changed, 219 insertions(+), 159 deletions(-) create mode 100644 paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/build.gradle create mode 100644 paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/src/test/java/app/cash/paparazzi/plugin/test/RenderingModesTest.kt delete mode 100644 paparazzi/paparazzi/src/test/java/app/cash/paparazzi/RenderingModeTest.kt create mode 100644 sample/src/test/java/app/cash/paparazzi/sample/WidgetTest.kt diff --git a/paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/build.gradle b/paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/build.gradle new file mode 100644 index 0000000000..571007831e --- /dev/null +++ b/paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'app.cash.paparazzi' +} + +repositories { + maven { + url "file://${projectDir.absolutePath}/../../../../../build/localMaven" + } + mavenCentral() + //mavenLocal() + google() +} + +android { + compileSdk libs.versions.compileSdk.get() as int + defaultConfig { + minSdk libs.versions.minSdk.get() as int + } +} + +dependencies { + testImplementation libs.testParameterInjector +} diff --git a/paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/src/test/java/app/cash/paparazzi/plugin/test/RenderingModesTest.kt b/paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/src/test/java/app/cash/paparazzi/plugin/test/RenderingModesTest.kt new file mode 100644 index 0000000000..8d0a097a63 --- /dev/null +++ b/paparazzi/paparazzi-gradle-plugin/src/test/projects/widgets/src/test/java/app/cash/paparazzi/plugin/test/RenderingModesTest.kt @@ -0,0 +1,105 @@ +package app.cash.paparazzi.plugin.test + + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.widget.Button +import android.widget.LinearLayout +import android.widget.TextView +import app.cash.paparazzi.DeviceConfig +import app.cash.paparazzi.Paparazzi +import com.android.ide.common.rendering.api.SessionParams.RenderingMode +import com.android.ide.common.rendering.api.SessionParams.RenderingMode.NORMAL +import com.android.ide.common.rendering.api.SessionParams.RenderingMode.SHRINK +import com.google.testing.junit.testparameterinjector.TestParameter +import com.google.testing.junit.testparameterinjector.TestParameterInjector +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(TestParameterInjector::class) +class RenderingModeTest( + @TestParameter val mode: Mode +) { + @get:Rule + val paparazzi = Paparazzi( + deviceConfig = DeviceConfig.PIXEL_3.copy(softButtons = false), + renderingMode = mode.renderingMode, + ) + + @Test fun default() { + paparazzi.snapshot(buildView(paparazzi.context)) + } + + enum class Mode( + val renderingMode: RenderingMode, + ) { + WIDGET(renderingMode = SHRINK), + FULL_SCREEN(renderingMode = NORMAL) + } + + private fun buildView(context: Context): View { + return LinearLayout(context).apply { + orientation = LinearLayout.VERTICAL + layoutParams = ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT) + addView( + TextView(context).apply { + id = 1 + text = "Text View Sample" + } + ) + + addView( + View(context).apply { + id = 2 + layoutParams = LinearLayout.LayoutParams(100, 100) + contentDescription = "Content Description Sample" + } + ) + + addView( + View(context).apply { + id = 3 + layoutParams = LinearLayout.LayoutParams(100, 100).apply { + setMargins(20, 20, 20, 20) + } + contentDescription = "Margin Sample" + } + ) + + addView( + View(context).apply { + id = 4 + layoutParams = LinearLayout.LayoutParams(100, 100).apply { + setMargins(20, 20, 20, 20) + } + foreground = GradientDrawable( + GradientDrawable.Orientation.TL_BR, + intArrayOf(Color.YELLOW, Color.BLUE) + ).apply { + shape = GradientDrawable.OVAL + } + contentDescription = "Foreground Drawable" + } + ) + + addView( + Button(context).apply { + id = 5 + layoutParams = LinearLayout.LayoutParams( + WRAP_CONTENT, + WRAP_CONTENT + ).apply { + gravity = Gravity.CENTER + } + text = "Button Sample" + } + ) + } + } +} diff --git a/paparazzi/paparazzi/src/test/java/app/cash/paparazzi/RenderingModeTest.kt b/paparazzi/paparazzi/src/test/java/app/cash/paparazzi/RenderingModeTest.kt deleted file mode 100644 index e7026f0773..0000000000 --- a/paparazzi/paparazzi/src/test/java/app/cash/paparazzi/RenderingModeTest.kt +++ /dev/null @@ -1,159 +0,0 @@ -package app.cash.paparazzi - -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.GradientDrawable -import android.view.Gravity -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.LinearLayout -import android.widget.TextView -import app.cash.paparazzi.internal.ImageUtils -import com.android.ide.common.rendering.api.SessionParams -import org.junit.Test -import org.junit.runner.Description -import java.awt.image.BufferedImage -import java.io.File -import javax.imageio.ImageIO - -class RenderingModeTest { - @Test - fun `shrinks to wrap view`() { - Paparazzi( - snapshotHandler = TestSnapshotVerifier(), - deviceConfig = DeviceConfig.NEXUS_5.copy( - softButtons = false - ), - renderingMode = SessionParams.RenderingMode.SHRINK - ).runTest("shrinks to wrap view") { - val view = buildView( - context, - ViewGroup.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - ) - snapshot(view, "rendering-mode-shrink") - } - } - - @Test - fun `renders full device with RenderingMode NORMAL`() { - Paparazzi( - snapshotHandler = TestSnapshotVerifier(true), - deviceConfig = DeviceConfig.NEXUS_5.copy( - softButtons = false - ), - renderingMode = SessionParams.RenderingMode.NORMAL - ).runTest("renders full device with RenderingMode NORMAL") { - val view = buildView( - context, - ViewGroup.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - ) - snapshot(view, "rendering-mode-normal") - } - } - - private fun Paparazzi.runTest(name: String, body: Paparazzi.() -> Unit) { - try { - prepare(Description.createTestDescription(this@RenderingModeTest::class.java, name)) - body() - } finally { - close() - } - } - - private fun buildView( - context: Context, - rootLayoutParams: ViewGroup.LayoutParams? = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - ) - ) = - LinearLayout(context).apply { - orientation = LinearLayout.VERTICAL - rootLayoutParams?.let { layoutParams = it } - addView( - TextView(context).apply { - id = 1 - text = "Text View Sample" - } - ) - - addView( - View(context).apply { - id = 2 - layoutParams = LinearLayout.LayoutParams(100, 100) - contentDescription = "Content Description Sample" - } - ) - - addView( - View(context).apply { - id = 3 - layoutParams = LinearLayout.LayoutParams(100, 100).apply { - setMarginsRelative(20, 20, 20, 20) - } - contentDescription = "Margin Sample" - } - ) - - addView( - View(context).apply { - id = 4 - layoutParams = LinearLayout.LayoutParams(100, 100).apply { - setMarginsRelative(20, 20, 20, 20) - } - foreground = GradientDrawable(GradientDrawable.Orientation.TL_BR, intArrayOf(Color.YELLOW, Color.BLUE)).apply { - shape = GradientDrawable.OVAL - } - contentDescription = "Foreground Drawable" - } - ) - - addView( - Button(context).apply { - id = 5 - layoutParams = LinearLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ).apply { - gravity = Gravity.CENTER - } - text = "Button Sample" - } - ) - } -} - -private class TestSnapshotVerifier(val writeImages: Boolean = false) : SnapshotHandler { - override fun newFrameHandler( - snapshot: Snapshot, - frameCount: Int, - fps: Int - ): SnapshotHandler.FrameHandler { - return object : SnapshotHandler.FrameHandler { - override fun handle(image: BufferedImage) { - val expected = File("src/test/resources/${snapshot.name}.png") - if (writeImages) { - ImageIO.write(image, "png", expected) - } else { - ImageUtils.assertImageSimilar( - relativePath = expected.path, - image = image, - goldenImage = ImageIO.read(expected), - maxPercentDifferent = 0.1 - ) - } - } - - override fun close() = Unit - } - } - - override fun close() = Unit -} diff --git a/sample/src/test/java/app/cash/paparazzi/sample/WidgetTest.kt b/sample/src/test/java/app/cash/paparazzi/sample/WidgetTest.kt new file mode 100644 index 0000000000..75ceca30a1 --- /dev/null +++ b/sample/src/test/java/app/cash/paparazzi/sample/WidgetTest.kt @@ -0,0 +1,89 @@ +package app.cash.paparazzi.sample + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.widget.Button +import android.widget.LinearLayout +import android.widget.TextView +import app.cash.paparazzi.DeviceConfig +import app.cash.paparazzi.Paparazzi +import com.android.ide.common.rendering.api.SessionParams +import org.junit.Rule +import org.junit.Test + +class WidgetTest { + @get:Rule + val paparazzi = Paparazzi( + deviceConfig = DeviceConfig.PIXEL_3.copy(softButtons = false), + renderingMode = SessionParams.RenderingMode.SHRINK, + ) + + @Test fun default() { + paparazzi.snapshot(buildView(paparazzi.context)) + } + + private fun buildView(context: Context): View { + return LinearLayout(context).apply { + orientation = LinearLayout.VERTICAL + layoutParams = ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT) + addView( + TextView(context).apply { + id = 1 + text = "Text View Sample" + } + ) + + addView( + View(context).apply { + id = 2 + layoutParams = LinearLayout.LayoutParams(100, 100) + contentDescription = "Content Description Sample" + } + ) + + addView( + View(context).apply { + id = 3 + layoutParams = LinearLayout.LayoutParams(100, 100).apply { + setMargins(20, 20, 20, 20) + } + contentDescription = "Margin Sample" + } + ) + + addView( + View(context).apply { + id = 4 + layoutParams = LinearLayout.LayoutParams(100, 100).apply { + setMargins(20, 20, 20, 20) + } + foreground = GradientDrawable( + GradientDrawable.Orientation.TL_BR, + intArrayOf(Color.YELLOW, Color.BLUE) + ).apply { + shape = GradientDrawable.OVAL + } + contentDescription = "Foreground Drawable" + } + ) + + addView( + Button(context).apply { + id = 5 + layoutParams = LinearLayout.LayoutParams( + WRAP_CONTENT, + WRAP_CONTENT + ).apply { + gravity = Gravity.CENTER + } + text = "Button Sample" + } + ) + } + } +}