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 }