Files
astro/moon/svg/occultation_band_cache_test.go
T

91 lines
3.1 KiB
Go
Raw Normal View History

package svg
import (
"testing"
"time"
"b612.me/astro/moon"
)
// 本文件钉住紧凑掩带合并缓存的契约:同输入复用只读结果、不同几何不会串味、产物逐字节确定。
func occultationTestCompactSweep(t *testing.T) occultationFootprintSweep {
t.Helper()
path := occultationTestSaturnPath(t)
if len(path.PartialBandFootprints) == 0 {
t.Fatal("fixture carries no compact band footprints")
}
return occultationFootprintSweep{
footprints: path.PartialBandFootprints,
contours: path.PartialBandContours,
visibilityContours: path.PartialVisibilityContours,
northern: path.NorthernLimit,
southern: path.SouthernLimit,
curves: path.RiseSetCurves,
compactBand: true,
kind: partialOccultationFootprintSweep,
}
}
func TestOccultationBandCacheReusesIdenticalGeometry(t *testing.T) {
sweep := occultationTestCompactSweep(t)
first, firstAuthoritative, err := sweep.mergedBandPolygons()
if err != nil {
t.Fatalf("first mergedBandPolygons() error = %v", err)
}
if len(first) == 0 {
t.Fatal("compact band merge produced no polygon")
}
second, secondAuthoritative, err := sweep.mergedBandPolygons()
if err != nil {
t.Fatalf("second mergedBandPolygons() error = %v", err)
}
if len(second) != len(first) || &second[0][0] != &first[0][0] {
t.Fatal("identical band geometry was merged again instead of reusing the cached polygons")
}
if secondAuthoritative != firstAuthoritative {
t.Fatalf("cached authoritative flag = %v, want %v", secondAuthoritative, firstAuthoritative)
}
}
func TestOccultationBandCacheSeparatesDifferentGeometry(t *testing.T) {
sweep := occultationTestCompactSweep(t)
first, _, err := sweep.mergedBandPolygons()
if err != nil {
t.Fatalf("first mergedBandPolygons() error = %v", err)
}
mutated := sweep
mutated.footprints = append([]moon.PlanetOccultationFootprint(nil), sweep.footprints...)
last := len(mutated.footprints) - 1
mutated.footprints[last].Polygons = append([][]moon.OccultationPathPoint(nil), mutated.footprints[last].Polygons...)
polygon := append([]moon.OccultationPathPoint(nil), mutated.footprints[last].Polygons[0]...)
polygon[0].Longitude += 1.5
mutated.footprints[last].Polygons[0] = polygon
second, _, err := mutated.mergedBandPolygons()
if err != nil {
t.Fatalf("mutated mergedBandPolygons() error = %v", err)
}
if len(second) > 0 && len(first) > 0 && &second[0][0] == &first[0][0] {
t.Fatal("a shifted footprint reused the cached band polygons")
}
}
func TestCompactBandRenderIsDeterministic(t *testing.T) {
path := occultationTestSaturnPath(t)
options := StarOccultationSVGOptions{Width: 1200, Height: 800, Location: time.UTC}
first, err := PlanetOccultationPathSVG(path, options)
if err != nil {
t.Fatalf("first render: %v", err)
}
second, err := PlanetOccultationPathSVG(path, options)
if err != nil {
t.Fatalf("second render: %v", err)
}
if first != second {
t.Fatal("compact-band SVG changed between renders after the merge was cached")
}
if len(first) == 0 {
t.Fatal("compact-band render is empty")
}
}