| // Go MySQL Driver - A MySQL-Driver for Go's database/sql package |
| // |
| // Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. |
| // |
| // This Source Code Form is subject to the terms of the Mozilla Public |
| // License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| // You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| package mysql |
| |
| import ( |
| "bytes" |
| "database/sql/driver" |
| "encoding/json" |
| "testing" |
| ) |
| |
| func TestConvertDerivedString(t *testing.T) { |
| type derived string |
| |
| output, err := converter{}.ConvertValue(derived("value")) |
| if err != nil { |
| t.Fatal("Derived string type not convertible", err) |
| } |
| |
| if output != "value" { |
| t.Fatalf("Derived string type not converted, got %#v %T", output, output) |
| } |
| } |
| |
| func TestConvertDerivedByteSlice(t *testing.T) { |
| type derived []uint8 |
| |
| output, err := converter{}.ConvertValue(derived("value")) |
| if err != nil { |
| t.Fatal("Byte slice not convertible", err) |
| } |
| |
| if !bytes.Equal(output.([]byte), []byte("value")) { |
| t.Fatalf("Byte slice not converted, got %#v %T", output, output) |
| } |
| } |
| |
| func TestConvertDerivedUnsupportedSlice(t *testing.T) { |
| type derived []int |
| |
| _, err := converter{}.ConvertValue(derived{1}) |
| if err == nil || err.Error() != "unsupported type mysql.derived, a slice of int" { |
| t.Fatal("Unexpected error", err) |
| } |
| } |
| |
| func TestConvertDerivedBool(t *testing.T) { |
| type derived bool |
| |
| output, err := converter{}.ConvertValue(derived(true)) |
| if err != nil { |
| t.Fatal("Derived bool type not convertible", err) |
| } |
| |
| if output != true { |
| t.Fatalf("Derived bool type not converted, got %#v %T", output, output) |
| } |
| } |
| |
| func TestConvertPointer(t *testing.T) { |
| str := "value" |
| |
| output, err := converter{}.ConvertValue(&str) |
| if err != nil { |
| t.Fatal("Pointer type not convertible", err) |
| } |
| |
| if output != "value" { |
| t.Fatalf("Pointer type not converted, got %#v %T", output, output) |
| } |
| } |
| |
| func TestConvertSignedIntegers(t *testing.T) { |
| values := []any{ |
| int8(-42), |
| int16(-42), |
| int32(-42), |
| int64(-42), |
| int(-42), |
| } |
| |
| for _, value := range values { |
| output, err := converter{}.ConvertValue(value) |
| if err != nil { |
| t.Fatalf("%T type not convertible %s", value, err) |
| } |
| |
| if output != int64(-42) { |
| t.Fatalf("%T type not converted, got %#v %T", value, output, output) |
| } |
| } |
| } |
| |
| type myUint64 struct { |
| value uint64 |
| } |
| |
| func (u myUint64) Value() (driver.Value, error) { |
| return u.value, nil |
| } |
| |
| func TestConvertUnsignedIntegers(t *testing.T) { |
| values := []any{ |
| uint8(42), |
| uint16(42), |
| uint32(42), |
| uint64(42), |
| uint(42), |
| myUint64{uint64(42)}, |
| } |
| |
| for _, value := range values { |
| output, err := converter{}.ConvertValue(value) |
| if err != nil { |
| t.Fatalf("%T type not convertible %s", value, err) |
| } |
| |
| if output != uint64(42) { |
| t.Fatalf("%T type not converted, got %#v %T", value, output, output) |
| } |
| } |
| |
| output, err := converter{}.ConvertValue(^uint64(0)) |
| if err != nil { |
| t.Fatal("uint64 high-bit not convertible", err) |
| } |
| |
| if output != ^uint64(0) { |
| t.Fatalf("uint64 high-bit converted, got %#v %T", output, output) |
| } |
| } |
| |
| func TestConvertJSON(t *testing.T) { |
| raw := json.RawMessage("{}") |
| |
| out, err := converter{}.ConvertValue(raw) |
| |
| if err != nil { |
| t.Fatal("json.RawMessage was failed in convert", err) |
| } |
| |
| if _, ok := out.(json.RawMessage); !ok { |
| t.Fatalf("json.RawMessage converted, got %#v %T", out, out) |
| } |
| } |