@@ -359,3 +359,171 @@ impl From<U512> for [u8; 64] {
359
359
arr
360
360
}
361
361
}
362
+
363
+ #[ cfg( test) ]
364
+ mod tests {
365
+ use super :: { U256 , U512 } ;
366
+ use std:: u64:: MAX ;
367
+ use serde_json as ser;
368
+
369
+ macro_rules! test_serialize {
370
+ ( $name: ident, $test_name: ident) => {
371
+ #[ test]
372
+ fn $test_name( ) {
373
+ let tests = vec![
374
+ ( $name:: from( 0 ) , "0x0" ) ,
375
+ ( $name:: from( 1 ) , "0x1" ) ,
376
+ ( $name:: from( 2 ) , "0x2" ) ,
377
+ ( $name:: from( 10 ) , "0xa" ) ,
378
+ ( $name:: from( 15 ) , "0xf" ) ,
379
+ ( $name:: from( 15 ) , "0xf" ) ,
380
+ ( $name:: from( 16 ) , "0x10" ) ,
381
+ ( $name:: from( 1_000 ) , "0x3e8" ) ,
382
+ ( $name:: from( 100_000 ) , "0x186a0" ) ,
383
+ ( $name:: from( u64 :: max_value( ) ) , "0xffffffffffffffff" ) ,
384
+ ( $name:: from( u64 :: max_value( ) ) + 1 , "0x10000000000000000" ) ,
385
+ ] ;
386
+
387
+ for ( number, expected) in tests {
388
+ assert_eq!( format!( "{:?}" , expected) , ser:: to_string_pretty( & number) . unwrap( ) ) ;
389
+ assert_eq!( number, ser:: from_str( & format!( "{:?}" , expected) ) . unwrap( ) ) ;
390
+ }
391
+
392
+ // Invalid examples
393
+ assert!( ser:: from_str:: <$name>( "\" 0x\" " ) . unwrap_err( ) . is_data( ) ) ;
394
+ assert!( ser:: from_str:: <$name>( "\" 0xg\" " ) . unwrap_err( ) . is_data( ) ) ;
395
+ assert!( ser:: from_str:: <$name>( "\" \" " ) . unwrap_err( ) . is_data( ) ) ;
396
+ assert!( ser:: from_str:: <$name>( "\" 10\" " ) . unwrap_err( ) . is_data( ) ) ;
397
+ assert!( ser:: from_str:: <$name>( "\" 0\" " ) . unwrap_err( ) . is_data( ) ) ;
398
+ }
399
+ }
400
+ }
401
+
402
+ test_serialize ! ( U256 , test_u256) ;
403
+ test_serialize ! ( U512 , test_u512) ;
404
+
405
+ #[ test]
406
+ fn test_serialize_large_values ( ) {
407
+ assert_eq ! (
408
+ ser:: to_string_pretty( & !U256 :: zero( ) ) . unwrap( ) ,
409
+ "\" 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\" "
410
+ ) ;
411
+ assert ! (
412
+ ser:: from_str:: <U256 >( "\" 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\" " ) . unwrap_err( ) . is_data( )
413
+ ) ;
414
+ }
415
+
416
+ #[ test]
417
+ fn fixed_arrays_roundtrip ( ) {
418
+ let raw: U256 = "7094875209347850239487502394881" . into ( ) ;
419
+ let array: [ u8 ; 32 ] = raw. into ( ) ;
420
+ let new_raw = array. into ( ) ;
421
+
422
+ assert_eq ! ( raw, new_raw) ;
423
+ }
424
+
425
+ #[ test]
426
+ fn u256_multi_full_mul ( ) {
427
+ let result = U256 ( [ 0 , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ 0 , 0 , 0 , 0 ] ) ) ;
428
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
429
+
430
+ let result = U256 ( [ 1 , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ 1 , 0 , 0 , 0 ] ) ) ;
431
+ assert_eq ! ( U512 ( [ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
432
+
433
+ let result = U256 ( [ 5 , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ 5 , 0 , 0 , 0 ] ) ) ;
434
+ assert_eq ! ( U512 ( [ 25 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
435
+
436
+ let result = U256 ( [ 0 , 5 , 0 , 0 ] ) . full_mul ( U256 ( [ 0 , 5 , 0 , 0 ] ) ) ;
437
+ assert_eq ! ( U512 ( [ 0 , 0 , 25 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
438
+
439
+ let result = U256 ( [ 0 , 0 , 0 , 4 ] ) . full_mul ( U256 ( [ 4 , 0 , 0 , 0 ] ) ) ;
440
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 16 , 0 , 0 , 0 , 0 ] ) , result) ;
441
+
442
+ let result = U256 ( [ 0 , 0 , 0 , 5 ] ) . full_mul ( U256 ( [ 2 , 0 , 0 , 0 ] ) ) ;
443
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 10 , 0 , 0 , 0 , 0 ] ) , result) ;
444
+
445
+ let result = U256 ( [ 0 , 0 , 2 , 0 ] ) . full_mul ( U256 ( [ 0 , 5 , 0 , 0 ] ) ) ;
446
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 10 , 0 , 0 , 0 , 0 ] ) , result) ;
447
+
448
+ let result = U256 ( [ 0 , 3 , 0 , 0 ] ) . full_mul ( U256 ( [ 0 , 0 , 3 , 0 ] ) ) ;
449
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 9 , 0 , 0 , 0 , 0 ] ) , result) ;
450
+
451
+ let result = U256 ( [ 0 , 0 , 8 , 0 ] ) . full_mul ( U256 ( [ 0 , 0 , 6 , 0 ] ) ) ;
452
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 0 , 48 , 0 , 0 , 0 ] ) , result) ;
453
+
454
+ let result = U256 ( [ 9 , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ 0 , 3 , 0 , 0 ] ) ) ;
455
+ assert_eq ! ( U512 ( [ 0 , 27 , 0 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
456
+
457
+ let result = U256 ( [ MAX , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , 0 , 0 , 0 ] ) ) ;
458
+ assert_eq ! ( U512 ( [ 1 , MAX -1 , 0 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
459
+
460
+ let result = U256 ( [ 0 , MAX , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , 0 , 0 , 0 ] ) ) ;
461
+ assert_eq ! ( U512 ( [ 0 , 1 , MAX -1 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
462
+
463
+ let result = U256 ( [ MAX , MAX , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , 0 , 0 , 0 ] ) ) ;
464
+ assert_eq ! ( U512 ( [ 1 , MAX , MAX -1 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
465
+
466
+ let result = U256 ( [ MAX , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , 0 , 0 ] ) ) ;
467
+ assert_eq ! ( U512 ( [ 1 , MAX , MAX -1 , 0 , 0 , 0 , 0 , 0 ] ) , result) ;
468
+
469
+ let result = U256 ( [ MAX , MAX , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , 0 , 0 ] ) ) ;
470
+ assert_eq ! ( U512 ( [ 1 , 0 , MAX -1 , MAX , 0 , 0 , 0 , 0 ] ) , result) ;
471
+
472
+ let result = U256 ( [ MAX , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , 0 ] ) ) ;
473
+ assert_eq ! ( U512 ( [ 1 , MAX , MAX , MAX -1 , 0 , 0 , 0 , 0 ] ) , result) ;
474
+
475
+ let result = U256 ( [ MAX , MAX , MAX , 0 ] ) . full_mul ( U256 ( [ MAX , 0 , 0 , 0 ] ) ) ;
476
+ assert_eq ! ( U512 ( [ 1 , MAX , MAX , MAX -1 , 0 , 0 , 0 , 0 ] ) , result) ;
477
+
478
+ let result = U256 ( [ MAX , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , MAX ] ) ) ;
479
+ assert_eq ! ( U512 ( [ 1 , MAX , MAX , MAX , MAX -1 , 0 , 0 , 0 ] ) , result) ;
480
+
481
+ let result = U256 ( [ MAX , MAX , MAX , MAX ] ) . full_mul ( U256 ( [ MAX , 0 , 0 , 0 ] ) ) ;
482
+ assert_eq ! ( U512 ( [ 1 , MAX , MAX , MAX , MAX -1 , 0 , 0 , 0 ] ) , result) ;
483
+
484
+ let result = U256 ( [ MAX , MAX , MAX , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , 0 , 0 ] ) ) ;
485
+ assert_eq ! ( U512 ( [ 1 , 0 , MAX , MAX -1 , MAX , 0 , 0 , 0 ] ) , result) ;
486
+
487
+ let result = U256 ( [ MAX , MAX , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , 0 ] ) ) ;
488
+ assert_eq ! ( U512 ( [ 1 , 0 , MAX , MAX -1 , MAX , 0 , 0 , 0 ] ) , result) ;
489
+
490
+ let result = U256 ( [ MAX , MAX , MAX , MAX ] ) . full_mul ( U256 ( [ MAX , MAX , 0 , 0 ] ) ) ;
491
+ assert_eq ! ( U512 ( [ 1 , 0 , MAX , MAX , MAX -1 , MAX , 0 , 0 ] ) , result) ;
492
+
493
+ let result = U256 ( [ MAX , MAX , 0 , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , MAX ] ) ) ;
494
+ assert_eq ! ( U512 ( [ 1 , 0 , MAX , MAX , MAX -1 , MAX , 0 , 0 ] ) , result) ;
495
+
496
+ let result = U256 ( [ MAX , MAX , MAX , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , 0 ] ) ) ;
497
+ assert_eq ! ( U512 ( [ 1 , 0 , 0 , MAX -1 , MAX , MAX , 0 , 0 ] ) , result) ;
498
+
499
+ let result = U256 ( [ MAX , MAX , MAX , 0 ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , MAX ] ) ) ;
500
+ assert_eq ! ( U512 ( [ 1 , 0 , 0 , MAX , MAX -1 , MAX , MAX , 0 ] ) , result) ;
501
+
502
+ let result = U256 ( [ MAX , MAX , MAX , MAX ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , 0 ] ) ) ;
503
+ assert_eq ! ( U512 ( [ 1 , 0 , 0 , MAX , MAX -1 , MAX , MAX , 0 ] ) , result) ;
504
+
505
+ let result = U256 ( [ MAX , MAX , MAX , MAX ] ) . full_mul ( U256 ( [ MAX , MAX , MAX , MAX ] ) ) ;
506
+ assert_eq ! ( U512 ( [ 1 , 0 , 0 , 0 , MAX -1 , MAX , MAX , MAX ] ) , result) ;
507
+
508
+ let result = U256 ( [ 0 , 0 , 0 , MAX ] ) . full_mul ( U256 ( [ 0 , 0 , 0 , MAX ] ) ) ;
509
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 0 , 0 , 0 , 1 , MAX -1 ] ) , result) ;
510
+
511
+ let result = U256 ( [ 1 , 0 , 0 , 0 ] ) . full_mul ( U256 ( [ 0 , 0 , 0 , MAX ] ) ) ;
512
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , MAX , 0 , 0 , 0 , 0 ] ) , result) ;
513
+
514
+ let result = U256 ( [ 1 , 2 , 3 , 4 ] ) . full_mul ( U256 ( [ 5 , 0 , 0 , 0 ] ) ) ;
515
+ assert_eq ! ( U512 ( [ 5 , 10 , 15 , 20 , 0 , 0 , 0 , 0 ] ) , result) ;
516
+
517
+ let result = U256 ( [ 1 , 2 , 3 , 4 ] ) . full_mul ( U256 ( [ 0 , 6 , 0 , 0 ] ) ) ;
518
+ assert_eq ! ( U512 ( [ 0 , 6 , 12 , 18 , 24 , 0 , 0 , 0 ] ) , result) ;
519
+
520
+ let result = U256 ( [ 1 , 2 , 3 , 4 ] ) . full_mul ( U256 ( [ 0 , 0 , 7 , 0 ] ) ) ;
521
+ assert_eq ! ( U512 ( [ 0 , 0 , 7 , 14 , 21 , 28 , 0 , 0 ] ) , result) ;
522
+
523
+ let result = U256 ( [ 1 , 2 , 3 , 4 ] ) . full_mul ( U256 ( [ 0 , 0 , 0 , 8 ] ) ) ;
524
+ assert_eq ! ( U512 ( [ 0 , 0 , 0 , 8 , 16 , 24 , 32 , 0 ] ) , result) ;
525
+
526
+ let result = U256 ( [ 1 , 2 , 3 , 4 ] ) . full_mul ( U256 ( [ 5 , 6 , 7 , 8 ] ) ) ;
527
+ assert_eq ! ( U512 ( [ 5 , 16 , 34 , 60 , 61 , 52 , 32 , 0 ] ) , result) ;
528
+ }
529
+ }
0 commit comments