diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/Directories.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/Directories.kt new file mode 100644 index 0000000..7fa1fc1 --- /dev/null +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/Directories.kt @@ -0,0 +1,17 @@ +package com.telefonica.androidsnaptesting + +import android.os.Environment +import androidx.test.platform.app.InstrumentationRegistry +import java.io.File + +internal class Directories { + + internal val context = InstrumentationRegistry.getInstrumentation().context + private val downloadDir = File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + ) + private val androidSnaptestingDir = File(downloadDir, "android-snaptesting/${context.packageName}") + internal val failuresDir = File(androidSnaptestingDir, "failures") + internal val recordedDir = File(androidSnaptestingDir, "recorded") + internal val goldenFilesDir = "android-snaptesting-golden-files" +} diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogComparator.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogComparator.kt similarity index 94% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogComparator.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogComparator.kt index e70cdd1..de5abdf 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogComparator.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogComparator.kt @@ -1,4 +1,4 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.logs import java.lang.StringBuilder diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogsRecorder.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogsRecorder.kt similarity index 70% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogsRecorder.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogsRecorder.kt index 307ec12..68332f6 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogsRecorder.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogsRecorder.kt @@ -1,4 +1,4 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.logs public interface LogsRecorder { public fun clear() diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogsRule.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogsRule.kt similarity index 66% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogsRule.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogsRule.kt index 62a3954..5149a1f 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/LogsRule.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/LogsRule.kt @@ -1,7 +1,8 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.logs -import android.os.Environment import androidx.test.platform.app.InstrumentationRegistry +import com.telefonica.androidsnaptesting.Directories +import com.telefonica.androidsnaptesting.IgnoreLogs import org.junit.rules.TestWatcher import org.junit.runner.Description import java.io.File @@ -24,24 +25,17 @@ public open class GenericLogsRule( private val comparator: LogComparator = DefaultLogComparator(), ) : TestWatcher() { - private val context = InstrumentationRegistry.getInstrumentation().context - - private val downloadDir = File( - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath - ) - private val androidSnaptestingDir = File(downloadDir, "android-snaptesting/${context.packageName}") - private val failuresDir = File(androidSnaptestingDir, "failures") - private val recordedDir = File(androidSnaptestingDir, "recorded") + private val directories = Directories() override fun starting(description: Description?) { super.starting(description) recorder.clear() - if (!failuresDir.exists()) { - failuresDir.mkdirs() + if (!directories.failuresDir.exists()) { + directories.failuresDir.mkdirs() } - if (!recordedDir.exists()) { - recordedDir.mkdirs() + if (!directories.recordedDir.exists()) { + directories.recordedDir.mkdirs() } } @@ -55,23 +49,20 @@ public open class GenericLogsRule( val recordedLogs = recorder.getRecordedLogs() val log = recordedLogs.joinToString("\n") { stringMapper.fromLog(it) } - val testFile = File(recordedDir, fileName) + val testFile = File(directories.recordedDir, fileName) testFile.createNewFile() testFile.writeText(log) if (InstrumentationRegistry.getArguments().getString("record") != "true" && !isTestIgnored) { - val goldenFile = - InstrumentationRegistry.getInstrumentation().context.assets.open( - "android-snaptesting-golden-files/${testName}.txt" - ) + val goldenFile = directories.context.assets.open("${directories.goldenFilesDir}/${testName}.txt") val goldenStringLogs = String(goldenFile.readBytes()).takeIf { it.isNotEmpty() }?.split("\n") ?: emptyList() val result = comparator.compare(recordedLogs, goldenStringLogs.map { stringMapper.toLog(it) }) if (result != null) { - val compareFile = File(failuresDir, fileName) + val compareFile = File(directories.failuresDir, fileName) compareFile.createNewFile() compareFile.writeText(result) throw AssertionError("Logs do not match:\n$result") } } } -} \ No newline at end of file +} diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/StringMapper.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/StringMapper.kt similarity index 74% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/StringMapper.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/StringMapper.kt index 6168562..5f676ec 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/StringMapper.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/logs/StringMapper.kt @@ -1,4 +1,4 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.logs public interface StringMapper { public fun fromLog(log: LogType): String diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/BitmapImage.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/BitmapImage.kt similarity index 91% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/BitmapImage.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/BitmapImage.kt index 3be619d..0ecc390 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/BitmapImage.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/BitmapImage.kt @@ -1,4 +1,4 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.screenshots import android.graphics.Bitmap import com.dropbox.differ.Color diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/ResultValidator.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/ResultValidator.kt similarity index 94% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/ResultValidator.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/ResultValidator.kt index a920285..8fff86c 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/ResultValidator.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/ResultValidator.kt @@ -1,4 +1,4 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.screenshots import com.dropbox.differ.ImageComparator import kotlin.math.roundToInt diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/ScreenshotsRule.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/ScreenshotsRule.kt similarity index 80% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/ScreenshotsRule.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/ScreenshotsRule.kt index cc56680..8e44a38 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/ScreenshotsRule.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/ScreenshotsRule.kt @@ -1,10 +1,9 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.screenshots import android.app.Activity import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Build -import android.os.Environment import androidx.annotation.RequiresApi import androidx.compose.ui.graphics.asAndroidBitmap import androidx.compose.ui.test.captureToImage @@ -15,6 +14,8 @@ import androidx.test.runner.screenshot.Screenshot import com.dropbox.differ.ImageComparator import com.dropbox.differ.Mask import com.dropbox.differ.SimpleImageComparator +import com.telefonica.androidsnaptesting.Directories +import com.telefonica.androidsnaptesting.IgnoreScreenshots import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement @@ -31,24 +32,18 @@ public class ScreenshotsRule( private var isTestIgnored: Boolean = false private val writeDiffImage = WriteDiffImage() - private val context = InstrumentationRegistry.getInstrumentation().context - private val downloadDir = File( - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath - ) - private val androidSnaptestingDir = File(downloadDir, "android-snaptesting/${context.packageName}") - private val failuresDir = File(androidSnaptestingDir, "failures") - private val recordedDir = File(androidSnaptestingDir, "recorded") + private val directories = Directories() override fun apply(base: Statement, description: Description): Statement { className = description.className testName = description.methodName isTestIgnored = description.getAnnotation(IgnoreScreenshots::class.java) != null - if (!failuresDir.exists()) { - failuresDir.mkdirs() + if (!directories.failuresDir.exists()) { + directories.failuresDir.mkdirs() } - if (!recordedDir.exists()) { - recordedDir.mkdirs() + if (!directories.recordedDir.exists()) { + directories.recordedDir.mkdirs() } return base } @@ -88,7 +83,7 @@ public class ScreenshotsRule( } private fun saveScreenshot(fileName: String, bitmap: Bitmap) { - val testFile = File(recordedDir, fileName) + val testFile = File(directories.recordedDir, fileName) testFile.createNewFile() testFile.outputStream().use { bitmap.compress(Bitmap.CompressFormat.PNG, 100, it) @@ -97,7 +92,7 @@ public class ScreenshotsRule( private fun getGoldenBitmap(resourceName: String): Bitmap { val goldenBitmap = try { - context.assets.open("android-snaptesting-golden-files/$resourceName").use { + directories.context.assets.open("${directories.goldenFilesDir}/$resourceName").use { BitmapFactory.decodeStream(it) } } catch (e: FileNotFoundException) { @@ -116,7 +111,7 @@ public class ScreenshotsRule( name: String? ) { if (bitmap.width != goldenBitmap.width || bitmap.height != goldenBitmap.height) { - writeDiffImage(failuresDir, fileName, bitmap, goldenBitmap, null) + writeDiffImage(directories.failuresDir, fileName, bitmap, goldenBitmap, null) throw AssertionError( "$name: Test image (w=${bitmap.width}, h=${bitmap.height}) differs in size" + " from reference image (w=${goldenBitmap.width}, h=${goldenBitmap.height}).\n", @@ -134,12 +129,12 @@ public class ScreenshotsRule( val result = try { imageComparator.compare(BitmapImage(goldenBitmap), BitmapImage(bitmap), mask) } catch (e: IllegalArgumentException) { - writeDiffImage(failuresDir, fileName, bitmap, goldenBitmap, mask) + writeDiffImage(directories.failuresDir, fileName, bitmap, goldenBitmap, mask) throw AssertionError("Failed to compare images", e) } if (!resultValidator(result)) { - writeDiffImage(failuresDir, fileName, bitmap, goldenBitmap, mask) + writeDiffImage(directories.failuresDir, fileName, bitmap, goldenBitmap, mask) throw AssertionError( "\"$resourceName\" failed to match reference image. ${result.pixelDifferences} pixels differ " + "(${(result.pixelDifferences / result.pixelCount.toFloat()) * 100} %)" diff --git a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/WriteDiffImage.kt b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/WriteDiffImage.kt similarity index 97% rename from android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/WriteDiffImage.kt rename to android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/WriteDiffImage.kt index 9395fc9..5b65ed7 100644 --- a/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/WriteDiffImage.kt +++ b/android-snaptesting/src/main/java/com/telefonica/androidsnaptesting/screenshots/WriteDiffImage.kt @@ -1,4 +1,4 @@ -package com.telefonica.androidsnaptesting +package com.telefonica.androidsnaptesting.screenshots import android.graphics.Bitmap import android.graphics.Canvas