package pflag import ( "fmt" "strings" "testing" "time" ) func setUpTimeVar(t *time.Time, formats []string) *FlagSet { f := NewFlagSet("test", ContinueOnError) f.TimeVar(t, "time", *t, formats, "Time") return f } func TestTime(t *testing.T) { testCases := []struct { input string success bool expected time.Time }{ {"2022-01-01T01:01:01+00:00", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.UTC)}, {" 2022-01-01T01:01:01+00:00", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.UTC)}, {"2022-01-01T01:01:01+00:00 ", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.UTC)}, {"2022-01-01T01:01:01+02:00", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.FixedZone("UTC+2", 2*60*60))}, {"2022-01-01T01:01:01.01+02:00", true, time.Date(2022, 1, 1, 1, 1, 1, 10000000, time.FixedZone("UTC+2", 2*60*60))}, {"Sat, 01 Jan 2022 01:01:01 +0000", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.UTC)}, {"Sat, 01 Jan 2022 01:01:01 +0200", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.FixedZone("UTC+2", 2*60*60))}, {"Sat, 01 Jan 2022 01:01:01 +0000", true, time.Date(2022, 1, 1, 1, 1, 1, 0, time.UTC)}, {"", false, time.Time{}}, {"not a date", false, time.Time{}}, {"2022-01-01 01:01:01", false, time.Time{}}, {"2022-01-01T01:01:01", false, time.Time{}}, {"01 Jan 2022 01:01:01 +0000", false, time.Time{}}, {"Sat, 01 Jan 2022 01:01:01", false, time.Time{}}, } for i := range testCases { var timeVar time.Time formats := []string{time.RFC3339Nano, time.RFC1123Z} f := setUpTimeVar(&timeVar, formats) tc := &testCases[i] arg := fmt.Sprintf("--time=%s", tc.input) err := f.Parse([]string{arg}) if err != nil && tc.success == true { t.Errorf("expected success, got %q", err) continue } else if err == nil && tc.success == false { t.Errorf("expected failure") continue } else if tc.success { timeResult, err := f.GetTime("time") if err != nil { t.Errorf("Got error trying to fetch the Time flag: %v", err) } if !timeResult.Equal(tc.expected) { t.Errorf("expected %q, got %q", tc.expected.Format(time.RFC3339Nano), timeVar.Format(time.RFC3339Nano)) } } } } func usageForTimeFlagSet(t *testing.T, timeVar time.Time) string { t.Helper() formats := []string{time.RFC3339Nano, time.RFC1123Z} f := setUpTimeVar(&timeVar, formats) if err := f.Parse([]string{}); err != nil { t.Fatalf("expected success, got %q", err) } return f.FlagUsages() } func TestTimeDefaultZero(t *testing.T) { usage := usageForTimeFlagSet(t, time.Time{}) if strings.Contains(usage, "default") { t.Errorf("expected no default value in usage, got %q", usage) } } func TestTimeDefaultNonZero(t *testing.T) { timeVar := time.Date(2025, 1, 1, 1, 1, 1, 0, time.UTC) usage := usageForTimeFlagSet(t, timeVar) if !strings.Contains(usage, "default") || !strings.Contains(usage, "2025") { t.Errorf("expected default value in usage, got %q", usage) } }