98 lines
3.3 KiB
Go
98 lines
3.3 KiB
Go
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") }
|
|
}
|