upgrade to go 1.25 & port helpers

Removed ExprID and ExprEnum in favour of generics.
This commit is contained in:
Elijah Duffy
2026-01-28 11:18:11 -08:00
parent 78de94c919
commit 6ab100cc46
6 changed files with 383 additions and 12 deletions

182
utility_test.go Normal file
View File

@@ -0,0 +1,182 @@
package dbx
import (
"testing"
"time"
"github.com/go-jet/jet/v2/mysql"
"github.com/stretchr/testify/assert"
"golang.org/x/exp/constraints"
)
func Test_ApplyPtr(t *testing.T) {
targetCol := mysql.StringColumn("test")
var empty string
cases := []struct {
name string
current *string
new *string
expected *string
length int
}{
{"apply updated value", Ptr("hello"), Ptr("world"), Ptr("world"), 1},
{"apply same value", Ptr("hello"), Ptr("hello"), Ptr("hello"), 0},
{"apply new value to nil", nil, Ptr("hello"), Ptr("hello"), 1},
{"apply nil to existing value", Ptr("hello"), nil, Ptr("hello"), 0},
{"apply empty string to existing value", Ptr("hello"), &empty, nil, 1},
{"apply empty string to nil", nil, &empty, nil, 0},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
modified := make(mysql.ColumnList, 0)
updated := ApplyPtr(c.current, c.new, &modified, targetCol)
assert.Len(t, modified, c.length)
if c.expected == nil {
assert.Nil(t, updated, "Expected updated value to be nil")
} else {
assert.NotNil(t, updated, "Expected updated value to be not nil")
if updated != nil {
assert.Equal(t, *c.expected, *updated, "Expected updated value to be equal to new value")
}
}
})
}
}
func applyComplexPtr_tc[
Current constraints.Float | constraints.Integer,
New constraints.Float | constraints.Integer,
](
t *testing.T,
name string,
current *Current,
new *New,
expected *Current,
length int,
) {
targetCol := mysql.IntegerColumn("test")
t.Run(name, func(t *testing.T) {
modified := make(mysql.ColumnList, 0)
updated := ApplyComplexPtr(current, new, &modified, targetCol)
assert.Len(t, modified, length)
if expected == nil {
assert.Nil(t, updated, "Expected updated value to be nil")
} else {
assert.NotNil(t, updated, "Expected updated value to be not nil")
if updated != nil {
assert.Equal(t, *expected, *updated, "Expected updated value to be equal to new value")
}
}
})
}
func Test_ApplyComplexPtr(t *testing.T) {
var empty int
applyComplexPtr_tc(t, "apply updated value", Ptr(1), Ptr(2), Ptr(2), 1)
applyComplexPtr_tc(t, "apply same value", Ptr(1), Ptr(1), Ptr(1), 0)
applyComplexPtr_tc(t, "apply new value to nil", nil, Ptr(2), Ptr(2), 1)
applyComplexPtr_tc[int, int](t, "apply nil to existing value", Ptr(1), nil, Ptr(1), 0)
applyComplexPtr_tc(t, "apply zero value to existing value", Ptr(1), &empty, nil, 1)
applyComplexPtr_tc(t, "apply different type to existing value", Ptr[uint64](1), Ptr[uint16](2), Ptr[uint64](2), 1)
applyComplexPtr_tc[int](t, "apply zero value to nil", nil, &empty, nil, 0)
}
func applyInterfacePtr_tc[
T ApplyInterface[T],
](
t *testing.T,
name string,
current *T,
new *T,
expected *T,
length int,
) {
targetCol := mysql.StringColumn("test")
t.Run(name, func(t *testing.T) {
modified := make(mysql.ColumnList, 0)
updated := ApplyInterfacePtr(current, new, &modified, targetCol)
assert.Len(t, modified, length)
if expected == nil {
assert.Nil(t, updated, "Expected updated value to be nil")
} else {
assert.NotNil(t, updated, "Expected updated value to be not nil")
if updated != nil {
assert.Equal(t, *expected, *updated, "Expected updated value to be equal to new value")
}
}
})
}
func Test_ApplyInterfacePtr(t *testing.T) {
var zero time.Time
applyInterfacePtr_tc(t, "apply updated value",
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
Ptr(time.Date(2023, 10, 2, 0, 0, 0, 0, time.UTC)),
Ptr(time.Date(2023, 10, 2, 0, 0, 0, 0, time.UTC)),
1,
)
applyInterfacePtr_tc(t, "apply same value",
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
0,
)
applyInterfacePtr_tc(t, "apply new value to nil",
nil,
Ptr(time.Date(2023, 10, 2, 0, 0, 0, 0, time.UTC)),
Ptr(time.Date(2023, 10, 2, 0, 0, 0, 0, time.UTC)),
1,
)
applyInterfacePtr_tc(t, "apply nil to existing value",
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
nil,
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
0,
)
applyInterfacePtr_tc(t, "apply zero value to existing value",
Ptr(time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)),
&zero,
nil,
1,
)
applyInterfacePtr_tc(t, "apply zero value to nil",
nil,
&zero,
nil,
0,
)
}
func Test_ApplyVal(t *testing.T) {
targetCol := mysql.StringColumn("test")
var empty string
cases := []struct {
name string
current string
new *string
expected string
length int
}{
{"apply updated value", "hello", Ptr("world"), "world", 1},
{"apply same value", "hello", Ptr("hello"), "hello", 0},
{"apply new value to empty value", "", Ptr("hello"), "hello", 1},
{"apply nil to existing value", "hello", nil, "hello", 0},
{"apply empty string to existing value", "hello", &empty, "", 1},
{"apply empty string to empty value", "", &empty, "", 0},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
modified := make(mysql.ColumnList, 0)
updated := ApplyVal(c.current, c.new, &modified, targetCol)
assert.Equal(t, c.expected, updated, "Expected updated value to be equal to new value")
assert.Len(t, modified, c.length)
})
}
}