improve AssertEqual to handle annoying json.Unmarshal type conversions...

This commit is contained in:
2023-01-17 20:41:45 +01:00
parent ff24493ff3
commit 2eb6292733
2 changed files with 121 additions and 10 deletions

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"math"
"reflect"
"runtime/debug"
"strings"
@@ -34,6 +35,111 @@ func AssertJsonMapEqual(t *testing.T, key string, expected map[string]any, actua
}
func AssertEqual(t *testing.T, key string, expected any, actual any) {
// try to fix types, kinda hacky, but its only unit tests...
switch vex := expected.(type) {
case int:
switch vac := actual.(type) {
case int:
// same
case int32:
expected = int64(vex)
actual = int64(vac)
case int64:
expected = int64(vex)
case float32:
if IsWholeFloat(vac) {
expected = int64(vex)
actual = int64(vac)
}
case float64:
if IsWholeFloat(vac) {
expected = int64(vex)
actual = int64(vac)
}
}
case int32:
switch vac := actual.(type) {
case int:
expected = int64(vex)
actual = int64(vac)
case int32:
// same
case int64:
expected = int64(vex)
case float32:
if IsWholeFloat(vac) {
expected = int64(vex)
actual = int64(vac)
}
case float64:
if IsWholeFloat(vac) {
expected = int64(vex)
actual = int64(vac)
}
}
case int64:
switch vac := actual.(type) {
case int:
actual = int64(vac)
case int32:
actual = int64(vac)
case int64:
// same
case float32:
if IsWholeFloat(vac) {
actual = int64(vac)
}
case float64:
if IsWholeFloat(vac) {
actual = int64(vac)
}
}
case float32:
switch vac := actual.(type) {
case int:
if IsWholeFloat(vex) {
expected = int64(vex)
actual = int64(vac)
}
case int32:
if IsWholeFloat(vex) {
expected = int64(vex)
actual = int64(vac)
}
case int64:
if IsWholeFloat(vex) {
expected = int64(vex)
}
case float32:
// same
case float64:
expected = float64(vex)
}
case float64:
switch vac := actual.(type) {
case int:
if IsWholeFloat(vex) {
expected = int64(vex)
actual = int64(vac)
}
case int32:
if IsWholeFloat(vex) {
expected = int64(vex)
actual = int64(vac)
}
case int64:
if IsWholeFloat(vex) {
expected = int64(vex)
}
case float32:
actual = float64(vac)
case float64:
// same
}
}
if expected != actual {
t.Errorf("Value [%s] differs (%T <-> %T):\n", key, expected, actual)
@@ -226,3 +332,8 @@ func AssertMappedSet[T langext.OrderedConstraint](t *testing.T, key string, expe
t.FailNow()
}
}
func IsWholeFloat[T langext.FloatConstraint](v T) bool {
_, frac := math.Modf(math.Abs(float64(v)))
return frac == 0.0
}