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 }