a1284075aa
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>
98 lines
2.5 KiB
Go
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())
|
|
}
|