103 lines
3.2 KiB
Go
103 lines
3.2 KiB
Go
|
|
package calendar
|
||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// 年号表的每条记录都必须带朝代,否则 LunarInfo.Dynasty 会随该条记录变空。
|
||
|
|
// Every era-table record must carry a dynasty, otherwise LunarInfo.Dynasty goes empty for that record.
|
||
|
|
func TestEraTablesCarryDynasty(t *testing.T) {
|
||
|
|
tables := map[string][]Era{
|
||
|
|
"hanEras": hanEras(),
|
||
|
|
"weiJinNanBeiChaoEras": weiJinNanBeiChaoEras(),
|
||
|
|
"tangEras": tangEras(),
|
||
|
|
"wudaiSongYuanEras": wudaiSongYuanEras(),
|
||
|
|
"mingQingEras": mingQingEras(),
|
||
|
|
"liaoJinYuanEras": liaoJinYuanEras(),
|
||
|
|
"houQinEras": houQinEras(),
|
||
|
|
"weiZhouSuiEras": weiZhouSuiEras(),
|
||
|
|
"beiLiangEras": beiLiangEras(),
|
||
|
|
"dongWeiBeiQiEras": dongWeiBeiQiEras(),
|
||
|
|
"shuEras": shuEras(),
|
||
|
|
"wuEras": wuEras(),
|
||
|
|
"nanMingEras01": nanMingEras01(),
|
||
|
|
"nanMingEras02": nanMingEras02(),
|
||
|
|
"zhouAncientEras": zhouAncientEras,
|
||
|
|
"luAncientEras": luAncientEras,
|
||
|
|
"qinWarringAncientEras": qinWarringAncientEras,
|
||
|
|
"qinHanAncientEras": qinHanAncientEras,
|
||
|
|
}
|
||
|
|
for name, eras := range tables {
|
||
|
|
for i, e := range eras {
|
||
|
|
if e.Dynasty == "" {
|
||
|
|
t.Errorf("%s[%d]: Year=%d Emperor=%q Nianhao=%q OtherNianHaoStart=%q has empty Dynasty", name, i, e.Year, e.Emperor, e.Nianhao, e.OtherNianHaoStart)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestXijinYongxingDynasty(t *testing.T) {
|
||
|
|
got, err := SolarToLunarByYMD(304, 6, 1)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("SolarToLunarByYMD(304,6,1) error: %v", err)
|
||
|
|
}
|
||
|
|
info := got.LunarInfo()
|
||
|
|
if len(info) == 0 {
|
||
|
|
t.Fatal("no lunar info")
|
||
|
|
}
|
||
|
|
for _, li := range info {
|
||
|
|
if li.Nianhao == "永兴" && li.Dynasty != "西晋" {
|
||
|
|
t.Errorf("永兴 record dynasty = %q, want 西晋", li.Dynasty)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if got.Lunar().Eras()[0].Dynasty != "西晋" {
|
||
|
|
t.Errorf("primary dynasty = %q, want 西晋", got.Lunar().Eras()[0].Dynasty)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 补充年号分支在农历年早于该表首年时,曾追加一条与主流日期完全相同却没有朝代的候选。
|
||
|
|
func TestSupplementLunarsCarryDynasty(t *testing.T) {
|
||
|
|
for _, d := range [][3]int{
|
||
|
|
{221, 1, 5}, {222, 1, 5}, {384, 1, 5}, {397, 1, 5}, {534, 1, 5},
|
||
|
|
{1647, 1, 1}, {1648, 1, 1},
|
||
|
|
} {
|
||
|
|
got, err := SolarToLunarByYMD(d[0], d[1], d[2])
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("%v error: %v", d, err)
|
||
|
|
}
|
||
|
|
for i, l := range got.Lunars() {
|
||
|
|
if len(l.Eras()) == 0 {
|
||
|
|
t.Errorf("%v record %d: no era", d, i)
|
||
|
|
}
|
||
|
|
for _, info := range l.LunarInfo() {
|
||
|
|
if info.Dynasty == "" {
|
||
|
|
t.Errorf("%v record %d: empty dynasty (%q)", d, i, info.EraDesc)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 永历年号表只有一条记录,曾因 innerEras 把“年==表首年”的唯一命中放进 secEra 而整条丢失。
|
||
|
|
func TestYongliFirstYear(t *testing.T) {
|
||
|
|
for _, d := range [][3]int{{1647, 6, 1}, {1648, 1, 1}} {
|
||
|
|
got, err := SolarToLunarByYMD(d[0], d[1], d[2])
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("%v error: %v", d, err)
|
||
|
|
}
|
||
|
|
found := false
|
||
|
|
for _, info := range got.LunarInfo() {
|
||
|
|
if info.Nianhao != "永历" {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
found = true
|
||
|
|
if info.Dynasty != "南明" || info.Emperor != "南明/明郑" || info.YearOfNianhao != 1 {
|
||
|
|
t.Errorf("%v: 永历 record = %+v, want 南明/明郑 永历元年", d, info)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if !found {
|
||
|
|
t.Errorf("%v: 永历 record missing", d)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|