From e5ee5e550211082d88ecd7a99c44b38658fcfc7d Mon Sep 17 00:00:00 2001 From: Anucha Petchagun Date: Wed, 24 Apr 2019 17:59:35 +0700 Subject: [PATCH] patch function Scan to support int,int8,int16,int32 (#1) * add tests for int8,int32 and int64 * implement Scan to support int8, int16, int32 * also support for int natural --- decimal.go | 20 +++++++++++++++++ decimal_test.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/decimal.go b/decimal.go index 134ece2..1270513 100644 --- a/decimal.go +++ b/decimal.go @@ -982,6 +982,26 @@ func (d *Decimal) Scan(value interface{}) error { *d = NewFromFloat(v) return nil + case int: + // also better to implement to support all type of int. + // profitable to create another abstract layer for testing + // data access with no depends on real RDBMS. + + *d = New(int64(v), 0) + return nil + + case int8: + *d = New(int64(v), 0) + return nil + + case int16: + *d = New(int64(v), 0) + return nil + + case int32: + *d = New(int64(v), 0) + return nil + case int64: // at least in sqlite3 when the value is 0 in db, the data is sent // to us as an int64 instead of a float64 ... diff --git a/decimal_test.go b/decimal_test.go index 64f0552..fa098cd 100644 --- a/decimal_test.go +++ b/decimal_test.go @@ -1952,6 +1952,66 @@ func TestDecimal_Scan(t *testing.T) { if err == nil { t.Errorf("a.Scan(Foo{}) should have thrown an error but did not") } + + dbvalueInt8 := int8(32) + expected = New(int64(32), 0) + + err = a.Scan(dbvalueInt8) + if err != nil { + // Scan failed... no need to test result value + t.Errorf("a.Scan(32) failed with message: %s", err) + + } else { + // Scan succeeded... test resulting values + if !a.Equal(expected) { + t.Errorf("%s does not equal to %s", a, expected) + } + } + + dbvalueInt16 := int16(21) + expected = New(int64(21), 0) + + err = a.Scan(dbvalueInt16) + if err != nil { + // Scan failed... no need to test result value + t.Errorf("a.Scan(21) failed with message: %s", err) + + } else { + // Scan succeeded... test resulting values + if !a.Equal(expected) { + t.Errorf("%s does not equal to %s", a, expected) + } + } + + dbvalueInt32 := int32(32) + expected = New(int64(32), 0) + + err = a.Scan(dbvalueInt32) + if err != nil { + // Scan failed... no need to test result value + t.Errorf("a.Scan(32) failed with message: %s", err) + + } else { + // Scan succeeded... test resulting values + if !a.Equal(expected) { + t.Errorf("%s does not equal to %s", a, expected) + } + } + + dbvalueIntNatural := 3264 + expected = New(int64(3264), 0) + + err = a.Scan(dbvalueIntNatural) + if err != nil { + // Scan failed... no need to test result value + t.Errorf("a.Scan(3264) failed with message: %s", err) + + } else { + // Scan succeeded... test resulting values + if !a.Equal(expected) { + t.Errorf("%s does not equal to %s", a, expected) + } + } } func TestDecimal_Value(t *testing.T) {