github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/longbits/fixed_size_test.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package longbits 7 8 import ( 9 "bytes" 10 "crypto/rand" 11 "errors" 12 "io" 13 "math" 14 "testing" 15 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestFoldUint64(t *testing.T) { 20 require.Zero(t, FoldUint64(0)) 21 22 require.Equal(t, uint32(2), FoldUint64(2)) 23 24 require.Equal(t, uint32(math.MaxUint32), FoldUint64(math.MaxUint32)) 25 26 require.Equal(t, uint32(1), FoldUint64(math.MaxUint32+1)) 27 28 require.Zero(t, FoldUint64(math.MaxUint64)) 29 } 30 31 func TestEqualFixedLenWriterTo(t *testing.T) { 32 require.False(t, Equal(nil, nil)) 33 34 bits1 := NewBits64(0) 35 require.False(t, Equal(&bits1, nil)) 36 37 require.False(t, Equal(nil, &bits1)) 38 39 bits2 := NewBits64(0) 40 require.True(t, Equal(&bits1, &bits2)) 41 42 bits2 = NewBits64(1) 43 require.False(t, Equal(&bits1, &bits2)) 44 } 45 46 func TestCompare(t *testing.T) { 47 require.False(t, (&writerToComparer{}).compare(nil, nil)) 48 49 bits1 := NewBits64(0) 50 require.False(t, (&writerToComparer{}).compare(&bits1, nil)) 51 52 require.False(t, (&writerToComparer{}).compare(nil, &bits1)) 53 54 bits2 := NewBits64(0) 55 require.True(t, (&writerToComparer{}).compare(&bits1, &bits2)) 56 57 bits3 := NewBits128(0, 0) 58 require.False(t, (&writerToComparer{}).compare(&bits1, &bits3)) 59 60 bits1 = NewBits64(1) 61 require.False(t, (&writerToComparer{}).compare(&bits1, &bits2)) 62 } 63 64 func TestWrite(t *testing.T) { 65 require.Panics(t, func() { _, _ = (&writerToComparer{}).Write(nil) }) 66 67 bits := NewBits64(0) 68 fr := NewFixedReaderMock(t) 69 fr.WriteToMock.Set(func(io.Writer) (int64, error) { return 0, errors.New("test") }) 70 n, err := (&writerToComparer{other: fr}).Write(bits.AsBytes()) 71 require.NotEqual(t, nil, err) 72 73 require.Zero(t, n) 74 75 n, err = (&writerToComparer{other: &bits}).Write(bits.AsBytes()) 76 require.Nil(t, err) 77 78 require.Equal(t, 8, n) 79 } 80 81 func TestAsByteString(t *testing.T) { 82 fs := fixedSize{} 83 require.Empty(t, fs.AsByteString()) 84 85 fs = fixedSize{data: []byte{'a', 'b', 'c'}} 86 require.Equal(t, ByteString("abc"), fs.AsByteString()) 87 } 88 89 func TestWriteTo(t *testing.T) { 90 fs := fixedSize{data: []byte{0}} 91 buf := &bytes.Buffer{} 92 n, err := fs.WriteTo(buf) 93 require.Nil(t, err) 94 95 require.Equal(t, int64(1), n) 96 } 97 98 func TestRead(t *testing.T) { 99 item := byte(3) 100 fs := fixedSize{data: []byte{item}} 101 buf := make([]byte, 2) 102 n := fs.CopyTo(buf) 103 require.Equal(t, 1, n) 104 require.Equal(t, item, buf[0]) 105 } 106 107 func TestFoldToUint64(t *testing.T) { 108 require.Equal(t, uint64(0), fixedSize{data: []byte{}}.FoldToUint64()) 109 require.Equal(t, uint64(0x01), fixedSize{data: []byte{1}}.FoldToUint64()) 110 require.Equal(t, uint64(0x0201), fixedSize{data: []byte{1, 2}}.FoldToUint64()) 111 112 fs := fixedSize{data: []byte{1, 2, 3, 4, 5, 6, 7, 8}} 113 require.Equal(t, uint64(0x0807060504030201), fs.FoldToUint64()) 114 fs.data = append(fs.data, 9) 115 require.Equal(t, uint64(0x0807060504030208), fs.FoldToUint64()) 116 fs.data = append(fs.data, 10) 117 require.Equal(t, uint64(0x0807060504030808), fs.FoldToUint64()) 118 fs.data = append(fs.data, 11, 12, 13, 14, 15, 16) 119 require.Equal(t, uint64(0x1808080808080808), fs.FoldToUint64()) 120 fs.data = append(fs.data, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80) 121 require.Equal(t, uint64(0x9878685848382818), fs.FoldToUint64()) 122 } 123 124 func TestCutOutUint64(t *testing.T) { 125 require.Equal(t, uint64(0), fixedSize{data: []byte{}}.CutOutUint64()) 126 require.Equal(t, uint64(0x01), fixedSize{data: []byte{1}}.CutOutUint64()) 127 require.Equal(t, uint64(0x0201), fixedSize{data: []byte{1, 2}}.CutOutUint64()) 128 require.Equal(t, uint64(0x807060504030201), fixedSize{data: []byte{1, 2, 3, 4, 5, 6, 7, 8}}.CutOutUint64()) 129 } 130 131 func TestFixedByteSize(t *testing.T) { 132 fs := fixedSize{data: []byte{1, 2}} 133 require.Equal(t, len(fs.data), fs.FixedByteSize()) 134 } 135 136 func TestCopyTo(t *testing.T) { 137 fs := fixedSize{data: []byte{1, 2}} 138 d := []byte{0, 0, 0} 139 140 require.Equal(t, 1, fs.CopyTo(d[:1])) 141 require.Equal(t, fs.data[0], d[0]) 142 require.Zero(t, d[1]) 143 144 require.Equal(t, len(fs.data), fs.CopyTo(d)) 145 require.Equal(t, fs.data, d[:len(fs.data)]) 146 } 147 148 func TestNewFixedReader(t *testing.T) { 149 data := []byte{1, 2, 3} 150 fr := WrapBytes(data) 151 require.Len(t, AsBytes(fr), len(data)) 152 153 require.Equal(t, data[1], AsBytes(fr)[1]) 154 } 155 156 func TestCopyFixedSize(t *testing.T) { 157 var b [1024/8]byte 158 _, _ = rand.Read(b[:]) 159 160 for i := len(b); i >= 0; i-- { 161 orig := WrapBytes(b[:i]) 162 cp := CopyFixed(orig) 163 164 require.Equal(t, i, cp.FixedByteSize(), i) 165 require.True(t, Equal(orig, cp), i) 166 167 switch i*8 { 168 case 0: 169 require.Equal(t, EmptyByteString, cp, i) 170 require.Nil(t, AsBytes(cp), i) 171 continue 172 case 64: 173 require.IsType(t, Bits64{}, cp, i) 174 case 128: 175 require.IsType(t, Bits128{}, cp, i) 176 case 224: 177 require.IsType(t, Bits224{}, cp, i) 178 case 256: 179 require.IsType(t, Bits256{}, cp, i) 180 case 512: 181 require.IsType(t, Bits512{}, cp, i) 182 default: 183 require.IsType(t, fixedSize{}, cp, i) 184 } 185 require.Equal(t, b[:i], AsBytes(cp), i) 186 } 187 } 188 189 func TestEqual(t *testing.T) { 190 empty0 := WrapBytes([]byte{}) 191 empty1 := WrapBytes([]byte{}) 192 require.False(t, Equal(nil, nil)) 193 require.False(t, Equal(nil, empty1)) 194 require.False(t, Equal(empty0, nil)) 195 require.True(t, Equal(empty0, empty1)) 196 require.False(t, Equal(empty0, WrapBytes([]byte{1}))) 197 require.True(t, Equal(WrapBytes([]byte{1}), WrapBytes([]byte{1}))) 198 } 199 200 func TestEqualToBytes(t *testing.T) { 201 empty0 := WrapBytes([]byte{}) 202 empty1 := make([]byte, 0) 203 require.False(t, EqualToBytes(nil, nil)) 204 require.False(t, EqualToBytes(nil, empty1)) 205 require.True(t, EqualToBytes(empty0, nil)) 206 require.True(t, EqualToBytes(empty0, empty1)) 207 require.False(t, EqualToBytes(empty0, []byte{1})) 208 require.True(t, EqualToBytes(WrapBytes([]byte{1}), []byte{1})) 209 }