github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/int256/bitwise_test.gno (about)

     1  package int256
     2  
     3  import (
     4  	"gno.land/p/demo/uint256"
     5  )
     6  
     7  import (
     8  	"testing"
     9  )
    10  
    11  func TestOr(t *testing.T) {
    12  	tests := []struct {
    13  		name       string
    14  		x, y, want Int
    15  	}{
    16  		{
    17  			name: "all zeroes",
    18  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    19  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    20  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    21  		},
    22  		{
    23  			name: "all ones",
    24  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    25  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    26  			want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    27  		},
    28  		{
    29  			name: "mixed",
    30  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, neg: false},
    31  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, neg: false},
    32  			want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    33  		},
    34  		{
    35  			name: "one operand all ones",
    36  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    37  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false},
    38  			want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    39  		},
    40  	}
    41  
    42  	for _, tc := range tests {
    43  		t.Run(tc.name, func(t *testing.T) {
    44  			got := New()
    45  			got.Or(&tc.x, &tc.y)
    46  
    47  			if got.Neq(&tc.want) {
    48  				t.Errorf("Or(%v, %v) = %v, want %v", tc.x, tc.y, got, tc.want)
    49  			}
    50  		})
    51  	}
    52  }
    53  
    54  func TestAnd(t *testing.T) {
    55  	tests := []struct {
    56  		name       string
    57  		x, y, want Int
    58  	}{
    59  		{
    60  			name: "all zeroes",
    61  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    62  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    63  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    64  		},
    65  		{
    66  			name: "all ones",
    67  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    68  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    69  			want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    70  		},
    71  		{
    72  			name: "mixed",
    73  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    74  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    75  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    76  		},
    77  		{
    78  			name: "mixed 2",
    79  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    80  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    81  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    82  		},
    83  		{
    84  			name: "mixed 3",
    85  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, neg: false},
    86  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, neg: false},
    87  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    88  		},
    89  		{
    90  			name: "one operand zero",
    91  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    92  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    93  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},
    94  		},
    95  		{
    96  			name: "one operand all ones",
    97  			x:    Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},
    98  			y:    Int{abs: &uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false},
    99  			want: Int{abs: &uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false},
   100  		},
   101  	}
   102  
   103  	for _, tc := range tests {
   104  		t.Run(tc.name, func(t *testing.T) {
   105  			got := New()
   106  			got.And(&tc.x, &tc.y)
   107  
   108  			if got.Neq(&tc.want) {
   109  				t.Errorf("And(%v, %v) = %v, want %v", tc.x, tc.y, got, tc.want)
   110  			}
   111  		})
   112  	}
   113  }
   114  
   115  func TestRsh(t *testing.T) {
   116  	tests := []struct {
   117  		x    string
   118  		n    uint
   119  		want string
   120  	}{
   121  		{"1024", 0, "1024"},
   122  		{"1024", 1, "512"},
   123  		{"1024", 2, "256"},
   124  		{"1024", 10, "1"},
   125  		{"1024", 11, "0"},
   126  		{"18446744073709551615", 0, "18446744073709551615"},
   127  		{"18446744073709551615", 1, "9223372036854775807"},
   128  		{"18446744073709551615", 62, "3"},
   129  		{"18446744073709551615", 63, "1"},
   130  		{"18446744073709551615", 64, "0"},
   131  		{"115792089237316195423570985008687907853269984665640564039457584007913129639935", 0, "115792089237316195423570985008687907853269984665640564039457584007913129639935"},
   132  		{"115792089237316195423570985008687907853269984665640564039457584007913129639935", 1, "57896044618658097711785492504343953926634992332820282019728792003956564819967"},
   133  		{"115792089237316195423570985008687907853269984665640564039457584007913129639935", 128, "340282366920938463463374607431768211455"},
   134  		{"115792089237316195423570985008687907853269984665640564039457584007913129639935", 255, "1"},
   135  		{"115792089237316195423570985008687907853269984665640564039457584007913129639935", 256, "0"},
   136  		{"-1024", 0, "-1024"},
   137  		{"-1024", 1, "-512"},
   138  		{"-1024", 2, "-256"},
   139  		{"-1024", 10, "-1"},
   140  		{"-1024", 10, "-1"},
   141  		{"-9223372036854775808", 0, "-9223372036854775808"},
   142  		{"-9223372036854775808", 1, "-4611686018427387904"},
   143  		{"-9223372036854775808", 62, "-2"},
   144  		{"-9223372036854775808", 63, "-1"},
   145  		{"-9223372036854775808", 64, "-1"},
   146  		{"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 0, "-57896044618658097711785492504343953926634992332820282019728792003956564819968"},
   147  		{"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 1, "-28948022309329048855892746252171976963317496166410141009864396001978282409984"},
   148  		{"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 253, "-4"},
   149  		{"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 254, "-2"},
   150  		{"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 255, "-1"},
   151  		{"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 256, "-1"},
   152  	}
   153  
   154  	for _, tc := range tests {
   155  		x, err := FromDecimal(tc.x)
   156  		if err != nil {
   157  			t.Error(err)
   158  			continue
   159  		}
   160  
   161  		got := New()
   162  		got.Rsh(x, tc.n)
   163  
   164  		if got.ToString() != tc.want {
   165  			t.Errorf("Rsh(%s, %d) = %v, want %v", tc.x, tc.n, got.ToString(), tc.want)
   166  		}
   167  	}
   168  }
   169  
   170  func TestLsh(t *testing.T) {
   171  	tests := []struct {
   172  		x    string
   173  		n    uint
   174  		want string
   175  	}{
   176  		{"1", 0, "1"},
   177  		{"1", 1, "2"},
   178  		{"1", 2, "4"},
   179  		{"2", 0, "2"},
   180  		{"2", 1, "4"},
   181  		{"2", 2, "8"},
   182  		{"-2", 0, "-2"},
   183  		{"-4", 0, "-4"},
   184  		{"-8", 0, "-8"},
   185  	}
   186  
   187  	for _, tc := range tests {
   188  		x, err := FromDecimal(tc.x)
   189  		if err != nil {
   190  			t.Error(err)
   191  			continue
   192  		}
   193  
   194  		got := New()
   195  		got.Lsh(x, tc.n)
   196  
   197  		if got.ToString() != tc.want {
   198  			t.Errorf("Lsh(%s, %d) = %v, want %v", tc.x, tc.n, got.ToString(), tc.want)
   199  		}
   200  	}
   201  }