From 612be0c78979421cc11e69888d57cdcdd29beb13 Mon Sep 17 00:00:00 2001 From: ko_oler <kooler89@gmail.com> Date: Wed, 4 Oct 2023 13:46:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=B7=20=D1=82=D0=B8=D0=BF=D0=B0=20float64=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=BA=20int64=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B8=D0=BF=D0=B0=20"Number"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/schema/field/number.go | 3 +++ pkg/schema/field/number_test.go | 46 ++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/pkg/schema/field/number.go b/pkg/schema/field/number.go index 502a2fef..22e6bb71 100644 --- a/pkg/schema/field/number.go +++ b/pkg/schema/field/number.go @@ -88,6 +88,9 @@ func (NumberType) decode(_ context.Context, field *Field, v interface{}) (interf case uint64: return i, nil case float64: + if i >= math.MaxInt64 || i <= math.MinInt64 { + return nil, errors.Errorf("the passed value must be no more than %d and no less than %d", math.MaxInt64, math.MinInt64) + } return int64(math.Round(i)), nil } case NumberFormatFloat: diff --git a/pkg/schema/field/number_test.go b/pkg/schema/field/number_test.go index e731793d..e694ee6b 100644 --- a/pkg/schema/field/number_test.go +++ b/pkg/schema/field/number_test.go @@ -1,6 +1,8 @@ package field import ( + "fmt" + "math" "reflect" "testing" ) @@ -13,12 +15,15 @@ func TestNumberField_Decode(t *testing.T) { want interface{} wantErr bool }{ - {"Correct", Number("int"), int64(2), int64(2), false}, // #0 - {"Correct", Number("int"), 2.2, int64(2), false}, // #1 - {"Correct", Number("int"), 2, int64(2), false}, // #2 - {"Correct", Number("int"), float32(2.2), int64(2), false}, // #3 - {"Correct", Number("int"), float64(2.6), int64(3), false}, // #4 - {"Correct", Number("int"), 2.6, int64(3), false}, // #5 + {"Correct", Number("int"), int64(2), int64(2), false}, // #0 + {"Correct", Number("int"), 2.2, int64(2), false}, // #1 + {"Correct", Number("int"), 2, int64(2), false}, // #2 + {"Correct", Number("int"), float32(2.2), int64(2), false}, // #3 + {"Correct", Number("int"), float64(2.6), int64(3), false}, // #4 + {"Correct", Number("int"), 2.6, int64(3), false}, // #5 + {"Convert error", Number(NumberFormatInt), math.MaxFloat64, nil, true}, // #6 + {"Convert error", Number(NumberFormatInt), float64(-9223372036854776000.0), nil, true}, // #7 + {"Convert error", Number(NumberFormatInt), float64(9223372036854776000.0), nil, true}, // #7 {"Correct", Number("float"), int8(2), 2.0, false}, // #6 {"Correct", Number("float"), 2.2, 2.2, false}, // #7 @@ -86,3 +91,32 @@ func TestNumberField_Encode(t *testing.T) { }) } } + +func TestNumberField_ConvertToInt64(t *testing.T) { + tests := []struct { + name string + number float64 + want int64 + }{ + { + name: "float64 to int64", + number: 9223372036854775807.0, + want: 9223372036854775807, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + num := int64(tt.number) + if reflect.DeepEqual(num, tt.want) { + return + } + t.Errorf("Convert() got = %v, want %v", int64(tt.number), tt.want) + }) + } + + fmt.Println(math.MaxInt64) + fmt.Println(float64(math.MaxInt64)) + r := float64(math.MaxInt64) + fmt.Println(int64(r)) + +} -- GitLab