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  }