53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
package sms
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
)
|
|
|
|
func TestHaversineMeters(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
lat1, lng1 float64
|
|
lat2, lng2 float64
|
|
wantMeters float64
|
|
tolerancePct float64
|
|
}{
|
|
{"same point", -33.86, 151.21, -33.86, 151.21, 0, 0},
|
|
{"Sydney CBD to Parramatta (~20km)", -33.8688, 151.2093, -33.8125, 151.0011, 20200, 0.02},
|
|
{"~250m at Sydney latitude", -33.86, 151.21, -33.86, 151.2128, 250, 0.20},
|
|
{"antipodal-ish long distance", 0, 0, 0, 180, 20037500, 0.01},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
got := HaversineMeters(tc.lat1, tc.lng1, tc.lat2, tc.lng2)
|
|
if tc.wantMeters == 0 {
|
|
if got > 1 {
|
|
t.Fatalf("same point: got %.1f m, want ~0", got)
|
|
}
|
|
return
|
|
}
|
|
diff := math.Abs(got-tc.wantMeters) / tc.wantMeters
|
|
if diff > tc.tolerancePct {
|
|
t.Fatalf("got %.1f m, want ~%.1f m (error %.1f%%)", got, tc.wantMeters, diff*100)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNormalizeAU(t *testing.T) {
|
|
cases := []struct{ in, want string }{
|
|
{"+61423274487", "61423274487"},
|
|
{"0423274487", "61423274487"},
|
|
{"61423274487", "61423274487"},
|
|
{"+61 423 274 487", "61423274487"},
|
|
{"0423 274 487", "61423274487"},
|
|
{"", ""},
|
|
}
|
|
for _, tc := range cases {
|
|
if got := NormalizeAU(tc.in); got != tc.want {
|
|
t.Errorf("NormalizeAU(%q) = %q, want %q", tc.in, got, tc.want)
|
|
}
|
|
}
|
|
}
|