feat: compute birthday flag in LunarCache

This commit is contained in:
xfy 2026-06-15 16:16:09 +08:00
parent 7404bdfc28
commit f33e68d1db
2 changed files with 42 additions and 5 deletions

View File

@ -75,23 +75,28 @@ class LunarCache(
val lunarDay = solarDay.getLunarDay() val lunarDay = solarDay.getLunarDay()
val lunarMonth = lunarDay.getLunarMonth() val lunarMonth = lunarDay.getLunarMonth()
val lunarMonthName = lunarMonth.getName() 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() val lunarFestival = lunarDay.getFestival()
if (lunarFestival != null) { if (lunarFestival != null) {
return DayCellInfo(lunarFestival.getName(), true, holidayBadge, lunarMonthName) return DayCellInfo(lunarFestival.getName(), true, holidayBadge, lunarMonthName, isBirthday)
} }
// 节气(当天才显示) // 节气(当天才显示)
val termDay = solarDay.getTermDay() val termDay = solarDay.getTermDay()
if (termDay.getDayIndex() == 0) { 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() val solarFestival = solarDay.getFestival()
if (solarFestival != null) { 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 { } else {
name name
} }
return DayCellInfo(text, false, holidayBadge, lunarMonthName) return DayCellInfo(text, false, holidayBadge, lunarMonthName, isBirthday)
} }
companion object { companion object {
@ -116,10 +121,12 @@ class LunarCache(
* @param annotationText 底部标注文字农历/节气/节日 * @param annotationText 底部标注文字农历/节气/节日
* @param isAnnotationHighlight 是否为高亮标注节日/节气 * @param isAnnotationHighlight 是否为高亮标注节日/节气
* @param holidayBadge 法定调休角标""/""/null * @param holidayBadge 法定调休角标""/""/null
* @param isBirthday 是否为生日
*/ */
data class DayCellInfo( data class DayCellInfo(
val annotationText: String, val annotationText: String,
val isAnnotationHighlight: Boolean, val isAnnotationHighlight: Boolean,
val holidayBadge: String?, val holidayBadge: String?,
val lunarMonthName: String? = null val lunarMonthName: String? = null,
val isBirthday: Boolean = false
) )

View File

@ -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)
}
}