From 5f594d2049f1b7f4af984f956680eea200843a9f Mon Sep 17 00:00:00 2001 From: weishaupt <1+weishaupt@noreply.localhost> Date: Mon, 19 Oct 2026 02:23:07 +0000 Subject: [PATCH] Add app/src/test/java/space/bloggin/mercies --- .../java/space/bloggin/mercies/ShotsTest.kt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 app/src/test/java/space/bloggin/mercies/ShotsTest.kt diff --git a/app/src/test/java/space/bloggin/mercies/ShotsTest.kt b/app/src/test/java/space/bloggin/mercies/ShotsTest.kt new file mode 100644 index 0000000..57c45f3 --- /dev/null +++ b/app/src/test/java/space/bloggin/mercies/ShotsTest.kt @@ -0,0 +1,66 @@ +package space.bloggin.mercies + +import android.graphics.Bitmap +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onRoot +import com.github.takahirom.roborazzi.captureRoboImage +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.robolectric.annotation.GraphicsMode +import java.io.File +import java.time.LocalDate + +@RunWith(RobolectricTestRunner::class) +@GraphicsMode(GraphicsMode.Mode.NATIVE) +@Config(sdk = [34], qualifiers = "w411dp-h891dp-xxhdpi") +class ShotsTest { + @get:Rule val rule = createAndroidComposeRule() + private val out = File("build/shots").apply { mkdirs() } + private fun shot(n: String) { rule.waitForIdle(); rule.mainClock.advanceTimeBy(1500); rule.waitForIdle(); rule.onRoot().captureRoboImage(File(out, "$n.png").path) } + private fun ui(b: AppState.() -> Unit) { rule.runOnUiThread { rule.activity.state.b() }; rule.waitForIdle() } + + @Test fun all() { + shot("01_empty") + ui { + val today = LocalDate.now() + val samples = listOf("Coffee on the porch before anyone woke up.", "The grandkids called just to say hi.", "Riverbend's water main held through the freeze.", + "A stranger paid for my lunch.", "First snow, and the dog lost her mind with joy.", "She laughed at my dumb joke.", "Got the truck fixed for less than I feared.", + "Sunset over the cornfield on the drive home.", "Church potluck: three kinds of pie.", "Finished the Bible app. She loves it.") + for (i in 0 until 46) store.addNote(samples[i % samples.size], today.minusDays((46 - i).toLong() * 2)) + store.addNote("She was hope-scrolling in the other room.") + store.savePrayer(null, "Mom", "Lord, give her strength for the surgery on Thursday, steady hands for the doctors, and peace for all of us waiting.") + store.savePrayer(null, "the Miller family", "Comfort them in their loss, and surround them with people who will carry meals and sit with them.") + store.savePrayer(null, "", "Help me to be patient at work this week, and kind when I don't feel like it.") + store.savePrayer(null, "Jake", "Safe travels on the drive back to base.") + store.setAnswered(store.prayers(false).first { it.forWho == "Jake" }.id, true, "Made it home safe Sunday night") + } + shot("02_jar") + rule.runOnUiThread { rule.activity.state.store.markKind(1) } + ui { tab = 1 } + shot("03_kindness") + ui { tab = 2 } + shot("04_prayers") + ui { open(Over.EditPrayer(null)) } + shot("05_new_prayer") + ui { back(); open(Over.ShareCard(Card("A prayer for Mom", store.prayers(false).first { it.forWho == "Mom" }.text, "Simple Mercies"), "")) } + shot("06_share") + ui { back(); tab = 0; browsing = true } + shot("07_browse") + ui { browsing = false; prefs.night = true } + shot("08_night") + ui { prefs.night = false; prefs.look = 1; open(Over.Settings) } + shot("09_settings") + ui { back(); prefs.look = 2; tab = 2 } + shot("10_sage_prayers") + ui { prefs.look = 0 } + + val ctx = rule.activity + Shape.entries.forEachIndexed { i, s -> + val b = ShareKit.render(ctx, Card("A prayer for Mom", "Lord, give her strength for the surgery on Thursday, steady hands for the doctors, and peace for all of us waiting.", "Simple Mercies"), Looks.all[i], s) + File(out, "img_${s.name.lowercase()}.png").outputStream().use { b.compress(Bitmap.CompressFormat.PNG, 100, it) } + } + } +}