feat: 完善星表查询与跨版本回归验证
- 将星表名称数据收敛为 TSV/GZIP 单一数据源,补充中文名、别名、英文常用名及宿/垣区域字段 - 增加星表名称表加载校验、旧详情字段一致性校验和 GZIP 漂移检查 - 新增 StarDataByName、StarDataByNameAll、StarDataByNameIn ,统一中英文查询与重名消歧 - 优化日月食半影带、升落曲线和可见性回归测试,补充极区、拓扑及低精度场景覆盖 - 增加 Go 1.16/386 兼容门禁和测试案例,处理旧工具链的分配、拓扑、SVG字节及 ULP 差异 - 补充星表、坐标、日月食和低精度回归用例,完善测试文件与缓存忽略规则
This commit is contained in:
+18
-2
@@ -175,9 +175,25 @@ func StarDataByHR(hr int) (basic.StarData, error) {
|
||||
return basic.StarDataByHR(hr)
|
||||
}
|
||||
|
||||
// StarDataByName 按中文名查询恒星数据 / returns star data by Chinese name.
|
||||
// ErrStarNotFound 未找到匹配的恒星 / no matching star.
|
||||
var ErrStarNotFound = basic.ErrStarNotFound
|
||||
|
||||
// ErrStarNameAmbiguous 星名对应多颗恒星 / the star name matches more than one star.
|
||||
var ErrStarNameAmbiguous = basic.ErrStarNameAmbiguous
|
||||
|
||||
// StarDataByName 按中文名、中文别名或英文常用名查唯一恒星;同名多星返回 ErrStarNameAmbiguous / returns the unique star by Chinese name, alias or English common name, or ErrStarNameAmbiguous for duplicate names.
|
||||
func StarDataByName(name string) (basic.StarData, error) {
|
||||
return basic.StarDataByChinese(name)
|
||||
return basic.StarDataByName(name)
|
||||
}
|
||||
|
||||
// StarDataByNameAll 返回中文名、别名或英文常用名的全部候选,按 HR 升序 / all candidates by HR order.
|
||||
func StarDataByNameAll(name string) ([]basic.StarData, error) {
|
||||
return basic.StarDataByNameAll(name)
|
||||
}
|
||||
|
||||
// StarDataByNameIn 按中文名、别名或英文常用名与宿/垣限定查询唯一恒星 / returns the unique star within a mansion or enclosure.
|
||||
func StarDataByNameIn(name, region string) (basic.StarData, error) {
|
||||
return basic.StarDataByNameIn(name, region)
|
||||
}
|
||||
|
||||
// TopBrightStars 明亮恒星样本 / bright-star sample list.
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package star
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestStarDataByNameAmbiguity(t *testing.T) {
|
||||
if err := InitStarDatabase(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := StarDataByName("杵增一"); !errors.Is(err, ErrStarNameAmbiguous) {
|
||||
t.Fatalf("StarDataByName(杵增一) error = %v, want ErrStarNameAmbiguous", err)
|
||||
}
|
||||
if _, err := StarDataByName("不存在的星名"); !errors.Is(err, ErrStarNotFound) {
|
||||
t.Fatalf("StarDataByName(不存在的星名) error = %v, want ErrStarNotFound", err)
|
||||
}
|
||||
if _, err := StarDataByNameIn("杵增一", ""); !errors.Is(err, ErrStarNameAmbiguous) {
|
||||
t.Fatalf("StarDataByNameIn(杵增一, \"\") error = %v, want ErrStarNameAmbiguous", err)
|
||||
}
|
||||
matches, err := StarDataByNameAll("杵增一")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(matches) != 2 || matches[0].HR != 6743 || matches[1].HR != 8449 {
|
||||
t.Fatalf("StarDataByNameAll(杵增一) = %v, want HR 6743 and 8449", matches)
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
region string
|
||||
hr uint16
|
||||
}{
|
||||
{"杵增一", "箕宿", 6743},
|
||||
{"杵增一", "危宿", 8449},
|
||||
{"杵一", "箕宿", 6537},
|
||||
{"杵一", "危宿", 8498},
|
||||
}
|
||||
for _, tc := range tests {
|
||||
got, err := StarDataByNameIn(tc.name, tc.region)
|
||||
if err != nil {
|
||||
t.Fatalf("StarDataByNameIn(%q, %q): %v", tc.name, tc.region, err)
|
||||
}
|
||||
if got.HR != tc.hr || got.ChineseRegion != tc.region {
|
||||
t.Fatalf("StarDataByNameIn(%q, %q) = HR %d region %q, want HR %d region %q",
|
||||
tc.name, tc.region, got.HR, got.ChineseRegion, tc.hr, tc.region)
|
||||
}
|
||||
}
|
||||
english, err := StarDataByName("sirius")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if english.HR != 2491 {
|
||||
t.Fatalf("StarDataByName(sirius) = HR %d, want 2491", english.HR)
|
||||
}
|
||||
if _, err := StarDataByName("Gienah"); !errors.Is(err, ErrStarNameAmbiguous) {
|
||||
t.Fatalf("StarDataByName(Gienah) error = %v, want ErrStarNameAmbiguous", err)
|
||||
}
|
||||
|
||||
got, err := StarDataByName("杵增一[危宿]")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got.HR != 8449 {
|
||||
t.Fatalf("StarDataByName(杵增一[危宿]) = HR %d, want 8449", got.HR)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user