Update lossless decimal tests to use new floats test table and DECIMAL literal constructor.
This commit is contained in:
parent
92d02fef78
commit
063b17ca05
7 changed files with 238 additions and 62 deletions
|
|
@ -346,7 +346,7 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
|
||||
testutils.AssertFileNamesEqual(t, modelFiles, "all_types.go", "all_types_view.go", "employee.go", "link.go",
|
||||
"mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go", "user.go")
|
||||
"mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go", "user.go", "floats.go")
|
||||
|
||||
testutils.AssertFileContent(t, modelDir+"all_types.go", allTypesModelContent)
|
||||
|
||||
|
|
@ -354,7 +354,7 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
|
||||
testutils.AssertFileNamesEqual(t, tableFiles, "all_types.go", "employee.go", "link.go",
|
||||
"person.go", "person_phone.go", "weird_names_table.go", "user.go")
|
||||
"person.go", "person_phone.go", "weird_names_table.go", "user.go", "floats.go")
|
||||
|
||||
testutils.AssertFileContent(t, tableDir+"all_types.go", allTypesTableContent)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,70 +36,106 @@ WHERE all_types.uuid = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11';
|
|||
}
|
||||
|
||||
func TestExactDecimals(t *testing.T) {
|
||||
|
||||
type floats struct {
|
||||
model.Floats
|
||||
Numeric decimal.Decimal
|
||||
NumericPtr decimal.Decimal
|
||||
Decimal decimal.Decimal
|
||||
DecimalPtr decimal.Decimal
|
||||
}
|
||||
|
||||
t.Run("should query decimal", func(t *testing.T) {
|
||||
query := SELECT(
|
||||
AllTypes.Numeric,
|
||||
AllTypes.NumericPtr,
|
||||
AllTypes.Decimal,
|
||||
AllTypes.DecimalPtr,
|
||||
Floats.AllColumns,
|
||||
).FROM(
|
||||
AllTypes,
|
||||
).WHERE(AllTypes.UUID.EQ(String("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11")))
|
||||
Floats,
|
||||
).WHERE(Floats.Decimal.EQ(Decimal("1.11111111111111111111")))
|
||||
|
||||
type AllTypes struct {
|
||||
model.AllTypes
|
||||
Numeric decimal.Decimal
|
||||
NumericPtr decimal.Decimal
|
||||
Decimal decimal.Decimal
|
||||
DecimalPtr decimal.Decimal
|
||||
}
|
||||
|
||||
var result AllTypes
|
||||
var result floats
|
||||
|
||||
err := query.Query(db, &result)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, "1.11", result.Decimal.String())
|
||||
require.Equal(t, "1.11", result.DecimalPtr.String())
|
||||
require.Equal(t, "2.22", result.Numeric.String())
|
||||
require.Equal(t, "2.22", result.NumericPtr.String())
|
||||
require.Equal(t, "1.11111111111111111111", result.Decimal.String())
|
||||
require.Equal(t, "0", result.DecimalPtr.String()) // NULL
|
||||
require.Equal(t, "2.22222222222222222222", result.Numeric.String())
|
||||
require.Equal(t, "0", result.NumericPtr.String()) // NULL
|
||||
|
||||
require.Equal(t, 1.1111111111111112, result.Floats.Decimal) // precision loss
|
||||
require.Equal(t, (*float64)(nil), result.Floats.DecimalPtr)
|
||||
require.Equal(t, 2.2222222222222223, result.Floats.Numeric) // precision loss
|
||||
require.Equal(t, (*float64)(nil), result.Floats.NumericPtr)
|
||||
|
||||
// floating point
|
||||
require.Equal(t, float32(3.3333333), result.Floats.Real) // precision loss
|
||||
require.Equal(t, (*float32)(nil), result.Floats.RealPtr)
|
||||
require.Equal(t, 4.444444444444445, result.Floats.Double) // precision loss
|
||||
require.Equal(t, (*float64)(nil), result.Floats.DoublePtr)
|
||||
})
|
||||
|
||||
t.Run("should insert decimal", func(t *testing.T) {
|
||||
type allTypes struct {
|
||||
model.AllTypes
|
||||
Numeric decimal.Decimal
|
||||
NumericPtr decimal.Decimal
|
||||
Decimal decimal.Decimal
|
||||
DecimalPtr decimal.Decimal
|
||||
}
|
||||
|
||||
m := allTypes{
|
||||
AllTypes: allTypesRow0,
|
||||
Numeric: decimal.RequireFromString("12.345"),
|
||||
NumericPtr: decimal.RequireFromString("56.789"),
|
||||
Decimal: decimal.RequireFromString("91.23"),
|
||||
DecimalPtr: decimal.RequireFromString("45.67"),
|
||||
}
|
||||
insertQuery := Floats.INSERT(
|
||||
Floats.AllColumns,
|
||||
).MODEL(
|
||||
floats{
|
||||
Floats: model.Floats{
|
||||
// overwritten by wrapped(floats) scope
|
||||
Numeric: 0.1,
|
||||
NumericPtr: testutils.Float64Ptr(0.1),
|
||||
Decimal: 0.1,
|
||||
DecimalPtr: testutils.Float64Ptr(0.1),
|
||||
|
||||
insertQuery := AllTypes.INSERT(
|
||||
AllTypes.MutableColumns,
|
||||
).MODEL(m).
|
||||
RETURNING(
|
||||
AllTypes.Numeric,
|
||||
AllTypes.NumericPtr,
|
||||
AllTypes.Decimal,
|
||||
AllTypes.DecimalPtr,
|
||||
)
|
||||
// not overwritten
|
||||
Real: 0.4,
|
||||
RealPtr: testutils.Float32Ptr(0.44),
|
||||
Double: 0.3,
|
||||
DoublePtr: testutils.Float64Ptr(0.33),
|
||||
},
|
||||
Numeric: decimal.RequireFromString("0.1234567890123456789"),
|
||||
NumericPtr: decimal.RequireFromString("1.1111111111111111111"),
|
||||
Decimal: decimal.RequireFromString("2.2222222222222222222"),
|
||||
DecimalPtr: decimal.RequireFromString("3.3333333333333333333"),
|
||||
},
|
||||
).RETURNING(
|
||||
Floats.AllColumns,
|
||||
)
|
||||
|
||||
var result allTypes
|
||||
testutils.AssertDebugStatementSql(t, insertQuery, `
|
||||
INSERT INTO test_sample.floats (decimal_ptr, decimal, numeric_ptr, numeric, real_ptr, real, double_ptr, double)
|
||||
VALUES ('3.3333333333333333333', '2.2222222222222222222', '1.1111111111111111111', '0.1234567890123456789', 0.4399999976158142, 0.4000000059604645, 0.33, 0.3)
|
||||
RETURNING floats.decimal_ptr AS "floats.decimal_ptr",
|
||||
floats.decimal AS "floats.decimal",
|
||||
floats.numeric_ptr AS "floats.numeric_ptr",
|
||||
floats.numeric AS "floats.numeric",
|
||||
floats.real_ptr AS "floats.real_ptr",
|
||||
floats.real AS "floats.real",
|
||||
floats.double_ptr AS "floats.double_ptr",
|
||||
floats.double AS "floats.double";
|
||||
`)
|
||||
|
||||
var result floats
|
||||
err := insertQuery.Query(db, &result)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, "12.345", result.Numeric.String())
|
||||
require.Equal(t, "56.789", result.NumericPtr.String())
|
||||
require.Equal(t, "91.23", result.Decimal.String())
|
||||
require.Equal(t, "45.67", result.DecimalPtr.String())
|
||||
// exact decimal
|
||||
require.Equal(t, "0.1234567890123456789", result.Numeric.String())
|
||||
require.Equal(t, "1.1111111111111111111", result.NumericPtr.String())
|
||||
require.Equal(t, "2.2222222222222222222", result.Decimal.String())
|
||||
require.Equal(t, "3.3333333333333333333", result.DecimalPtr.String())
|
||||
|
||||
// precision loss
|
||||
require.Equal(t, 0.12345678901234568, result.Floats.Numeric)
|
||||
require.Equal(t, 1.1111111111111112, *result.Floats.NumericPtr)
|
||||
require.Equal(t, 2.2222222222222223, result.Floats.Decimal)
|
||||
require.Equal(t, 3.3333333333333335, *result.Floats.DecimalPtr)
|
||||
|
||||
// floating points numbers
|
||||
require.Equal(t, float32(0.4), result.Floats.Real)
|
||||
require.Equal(t, float32(0.44), *result.Floats.RealPtr)
|
||||
require.Equal(t, 0.3, result.Floats.Double)
|
||||
require.Equal(t, 0.33, *result.Floats.DoublePtr)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue