101 lines
2.8 KiB
Go
101 lines
2.8 KiB
Go
package rfctime
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"git.blackforestbytes.com/BlackForestBytes/goext/tst"
|
|
)
|
|
|
|
func TestTimeNew(t *testing.T) {
|
|
v := NewTime(14, 30, 45, 123)
|
|
tst.AssertEqual(t, v.Hour, 14)
|
|
tst.AssertEqual(t, v.Minute, 30)
|
|
tst.AssertEqual(t, v.Second, 45)
|
|
tst.AssertEqual(t, v.NanoSecond, 123)
|
|
}
|
|
|
|
func TestTimeFromTS(t *testing.T) {
|
|
tm := time.Date(2023, 5, 17, 14, 30, 45, 123456789, time.UTC)
|
|
v := NewTimeFromTS(tm)
|
|
tst.AssertEqual(t, v.Hour, 14)
|
|
tst.AssertEqual(t, v.Minute, 30)
|
|
tst.AssertEqual(t, v.Second, 45)
|
|
tst.AssertEqual(t, v.NanoSecond, 123456789)
|
|
}
|
|
|
|
func TestTimeSerialize(t *testing.T) {
|
|
v := NewTime(14, 30, 45, 123456789)
|
|
tst.AssertEqual(t, v.Serialize(), "0014:30:45.123456789")
|
|
tst.AssertEqual(t, v.String(), "0014:30:45.123456789")
|
|
tst.AssertEqual(t, v.GoString(), "rfctime.NewTime(14, 30, 45, 123456789)")
|
|
tst.AssertEqual(t, v.FormatStr(), "15:04:05.999999999")
|
|
}
|
|
|
|
func TestTimeSerializeShort(t *testing.T) {
|
|
tst.AssertEqual(t, NewTime(14, 30, 0, 0).SerializeShort(), "14:30")
|
|
tst.AssertEqual(t, NewTime(14, 30, 45, 0).SerializeShort(), "14:30:45")
|
|
tst.AssertEqual(t, NewTime(14, 30, 45, 123).SerializeShort(), "14:30:45.000000123")
|
|
tst.AssertEqual(t, NewTime(0, 0, 0, 0).SerializeShort(), "00:00")
|
|
}
|
|
|
|
func TestTimeDeserialize(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
ok bool
|
|
expected Time
|
|
}{
|
|
{"14:30", true, Time{Hour: 14, Minute: 30, Second: 0, NanoSecond: 0}},
|
|
{"14:30:45", true, Time{Hour: 14, Minute: 30, Second: 45, NanoSecond: 0}},
|
|
{"14:30:45.123", true, Time{Hour: 14, Minute: 30, Second: 45, NanoSecond: 123000000}},
|
|
{"14:30:45.123456789", true, Time{Hour: 14, Minute: 30, Second: 45, NanoSecond: 123456789}},
|
|
{"00:00:00.000000000", true, Time{Hour: 0, Minute: 0, Second: 0, NanoSecond: 0}},
|
|
{"14", false, Time{}},
|
|
{"14:30:45.123:extra", false, Time{}},
|
|
{"ab:cd", false, Time{}},
|
|
{"14:bb", false, Time{}},
|
|
{"14:30:cc", false, Time{}},
|
|
{"14:30:45.zz", false, Time{}},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
var v Time
|
|
err := v.Deserialize(tc.input)
|
|
if tc.ok {
|
|
if err != nil {
|
|
t.Errorf("Deserialize(%q) failed: %v", tc.input, err)
|
|
continue
|
|
}
|
|
tst.AssertEqual(t, v, tc.expected)
|
|
} else if err == nil {
|
|
t.Errorf("Deserialize(%q) should have failed", tc.input)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNowTime(t *testing.T) {
|
|
now := time.Now().UTC()
|
|
v := NowTime(time.UTC)
|
|
// Within a couple of seconds
|
|
if abs(v.Hour-now.Hour()) > 1 && !(now.Hour() == 23 && v.Hour == 0) {
|
|
t.Errorf("NowTime hour mismatch: %d vs %d", v.Hour, now.Hour())
|
|
}
|
|
|
|
vl := NowTimeLoc()
|
|
if vl.Hour < 0 || vl.Hour > 23 {
|
|
t.Errorf("NowTimeLoc invalid hour: %d", vl.Hour)
|
|
}
|
|
|
|
vu := NowTimeUTC()
|
|
if vu.Hour < 0 || vu.Hour > 23 {
|
|
t.Errorf("NowTimeUTC invalid hour: %d", vu.Hour)
|
|
}
|
|
}
|
|
|
|
func abs(x int) int {
|
|
if x < 0 {
|
|
return -x
|
|
}
|
|
return x
|
|
}
|