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