Files
astro/planet/spk/guard_test.go
T

85 lines
2.7 KiB
Go
Raw Normal View History

// 被测契约:畸形阶数与非有限系数报 ErrInvalidFile 而不是 panic 或返回 NaN;无关段的覆盖缺口不阻断有效路径。
package spk
import (
"encoding/binary"
"errors"
"math"
"testing"
"b612.me/astro/internal/ephem"
)
func type21Record(maxdim, kqmax1, kq int) []float64 {
record := make([]float64, 4*maxdim+12)
record[0] = float64(maxdim)
for index := 0; index < maxdim; index++ {
record[2+index] = 1
}
record[4*maxdim+8] = float64(kqmax1)
for component := 0; component < 3; component++ {
record[4*maxdim+9+component] = float64(kq)
}
return record
}
func TestType21RejectsInconsistentOrders(t *testing.T) {
cases := []struct{ maxdim, kqmax1, kq int }{
{15, 3, 15},
{15, 27, 1},
{15, 17, 1},
{15, 5, 5},
}
for _, c := range cases {
_, _, err := evaluateType21(0, type21Record(c.maxdim, c.kqmax1, c.kq))
if !errors.Is(err, ErrInvalidFile) {
t.Errorf("maxdim=%d kqmax1=%d kq=%d: err = %v, want %v", c.maxdim, c.kqmax1, c.kq, err, ErrInvalidFile)
}
}
if _, _, err := evaluateType21(0, type21Record(15, 16, 15)); err != nil {
t.Errorf("maximal valid orders: err = %v", err)
}
}
func TestType21RejectsNonFiniteRecord(t *testing.T) {
record := type21Record(15, 3, 1)
record[15+2] = math.NaN()
if _, _, err := evaluateType21(0, record); !errors.Is(err, ErrInvalidFile) {
t.Errorf("err = %v, want %v", err, ErrInvalidFile)
}
}
func TestType2RejectsNonFiniteCoefficient(t *testing.T) {
path := writeTestSPK(t, binary.LittleEndian, "LTL-IEEE",
testSPKSegment{target: Mars, center: Sun, frame: 1, typ: 2, start: 0, end: 10, words: type2Words(0, 10, []float64{5, 5, math.NaN(), 20, 30})},
)
file, err := Open(path)
if err != nil {
t.Fatal(err)
}
defer file.Close()
if _, _, err := file.State(Mars, Sun, spkJ2000+5/spkSecondsDay); !errors.Is(err, ErrInvalidFile) {
t.Errorf("err = %v, want %v", err, ErrInvalidFile)
}
}
func TestUnrelatedSegmentCoverageDoesNotBlockDirectPath(t *testing.T) {
path := writeTestSPK(t, binary.LittleEndian, "LTL-IEEE",
testSPKSegment{target: Mars, center: Sun, frame: 1, typ: 2, start: 0, end: 10, words: type2Words(0, 10, []float64{5, 5, 10, 20, 30})},
testSPKSegment{target: Sun, center: SSB, frame: 1, typ: 2, start: 100, end: 110, words: type2Words(100, 10, []float64{105, 5, 1, 2, 3})},
)
file, err := Open(path)
if err != nil {
t.Fatal(err)
}
defer file.Close()
pos, _, err := file.State(Mars, Sun, spkJ2000+5/spkSecondsDay)
if err != nil {
t.Fatalf("Mars→Sun err = %v", err)
}
assertVector(t, pos, [3]float64{10, 20, 30})
if _, _, err := file.State(Mars, SSB, spkJ2000+5/spkSecondsDay); err != ephem.ErrOutOfRange {
t.Errorf("Mars→SSB err = %v, want %v", err, ephem.ErrOutOfRange)
}
}