Files
clocktime/clocktime_test.go
T
end a1284075aa fix: strict ClockTime parsing and ISODuration SQL
Validate constructors, strict HH:MM:SS parse, UTC ClockTimeFromTime,
ISODuration Value/Scan, Compare and TextMarshaler, codec.go split.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 18:01:08 -07:00

98 lines
2.5 KiB
Go

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