@@ -59,3 +59,76 @@ fn widen_mul_u128() {
59
59
}
60
60
assert ! ( errors. is_empty( ) ) ;
61
61
}
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