package time_test import ( "testing" "time" utime "apigo.cc/go/time" ) func TestParse(t *testing.T) { refTime := time.Date(2025, 6, 23, 15, 30, 45, 123456789, time.Local) tests := []struct { input any expected time.Time name string }{ {input: refTime.Unix(), expected: refTime.Truncate(time.Second), name: "Timestamp Seconds"}, {input: refTime.UnixMilli(), expected: refTime.Truncate(time.Millisecond), name: "Timestamp Millis"}, {input: "20250623153045", expected: refTime.Truncate(time.Second), name: "Compact DateTime"}, {input: "2025-06-23T15:30:45Z", expected: time.Date(2025, 6, 23, 15, 30, 45, 0, time.UTC), name: "RFC3339 UTC"}, {input: "2025-06-23 15:30:45", expected: refTime.Truncate(time.Second), name: "Standard Format"}, {input: "2025/06/23 15:30:45", expected: refTime.Truncate(time.Second), name: "Slash Format"}, {input: "2025.06.23", expected: time.Date(2025, 6, 23, 0, 0, 0, 0, time.Local), name: "Dot Date"}, {input: "25-06-23 15:30:45", expected: refTime.Truncate(time.Second), name: "Short Year"}, {input: "2025年06月23日 15点30分45秒", expected: refTime.Truncate(time.Second), name: "Chinese Format"}, {input: "下午3点30分", expected: time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 15, 30, 0, 0, time.Local), name: "Chinese Time Only"}, {input: "15:30:45", expected: time.Date(0, 1, 1, 15, 30, 45, 0, time.Local), name: "Time Only"}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { result := utime.Parse(tc.input) if !result.Equal(tc.expected) { t.Errorf("Parse failed for %s: expected %v, got %v", tc.name, tc.expected, result) } }) } } func TestFormat(t *testing.T) { refTime := time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC) tests := []struct { layout string input any expected string }{ {"YYYY-MM-DD HH:mm:ss", refTime, "2006-01-02 15:04:05"}, {"YYYY/MM/DD", "2006-01-02", "2006/01/02"}, {"hh:mm A", refTime, "03:04 PM"}, } for _, tc := range tests { result := utime.Format(tc.layout, tc.input) if result != tc.expected { t.Errorf("Format failed for layout %s: expected %s, got %s", tc.layout, tc.expected, result) } } } func TestAdd(t *testing.T) { refTime := time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC) tests := []struct { expr string input any expected time.Time }{ {"+1D", refTime, time.Date(2006, 1, 3, 15, 4, 5, 0, time.UTC)}, {"-1M", refTime, time.Date(2005, 12, 2, 15, 4, 5, 0, time.UTC)}, {"+1Y1M1D", refTime, time.Date(2007, 2, 3, 15, 4, 5, 0, time.UTC)}, {"+1h30m", refTime, refTime.Add(90 * time.Minute)}, {"-500ms", refTime, refTime.Add(-500 * time.Millisecond)}, } for _, tc := range tests { result := utime.Add(tc.expr, tc.input) if !result.Equal(tc.expected) { t.Errorf("Add failed for expr %s: expected %v, got %v", tc.expr, tc.expected, result) } } } func TestHelpers(t *testing.T) { now := time.Now() if utime.Now().Before(now.Add(-time.Second)) { t.Error("Now() too early") } today := utime.Today() if today.Hour() != 0 || today.Minute() != 0 { t.Error("Today() not start of day") } yesterday := utime.Yesterday() if !yesterday.Equal(today.AddDate(0, 0, -1)) { t.Error("Yesterday() incorrect") } tomorrow := utime.Tomorrow() if !tomorrow.Equal(today.AddDate(0, 0, 1)) { t.Error("Tomorrow() incorrect") } }