github.com/tunabay/go-bitarray@v1.3.1/buffer_bitwise_test.go (about) 1 // Copyright (c) 2021 Hirotsuna Mizuno. All rights reserved. 2 // Use of this source code is governed by the MIT license that can be found in 3 // the LICENSE file. 4 5 package bitarray_test 6 7 import ( 8 "testing" 9 10 "github.com/tunabay/go-bitarray" 11 ) 12 13 func TestBuffer_ToggleBitAt(t *testing.T) { 14 buf := bitarray.NewBuffer(18) 15 chk := func(wantS string) { 16 t.Helper() 17 buf.V() 18 got := buf.BitArray() 19 want := bitarray.MustParse(wantS) 20 if !got.Equal(want) { 21 t.Error("unexpected:") 22 t.Logf(" got: %#b", got) 23 t.Logf("want: %#b", want) 24 t.Logf(" buf: %s", buf.D()) 25 } 26 } 27 chk("0000-0000 0000-0000 00") 28 buf.ToggleBitAt(0) 29 chk("1000-0000 0000-0000 00") 30 buf.ToggleBitAt(1) 31 chk("1100-0000 0000-0000 00") 32 buf.ToggleBitAt(2) 33 chk("1110-0000 0000-0000 00") 34 buf.ToggleBitAt(6) 35 chk("1110-0010 0000-0000 00") 36 buf.ToggleBitAt(7) 37 chk("1110-0011 0000-0000 00") 38 buf.ToggleBitAt(8) 39 chk("1110-0011 1000-0000 00") 40 buf.ToggleBitAt(0) 41 chk("0110-0011 1000-0000 00") 42 buf.ToggleBitAt(1) 43 chk("0010-0011 1000-0000 00") 44 buf.ToggleBitAt(7) 45 chk("0010-0010 1000-0000 00") 46 buf.ToggleBitAt(8) 47 chk("0010-0010 0000-0000 00") 48 buf.ToggleBitAt(17) 49 chk("0010-0010 0000-0000 01") 50 buf.ToggleBitAt(16) 51 chk("0010-0010 0000-0000 11") 52 buf.ToggleBitAt(15) 53 chk("0010-0010 0000-0001 11") 54 buf.ToggleBitAt(17) 55 chk("0010-0010 0000-0001 10") 56 buf.ToggleBitAt(10) 57 chk("0010-0010 0010-0001 10") 58 59 chkpanic := func(off int) { 60 defer func() { 61 if recover() == nil { 62 t.Errorf("panic expected: off=%d, buf=%s.", off, buf.D()) 63 } 64 }() 65 buf.ToggleBitAt(off) 66 } 67 chkpanic(-1) 68 chkpanic(18) 69 } 70 71 func TestBuffer_ToggleBitsAt(t *testing.T) { 72 buf := bitarray.NewBuffer(28) 73 chk := func(wantS string) { 74 t.Helper() 75 buf.V() 76 got := buf.BitArray() 77 want := bitarray.MustParse(wantS) 78 if !got.Equal(want) { 79 t.Error("unexpected:") 80 t.Logf(" got: %#b", got) 81 t.Logf("want: %#b", want) 82 t.Logf(" buf: %s", buf.D()) 83 } 84 } 85 chk("0000-0000 0000-0000 0000-0000 0000") 86 buf.ToggleBitsAt(0, 0) 87 chk("0000-0000 0000-0000 0000-0000 0000") 88 buf.ToggleBitsAt(28, 0) 89 chk("0000-0000 0000-0000 0000-0000 0000") 90 buf.ToggleBitsAt(0, 16) 91 chk("1111-1111 1111-1111 0000-0000 0000") 92 buf.ToggleBitsAt(0, 8) 93 chk("0000-0000 1111-1111 0000-0000 0000") 94 buf.ToggleBitsAt(16, 8) 95 chk("0000-0000 1111-1111 1111-1111 0000") 96 buf.ToggleBitsAt(0, 1) 97 chk("1000-0000 1111-1111 1111-1111 0000") 98 buf.ToggleBitsAt(0, 2) 99 chk("0100-0000 1111-1111 1111-1111 0000") 100 buf.ToggleBitsAt(0, 4) 101 chk("1011-0000 1111-1111 1111-1111 0000") 102 buf.ToggleBitsAt(0, 7) 103 chk("0100-1110 1111-1111 1111-1111 0000") 104 buf.ToggleBitsAt(1, 7) 105 chk("0011-0001 1111-1111 1111-1111 0000") 106 buf.ToggleBitsAt(0, 28) 107 chk("1100-1110 0000-0000 0000-0000 1111") 108 buf.ToggleBitsAt(6, 20) 109 chk("1100-1101 1111-1111 1111-1111 0011") 110 buf.ToggleBitsAt(2, 5) 111 chk("1111-0011 1111-1111 1111-1111 0011") 112 buf.ToggleBitsAt(9, 6) 113 chk("1111-0011 1000-0001 1111-1111 0011") 114 buf.ToggleBitsAt(16, 2) 115 chk("1111-0011 1000-0001 0011-1111 0011") 116 buf.ToggleBitsAt(21, 3) 117 chk("1111-0011 1000-0001 0011-1000 0011") 118 buf.ToggleBitsAt(7, 2) 119 chk("1111-0010 0000-0001 0011-1000 0011") 120 121 chkpanic := func(off, nBits int) { 122 defer func() { 123 if recover() == nil { 124 t.Errorf("panic expected: off=%d, nBits=%d, buf=%s.", off, nBits, buf.D()) 125 } 126 }() 127 buf.ToggleBitsAt(off, nBits) 128 } 129 chkpanic(-1, 0) 130 chkpanic(-1, 1) 131 chkpanic(0, -1) 132 chkpanic(0, 29) 133 chkpanic(29, 0) 134 chkpanic(28, 1) 135 chkpanic(27, 2) 136 chkpanic(24, 5) 137 } 138 139 func TestBuffer_AndAt(t *testing.T) { 140 buf := bitarray.NewBuffer(30) 141 chk := func(wantS string) { 142 t.Helper() 143 buf.V() 144 got := buf.BitArray() 145 want := bitarray.MustParse(wantS) 146 if !got.Equal(want) { 147 t.Error("unexpected:") 148 t.Logf(" got: %#b", got) 149 t.Logf("want: %#b", want) 150 t.Logf(" buf: %s", buf.D()) 151 } 152 } 153 chk("0000-0000 0000-0000 0000-0000 0000-00") 154 buf.AndAt(0, nil) 155 chk("0000-0000 0000-0000 0000-0000 0000-00") 156 var nilba *bitarray.BitArray 157 buf.AndAt(0, nilba) 158 chk("0000-0000 0000-0000 0000-0000 0000-00") 159 buf.AndAt(0, bitarray.NewZeroFilled(0)) 160 chk("0000-0000 0000-0000 0000-0000 0000-00") 161 buf.AndAt(30, bitarray.NewZeroFilled(0)) 162 chk("0000-0000 0000-0000 0000-0000 0000-00") 163 buf.AndAt(0, bitarray.NewZeroFilled(30)) 164 chk("0000-0000 0000-0000 0000-0000 0000-00") 165 buf.FillBitsAt(0, 30, 1) 166 chk("1111-1111 1111-1111 1111-1111 1111-11") 167 buf.AndAt(0, bitarray.NewZeroFilled(30)) 168 chk("0000-0000 0000-0000 0000-0000 0000-00") 169 buf.FillBitsAt(0, 30, 1) 170 buf.AndAt(0, bitarray.MustParse("00000000")) 171 chk("0000-0000 1111-1111 1111-1111 1111-11") 172 buf.FillBitsAt(0, 30, 1) 173 buf.AndAt(0, bitarray.MustParse("101010")) 174 chk("1010-1011 1111-1111 1111-1111 1111-11") 175 buf.AndAt(4, bitarray.MustParse("101010")) 176 chk("1010-1010 1011-1111 1111-1111 1111-11") 177 buf.AndAt(6, bitarray.MustParse("1111-0000 1111-0000")) 178 chk("1010-1010 1000-0011 1100-0011 1111-11") 179 buf.AndAt(7, bitarray.MustParse("10")) 180 chk("1010-1010 0000-0011 1100-0011 1111-11") 181 buf.AndAt(14, bitarray.MustParse("1100-1100 1100-1100")) 182 chk("1010-1010 0000-0011 0000-0011 0011-00") 183 buf.AndAt(8, bitarray.MustParse("1010-1010")) 184 chk("1010-1010 0000-0010 0000-0011 0011-00") 185 186 chkpanic := func(off int, ba bitarray.BitArrayer) { 187 defer func() { 188 if recover() == nil { 189 t.Errorf("panic expected: off=%d, ba=%v.", off, ba) 190 t.Logf("buf: %s", buf.D()) 191 } 192 }() 193 buf.AndAt(off, ba) 194 } 195 chkpanic(-1, bitarray.NewZeroFilled(1)) 196 chkpanic(30, bitarray.NewZeroFilled(1)) 197 chkpanic(8, bitarray.NewOneFilled(23)) 198 chkpanic(0, bitarray.NewZeroFilled(31)) 199 } 200 201 func TestBuffer_OrAt(t *testing.T) { 202 buf := bitarray.NewBuffer(30) 203 chk := func(wantS string) { 204 t.Helper() 205 buf.V() 206 got := buf.BitArray() 207 want := bitarray.MustParse(wantS) 208 if !got.Equal(want) { 209 t.Error("unexpected:") 210 t.Logf(" got: %#b", got) 211 t.Logf("want: %#b", want) 212 t.Logf(" buf: %s", buf.D()) 213 } 214 } 215 chk("0000-0000 0000-0000 0000-0000 0000-00") 216 buf.OrAt(0, nil) 217 chk("0000-0000 0000-0000 0000-0000 0000-00") 218 var nilba *bitarray.BitArray 219 buf.OrAt(0, nilba) 220 chk("0000-0000 0000-0000 0000-0000 0000-00") 221 buf.OrAt(0, bitarray.NewOneFilled(0)) 222 chk("0000-0000 0000-0000 0000-0000 0000-00") 223 buf.OrAt(30, bitarray.NewOneFilled(0)) 224 chk("0000-0000 0000-0000 0000-0000 0000-00") 225 buf.OrAt(0, bitarray.NewZeroFilled(30)) 226 chk("0000-0000 0000-0000 0000-0000 0000-00") 227 buf.OrAt(0, bitarray.NewOneFilled(30)) 228 chk("1111-1111 1111-1111 1111-1111 1111-11") 229 buf.OrAt(0, bitarray.NewZeroFilled(30)) 230 chk("1111-1111 1111-1111 1111-1111 1111-11") 231 buf.FillBitsAt(0, 30, 0) 232 buf.OrAt(0, bitarray.NewOneFilled(4)) 233 chk("1111-0000 0000-0000 0000-0000 0000-00") 234 buf.OrAt(6, bitarray.NewOneFilled(2)) 235 chk("1111-0011 0000-0000 0000-0000 0000-00") 236 buf.OrAt(8, bitarray.MustParse("1010-1010")) 237 chk("1111-0011 1010-1010 0000-0000 0000-00") 238 buf.OrAt(22, bitarray.MustParse("10110011")) 239 chk("1111-0011 1010-1010 0000-0010 1100-11") 240 buf.OrAt(29, bitarray.MustParse("1")) 241 chk("1111-0011 1010-1010 0000-0010 1100-11") 242 buf.FillBitsAt(8, 20, 0) 243 chk("1111-0011 0000-0000 0000-0000 0000-11") 244 buf.OrAt(4, bitarray.MustParse("1010-1010 1010-1010 1010")) 245 chk("1111-1011 1010-1010 1010-1010 0000-11") 246 buf.OrAt(10, bitarray.MustParse("0101-0101 0101")) 247 chk("1111-1011 1011-1111 1111-1110 0000-11") 248 249 chkpanic := func(off int, ba bitarray.BitArrayer) { 250 defer func() { 251 if recover() == nil { 252 t.Errorf("panic expected: off=%d, ba=%v.", off, ba) 253 t.Logf("buf: %s", buf.D()) 254 } 255 }() 256 buf.OrAt(off, ba) 257 } 258 chkpanic(-1, bitarray.NewZeroFilled(1)) 259 chkpanic(30, bitarray.NewZeroFilled(1)) 260 chkpanic(8, bitarray.NewOneFilled(23)) 261 } 262 263 func TestBuffer_XorAt(t *testing.T) { 264 buf := bitarray.NewBuffer(30) 265 chk := func(wantS string) { 266 t.Helper() 267 buf.V() 268 got := buf.BitArray() 269 want := bitarray.MustParse(wantS) 270 if !got.Equal(want) { 271 t.Error("unexpected:") 272 t.Logf(" got: %#b", got) 273 t.Logf("want: %#b", want) 274 t.Logf(" buf: %s", buf.D()) 275 } 276 } 277 chk("0000-0000 0000-0000 0000-0000 0000-00") 278 buf.XorAt(0, nil) 279 chk("0000-0000 0000-0000 0000-0000 0000-00") 280 var nilba *bitarray.BitArray 281 buf.XorAt(0, nilba) 282 chk("0000-0000 0000-0000 0000-0000 0000-00") 283 buf.XorAt(0, bitarray.NewOneFilled(0)) 284 chk("0000-0000 0000-0000 0000-0000 0000-00") 285 buf.XorAt(30, bitarray.NewOneFilled(0)) 286 chk("0000-0000 0000-0000 0000-0000 0000-00") 287 buf.XorAt(0, bitarray.NewZeroFilled(30)) 288 chk("0000-0000 0000-0000 0000-0000 0000-00") 289 buf.XorAt(0, bitarray.NewOneFilled(30)) 290 chk("1111-1111 1111-1111 1111-1111 1111-11") 291 buf.XorAt(0, bitarray.NewZeroFilled(30)) 292 chk("1111-1111 1111-1111 1111-1111 1111-11") 293 buf.XorAt(0, bitarray.NewOneFilled(4)) 294 chk("0000-1111 1111-1111 1111-1111 1111-11") 295 buf.XorAt(6, bitarray.NewOneFilled(2)) 296 chk("0000-1100 1111-1111 1111-1111 1111-11") 297 buf.XorAt(8, bitarray.MustParse("1010-1010")) 298 chk("0000-1100 0101-0101 1111-1111 1111-11") 299 buf.XorAt(22, bitarray.MustParse("10110011")) 300 chk("0000-1100 0101-0101 1111-1101 0011-00") 301 buf.XorAt(29, bitarray.MustParse("1")) 302 chk("0000-1100 0101-0101 1111-1101 0011-01") 303 buf.XorAt(10, bitarray.NewOneFilled(20)) 304 chk("0000-1100 0110-1010 0000-0010 1100-10") 305 buf.XorAt(4, bitarray.MustParse("1010-1010 1010-1010 1010")) 306 chk("0000-0110 1100-0000 1010-1000 1100-10") 307 buf.XorAt(10, bitarray.MustParse("0101-0101 0101")) 308 chk("0000-0110 1101-0101 1111-1100 1100-10") 309 310 chkpanic := func(off int, ba bitarray.BitArrayer) { 311 defer func() { 312 if recover() == nil { 313 t.Errorf("panic expected: off=%d, ba=%v.", off, ba) 314 t.Logf("buf: %s", buf.D()) 315 } 316 }() 317 buf.XorAt(off, ba) 318 } 319 chkpanic(-1, bitarray.NewZeroFilled(1)) 320 chkpanic(30, bitarray.NewZeroFilled(1)) 321 chkpanic(8, bitarray.NewOneFilled(23)) 322 } 323 324 func TestBuffer_LeadingZeros(t *testing.T) { 325 buf := bitarray.NewBuffer(30) 326 buf.PutBitArrayAt(6, bitarray.MustParse("0000-0111 0000-0111 0011")) 327 if n := buf.LeadingZeros(); n != 11 { 328 t.Errorf("unexpected: got %d, want 11", n) 329 } 330 buf.PutBitArrayAt(6, bitarray.MustParse("101")) 331 if n := buf.LeadingZeros(); n != 6 { 332 t.Errorf("unexpected: got %d, want 6", n) 333 } 334 buf.Resize(0, bitarray.AlignLeft) 335 if n := buf.LeadingZeros(); n != 0 { 336 t.Errorf("unexpected: got %d, want 0", n) 337 } 338 } 339 340 func TestBuffer_TrailingZeros(t *testing.T) { 341 buf := bitarray.NewBuffer(30) 342 buf.PutBitArrayAt(6, bitarray.MustParse("1111-0111 0000-0111")) 343 if n := buf.TrailingZeros(); n != 8 { 344 t.Errorf("unexpected: got %d, want 8", n) 345 } 346 buf.PutBitArrayAt(22, bitarray.MustParse("1010")) 347 if n := buf.TrailingZeros(); n != 5 { 348 t.Errorf("unexpected: got %d, want 5", n) 349 } 350 buf.Resize(0, bitarray.AlignLeft) 351 if n := buf.TrailingZeros(); n != 0 { 352 t.Errorf("unexpected: got %d, want 0", n) 353 } 354 } 355 356 func TestBuffer_OnesCount(t *testing.T) { 357 buf := bitarray.NewBuffer(30) 358 buf.PutBitArrayAt(6, bitarray.MustParse("1111-0111 0000-0111")) 359 if n := buf.OnesCount(); n != 10 { 360 t.Errorf("unexpected: got %d, want 10", n) 361 } 362 buf.PutBitArrayAt(2, bitarray.MustParse("1010")) 363 if n := buf.OnesCount(); n != 12 { 364 t.Errorf("unexpected: got %d, want 12", n) 365 } 366 buf.Resize(0, bitarray.AlignLeft) 367 if n := buf.OnesCount(); n != 0 { 368 t.Errorf("unexpected: got %d, want 0", n) 369 } 370 }