feat: 扩展天文计算能力
- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user