From f33e68d1dbc08275842a17ff954621a07c7fbe2c Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 15 Jun 2026 16:16:09 +0800 Subject: [PATCH] feat: compute birthday flag in LunarCache --- .../kotlin/plus/rua/project/LunarCache.kt | 17 +++++++---- .../rua/project/LunarCacheBirthdayTest.kt | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 core/src/test/kotlin/plus/rua/project/LunarCacheBirthdayTest.kt diff --git a/core/src/main/kotlin/plus/rua/project/LunarCache.kt b/core/src/main/kotlin/plus/rua/project/LunarCache.kt index 3199e23..5ab13af 100644 --- a/core/src/main/kotlin/plus/rua/project/LunarCache.kt +++ b/core/src/main/kotlin/plus/rua/project/LunarCache.kt @@ -75,23 +75,28 @@ class LunarCache( val lunarDay = solarDay.getLunarDay() val lunarMonth = lunarDay.getLunarMonth() val lunarMonthName = lunarMonth.getName() + // 阳历生日:每年 9 月 4 日 + val isSolarBirthday = date.month.number == 9 && date.day == 4 + // 农历生日:每年正月二十一(tyme4kt 中正月 indexInYear = 0) + val isLunarBirthday = lunarMonth.getIndexInYear() == 0 && lunarDay.day == 21 + val isBirthday = isSolarBirthday || isLunarBirthday // 农历传统节日(仅当天) val lunarFestival = lunarDay.getFestival() if (lunarFestival != null) { - return DayCellInfo(lunarFestival.getName(), true, holidayBadge, lunarMonthName) + return DayCellInfo(lunarFestival.getName(), true, holidayBadge, lunarMonthName, isBirthday) } // 节气(当天才显示) val termDay = solarDay.getTermDay() if (termDay.getDayIndex() == 0) { - return DayCellInfo(termDay.getSolarTerm().getName(), true, holidayBadge, lunarMonthName) + return DayCellInfo(termDay.getSolarTerm().getName(), true, holidayBadge, lunarMonthName, isBirthday) } // 公历节日(仅当天) val solarFestival = solarDay.getFestival() if (solarFestival != null) { - return DayCellInfo(solarFestival.getName(), true, holidayBadge, lunarMonthName) + return DayCellInfo(solarFestival.getName(), true, holidayBadge, lunarMonthName, isBirthday) } // 默认:农历日期 @@ -101,7 +106,7 @@ class LunarCache( } else { name } - return DayCellInfo(text, false, holidayBadge, lunarMonthName) + return DayCellInfo(text, false, holidayBadge, lunarMonthName, isBirthday) } companion object { @@ -116,10 +121,12 @@ class LunarCache( * @param annotationText 底部标注文字(农历/节气/节日) * @param isAnnotationHighlight 是否为高亮标注(节日/节气) * @param holidayBadge 法定调休角标("班"/"休"/null) + * @param isBirthday 是否为生日 */ data class DayCellInfo( val annotationText: String, val isAnnotationHighlight: Boolean, val holidayBadge: String?, - val lunarMonthName: String? = null + val lunarMonthName: String? = null, + val isBirthday: Boolean = false ) diff --git a/core/src/test/kotlin/plus/rua/project/LunarCacheBirthdayTest.kt b/core/src/test/kotlin/plus/rua/project/LunarCacheBirthdayTest.kt new file mode 100644 index 0000000..bc7b01c --- /dev/null +++ b/core/src/test/kotlin/plus/rua/project/LunarCacheBirthdayTest.kt @@ -0,0 +1,30 @@ +package plus.rua.project + +import kotlinx.coroutines.test.runTest +import kotlinx.datetime.LocalDate +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class LunarCacheBirthdayTest { + private val cache = LunarCache() + + @Test + fun solarBirthdaySeptember4_returnsTrue() = runTest { + val info = cache.getOrCompute(LocalDate(2026, 9, 4)) + assertTrue("阳历 9 月 4 日应为生日", info.isBirthday) + } + + @Test + fun lunarBirthdayFirstMonthDay21_returnsTrue() = runTest { + // 2026 年农历正月二十一对应阳历 2026-03-09 + val info = cache.getOrCompute(LocalDate(2026, 3, 9)) + assertTrue("农历正月二十一应为生日", info.isBirthday) + } + + @Test + fun regularDate_returnsFalse() = runTest { + val info = cache.getOrCompute(LocalDate(2026, 6, 15)) + assertFalse("普通日期不应为生日", info.isBirthday) + } +}