@@ -643,14 +643,18 @@ fn u128_multiply() {
643
643
let mul_128_max = max_u64 * max_u64 ;
644
644
assert (mul_128_max . upper () == u64 :: max () - 1 );
645
645
assert (mul_128_max . lower () == 1 );
646
+
647
+ let upper_u128 = U128 :: from ((1 , 0 ));
648
+ assert (upper_u128 * U128 :: from (2u64 ) == U128 :: from ((2 ,0 )));
646
649
}
647
650
648
651
#[test(should_revert)]
649
652
fn revert_u128_multiply () {
650
653
let first = U128 :: from ((0 , 2 ));
651
654
let second = U128 :: from ((u64 :: max (), 1 ));
652
655
653
- let _result = first * second ;
656
+ let result = first * second ;
657
+ log (result );
654
658
}
655
659
656
660
#[test(should_revert)]
@@ -766,19 +770,22 @@ fn u128_pow() {
766
770
u_128 = U128 :: from ((0 , 13 ));
767
771
u_128 = u_128 . pow (1u32 );
768
772
assert (u_128 == U128 :: from ((0 , 13 )));
769
- }
770
-
771
- #[test]
772
- fn u128_overflowing_pow () {
773
- // Overflow on pow should return 0 if panic is disabled
774
- let prior_flags = disable_panic_on_overflow ();
775
- let a = U128 :: max ();
776
773
777
- let res = a . pow (2 );
774
+ let max_u64_u128 = U128 :: from (u64 :: max ());
775
+ let max_pow = max_u64_u128 . pow (2 );
776
+ let expected_result = U128 :: from ((18446744073709551614 , 1 ));
777
+ assert (max_pow == expected_result );
778
778
779
- assert (res == U128 :: from ((0 , 0 )));
779
+ let u128_upper_and_lower_not_zero = U128 :: from ((1 , 1 ));
780
+ let upper_and_lower_result = u128_upper_and_lower_not_zero . pow (1 );
781
+ assert (upper_and_lower_result == u128_upper_and_lower_not_zero );
782
+ }
780
783
781
- set_flags (prior_flags );
784
+ #[test(should_revert)]
785
+ fn revert_u128_pow_overflow () {
786
+ let max_u64_u128 = U128 :: from (u64 :: max ());
787
+ let max_pow = max_u64_u128 . pow (3 );
788
+ log (max_pow );
782
789
}
783
790
784
791
#[test]
@@ -1327,6 +1334,84 @@ fn parity_u128_log_with_ruint() {
1327
1334
assert (prior_flags == flags ());
1328
1335
}
1329
1336
1337
+ #[test]
1338
+ fn u128_overflowing_add () {
1339
+ let prior_flags = disable_panic_on_overflow ();
1340
+ let a = U128 :: max ();
1341
+ let b = U128 :: from ((0 , 1 ));
1342
+ let c = a + b ;
1343
+
1344
+ assert (c == U128 :: from ((0 , 0 )));
1345
+
1346
+ set_flags (prior_flags );
1347
+ }
1348
+
1349
+ #[test]
1350
+ fn u128_underflowing_sub () {
1351
+ let prior_flags = disable_panic_on_overflow ();
1352
+ let a = U128 :: from ((0 , 1 ));
1353
+ let b = U128 :: from ((0 , 2 ));
1354
+ let c = a - b ;
1355
+
1356
+ assert (c == U128 :: max ());
1357
+
1358
+ set_flags (prior_flags );
1359
+ }
1360
+
1361
+ #[test]
1362
+ fn u128_overflowing_mul () {
1363
+ let prior_flags = disable_panic_on_overflow ();
1364
+ let a = U128 :: max ();
1365
+ let b = U128 :: from ((0 , 2 ));
1366
+ let c = a * b ;
1367
+
1368
+ // 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
1369
+ assert (c == U128 :: from ((0xFFFFFFFFFFFFFFFF , 0xFFFFFFFFFFFFFFFE )));
1370
+
1371
+ set_flags (prior_flags );
1372
+ }
1373
+
1374
+ #[test]
1375
+ fn u128_overflowing_pow () {
1376
+ // Overflow on pow should return 0 if panic is disabled
1377
+ let prior_flags = disable_panic_on_overflow ();
1378
+ let a = U128 :: max ();
1379
+
1380
+ let res = a . pow (2 );
1381
+
1382
+ assert (res == U128 :: from ((0 , 0 )));
1383
+
1384
+ assert (U128 :: from (u64 :: max ()). pow (100 ) == U128 :: zero ());
1385
+
1386
+ assert (U128 :: from (2u32 ). pow (150 ) == U128 :: zero ());
1387
+
1388
+ let lower_max = U128 :: from ((0 , u64 :: max ()));
1389
+ let with_upper_1 = lower_max + U128 :: from (1u32 );
1390
+ assert (with_upper_1 == U128 :: from ((1 , 0 )));
1391
+ assert (with_upper_1 > lower_max );
1392
+ let powered_to_zero = with_upper_1 . pow (2 );
1393
+ assert (powered_to_zero == U128 :: zero ());
1394
+
1395
+
1396
+ let u128_upper_and_lower_not_zero = U128 :: from ((1 , 1 ));
1397
+ let upper_and_lower_result = u128_upper_and_lower_not_zero . pow (2 );
1398
+ assert (upper_and_lower_result == U128 :: zero ());
1399
+
1400
+ set_flags (prior_flags );
1401
+ }
1402
+
1403
+ #[test]
1404
+ fn u128_unsafemath_log2 () {
1405
+ let prior_flags = disable_panic_on_unsafe_math ();
1406
+ // 0 is not a valid operand for log2
1407
+ let a = U128 :: zero ();
1408
+ let res = a . log2 ();
1409
+
1410
+ assert (res == U128 :: zero ());
1411
+
1412
+ set_flags (prior_flags );
1413
+ }
1414
+
1330
1415
#[test]
1331
1416
fn u128_as_u256 () {
1332
1417
let mut vals = Vec :: new ();
@@ -1361,4 +1446,4 @@ fn u128_as_u256() {
1361
1446
assert (u256_val == asm_val );
1362
1447
}
1363
1448
}
1364
- }
1449
+ }
0 commit comments