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 }