85 lines
2.7 KiB
Go
85 lines
2.7 KiB
Go
|
|
// 被测契约:畸形阶数与非有限系数报 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)
|
||
|
|
}
|
||
|
|
}
|