PasswordGeneratorTest.kt

2.3 KB · raw

1package com.peachpasswords.vault23import org.junit.Assert.assertEquals4import org.junit.Assert.assertFalse5import org.junit.Assert.assertTrue6import org.junit.Test7import java.security.MessageDigest89class PasswordGeneratorTest {10    @Test fun respects_length() {11        repeat(20) { assertEquals(24, PasswordGenerator.generate(PasswordGenerator.Options(length = 24)).length) }12    }1314    @Test fun numbers_only_yields_only_digits() {15        val pw = PasswordGenerator.generate(16            PasswordGenerator.Options(length = 60, includeLowercase = false, includeUppercase = false,17                includeNumbers = true, includeSymbols = false),18        )19        assertTrue(pw.all { it.isDigit() })20    }2122    @Test fun forbidden_chars_are_excluded() {23        val pw = PasswordGenerator.generate(24            PasswordGenerator.Options(length = 200, forbiddenChars = "0O1lI"),25        )26        assertFalse(pw.any { it in "0O1lI" })27    }2829    @Test fun empty_charset_falls_back_to_lowercase() {30        val pw = PasswordGenerator.generate(31            PasswordGenerator.Options(length = 30, includeLowercase = false, includeUppercase = false,32                includeNumbers = false, includeSymbols = false),33        )34        assertEquals(30, pw.length)35        assertTrue(pw.all { it in 'a'..'z' })36    }3738    @Test fun passphrase_defaults_to_five_words() {39        assertEquals(5, PasswordGenerator.generatePassphrase().split("-").size)40    }4142    @Test fun passphrase_supports_four_through_twelve_words() {43        assertEquals(4, PasswordGenerator.generatePassphrase(wordCount = 4).split("-").size)44        assertEquals(12, PasswordGenerator.generatePassphrase(wordCount = 12).split("-").size)45    }4647    @Test fun passphrase_uses_the_selected_separator() {48        assertEquals(8, PasswordGenerator.generatePassphrase(wordCount = 8, separator = ".").split(".").size)49    }5051    @Test fun eff_short_word_list_matches_the_published_source() {52        val normalized = EffShortWordList.words.joinToString(separator = "\n", postfix = "\n")53        val digest = MessageDigest.getInstance("SHA-256")54            .digest(normalized.toByteArray())55            .joinToString("") { "%02x".format(it) }56        assertEquals(1296, EffShortWordList.words.size)57        assertEquals("36ecca49e4fa20ca84b176c32f2e9c82f98f446585190e75f9879a95c08247bf", digest)58    }59}