package clocktime_test import ( "encoding/json" "testing" "time" "gitea.auvem.com/go-toolkit/clocktime" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestComparison(t *testing.T) { a, err := clocktime.NewClockTime(12, 30, 0) require.NoError(t, err) b, err := clocktime.NewClockTime(13, 0, 0) require.NoError(t, err) assert.True(t, a.Before(b)) assert.True(t, b.After(a)) assert.False(t, a.Equal(b)) assert.Equal(t, -1, a.Compare(b)) } func TestParseClockTimeStrict(t *testing.T) { _, err := clocktime.ParseClockTime("1:2:3") assert.Error(t, err) _, err = clocktime.ParseClockTime("12:30:00x") assert.Error(t, err) got, err := clocktime.ParseClockTime("12:30:00") require.NoError(t, err) assert.Equal(t, 12, got.Hour) } func TestNewClockTimeValidation(t *testing.T) { _, err := clocktime.NewClockTime(25, 0, 0) assert.Error(t, err) } func TestIsZeroVsMidnight(t *testing.T) { var nilPtr *clocktime.ClockTime assert.True(t, nilPtr.IsZero()) midnight, err := clocktime.NewClockTime(0, 0, 0) require.NoError(t, err) assert.False(t, midnight.IsZero()) assert.True(t, midnight.IsMidnight()) } func TestClockTimeFromTimeUTC(t *testing.T) { loc, err := time.LoadLocation("America/New_York") require.NoError(t, err) tNY := time.Date(2024, 6, 1, 15, 4, 5, 0, loc) got := clocktime.ClockTimeFromTime(tNY) assert.Equal(t, "19:04:05", got.String()) } func TestClockTimeJSON(t *testing.T) { ct, err := clocktime.NewClockTime(9, 5, 7) require.NoError(t, err) data, err := json.Marshal(ct) require.NoError(t, err) assert.JSONEq(t, `"09:05:07"`, string(data)) var decoded clocktime.ClockTime require.NoError(t, json.Unmarshal([]byte(`null`), &decoded)) assert.True(t, decoded.IsMidnight()) } func TestISODurationSQL(t *testing.T) { d := clocktime.NewISODuration(1, 30, 0) val, err := d.Value() require.NoError(t, err) assert.Equal(t, int64((90*time.Minute).Nanoseconds()), val) var scanned clocktime.ISODuration require.NoError(t, scanned.Scan(val)) assert.Equal(t, d.Duration(), scanned.Duration()) } func TestISODurationJSON(t *testing.T) { d := clocktime.NewISODuration(0, 45, 0) data, err := json.Marshal(d) require.NoError(t, err) assert.Contains(t, string(data), "PT") var back clocktime.ISODuration require.NoError(t, json.Unmarshal(data, &back)) assert.Equal(t, 45*time.Minute, back.Duration()) } func TestClockTimeScanString(t *testing.T) { var ct clocktime.ClockTime require.NoError(t, ct.Scan("08:15:30")) assert.Equal(t, "08:15:30", ct.String()) }