blob: 5765c9642efed9113446e91b5656f5db4cd83545 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package frob_test
import (
"math"
"reflect"
"testing"
"golang.org/x/tools/gopls/internal/util/frob"
)
func TestBasics(t *testing.T) {
type Basics struct {
A []*string
B [2]int
C *Basics
D map[string]int
E []byte
F []string
}
codec := frob.CodecFor[Basics]()
s1, s2 := "hello", "world"
x := Basics{
A: []*string{&s1, nil, &s2},
B: [...]int{1, 2},
C: &Basics{
B: [...]int{3, 4},
D: map[string]int{"one": 1},
},
E: []byte("hello"),
F: []string{s1, s2},
}
var y Basics
codec.Decode(codec.Encode(x), &y)
if !reflect.DeepEqual(x, y) {
t.Fatalf("bad roundtrip: got %#v, want %#v", y, x)
}
}
func TestInts(t *testing.T) {
type Ints struct {
U uint
U8 uint8
U16 uint16
U32 uint32
U64 uint64
UP uintptr
I int
I8 int8
I16 int16
I32 int32
I64 int64
F32 float32
F64 float64
C64 complex64
C128 complex128
}
codec := frob.CodecFor[Ints]()
// maxima
max1 := Ints{
U: math.MaxUint,
U8: math.MaxUint8,
U16: math.MaxUint16,
U32: math.MaxUint32,
U64: math.MaxUint64,
UP: math.MaxUint,
I: math.MaxInt,
I8: math.MaxInt8,
I16: math.MaxInt16,
I32: math.MaxInt32,
I64: math.MaxInt64,
F32: math.MaxFloat32,
F64: math.MaxFloat64,
C64: complex(math.MaxFloat32, math.MaxFloat32),
C128: complex(math.MaxFloat64, math.MaxFloat64),
}
var max2 Ints
codec.Decode(codec.Encode(max1), &max2)
if !reflect.DeepEqual(max1, max2) {
t.Fatalf("max: bad roundtrip: got %#v, want %#v", max2, max1)
}
// minima
min1 := Ints{
I: math.MinInt,
I8: math.MinInt8,
I16: math.MinInt16,
I32: math.MinInt32,
I64: math.MinInt64,
F32: -math.MaxFloat32,
F64: -math.MaxFloat32,
C64: complex(-math.MaxFloat32, -math.MaxFloat32),
C128: complex(-math.MaxFloat64, -math.MaxFloat64),
}
var min2 Ints
codec.Decode(codec.Encode(min1), &min2)
if !reflect.DeepEqual(min1, min2) {
t.Fatalf("min: bad roundtrip: got %#v, want %#v", min2, min1)
}
// negatives (other than MinInt), to exercise conversions
neg1 := Ints{
I: -1,
I8: -1,
I16: -1,
I32: -1,
I64: -1,
}
var neg2 Ints
codec.Decode(codec.Encode(neg1), &neg2)
if !reflect.DeepEqual(neg1, neg2) {
t.Fatalf("neg: bad roundtrip: got %#v, want %#v", neg2, neg1)
}
}