location_test.go
package utils
import "testing"
func TestParseLocation(t *testing.T) {
tests := []struct {
name string
input string
wantLat float64
wantLng float64
wantTZ string
wantErr bool
errSubstr string
}{
{"valid lat,lng", "-36.8485,174.7633", -36.8485, 174.7633, "", false, ""},
{"valid lat,lng,tz", "-36.8485, 174.7633, Pacific/Auckland", -36.8485, 174.7633, "Pacific/Auckland", false, ""},
{"whitespace trimming", " -36.8 , 174.7 , UTC ", -36.8, 174.7, "UTC", false, ""},
{"too few parts", "-36.8485", 0, 0, "", true, "got 1 parts"},
{"too many parts", "1,2,3,4", 0, 0, "", true, "got 4 parts"},
{"invalid latitude", "abc,174.7633", 0, 0, "", true, "invalid latitude"},
{"invalid longitude", "-36.8485,xyz", 0, 0, "", true, "invalid longitude"},
{"trailing comma gives empty timezone", "-36.8485,174.7633,", -36.8485, 174.7633, "", false, ""},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
lat, lng, tz, err := ParseLocation(tt.input)
if tt.wantErr {
if err == nil {
t.Fatal("expected error, got nil")
}
if tt.errSubstr != "" && !contains(err.Error(), tt.errSubstr) {
t.Errorf("error %q doesn't contain %q", err.Error(), tt.errSubstr)
}
return
}
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if lat != tt.wantLat {
t.Errorf("lat = %v, want %v", lat, tt.wantLat)
}
if lng != tt.wantLng {
t.Errorf("lng = %v, want %v", lng, tt.wantLng)
}
if tz != tt.wantTZ {
t.Errorf("tz = %q, want %q", tz, tt.wantTZ)
}
})
}
}
func contains(s, substr string) bool {
return len(s) >= len(substr) && (s == substr || containsHelper(s, substr))
}
func containsHelper(s, substr string) bool {
for i := 0; i <= len(s)-len(substr); i++ {
if s[i:i+len(substr)] == substr {
return true
}
}
return false
}