@@ -75,138 +75,135 @@ impl<const LIMBS: usize> WrappingSub for Int<LIMBS> {
75
75
}
76
76
77
77
#[ cfg( test) ]
78
+ #[ allow( clippy:: init_numbered_fields) ]
78
79
mod tests {
80
+ use num_traits:: WrappingSub ;
79
81
80
- #[ cfg( test) ]
81
- mod tests {
82
- use num_traits:: WrappingSub ;
82
+ use crate :: { CheckedSub , I128 , Int , U128 } ;
83
83
84
- use crate :: { CheckedSub , I128 , Int , U128 } ;
84
+ #[ test]
85
+ fn checked_sub ( ) {
86
+ let min_plus_one = Int {
87
+ 0 : I128 :: MIN . 0 . wrapping_add ( & I128 :: ONE . 0 ) ,
88
+ } ;
89
+ let max_minus_one = Int {
90
+ 0 : I128 :: MAX . 0 . wrapping_sub ( & I128 :: ONE . 0 ) ,
91
+ } ;
92
+ let two = Int {
93
+ 0 : U128 :: from ( 2u32 ) ,
94
+ } ;
95
+ let min_plus_two = Int {
96
+ 0 : I128 :: MIN . 0 . wrapping_add ( & two. 0 ) ,
97
+ } ;
85
98
86
- #[ test]
87
- fn checked_sub ( ) {
88
- let min_plus_one = Int {
89
- 0 : I128 :: MIN . 0 . wrapping_add ( & I128 :: ONE . 0 ) ,
90
- } ;
91
- let max_minus_one = Int {
92
- 0 : I128 :: MAX . 0 . wrapping_sub ( & I128 :: ONE . 0 ) ,
93
- } ;
94
- let two = Int {
95
- 0 : U128 :: from ( 2u32 ) ,
96
- } ;
97
- let min_plus_two = Int {
98
- 0 : I128 :: MIN . 0 . wrapping_add ( & two. 0 ) ,
99
- } ;
99
+ // lhs = MIN
100
100
101
- // lhs = MIN
101
+ let result = I128 :: MIN . checked_sub ( & I128 :: MIN ) ;
102
+ assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
102
103
103
- let result = I128 :: MIN . checked_sub ( & I128 :: MIN ) ;
104
- assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
104
+ let result = I128 :: MIN . checked_sub ( & I128 :: MINUS_ONE ) ;
105
+ assert_eq ! ( result. unwrap( ) , min_plus_one ) ;
105
106
106
- let result = I128 :: MIN . checked_sub ( & I128 :: MINUS_ONE ) ;
107
- assert_eq ! ( result. unwrap( ) , min_plus_one ) ;
107
+ let result = I128 :: MIN . checked_sub ( & I128 :: ZERO ) ;
108
+ assert_eq ! ( result. unwrap( ) , I128 :: MIN ) ;
108
109
109
- let result = I128 :: MIN . checked_sub ( & I128 :: ZERO ) ;
110
- assert_eq ! ( result. unwrap ( ) , I128 :: MIN ) ;
110
+ let result = I128 :: MIN . checked_sub ( & I128 :: ONE ) ;
111
+ assert ! ( bool :: from ( result. is_none ( ) ) ) ;
111
112
112
- let result = I128 :: MIN . checked_sub ( & I128 :: ONE ) ;
113
- assert ! ( bool :: from( result. is_none( ) ) ) ;
113
+ let result = I128 :: MIN . checked_sub ( & I128 :: MAX ) ;
114
+ assert ! ( bool :: from( result. is_none( ) ) ) ;
114
115
115
- let result = I128 :: MIN . checked_sub ( & I128 :: MAX ) ;
116
- assert ! ( bool :: from( result. is_none( ) ) ) ;
116
+ // lhs = -1
117
117
118
- // lhs = -1
118
+ let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: MIN ) ;
119
+ assert_eq ! ( result. unwrap( ) , I128 :: MAX ) ;
119
120
120
- let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: MIN ) ;
121
- assert_eq ! ( result. unwrap( ) , I128 :: MAX ) ;
121
+ let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: MINUS_ONE ) ;
122
+ assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
122
123
123
- let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: MINUS_ONE ) ;
124
- assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
124
+ let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: ZERO ) ;
125
+ assert_eq ! ( result. unwrap( ) , I128 :: MINUS_ONE ) ;
125
126
126
- let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: ZERO ) ;
127
- assert_eq ! ( result. unwrap( ) , I128 :: MINUS_ONE ) ;
127
+ let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: ONE ) ;
128
+ assert_eq ! ( result. unwrap( ) , two . wrapping_neg ( ) ) ;
128
129
129
- let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: ONE ) ;
130
- assert_eq ! ( result. unwrap( ) , two . wrapping_neg ( ) ) ;
130
+ let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: MAX ) ;
131
+ assert_eq ! ( result. unwrap( ) , I128 :: MIN ) ;
131
132
132
- let result = I128 :: MINUS_ONE . checked_sub ( & I128 :: MAX ) ;
133
- assert_eq ! ( result. unwrap( ) , I128 :: MIN ) ;
133
+ // lhs = 0
134
134
135
- // lhs = 0
135
+ let result = I128 :: ZERO . checked_sub ( & I128 :: MIN ) ;
136
+ assert ! ( bool :: from( result. is_none( ) ) ) ;
136
137
137
- let result = I128 :: ZERO . checked_sub ( & I128 :: MIN ) ;
138
- assert ! ( bool :: from ( result. is_none ( ) ) ) ;
138
+ let result = I128 :: ZERO . checked_sub ( & I128 :: MINUS_ONE ) ;
139
+ assert_eq ! ( result. unwrap ( ) , I128 :: ONE ) ;
139
140
140
- let result = I128 :: ZERO . checked_sub ( & I128 :: MINUS_ONE ) ;
141
- assert_eq ! ( result. unwrap( ) , I128 :: ONE ) ;
141
+ let result = I128 :: ZERO . checked_sub ( & I128 :: ZERO ) ;
142
+ assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
142
143
143
- let result = I128 :: ZERO . checked_sub ( & I128 :: ZERO ) ;
144
- assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
144
+ let result = I128 :: ZERO . checked_sub ( & I128 :: ONE ) ;
145
+ assert_eq ! ( result. unwrap( ) , I128 :: MINUS_ONE ) ;
145
146
146
- let result = I128 :: ZERO . checked_sub ( & I128 :: ONE ) ;
147
- assert_eq ! ( result. unwrap( ) , I128 :: MINUS_ONE ) ;
147
+ let result = I128 :: ZERO . checked_sub ( & I128 :: MAX ) ;
148
+ assert_eq ! ( result. unwrap( ) , min_plus_one ) ;
148
149
149
- let result = I128 :: ZERO . checked_sub ( & I128 :: MAX ) ;
150
- assert_eq ! ( result. unwrap( ) , min_plus_one) ;
150
+ // lhs = 1
151
151
152
- // lhs = 1
152
+ let result = I128 :: ONE . checked_sub ( & I128 :: MIN ) ;
153
+ assert ! ( bool :: from( result. is_none( ) ) ) ;
153
154
154
- let result = I128 :: ONE . checked_sub ( & I128 :: MIN ) ;
155
- assert ! ( bool :: from ( result. is_none ( ) ) ) ;
155
+ let result = I128 :: ONE . checked_sub ( & I128 :: MINUS_ONE ) ;
156
+ assert_eq ! ( result. unwrap ( ) , two ) ;
156
157
157
- let result = I128 :: ONE . checked_sub ( & I128 :: MINUS_ONE ) ;
158
- assert_eq ! ( result. unwrap( ) , two ) ;
158
+ let result = I128 :: ONE . checked_sub ( & I128 :: ZERO ) ;
159
+ assert_eq ! ( result. unwrap( ) , I128 :: ONE ) ;
159
160
160
- let result = I128 :: ONE . checked_sub ( & I128 :: ZERO ) ;
161
- assert_eq ! ( result. unwrap( ) , I128 :: ONE ) ;
161
+ let result = I128 :: ONE . checked_sub ( & I128 :: ONE ) ;
162
+ assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
162
163
163
- let result = I128 :: ONE . checked_sub ( & I128 :: ONE ) ;
164
- assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
164
+ let result = I128 :: ONE . checked_sub ( & I128 :: MAX ) ;
165
+ assert_eq ! ( result. unwrap( ) , min_plus_two ) ;
165
166
166
- let result = I128 :: ONE . checked_sub ( & I128 :: MAX ) ;
167
- assert_eq ! ( result. unwrap( ) , min_plus_two) ;
167
+ // lhs = MAX
168
168
169
- // lhs = MAX
169
+ let result = I128 :: MAX . checked_sub ( & I128 :: MIN ) ;
170
+ assert ! ( bool :: from( result. is_none( ) ) ) ;
170
171
171
- let result = I128 :: MAX . checked_sub ( & I128 :: MIN ) ;
172
- assert ! ( bool :: from( result. is_none( ) ) ) ;
172
+ let result = I128 :: MAX . checked_sub ( & I128 :: MINUS_ONE ) ;
173
+ assert ! ( bool :: from( result. is_none( ) ) ) ;
173
174
174
- let result = I128 :: MAX . checked_sub ( & I128 :: MINUS_ONE ) ;
175
- assert ! ( bool :: from ( result. is_none ( ) ) ) ;
175
+ let result = I128 :: MAX . checked_sub ( & I128 :: ZERO ) ;
176
+ assert_eq ! ( result. unwrap ( ) , I128 :: MAX ) ;
176
177
177
- let result = I128 :: MAX . checked_sub ( & I128 :: ZERO ) ;
178
- assert_eq ! ( result. unwrap( ) , I128 :: MAX ) ;
178
+ let result = I128 :: MAX . checked_sub ( & I128 :: ONE ) ;
179
+ assert_eq ! ( result. unwrap( ) , max_minus_one ) ;
179
180
180
- let result = I128 :: MAX . checked_sub ( & I128 :: ONE ) ;
181
- assert_eq ! ( result. unwrap( ) , max_minus_one) ;
182
-
183
- let result = I128 :: MAX . checked_sub ( & I128 :: MAX ) ;
184
- assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
185
- }
186
-
187
- #[ test]
188
- fn wrapping_sub ( ) {
189
- let min_plus_one = Int {
190
- 0 : I128 :: MIN . 0 . wrapping_add ( & I128 :: ONE . 0 ) ,
191
- } ;
192
- let two = Int {
193
- 0 : U128 :: from ( 2u32 ) ,
194
- } ;
195
- let max_minus_one = Int {
196
- 0 : I128 :: MAX . 0 . wrapping_sub ( & I128 :: ONE . 0 ) ,
197
- } ;
198
-
199
- // + sub -
200
- let result = I128 :: ONE . wrapping_sub ( & I128 :: MIN ) ;
201
- assert_eq ! ( result, min_plus_one) ;
202
-
203
- // 0 sub -
204
- let result = I128 :: ZERO . wrapping_sub ( & I128 :: MIN ) ;
205
- assert_eq ! ( result, I128 :: MIN ) ;
181
+ let result = I128 :: MAX . checked_sub ( & I128 :: MAX ) ;
182
+ assert_eq ! ( result. unwrap( ) , I128 :: ZERO ) ;
183
+ }
206
184
207
- // - sub +
208
- let result = I128 :: MIN . wrapping_sub ( & two) ;
209
- assert_eq ! ( result, max_minus_one) ;
210
- }
185
+ #[ test]
186
+ fn wrapping_sub ( ) {
187
+ let min_plus_one = Int {
188
+ 0 : I128 :: MIN . 0 . wrapping_add ( & I128 :: ONE . 0 ) ,
189
+ } ;
190
+ let two = Int {
191
+ 0 : U128 :: from ( 2u32 ) ,
192
+ } ;
193
+ let max_minus_one = Int {
194
+ 0 : I128 :: MAX . 0 . wrapping_sub ( & I128 :: ONE . 0 ) ,
195
+ } ;
196
+
197
+ // + sub -
198
+ let result = I128 :: ONE . wrapping_sub ( & I128 :: MIN ) ;
199
+ assert_eq ! ( result, min_plus_one) ;
200
+
201
+ // 0 sub -
202
+ let result = I128 :: ZERO . wrapping_sub ( & I128 :: MIN ) ;
203
+ assert_eq ! ( result, I128 :: MIN ) ;
204
+
205
+ // - sub +
206
+ let result = I128 :: MIN . wrapping_sub ( & two) ;
207
+ assert_eq ! ( result, max_minus_one) ;
211
208
}
212
209
}
0 commit comments