91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
package spc
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestDecodeGeoJSONExposesSPCPropertiesAndCompactGeometry(t *testing.T) {
|
|
raw := readTestFile(t, "day1_cat.geojson")
|
|
|
|
got, err := DecodeGeoJSON(raw)
|
|
if err != nil {
|
|
t.Fatalf("DecodeGeoJSON() error = %v", err)
|
|
}
|
|
if got.Type != "FeatureCollection" {
|
|
t.Fatalf("Type = %q, want FeatureCollection", got.Type)
|
|
}
|
|
if len(got.Features) != 1 {
|
|
t.Fatalf("Features length = %d, want 1", len(got.Features))
|
|
}
|
|
|
|
feature := got.Features[0]
|
|
props := feature.Properties
|
|
if props.ValidISO != "2026-06-11T13:00:00Z" {
|
|
t.Fatalf("VALID_ISO = %q", props.ValidISO)
|
|
}
|
|
if props.ExpireISO != "2026-06-12T12:00:00Z" {
|
|
t.Fatalf("EXPIRE_ISO = %q", props.ExpireISO)
|
|
}
|
|
if props.IssueISO != "2026-06-11T12:34:56Z" {
|
|
t.Fatalf("ISSUE_ISO = %q", props.IssueISO)
|
|
}
|
|
if props.Forecaster != "SMITH" {
|
|
t.Fatalf("FORECASTER = %q", props.Forecaster)
|
|
}
|
|
if props.Label != "SLGT" {
|
|
t.Fatalf("LABEL = %q", props.Label)
|
|
}
|
|
if props.Label2 != "Slight Risk" {
|
|
t.Fatalf("LABEL2 = %q", props.Label2)
|
|
}
|
|
if props.DN == nil || *props.DN != 3 {
|
|
t.Fatalf("DN = %v, want 3", props.DN)
|
|
}
|
|
|
|
wantGeometry := `{"type":"Polygon","coordinates":[[[-91.0,38.0],[-90.0,38.0],[-90.0,39.0],[-91.0,39.0],[-91.0,38.0]]]}`
|
|
if string(feature.Geometry) != wantGeometry {
|
|
t.Fatalf("Geometry = %s, want %s", feature.Geometry, wantGeometry)
|
|
}
|
|
if strings.Contains(string(feature.Geometry), "\n") || strings.Contains(string(feature.Geometry), " ") {
|
|
t.Fatalf("Geometry is not compact: %q", feature.Geometry)
|
|
}
|
|
}
|
|
|
|
func TestDecodeGeoJSONParsesSeverityRankString(t *testing.T) {
|
|
raw := readTestFile(t, "day2_torn.geojson")
|
|
|
|
got, err := DecodeGeoJSON(raw)
|
|
if err != nil {
|
|
t.Fatalf("DecodeGeoJSON() error = %v", err)
|
|
}
|
|
props := got.Features[0].Properties
|
|
if props.DN == nil || *props.DN != 5 {
|
|
t.Fatalf("DN = %v, want 5", props.DN)
|
|
}
|
|
}
|
|
|
|
func TestParseISOTimestampTrimsAndReturnsUTC(t *testing.T) {
|
|
got, err := ParseISOTimestamp(" 2026-06-11T12:34:56Z ")
|
|
if err != nil {
|
|
t.Fatalf("ParseISOTimestamp() error = %v", err)
|
|
}
|
|
want := time.Date(2026, 6, 11, 12, 34, 56, 0, time.UTC)
|
|
if !got.Equal(want) {
|
|
t.Fatalf("ParseISOTimestamp() = %s, want %s", got, want)
|
|
}
|
|
}
|
|
|
|
func readTestFile(t *testing.T, name string) []byte {
|
|
t.Helper()
|
|
path := filepath.Join("testdata", name)
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatalf("read %s: %v", path, err)
|
|
}
|
|
return raw
|
|
}
|