github.com/alexflint/go-memdump@v1.1.0/heterogeneous_test.go (about) 1 package memdump 2 3 import ( 4 "bytes" 5 "strings" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func testEncodeDecode(t *testing.T, src interface{}, dest interface{}) { 13 var b bytes.Buffer 14 15 enc := NewHeterogeneousEncoder(&b) 16 err := enc.Encode(src) 17 require.NoError(t, err) 18 19 dec := NewHeterogeneousDecoder(&b) 20 err = dec.Decode(dest) 21 require.NoError(t, err) 22 } 23 24 func TestHeterogeneous_Int(t *testing.T) { 25 var dest int 26 var src int = 3 27 testEncodeDecode(t, &src, &dest) 28 assert.EqualValues(t, src, dest) 29 } 30 31 func TestHeterogeneous_String(t *testing.T) { 32 var dest string 33 src := "abc" 34 testEncodeDecode(t, &src, &dest) 35 assert.EqualValues(t, src, dest) 36 } 37 38 func TestHeterogeneous_Slice(t *testing.T) { 39 var dest []int16 40 src := []int16{5, 4, 3} 41 testEncodeDecode(t, &src, &dest) 42 assert.EqualValues(t, src, dest) 43 } 44 45 func TestHeterogeneous_Large(t *testing.T) { 46 type T struct { 47 A string 48 B int 49 } 50 src := make([]T, 1000) 51 for i := range src { 52 src[i].A = strings.Repeat("123", 100) 53 src[i].B = 123 54 } 55 var dest []T 56 testEncodeDecode(t, &src, &dest) 57 assert.EqualValues(t, src, dest) 58 } 59 60 func TestHeterogeneous_Struct(t *testing.T) { 61 type U struct { 62 W string 63 X *string 64 } 65 type T struct { 66 U 67 A int 68 B byte 69 C []U 70 D []*U 71 E *[]U 72 F *U 73 G *T 74 } 75 76 s := "hello" 77 u := U{W: s, X: &s} 78 src := T{ 79 U: u, 80 A: 5, 81 B: 6, 82 C: []U{u}, 83 D: []*U{&u}, 84 F: &u, 85 } 86 src.E = &src.C 87 src.G = &src 88 89 var dest T 90 testEncodeDecode(t, &src, &dest) 91 assert.EqualValues(t, src, dest) 92 } 93 94 func TestHeterogeneous_Incompatible(t *testing.T) { 95 type U struct { 96 X int 97 Y string 98 } 99 type V struct { 100 X string 101 Y int 102 } 103 104 src := U{3, "abc"} 105 var dest V 106 107 var b bytes.Buffer 108 109 enc := NewHeterogeneousEncoder(&b) 110 err := enc.Encode(&src) 111 require.NoError(t, err) 112 113 dec := NewHeterogeneousDecoder(&b) 114 err = dec.Decode(&dest) 115 assert.Equal(t, ErrIncompatibleLayout, err) 116 } 117 118 func TestHeterogeneousEncodeUnsupportedTypes(t *testing.T) { 119 var buf bytes.Buffer 120 enc := NewHeterogeneousEncoder(&buf) 121 assert.Panics(t, func() { 122 enc.Encode(&map[string]int{}) 123 }) 124 assert.Panics(t, func() { 125 enc.Encode(func() {}) 126 }) 127 assert.Panics(t, func() { 128 enc.Encode(make(chan int)) 129 }) 130 assert.Panics(t, func() { 131 var x interface{} = "abc" 132 enc.Encode(&x) 133 }) 134 }