Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

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
}