package svg import ( "errors" "math" "strings" "testing" "time" "b612.me/astro/moon" ) func TestFindLocalStarOccultationSVGsHR4799(t *testing.T) { location := time.FixedZone("UTC+8", 8*3600) diagrams, err := FindLocalStarOccultationSVGs( time.Date(2025, 6, 5, 0, 0, 0, 0, location), time.Date(2025, 6, 6, 0, 0, 0, 0, location), hr4799StarCoordinate(), 121.56601, 6.80706, 0, moon.OccultationSearchOptions{}, LocalStarOccultationSVGOptions{Width: 720, Height: 560, Location: location}, ) if err != nil { t.Fatalf("FindLocalStarOccultationSVGs() error = %v", err) } if len(diagrams) != 1 { t.Fatalf("FindLocalStarOccultationSVGs() returned %d diagrams, want 1", len(diagrams)) } diagram := diagrams[0] for _, want := range []string{ ` 1e-12 || math.Abs(unitY-2/math.Sqrt(5)) > 1e-12 { t.Fatalf("lunar path direction = %.12f %.12f, want greatest tangent", unitX, unitY) } } func TestFindLocalStarOccultationSVGsNoEvent(t *testing.T) { location := time.FixedZone("CST", 8*3600) star := hr4799StarCoordinate() star.Dec = 80 diagrams, err := FindLocalStarOccultationSVGs( time.Date(2025, 6, 5, 0, 0, 0, 0, location), time.Date(2025, 6, 6, 0, 0, 0, 0, location), star, 121.56601, 6.80706, 0, moon.OccultationSearchOptions{}, LocalStarOccultationSVGOptions{}, ) if err != nil { t.Fatalf("FindLocalStarOccultationSVGs() error = %v", err) } if len(diagrams) != 0 { t.Fatalf("FindLocalStarOccultationSVGs() returned %d diagrams, want none", len(diagrams)) } } func TestLocalStarOccultationSVGRejectsInvalidInput(t *testing.T) { info := localHR4799Occultation(t) _, err := LocalStarOccultationSVG(info, hr4799StarCoordinate(), LocalStarOccultationSVGOptions{Width: 1}) if !errors.Is(err, ErrInvalidLocalStarOccultationSVGOptions) { t.Fatalf("invalid canvas error = %v, want ErrInvalidLocalStarOccultationSVGOptions", err) } info.ContactsComplete = false _, err = LocalStarOccultationSVG(info, hr4799StarCoordinate(), LocalStarOccultationSVGOptions{}) if !errors.Is(err, ErrInvalidLocalStarOccultationInfo) { t.Fatalf("incomplete event error = %v, want ErrInvalidLocalStarOccultationInfo", err) } info = localHR4799Occultation(t) otherStar := hr4799StarCoordinate() otherStar.ID = "another-star" _, err = LocalStarOccultationSVG(info, otherStar, LocalStarOccultationSVGOptions{}) if !errors.Is(err, ErrInvalidLocalStarOccultationInfo) { t.Fatalf("mismatched target error = %v, want ErrInvalidLocalStarOccultationInfo", err) } info = localHR4799Occultation(t) wrongCoordinate := hr4799StarCoordinate() wrongCoordinate.RA += 30 _, err = LocalStarOccultationSVG(info, wrongCoordinate, LocalStarOccultationSVGOptions{}) if !errors.Is(err, ErrInvalidLocalStarOccultationInfo) { t.Fatalf("same-ID wrong coordinate error = %v, want ErrInvalidLocalStarOccultationInfo", err) } info.TargetID = "" wrongCoordinate.ID = "" _, err = LocalStarOccultationSVG(info, wrongCoordinate, LocalStarOccultationSVGOptions{}) if !errors.Is(err, ErrInvalidLocalStarOccultationInfo) { t.Fatalf("empty-ID wrong coordinate error = %v, want ErrInvalidLocalStarOccultationInfo", err) } } func localHR4799Occultation(t *testing.T) moon.StarOccultationInfo { t.Helper() location := time.FixedZone("CST", 8*3600) events, err := moon.FindStarOccultations( time.Date(2025, 6, 5, 0, 0, 0, 0, location), time.Date(2025, 6, 6, 0, 0, 0, 0, location), hr4799StarCoordinate(), 121.56601, 6.80706, 0, moon.OccultationSearchOptions{}, ) if err != nil { t.Fatalf("FindStarOccultations() error = %v", err) } if len(events) != 1 { t.Fatalf("FindStarOccultations() returned %d events, want 1", len(events)) } return events[0] }