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  }