@@ -59,3 +59,76 @@ fn widen_mul_u128() {
5959 }
6060 assert ! ( errors. is_empty( ) ) ;
6161}
62+
63+ #[ test]
64+ fn not_u128 ( ) {
65+ assert_eq ! ( !u256:: ZERO , u256:: MAX ) ;
66+ }
67+
68+ #[ test]
69+ fn shr_u128 ( ) {
70+ let only_low = [
71+ 1 ,
72+ u16:: MAX . into ( ) ,
73+ u32:: MAX . into ( ) ,
74+ u64:: MAX . into ( ) ,
75+ u128:: MAX ,
76+ ] ;
77+
78+ let mut errors = Vec :: new ( ) ;
79+
80+ for a in only_low {
81+ for perturb in 0 ..10 {
82+ let a = a. saturating_add ( perturb) ;
83+ for shift in 0 ..128 {
84+ let res = a. widen ( ) >> shift;
85+ let expected = ( a >> shift) . widen ( ) ;
86+ if res != expected {
87+ errors. push ( ( a. widen ( ) , shift, res, expected) ) ;
88+ }
89+ }
90+ }
91+ }
92+
93+ let check = [
94+ (
95+ u256:: MAX ,
96+ 1 ,
97+ u256 ( [ u64:: MAX , u64:: MAX , u64:: MAX , u64:: MAX >> 1 ] ) ,
98+ ) ,
99+ (
100+ u256:: MAX ,
101+ 5 ,
102+ u256 ( [ u64:: MAX , u64:: MAX , u64:: MAX , u64:: MAX >> 5 ] ) ,
103+ ) ,
104+ ( u256:: MAX , 63 , u256 ( [ u64:: MAX , u64:: MAX , u64:: MAX , 1 ] ) ) ,
105+ ( u256:: MAX , 64 , u256 ( [ u64:: MAX , u64:: MAX , u64:: MAX , 0 ] ) ) ,
106+ ( u256:: MAX , 65 , u256 ( [ u64:: MAX , u64:: MAX , u64:: MAX >> 1 , 0 ] ) ) ,
107+ ( u256:: MAX , 127 , u256 ( [ u64:: MAX , u64:: MAX , 1 , 0 ] ) ) ,
108+ ( u256:: MAX , 128 , u256 ( [ u64:: MAX , u64:: MAX , 0 , 0 ] ) ) ,
109+ ( u256:: MAX , 129 , u256 ( [ u64:: MAX , u64:: MAX >> 1 , 0 , 0 ] ) ) ,
110+ ( u256:: MAX , 191 , u256 ( [ u64:: MAX , 1 , 0 , 0 ] ) ) ,
111+ ( u256:: MAX , 192 , u256 ( [ u64:: MAX , 0 , 0 , 0 ] ) ) ,
112+ ( u256:: MAX , 193 , u256 ( [ u64:: MAX >> 1 , 0 , 0 , 0 ] ) ) ,
113+ ( u256:: MAX , 191 , u256 ( [ u64:: MAX , 1 , 0 , 0 ] ) ) ,
114+ ( u256:: MAX , 254 , u256 ( [ 0b11 , 0 , 0 , 0 ] ) ) ,
115+ ( u256:: MAX , 255 , u256 ( [ 1 , 0 , 0 , 0 ] ) ) ,
116+ ] ;
117+
118+ for ( input, shift, expected) in check {
119+ let res = input >> shift;
120+ if res != expected {
121+ errors. push ( ( input, shift, res, expected) ) ;
122+ }
123+ }
124+
125+ for ( a, b, res, expected) in & errors {
126+ eprintln ! (
127+ "FAILURE: {} >> {b} = {} got {}" ,
128+ hexu( * a) ,
129+ hexu( * expected) ,
130+ hexu( * res) ,
131+ ) ;
132+ }
133+ assert ! ( errors. is_empty( ) ) ;
134+ }
0 commit comments