blob: 62d9a7992234618fbae28d4a2ca9d21e0e27de0d [file] [log] [blame] [edit]
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)
}
}