github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/net/netip/uint128_test.go (about)

     1  // Copyright 2020 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package netip
     6  
     7  import (
     8  	"testing"
     9  )
    10  
    11  func TestUint128AddSub(t *testing.T) {
    12  	const add1 = 1
    13  	const sub1 = -1
    14  	tests := []struct {
    15  		in   uint128
    16  		op   int // +1 or -1 to add vs subtract
    17  		want uint128
    18  	}{
    19  		{uint128{0, 0}, add1, uint128{0, 1}},
    20  		{uint128{0, 1}, add1, uint128{0, 2}},
    21  		{uint128{1, 0}, add1, uint128{1, 1}},
    22  		{uint128{0, ^uint64(0)}, add1, uint128{1, 0}},
    23  		{uint128{^uint64(0), ^uint64(0)}, add1, uint128{0, 0}},
    24  
    25  		{uint128{0, 0}, sub1, uint128{^uint64(0), ^uint64(0)}},
    26  		{uint128{0, 1}, sub1, uint128{0, 0}},
    27  		{uint128{0, 2}, sub1, uint128{0, 1}},
    28  		{uint128{1, 0}, sub1, uint128{0, ^uint64(0)}},
    29  		{uint128{1, 1}, sub1, uint128{1, 0}},
    30  	}
    31  	for _, tt := range tests {
    32  		var got uint128
    33  		switch tt.op {
    34  		case add1:
    35  			got = tt.in.addOne()
    36  		case sub1:
    37  			got = tt.in.subOne()
    38  		default:
    39  			panic("bogus op")
    40  		}
    41  		if got != tt.want {
    42  			t.Errorf("%v add %d = %v; want %v", tt.in, tt.op, got, tt.want)
    43  		}
    44  	}
    45  }
    46  
    47  func TestBitsSetFrom(t *testing.T) {
    48  	tests := []struct {
    49  		bit  uint8
    50  		want uint128
    51  	}{
    52  		{0, uint128{^uint64(0), ^uint64(0)}},
    53  		{1, uint128{^uint64(0) >> 1, ^uint64(0)}},
    54  		{63, uint128{1, ^uint64(0)}},
    55  		{64, uint128{0, ^uint64(0)}},
    56  		{65, uint128{0, ^uint64(0) >> 1}},
    57  		{127, uint128{0, 1}},
    58  		{128, uint128{0, 0}},
    59  	}
    60  	for _, tt := range tests {
    61  		var zero uint128
    62  		got := zero.bitsSetFrom(tt.bit)
    63  		if got != tt.want {
    64  			t.Errorf("0.bitsSetFrom(%d) = %064b want %064b", tt.bit, got, tt.want)
    65  		}
    66  	}
    67  }
    68  
    69  func TestBitsClearedFrom(t *testing.T) {
    70  	tests := []struct {
    71  		bit  uint8
    72  		want uint128
    73  	}{
    74  		{0, uint128{0, 0}},
    75  		{1, uint128{1 << 63, 0}},
    76  		{63, uint128{^uint64(0) &^ 1, 0}},
    77  		{64, uint128{^uint64(0), 0}},
    78  		{65, uint128{^uint64(0), 1 << 63}},
    79  		{127, uint128{^uint64(0), ^uint64(0) &^ 1}},
    80  		{128, uint128{^uint64(0), ^uint64(0)}},
    81  	}
    82  	for _, tt := range tests {
    83  		ones := uint128{^uint64(0), ^uint64(0)}
    84  		got := ones.bitsClearedFrom(tt.bit)
    85  		if got != tt.want {
    86  			t.Errorf("ones.bitsClearedFrom(%d) = %064b want %064b", tt.bit, got, tt.want)
    87  		}
    88  	}
    89  }