github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/longbits/bit_builder_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  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestBitBuilder_FirstLow_BitOrder(t *testing.T) {
    15  	bb := BitBuilder{}
    16  	bb.AppendBit(0)
    17  	bb.AppendBit(1)
    18  	bb.AppendBit(1)
    19  	bb.AppendBit(0)
    20  	bb.AppendBit(1)
    21  	bb.AppendBit(1)
    22  	bb.AppendBit(0)
    23  	bb.AppendBit(1)
    24  
    25  	bb.AppendByte(0xB6)
    26  	bb.AppendSubByte(0x06, 4)
    27  	bb.AppendSubByte(0x0B, 4)
    28  
    29  	require.Equal(t, []byte{0xB6, 0xB6, 0xB6}, bb.dump())
    30  	require.Equal(t, 24, bb.BitLen())
    31  }
    32  
    33  func TestBitBuilder_FirstHigh_BitOrder(t *testing.T) {
    34  	bb := NewBitBuilder(MSB, 0)
    35  	bb.AppendBit(0)
    36  	bb.AppendBit(1)
    37  	bb.AppendBit(1)
    38  	bb.AppendBit(0)
    39  	bb.AppendBit(1)
    40  	bb.AppendBit(1)
    41  	bb.AppendBit(0)
    42  	bb.AppendBit(1)
    43  
    44  	bb.AppendByte(0xB6)
    45  	bb.AppendSubByte(0x06, 4)
    46  	bb.AppendSubByte(0x0B, 4)
    47  
    48  	require.Equal(t, []byte{0x6D, 0x6D, 0x6D}, bb.dump())
    49  	require.Equal(t, 24, bb.BitLen())
    50  }
    51  
    52  func TestBitBuilder_FirstLow(t *testing.T) {
    53  	bb := BitBuilder{}
    54  	bb.AppendBit(0)
    55  	bb.AppendBit(0)
    56  	bb.AppendBit(1)
    57  	bb.AppendBit(0)
    58  	bb.AppendBit(1)
    59  	bb.AppendBit(1)
    60  
    61  	require.Equal(t, []byte{0x34}, bb.dump())
    62  	require.Equal(t, 6, bb.BitLen())
    63  
    64  	bb.AppendNBit(7, 1)
    65  	require.Equal(t, []byte{0xF4, 0x1F}, bb.dump())
    66  	require.Equal(t, 13, bb.BitLen())
    67  
    68  	bb.AppendByte(0xAB)
    69  	require.Equal(t, []byte{0xF4, 0x7F, 0x15}, bb.dump())
    70  	require.Equal(t, 21, bb.BitLen())
    71  
    72  	bb.PadWithBit(0)
    73  	require.Equal(t, []byte{0xF4, 0x7F, 0x15}, bb.dump())
    74  	require.Equal(t, 24, bb.BitLen())
    75  
    76  	bb.PadWithBit(0)
    77  	require.Equal(t, []byte{0xF4, 0x7F, 0x15}, bb.dump())
    78  	require.Equal(t, 24, bb.BitLen())
    79  
    80  	bb.AppendAlignedByte(0x01)
    81  	bb.AppendByte(0x02)
    82  
    83  	require.Equal(t, []byte{0xF4, 0x7F, 0x15, 0x01, 0x02}, bb.dump())
    84  	require.Equal(t, 40, bb.BitLen())
    85  
    86  	bb.AppendSubByte(0x5D, 4)
    87  	require.Equal(t, []byte{0xF4, 0x7F, 0x15, 0x01, 0x02, 0x0D}, bb.dump())
    88  	require.Equal(t, 44, bb.BitLen())
    89  
    90  	bb.AppendNBit(15, 1)
    91  	require.Equal(t, []byte{0xF4, 0x7F, 0x15, 0x01, 0x02, 0xFD, 0xFF, 0x07}, bb.dump())
    92  	require.Equal(t, 59, bb.BitLen())
    93  
    94  	bb.PadWithBit(1)
    95  	require.Equal(t, []byte{0xF4, 0x7F, 0x15, 0x01, 0x02, 0xFD, 0xFF, 0xFF}, bb.dump())
    96  	require.Equal(t, 64, bb.BitLen())
    97  
    98  	bb.PadWithBit(1)
    99  	require.Equal(t, []byte{0xF4, 0x7F, 0x15, 0x01, 0x02, 0xFD, 0xFF, 0xFF}, bb.dump())
   100  	require.Equal(t, 64, bb.BitLen())
   101  }
   102  
   103  func TestBitBuilder_FirstHigh(t *testing.T) {
   104  	bb := NewBitBuilder(MSB, 0)
   105  	bb.AppendBit(0)
   106  	bb.AppendBit(0)
   107  	bb.AppendBit(1)
   108  	bb.AppendBit(0)
   109  	bb.AppendBit(1)
   110  	bb.AppendBit(1)
   111  
   112  	require.Equal(t, []byte{0x2C}, bb.dump())
   113  	require.Equal(t, 6, bb.BitLen())
   114  
   115  	bb.AppendNBit(7, 1)
   116  	require.Equal(t, []byte{0x2F, 0xF8}, bb.dump())
   117  	require.Equal(t, 13, bb.BitLen())
   118  
   119  	bb.AppendByte(0xAB)
   120  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8}, bb.dump())
   121  	require.Equal(t, 21, bb.BitLen())
   122  
   123  	bb.PadWithBit(0)
   124  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8}, bb.dump())
   125  	require.Equal(t, 24, bb.BitLen())
   126  
   127  	bb.PadWithBit(0)
   128  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8}, bb.dump())
   129  	require.Equal(t, 24, bb.BitLen())
   130  
   131  	bb.AppendAlignedByte(0x01)
   132  	bb.AppendByte(0x02)
   133  
   134  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8, 0x80, 0x40}, bb.dump())
   135  	require.Equal(t, 40, bb.BitLen())
   136  
   137  	bb.AppendSubByte(0x5D, 4)
   138  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8, 0x80, 0x40, 0xB0}, bb.dump())
   139  	require.Equal(t, 44, bb.BitLen())
   140  
   141  	bb.AppendNBit(15, 1)
   142  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8, 0x80, 0x40, 0xBF, 0xFF, 0xE0}, bb.dump())
   143  	require.Equal(t, 59, bb.BitLen())
   144  
   145  	bb.PadWithBit(1)
   146  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8, 0x80, 0x40, 0xBF, 0xFF, 0xFF}, bb.dump())
   147  	require.Equal(t, 64, bb.BitLen())
   148  
   149  	bb.PadWithBit(1)
   150  	require.Equal(t, []byte{0x2F, 0xFE, 0xA8, 0x80, 0x40, 0xBF, 0xFF, 0xFF}, bb.dump())
   151  	require.Equal(t, 64, bb.BitLen())
   152  }
   153  
   154  func TestBitBuilder_FirstLow_SubByte(t *testing.T) {
   155  	bb := BitBuilder{}
   156  	for i := byte(0); i < 8; i++ {
   157  		bb.AppendSubByte(i, 3)
   158  	}
   159  	require.Equal(t, 24, bb.BitLen())
   160  	require.Equal(t, []byte{0x88, 0xC6, 0xFA}, bb.dump())
   161  }
   162  
   163  func TestBitBuilder_FirstHigh_SubByte(t *testing.T) {
   164  	bb := NewBitBuilder(MSB, 0)
   165  	for i := byte(0); i < 8; i++ {
   166  		bb.AppendSubByte(i, 3)
   167  	}
   168  	require.Equal(t, 24, bb.BitLen())
   169  	require.Equal(t, []byte{0x11, 0x63, 0x5F}, bb.dump())
   170  }
   171  
   172  func TestBitBuilder_Done(t *testing.T) {
   173  	t.Run("Aligned", func(t *testing.T) {
   174  		bb := NewBitBuilder(MSB, 0)
   175  		bb.AppendBit(0)
   176  		bb.AppendBit(0)
   177  		bb.AppendBit(1)
   178  		bb.AppendBit(0)
   179  		bb.AppendBit(1)
   180  		bb.AppendBit(1)
   181  		bb.AppendBit(1)
   182  		bb.AppendBit(1)
   183  
   184  		doneBytes, doneLen := bb.Done()
   185  		require.Equal(t, []byte{0x2f}, doneBytes)
   186  		require.Equal(t, 0, doneLen)
   187  	})
   188  
   189  	t.Run("NonAligned", func(t *testing.T) {
   190  		bb := NewBitBuilder(MSB, 0)
   191  		bb.AppendBit(0)
   192  		bb.AppendBit(0)
   193  		bb.AppendBit(1)
   194  		bb.AppendBit(0)
   195  		bb.AppendBit(1)
   196  		bb.AppendBit(1)
   197  
   198  		doneBytes, doneLen := bb.Done()
   199  		require.Equal(t, []byte{0x2c}, doneBytes)
   200  		require.Equal(t, -2, doneLen)
   201  	})
   202  }