- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
73 lines
2.4 KiB
Go
73 lines
2.4 KiB
Go
package basic
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/json"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
type constellationBaselineSample struct {
|
|
RA float64 `json:"ra"`
|
|
Dec float64 `json:"dec"`
|
|
JDE float64 `json:"jde"`
|
|
Code string `json:"code"`
|
|
ZH string `json:"zh"`
|
|
}
|
|
|
|
//go:embed testdata/cst_baseline.json
|
|
var constellationBaselineJSON []byte
|
|
|
|
func loadCstBaseline(t *testing.T) []constellationBaselineSample {
|
|
t.Helper()
|
|
var samples []constellationBaselineSample
|
|
if err := json.Unmarshal(constellationBaselineJSON, &samples); err != nil {
|
|
t.Fatalf("unmarshal constellation baseline: %v", err)
|
|
}
|
|
return samples
|
|
}
|
|
|
|
func TestConstellationBaseline(t *testing.T) {
|
|
samples := loadCstBaseline(t)
|
|
for index, sample := range samples {
|
|
if code := resolveConstellationCode(sample.RA, sample.Dec, sample.JDE); code != sample.Code {
|
|
t.Fatalf("sample %d code mismatch: ra=%.6f dec=%.6f jde=%.6f got=%q want=%q", index, sample.RA, sample.Dec, sample.JDE, code, sample.Code)
|
|
}
|
|
if code := ConstellationCode(sample.RA, sample.Dec, sample.JDE); code != sample.Code {
|
|
t.Fatalf("sample %d wrapper mismatch: ra=%.6f dec=%.6f jde=%.6f got=%q want=%q", index, sample.RA, sample.Dec, sample.JDE, code, sample.Code)
|
|
}
|
|
if zh := ConstellationNameZH(sample.RA, sample.Dec, sample.JDE); zh != sample.ZH {
|
|
t.Fatalf("sample %d zh mismatch: ra=%.6f dec=%.6f jde=%.6f got=%q want=%q", index, sample.RA, sample.Dec, sample.JDE, zh, sample.ZH)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestConstellationNameLookups(t *testing.T) {
|
|
tests := []struct {
|
|
code string
|
|
zh string
|
|
en string
|
|
}{
|
|
{code: "ORI", zh: "猎户座", en: "Orion"},
|
|
{code: "PSC", zh: "双鱼座", en: "Pisces"},
|
|
{code: "SER1", zh: "巨蛇座", en: "Serpens Caput"},
|
|
{code: "SER2", zh: "巨蛇座", en: "Serpens Cauda"},
|
|
{code: "UMI", zh: "小熊座", en: "Ursa Minor"},
|
|
}
|
|
for _, testCase := range tests {
|
|
if zh := ConstellationNameByCodeZH(testCase.code); zh != testCase.zh {
|
|
t.Fatalf("ConstellationNameByCodeZH(%q) = %q, want %q", testCase.code, zh, testCase.zh)
|
|
}
|
|
if en := ConstellationNameByCodeEN(testCase.code); en != testCase.en {
|
|
t.Fatalf("ConstellationNameByCodeEN(%q) = %q, want %q", testCase.code, en, testCase.en)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestConstellationNameEN(t *testing.T) {
|
|
jde := Date2JDE(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC))
|
|
if en := ConstellationNameEN(88.792939, 7.407064, jde); en != "Orion" {
|
|
t.Fatalf("ConstellationNameEN() = %q, want %q", en, "Orion")
|
|
}
|
|
}
|