From 55d50c3e1d38375d2771488a27399cd17965ba3f Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 15 Jun 2026 11:24:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20clampExpiryDays=20?= =?UTF-8?q?=E7=BA=AF=E5=87=BD=E6=95=B0=E9=92=B3=E5=88=B6=E4=BF=9D=E8=B4=A8?= =?UTF-8?q?=E6=9C=9F=E5=A4=A9=E6=95=B0=E4=B8=BA=E9=9D=9E=E8=B4=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plus/rua/project/ui/DateCheckerScreen.kt | 11 +++++++ .../project/ui/DateCheckerScreenLogicTest.kt | 29 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 core/src/test/kotlin/plus/rua/project/ui/DateCheckerScreenLogicTest.kt diff --git a/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt b/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt index e876a68..2dd3811 100644 --- a/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt +++ b/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt @@ -745,6 +745,17 @@ private fun ArrowRightIcon(color: Color, modifier: Modifier = Modifier) { // region Helpers +/** + * 将保质期天数钳制到合法范围 [0, +∞)。 + * + * 天数语义上不能为负(到期日不应早于生产日期)。 + * 无论来自天数输入框还是日期选择器,写入 [ExpiryRow.days] 前都应经过此函数。 + * + * @param days 原始天数 + * @return 钳制后的天数,最小为 0 + */ +fun clampExpiryDays(days: Int): Int = days.coerceAtLeast(0) + private fun LocalDate.toEpochMillis(): Long = this.atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds() diff --git a/core/src/test/kotlin/plus/rua/project/ui/DateCheckerScreenLogicTest.kt b/core/src/test/kotlin/plus/rua/project/ui/DateCheckerScreenLogicTest.kt new file mode 100644 index 0000000..660491c --- /dev/null +++ b/core/src/test/kotlin/plus/rua/project/ui/DateCheckerScreenLogicTest.kt @@ -0,0 +1,29 @@ +package plus.rua.project.ui + +import kotlin.test.Test +import kotlin.test.assertEquals + +class DateCheckerScreenLogicTest { + + // ---- clampExpiryDays ---- + + @Test + fun clampExpiryDays_positiveValue_unchanged() { + assertEquals(30, clampExpiryDays(30)) + } + + @Test + fun clampExpiryDays_zero_unchanged() { + assertEquals(0, clampExpiryDays(0)) + } + + @Test + fun clampExpiryDays_negativeValue_clampedToZero() { + assertEquals(0, clampExpiryDays(-1)) + } + + @Test + fun clampExpiryDays_largeNegative_clampedToZero() { + assertEquals(0, clampExpiryDays(-365)) + } +}