1package com.peachpasswords.ui.vault23import com.peachpasswords.vault.PasswordGenerator4import org.junit.Assert.assertEquals5import org.junit.Assert.assertFalse6import org.junit.Assert.assertTrue7import org.junit.Test891011121314class EntryEditExtraTest {1516 1718 @Test fun network_detected_from_first_digit() {19 assertEquals("visa", CardFieldUtils.detectNetwork("4111111111111111"))20 assertEquals("mastercard", CardFieldUtils.detectNetwork("5500000000000004"))21 assertEquals("amex", CardFieldUtils.detectNetwork("378282246310005"))22 assertEquals("discover", CardFieldUtils.detectNetwork("6011000000000004"))23 assertEquals("unknown", CardFieldUtils.detectNetwork("9999"))24 assertEquals("unknown", CardFieldUtils.detectNetwork(""))25 }2627 @Test fun network_label_is_human_readable() {28 assertEquals("Visa", CardFieldUtils.networkLabel("visa"))29 assertEquals("Mastercard", CardFieldUtils.networkLabel("mastercard"))30 assertEquals("Amex", CardFieldUtils.networkLabel("amex"))31 assertEquals("Discover", CardFieldUtils.networkLabel("discover"))32 assertEquals("", CardFieldUtils.networkLabel("unknown"))33 assertEquals("", CardFieldUtils.networkLabel(null))34 }3536 3738 @Test fun pan_max_digits_amex_is_15_others_16() {39 assertEquals(15, CardFieldUtils.panMaxDigits("amex"))40 assertEquals(16, CardFieldUtils.panMaxDigits("visa"))41 assertEquals(16, CardFieldUtils.panMaxDigits(null))42 }4344 @Test fun cvc_max_digits_amex_is_4_others_3() {45 assertEquals(4, CardFieldUtils.cvcMaxDigits("amex"))46 assertEquals(3, CardFieldUtils.cvcMaxDigits("visa"))47 }4849 @Test fun format_pan_caps_at_network_max() {50 51 assertEquals("4242 4242 4242 4242", CardFieldUtils.formatPan("42424242424242424242"))52 }5354 @Test fun format_pan_strips_non_digits() {55 assertEquals("4242 4242", CardFieldUtils.formatPan("4242-4242"))56 }5758 @Test fun last4_extracts_trailing_digits() {59 assertEquals("4242", CardFieldUtils.last4("4242 4242 4242 4242"))60 assertEquals("", CardFieldUtils.last4(null))61 }6263 6465 @Test fun expiry_valid_in_future() {66 assertTrue(CardFieldUtils.isExpiryValid("06/26", currentYear2 = 26, currentMonth = 6)) 67 assertTrue(CardFieldUtils.isExpiryValid("01/30", currentYear2 = 26, currentMonth = 6))68 }6970 @Test fun expiry_rejects_past_month_this_year() {71 assertFalse(CardFieldUtils.isExpiryValid("05/26", currentYear2 = 26, currentMonth = 6))72 }7374 @Test fun expiry_rejects_bad_month() {75 assertFalse(CardFieldUtils.isExpiryValid("13/30", currentYear2 = 26, currentMonth = 6))76 assertFalse(CardFieldUtils.isExpiryValid("00/30", currentYear2 = 26, currentMonth = 6))77 }7879 @Test fun expiry_rejects_incomplete() {80 assertFalse(CardFieldUtils.isExpiryValid("6/2", currentYear2 = 26, currentMonth = 6))81 }8283 8485 @Test fun generator_respects_length() {86 val pw = PasswordGenerator.generate(PasswordGenerator.Options(length = 24))87 assertEquals(24, pw.length)88 }8990 @Test fun generator_with_only_digits_yields_digits() {91 val pw = PasswordGenerator.generate(92 PasswordGenerator.Options(93 length = 20, includeUppercase = false, includeLowercase = false,94 includeNumbers = true, includeSymbols = false,95 ),96 )97 assertTrue(pw.all { it.isDigit() })98 }99100 @Test fun generator_produces_distinct_passwords() {101 val a = PasswordGenerator.generate(PasswordGenerator.Options(length = 32))102 val b = PasswordGenerator.generate(PasswordGenerator.Options(length = 32))103 assertFalse("two generated passwords should differ", a == b)104 }105}