| 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) |
| } |
| } |