github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/longbits/long_bits_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  	"encoding/binary"
    10  	"errors"
    11  	"io"
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestNewBits64(t *testing.T) {
    18  	bits := NewBits64(0x2211)
    19  	require.Equal(t, uint8(0x11), bits.AsBytes()[0])
    20  
    21  	require.Equal(t, uint8(0x22), bits.AsBytes()[1])
    22  
    23  	require.Zero(t, bits.AsBytes()[7])
    24  }
    25  
    26  func TestBits64WriteTo(t *testing.T) {
    27  	bits := NewBits64(1)
    28  	n, err := bits.WriteTo(&writerToComparer{other: &bits})
    29  	require.Nil(t, err)
    30  
    31  	require.Equal(t, int64(8), n)
    32  
    33  	require.Equal(t, uint8(1), bits.AsBytes()[0])
    34  
    35  	require.Panics(t, func() { _, _ = bits.WriteTo(&writerToComparer{}) })
    36  }
    37  
    38  func TestBits64Read(t *testing.T) {
    39  	bits := NewBits64(1)
    40  	dest := make([]byte, 2)
    41  	n := bits.CopyTo(dest)
    42  	require.Equal(t, 2, n)
    43  
    44  	require.Equal(t, uint8(1), dest[0])
    45  
    46  	dest = make([]byte, 9)
    47  	n = bits.CopyTo(dest)
    48  	require.Equal(t, 8, n)
    49  
    50  	require.Equal(t, uint8(1), dest[0])
    51  
    52  	n = bits.CopyTo(nil)
    53  	require.Zero(t, n)
    54  }
    55  
    56  func TestBits64FoldToUint64(t *testing.T) {
    57  	b := uint64(0x807060504030201)
    58  	bits := NewBits64(b)
    59  	require.Equal(t, b, bits.FoldToUint64())
    60  }
    61  
    62  func TestBits64FixedByteSize(t *testing.T) {
    63  	bits := NewBits64(1)
    64  	require.Equal(t, 8, bits.FixedByteSize())
    65  }
    66  
    67  func TestBits64AsByteString(t *testing.T) {
    68  	bits := NewBits64(0x4142434445464748)
    69  	require.Equal(t, ByteString("HGFEDCBA"), bits.AsByteString())
    70  }
    71  
    72  func TestBits64String(t *testing.T) {
    73  	require.NotEmpty(t, NewBits64(1).String())
    74  }
    75  
    76  func TestBits64AsBytes(t *testing.T) {
    77  	bits := NewBits64(0x807060504030201)
    78  	require.Equal(t, []uint8{1, 2, 3, 4, 5, 6, 7, 8}, bits.AsBytes())
    79  }
    80  
    81  func TestFoldToBits64(t *testing.T) {
    82  	require.Equal(t, NewBits64(0x807060504030201), FoldToBits64([]byte{1, 2, 3, 4, 5, 6, 7, 8}))
    83  	require.Equal(t, NewBits64(0x1808080808080808), FoldToBits64([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}))
    84  }
    85  
    86  func TestNewBits128(t *testing.T) {
    87  	bits := NewBits128(0x11, 0x22)
    88  	require.Equal(t, uint8(0x11), bits.AsBytes()[0])
    89  
    90  	require.Equal(t, uint8(0x22), bits.AsBytes()[8])
    91  }
    92  
    93  func TestBits128WriteTo(t *testing.T) {
    94  	bits := NewBits128(1, 2)
    95  	n, err := bits.WriteTo(&writerToComparer{other: &bits})
    96  	require.Nil(t, err)
    97  
    98  	require.Equal(t, int64(16), n)
    99  
   100  	require.Equal(t, uint8(1), bits.AsBytes()[0])
   101  
   102  	require.Equal(t, uint8(2), bits.AsBytes()[8])
   103  
   104  	require.Panics(t, func() { _, _ = bits.WriteTo(&writerToComparer{}) })
   105  }
   106  
   107  func TestBits128Read(t *testing.T) {
   108  	bits := NewBits128(1, 2)
   109  	dest := make([]byte, 2)
   110  	n := bits.CopyTo(dest)
   111  	require.Equal(t, 2, n)
   112  
   113  	require.Equal(t, uint8(1), dest[0])
   114  
   115  	dest = make([]byte, 17)
   116  	n = bits.CopyTo(dest)
   117  	require.Equal(t, 16, n)
   118  
   119  	require.Equal(t, uint8(1), dest[0])
   120  
   121  	require.Equal(t, uint8(2), dest[8])
   122  
   123  	n = bits.CopyTo(nil)
   124  	require.Zero(t, n)
   125  }
   126  
   127  func TestBits128FoldToUint64(t *testing.T) {
   128  	l := uint64(0x807060504030201)
   129  	h := uint64(0x10F0E0D0C0B0A09)
   130  	bits := NewBits128(l, h)
   131  	require.Equal(t, uint64(0x908080808080808), bits.FoldToUint64())
   132  }
   133  
   134  func TestBits128FixedByteSize(t *testing.T) {
   135  	bits := NewBits128(1, 2)
   136  	require.Equal(t, 16, bits.FixedByteSize())
   137  }
   138  
   139  func TestBits128String(t *testing.T) {
   140  	require.NotEmpty(t, NewBits128(1, 2).String())
   141  }
   142  
   143  func TestBits128AsByteString(t *testing.T) {
   144  	bits := NewBits128(0x4142434445464748, 0x494A4B4C4D4E4F50)
   145  	require.Equal(t, ByteString("HGFEDCBAPONMLKJI"), bits.AsByteString())
   146  }
   147  
   148  func TestBits128AsBytes(t *testing.T) {
   149  	bits := NewBits128(0x807060504030201, 0x10F0E0D0C0B0A09)
   150  	require.Equal(t, []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1}, bits.AsBytes())
   151  }
   152  
   153  func TestBits224WriteTo(t *testing.T) {
   154  	bits := Bits224{1}
   155  	n, err := bits.WriteTo(&writerToComparer{other: &bits})
   156  	require.Equal(t, nil, err)
   157  
   158  	require.Equal(t, int64(28), n)
   159  
   160  	require.Equal(t, uint8(1), bits.AsBytes()[0])
   161  
   162  	require.Panics(t, func() { _, _ = bits.WriteTo(&writerToComparer{}) })
   163  }
   164  
   165  func TestBits224Read(t *testing.T) {
   166  	bits := Bits224{1, 2, 3}
   167  	dest := make([]byte, 2)
   168  	n := bits.CopyTo(dest)
   169  	require.Equal(t, 2, n)
   170  
   171  	require.Equal(t, uint8(1), dest[0])
   172  
   173  	dest = make([]byte, 29)
   174  	n = bits.CopyTo(dest)
   175  	require.Equal(t, 28, n)
   176  
   177  	require.Equal(t, uint8(1), dest[0])
   178  
   179  	n = bits.CopyTo(nil)
   180  	require.Zero(t, n)
   181  }
   182  
   183  func TestBits224FoldToUint64(t *testing.T) {
   184  	bits := Bits224{}
   185  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x0807060504030201))
   186  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x010F0E0D0C0B0A09))
   187  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   188  	require.Equal(t, uint64(0xf0e0d0c0b0a), bits.FoldToUint64())
   189  }
   190  
   191  func TestBits224FixedByteSize(t *testing.T) {
   192  	bits := Bits224{}
   193  	require.Equal(t, 28, bits.FixedByteSize())
   194  }
   195  
   196  func TestBits224String(t *testing.T) {
   197  	require.NotEmpty(t, Bits224{}.String())
   198  }
   199  
   200  func TestBits224AsByteString(t *testing.T) {
   201  	bits := Bits224{}
   202  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x4142434445464748))
   203  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x494A4B4C4D4E4F50))
   204  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x5152535455565758))
   205  	binary.LittleEndian.PutUint32(bits[24:28], uint32(0x41424344))
   206  	require.Equal(t, ByteString("HGFEDCBAPONMLKJIXWVUTSRQDCBA"), bits.AsByteString())
   207  }
   208  
   209  func TestBits224AsBytes(t *testing.T) {
   210  	bits := Bits224{}
   211  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   212  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   213  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x908070605040302))
   214  	binary.LittleEndian.PutUint32(bits[24:28], uint32(0x80706050))
   215  	require.Equal(t, []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
   216  		1, 2, 3, 4, 5, 6, 7, 8, 9, 0x50, 0x60, 0x70, 0x80}, bits.AsBytes())
   217  }
   218  
   219  func TestBits256WriteTo(t *testing.T) {
   220  	bits := Bits256{1}
   221  	n, err := bits.WriteTo(&writerToComparer{other: &bits})
   222  	require.Nil(t, err)
   223  
   224  	require.Equal(t, int64(32), n)
   225  
   226  	require.Equal(t, uint8(1), bits.AsBytes()[0])
   227  
   228  	require.Panics(t, func() { _, _ = bits.WriteTo(&writerToComparer{}) })
   229  }
   230  
   231  func TestBits256Read(t *testing.T) {
   232  	bits := Bits256{1, 2, 3}
   233  	dest := make([]byte, 2)
   234  	n := bits.CopyTo(dest)
   235  	require.Equal(t, 2, n)
   236  
   237  	require.Equal(t, uint8(1), dest[0])
   238  
   239  	dest = make([]byte, 33)
   240  	n = bits.CopyTo(dest)
   241  	require.Equal(t, 32, n)
   242  
   243  	require.Equal(t, uint8(1), dest[0])
   244  
   245  	n = bits.CopyTo(nil)
   246  	require.Zero(t, n)
   247  }
   248  
   249  func TestBits256FoldToUint64(t *testing.T) {
   250  	bits := Bits256{}
   251  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   252  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   253  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   254  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   255  	require.Equal(t, uint64(0x201000000000000), bits.FoldToUint64())
   256  }
   257  
   258  func TestBits256FoldToBits128(t *testing.T) {
   259  	bits := Bits256{}
   260  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   261  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   262  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   263  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   264  	require.Equal(t, Bits128{3, 1, 7, 1, 3, 1, 15, 1, 3, 1, 7, 1, 3, 1, 14, 3}, bits.FoldToBits128())
   265  }
   266  
   267  func TestBits256FoldToBits224(t *testing.T) {
   268  	bits := Bits256{}
   269  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   270  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   271  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   272  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   273  	require.Equal(t, Bits224{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
   274  		1, 2, 3, 4, 5, 6, 7, 8, 9, 0x0a, 0x0b, 0x0c, 0x0d}, bits.TruncateToBits224())
   275  }
   276  
   277  func TestBits256FixedByteSize(t *testing.T) {
   278  	bits := Bits256{}
   279  	require.Equal(t, 32, bits.FixedByteSize())
   280  }
   281  
   282  func TestBits256String(t *testing.T) {
   283  	require.NotEmpty(t, Bits256{}.String())
   284  }
   285  
   286  func TestBits256AsByteString(t *testing.T) {
   287  	bits := Bits256{}
   288  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x4142434445464748))
   289  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x494A4B4C4D4E4F50))
   290  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x5152535455565758))
   291  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x595A5B5C5D5E5F60))
   292  	require.Equal(t, ByteString("HGFEDCBAPONMLKJIXWVUTSRQ`_^]\\[ZY"), bits.AsByteString())
   293  }
   294  
   295  func TestBits256AsBytes(t *testing.T) {
   296  	bits := Bits256{}
   297  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   298  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   299  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x908070605040302))
   300  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   301  	require.Equal(t, []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
   302  		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2}, bits.AsBytes())
   303  }
   304  
   305  func TestBits512WriteTo(t *testing.T) {
   306  	bits := Bits512{1}
   307  	n, err := bits.WriteTo(&writerToComparer{other: &bits})
   308  	require.Nil(t, err)
   309  
   310  	require.Equal(t, int64(64), n)
   311  
   312  	require.Equal(t, uint8(1), bits.AsBytes()[0])
   313  
   314  	require.Panics(t, func() { _, _ = bits.WriteTo(&writerToComparer{}) })
   315  }
   316  
   317  func TestBits512Read(t *testing.T) {
   318  	bits := Bits512{1, 2, 3}
   319  	dest := make([]byte, 2)
   320  	n := bits.CopyTo(dest)
   321  	require.Equal(t, 2, n)
   322  
   323  	require.Equal(t, uint8(1), dest[0])
   324  
   325  	dest = make([]byte, 65)
   326  	n = bits.CopyTo(dest)
   327  	require.Equal(t, 64, n)
   328  
   329  	require.Equal(t, uint8(1), dest[0])
   330  
   331  	n = bits.CopyTo(nil)
   332  	require.Zero(t, n)
   333  }
   334  
   335  func TestBits512FoldToUint64(t *testing.T) {
   336  	bits := Bits512{}
   337  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   338  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   339  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   340  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   341  	binary.LittleEndian.PutUint64(bits[32:40], uint64(0x0A09080706050403))
   342  	binary.LittleEndian.PutUint64(bits[40:48], uint64(0x0302010F0E0D0C0B))
   343  	binary.LittleEndian.PutUint64(bits[48:56], uint64(0x0B0A090807060504))
   344  	binary.LittleEndian.PutUint64(bits[56:64], uint64(0x040302010F0E0D0C))
   345  	require.Equal(t, uint64(0x403020100000000), bits.FoldToUint64())
   346  }
   347  
   348  func TestBits512FoldToBits256(t *testing.T) {
   349  	bits := Bits512{}
   350  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   351  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   352  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   353  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   354  	binary.LittleEndian.PutUint64(bits[32:40], uint64(0x0A09080706050403))
   355  	binary.LittleEndian.PutUint64(bits[40:48], uint64(0x0302010F0E0D0C0B))
   356  	binary.LittleEndian.PutUint64(bits[48:56], uint64(0x0B0A090807060504))
   357  	binary.LittleEndian.PutUint64(bits[56:64], uint64(0x040302010F0E0D0C))
   358  	require.Equal(t, Bits256{2, 6, 6, 2, 2, 14, 14, 2, 2, 6, 6, 2, 2, 15, 13, 2, 6, 6, 2, 2, 14, 14,
   359  		2, 2, 6, 6, 2, 2, 15, 13, 2, 6}, bits.FoldToBits256())
   360  }
   361  
   362  func TestBits512FoldToBits224(t *testing.T) {
   363  	bits := Bits512{}
   364  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   365  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   366  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x0908070605040302))
   367  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   368  	binary.LittleEndian.PutUint64(bits[32:40], uint64(0x0A09080706050403))
   369  	binary.LittleEndian.PutUint64(bits[40:48], uint64(0x0302010F0E0D0C0B))
   370  	binary.LittleEndian.PutUint64(bits[48:56], uint64(0x0B0A090807060504))
   371  	binary.LittleEndian.PutUint64(bits[56:64], uint64(0x040302010F0E0D0C))
   372  	require.Equal(t, Bits224{2, 6, 6, 2, 2, 14, 14, 2, 2, 6, 6, 2, 2, 15, 13, 2, 6, 6, 2, 2, 14, 14,
   373  		2, 2, 6, 6, 2, 2}, bits.FoldToBits224())
   374  }
   375  
   376  func TestBits512FixedByteSize(t *testing.T) {
   377  	bits := Bits512{}
   378  	require.Equal(t, 64, bits.FixedByteSize())
   379  }
   380  
   381  func TestBits512String(t *testing.T) {
   382  	require.NotEmpty(t, Bits512{}.String())
   383  }
   384  
   385  func TestBits512AsByteString(t *testing.T) {
   386  	bits := Bits512{}
   387  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x4142434445464748))
   388  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x494A4B4C4D4E4F50))
   389  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x5152535455565758))
   390  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x595A5B5C5D5E5F60))
   391  	binary.LittleEndian.PutUint64(bits[32:40], uint64(0x6162636465666768))
   392  	binary.LittleEndian.PutUint64(bits[40:48], uint64(0x696A6B6C6D6E6F70))
   393  	binary.LittleEndian.PutUint64(bits[48:56], uint64(0x7172737475767778))
   394  	binary.LittleEndian.PutUint64(bits[56:64], uint64(0x797A7B7C7D7E7F80))
   395  	require.Equal(t, ByteString("HGFEDCBAPONMLKJIXWVUTSRQ`_^]\\[ZYhgfedcbaponmlkjixwvutsrq\x80\u007f~}|{zy"),
   396  		bits.AsByteString())
   397  }
   398  
   399  func TestBits512AsBytes(t *testing.T) {
   400  	bits := Bits512{}
   401  	binary.LittleEndian.PutUint64(bits[:8], uint64(0x807060504030201))
   402  	binary.LittleEndian.PutUint64(bits[8:16], uint64(0x10F0E0D0C0B0A09))
   403  	binary.LittleEndian.PutUint64(bits[16:24], uint64(0x908070605040302))
   404  	binary.LittleEndian.PutUint64(bits[24:32], uint64(0x02010F0E0D0C0B0A))
   405  	binary.LittleEndian.PutUint64(bits[32:40], uint64(0x0A09080706050403))
   406  	binary.LittleEndian.PutUint64(bits[40:48], uint64(0x0302010F0E0D0C0B))
   407  	binary.LittleEndian.PutUint64(bits[48:56], uint64(0x0B0A090807060504))
   408  	binary.LittleEndian.PutUint64(bits[56:64], uint64(0x040302010F0E0D0C))
   409  	require.Equal(t, []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
   410  		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
   411  		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4}, bits.AsBytes())
   412  }
   413  
   414  func TestFoldedFoldToUint64(t *testing.T) {
   415  	require.Equal(t, uint64(0x807060504030201), FoldToUint64([]byte{1, 2, 3, 4, 5, 6, 7, 8}))
   416  	require.Equal(t, uint64(0x1808080808080808), FoldToUint64([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}))
   417  }
   418  
   419  func TestFillBitsWithStaticNoise(t *testing.T) {
   420  	bytes := []byte{1, 2, 3, 4, 5, 6, 7, 8}
   421  	FillBitsWithStaticNoise(5, bytes)
   422  	require.Equal(t, []byte{0xde, 0xaa, 0xdb, 0x79, 0x6d, 0xd5, 0xed, 0x3c}, bytes)
   423  
   424  	bytes = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
   425  	FillBitsWithStaticNoise(31, bytes)
   426  	require.Equal(t, []byte{0xc9, 0xaa, 0xcc, 0xf9, 0x65, 0x55, 0xe6, 0x3c, 0xc8, 0x2a, 0xcd,
   427  		0xb9, 0x64, 0x95, 0xe6, 0x3c}, bytes)
   428  
   429  	require.Panics(t, func() { FillBitsWithStaticNoise(1, []byte{1}) })
   430  }
   431  
   432  func TestBitsToStringDefault(t *testing.T) {
   433  	bits := Bits64{1}
   434  	require.NotEmpty(t, bitsToStringDefault(&bits))
   435  }
   436  
   437  func TestBytesToDigestString(t *testing.T) {
   438  	bits := Bits64{1}
   439  	require.NotEmpty(t, BytesToDigestString(&bits, "abc"))
   440  }
   441  
   442  func TestCopyToFixedBits(t *testing.T) {
   443  	var d, s []byte
   444  	copyToFixedBits(d, s, 0)
   445  	require.Len(t, d, 0)
   446  
   447  	require.Len(t, s, 0)
   448  
   449  	d = make([]byte, 1)
   450  	copyToFixedBits(d, s, 0)
   451  	require.Len(t, d, 1)
   452  
   453  	require.Len(t, s, 0)
   454  
   455  	d = nil
   456  	s = []byte{1}
   457  	copyToFixedBits(d, s, 1)
   458  	require.Len(t, d, 0)
   459  
   460  	require.Len(t, s, 1)
   461  
   462  	d = make([]byte, 1)
   463  	copyToFixedBits(d, s, 1)
   464  	require.Len(t, s, 1)
   465  
   466  	require.Len(t, s, 1)
   467  
   468  	require.Equal(t, s[0], d[0])
   469  
   470  	require.Equal(t, uint8(1), d[0])
   471  
   472  	d = make([]byte, 2)
   473  	copyToFixedBits(d, s, 1)
   474  	require.Len(t, d, 2)
   475  
   476  	require.Len(t, s, 1)
   477  
   478  	d = make([]byte, 1)
   479  	s = []byte{1, 2}
   480  	copyToFixedBits(d, s, 2)
   481  	require.Len(t, d, 1)
   482  
   483  	require.Len(t, s, 2)
   484  
   485  	require.Equal(t, s[0], d[0])
   486  
   487  	require.Equal(t, uint8(1), d[0])
   488  
   489  	require.Panics(t, func() { copyToFixedBits(d, s, 3) })
   490  }
   491  
   492  func TestNewBits64FromBytes(t *testing.T) {
   493  	var bytes []byte
   494  	for i := 0; i < 8; i++ {
   495  		bytes = append(bytes, byte(i%8))
   496  	}
   497  	bits := NewBits64FromBytes(bytes)
   498  	require.Equal(t, bytes, bits.AsBytes())
   499  
   500  	require.Panics(t, func() { NewBits64FromBytes([]byte{1}) })
   501  }
   502  
   503  func TestNewBits128FromBytes(t *testing.T) {
   504  	var bytes []byte
   505  	for i := 0; i < 16; i++ {
   506  		bytes = append(bytes, byte(i%8))
   507  	}
   508  	bits := NewBits128FromBytes(bytes)
   509  	require.Equal(t, bytes, bits.AsBytes())
   510  
   511  	require.Panics(t, func() { NewBits128FromBytes([]byte{1}) })
   512  }
   513  
   514  func TestNewBits224FromBytes(t *testing.T) {
   515  	var bytes []byte
   516  	for i := 0; i < 28; i++ {
   517  		bytes = append(bytes, byte(i%8))
   518  	}
   519  	bits := NewBits224FromBytes(bytes)
   520  	require.Equal(t, bytes, bits.AsBytes())
   521  
   522  	require.Panics(t, func() { NewBits224FromBytes([]byte{1}) })
   523  }
   524  
   525  func TestNewBits256FromBytes(t *testing.T) {
   526  	var bytes []byte
   527  	for i := 0; i < 32; i++ {
   528  		bytes = append(bytes, byte(i%8))
   529  	}
   530  	bits := NewBits256FromBytes(bytes)
   531  	require.Equal(t, bytes, bits.AsBytes())
   532  
   533  	require.Panics(t, func() { NewBits256FromBytes([]byte{1}) })
   534  }
   535  
   536  func TestNewBits512FromBytes(t *testing.T) {
   537  	var bytes []byte
   538  	for i := 0; i < 64; i++ {
   539  		bytes = append(bytes, byte(i%8))
   540  	}
   541  	bits := NewBits512FromBytes(bytes)
   542  	require.Equal(t, bytes, bits.AsBytes())
   543  
   544  	require.Panics(t, func() { NewBits512FromBytes([]byte{1}) })
   545  }
   546  
   547  func TestCutOutBits64FromLonger(t *testing.T) {
   548  	bytes := make([]byte, 64/8)
   549  	for i := range bytes {
   550  		bytes[i] = byte(i + 1)
   551  	}
   552  	require.Equal(t, bytes, CutOutBits64(bytes).AsBytes())
   553  
   554  	for i := byte(len(bytes)); i < 1024/8; i++ {
   555  		bytes = append(bytes, i+1)
   556  		cut := CutOutBits64(bytes)
   557  		//t.Log(i, cut[:])
   558  		prev := byte(0)
   559  		for _, b := range cut {
   560  			if prev >= b {
   561  				require.Fail(t, "invalid sequence", "", i, cut[:])
   562  			}
   563  			prev = b
   564  		}
   565  	}
   566  }
   567  
   568  func TestVerifyReadAt(t *testing.T) {
   569  	for _, tc := range []struct {
   570  		input []byte
   571  		off   int64
   572  		max   int
   573  		res   int
   574  		err   error
   575  	}{
   576  		{
   577  			input: []byte{0x1, 0x0},
   578  			off:   1,
   579  			max:   10,
   580  			res:   2,
   581  		},
   582  		{
   583  			input: []byte{0x1},
   584  			off:   -1,
   585  			max:   10,
   586  			err:   errors.New("negative offset"),
   587  		},
   588  		{
   589  			input: []byte{},
   590  			off:   1,
   591  			max:   10,
   592  			res:   0,
   593  		},
   594  		{
   595  			input: []byte{0x1},
   596  			off:   1,
   597  			max:   1,
   598  			err:   io.EOF,
   599  		},
   600  		{
   601  			input: []byte{0x1},
   602  			off:   2,
   603  			max:   1,
   604  			res:   0,
   605  			err:   io.ErrUnexpectedEOF,
   606  		},
   607  	} {
   608  		res, err := VerifyReadAt(tc.input, tc.off, tc.max)
   609  		require.Equal(t, tc.err, err)
   610  		require.Equal(t, tc.res, res)
   611  	}
   612  }
   613  
   614  func TestBytesToGroupedString(t *testing.T) {
   615  	for _, tc := range []struct {
   616  		bytes     []byte
   617  		prefix    string
   618  		separator string
   619  		everyN    int
   620  		res       string
   621  	}{
   622  		{
   623  			bytes:     nil,
   624  			prefix:    "",
   625  			separator: "",
   626  			everyN:    10,
   627  			res:       "",
   628  		},
   629  		{
   630  			bytes:     []byte{0x2},
   631  			prefix:    "",
   632  			separator: "",
   633  			everyN:    10,
   634  			res:       "02",
   635  		},
   636  		{
   637  			bytes:     []byte{0x0},
   638  			prefix:    "ins",
   639  			separator: "",
   640  			everyN:    10,
   641  			res:       "ins00",
   642  		},
   643  		{
   644  			bytes:     []byte{0x0, 0x0, 0x0},
   645  			prefix:    "ins",
   646  			separator: "||",
   647  			everyN:    0,
   648  			res:       "ins000000",
   649  		},
   650  		{
   651  			bytes:     []byte{0x0, 0x0, 0x0},
   652  			prefix:    "ins",
   653  			separator: "||",
   654  			everyN:    1,
   655  			res:       "ins0||0||0",
   656  		},
   657  		{
   658  			bytes:     []byte{0x0, 0x0, 0x0},
   659  			prefix:    "ins",
   660  			separator: "||",
   661  			everyN:    2,
   662  			res:       "ins00||00",
   663  		},
   664  		{
   665  			bytes:     []byte{0x0, 0x0, 0x0, 0x0},
   666  			prefix:    "ins",
   667  			separator: "||",
   668  			everyN:    2,
   669  			res:       "ins00||00",
   670  		},
   671  	} {
   672  		require.Equal(t, tc.res, BytesToGroupedString(tc.bytes, tc.prefix, tc.separator, tc.everyN))
   673  	}
   674  }