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 }