Add app/src/test/java/space/bloggin/mercies

This commit is contained in:
2026-10-19 02:23:07 +00:00
parent 86c37a8722
commit 5f594d2049
@@ -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<MainActivity>()
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) }
}
}
}