package com.peachpasswords.ui.codex import com.peachpasswords.codex.CodexCodec import com.peachpasswords.codex.CodexErrorCode import org.junit.Assert.assertEquals import org.junit.Test import kotlin.random.Random class CodexRestoreStateTest { @Test fun codexRestoreShortfall_reportsMissingCodeCounts() { val rng = Random(36) val compressed = CodexCodec.deflate(ByteArray(5000) { rng.nextInt().toByte() }) val (envelopes, layout) = CodexCodec.encodeToEnvelopes(compressed, "PX-TEST-0001") val parityInFirstStripe = layout.parityChunks / layout.stripeCount val survivors = envelopes .filterNot { it.s == 0 && it.i <= parityInFirstStripe } val shortfall = codexRestoreShortfall(survivors) assertEquals(layout.totalChunks - parityInFirstStripe - 1, shortfall?.found) assertEquals(1, shortfall?.missing) assertEquals(0, shortfall?.ready) assertEquals(layout.stripeCount, shortfall?.total) } @Test fun codexRestoreErrorMessage_matchesBrowserRestoreCopy() { assertEquals( "wrong master password. try again.", codexRestoreErrorMessage(CodexErrorCode.RESTORE_FAILED, "WRONG_PASSPHRASE"), ) assertEquals( "the reconstructed vault is unreadable. please re-scan the Codex.", codexRestoreErrorMessage(CodexErrorCode.INVALID_VAULT_BLOB, null), ) assertEquals( "vault integrity check failed. please re-scan the Codex.", codexRestoreErrorMessage(CodexErrorCode.RECONSTRUCTION_FINGERPRINT_MISMATCH, null), ) assertEquals( "no Codex codes found in this PDF. make sure you're selecting a Peach Codex PDF, not a different document.", codexRestoreErrorMessage(CodexErrorCode.INSUFFICIENT_CHUNKS, "No Aztec codes could be read from this file"), ) assertEquals( "restoration failed. please try again.", codexRestoreErrorMessage(CodexErrorCode.RESTORE_FAILED, null), ) } }