time/time_test.go

98 lines
3.3 KiB
Go
Raw Normal View History

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