| ... | @@ -4,6 +4,7 @@ const testing = std.testing; | ... | @@ -4,6 +4,7 @@ const testing = std.testing; |
| 4 | const Managed = std.math.big.int.Managed; | 4 | const Managed = std.math.big.int.Managed; |
| 5 | const Mutable = std.math.big.int.Mutable; | 5 | const Mutable = std.math.big.int.Mutable; |
| 6 | const Limb = std.math.big.Limb; | 6 | const Limb = std.math.big.Limb; |
| | 7 | const SignedLimb = std.math.big.SignedLimb; |
| 7 | const DoubleLimb = std.math.big.DoubleLimb; | 8 | const DoubleLimb = std.math.big.DoubleLimb; |
| 8 | const SignedDoubleLimb = std.math.big.SignedDoubleLimb; | 9 | const SignedDoubleLimb = std.math.big.SignedDoubleLimb; |
| 9 | const maxInt = std.math.maxInt; | 10 | const maxInt = std.math.maxInt; |
| ... | @@ -575,6 +576,102 @@ test "big.int add scalar" { | ... | @@ -575,6 +576,102 @@ test "big.int add scalar" { |
| 575 | try testing.expect((try b.to(u32)) == 55); | 576 | try testing.expect((try b.to(u32)) == 55); |
| 576 | } | 577 | } |
| 577 | | 578 | |
| | 579 | test "big.int addWrap single-single, unsigned" { |
| | 580 | var a = try Managed.initSet(testing.allocator, maxInt(u17)); |
| | 581 | defer a.deinit(); |
| | 582 | |
| | 583 | var b = try Managed.initSet(testing.allocator, 10); |
| | 584 | defer b.deinit(); |
| | 585 | |
| | 586 | try a.addWrap(a.toConst(), b.toConst(), .unsigned, 17); |
| | 587 | |
| | 588 | try testing.expect((try a.to(u17)) == 9); |
| | 589 | } |
| | 590 | |
| | 591 | test "big.int subWrap single-single, unsigned" { |
| | 592 | var a = try Managed.initSet(testing.allocator, 0); |
| | 593 | defer a.deinit(); |
| | 594 | |
| | 595 | var b = try Managed.initSet(testing.allocator, maxInt(u17)); |
| | 596 | defer b.deinit(); |
| | 597 | |
| | 598 | try a.subWrap(a.toConst(), b.toConst(), .unsigned, 17); |
| | 599 | |
| | 600 | try testing.expect((try a.to(u17)) == 1); |
| | 601 | } |
| | 602 | |
| | 603 | test "big.int addWrap multi-multi, unsigned, limb aligned" { |
| | 604 | var a = try Managed.initSet(testing.allocator, maxInt(DoubleLimb)); |
| | 605 | defer a.deinit(); |
| | 606 | |
| | 607 | var b = try Managed.initSet(testing.allocator, maxInt(DoubleLimb)); |
| | 608 | defer b.deinit(); |
| | 609 | |
| | 610 | try a.addWrap(a.toConst(), b.toConst(), .unsigned, @bitSizeOf(DoubleLimb)); |
| | 611 | |
| | 612 | try testing.expect((try a.to(DoubleLimb)) == maxInt(DoubleLimb) - 1); |
| | 613 | } |
| | 614 | |
| | 615 | test "big.int subWrap single-multi, unsigned, limb aligned" { |
| | 616 | var a = try Managed.initSet(testing.allocator, 10); |
| | 617 | defer a.deinit(); |
| | 618 | |
| | 619 | var b = try Managed.initSet(testing.allocator, maxInt(DoubleLimb) + 100); |
| | 620 | defer b.deinit(); |
| | 621 | |
| | 622 | try a.subWrap(a.toConst(), b.toConst(), .unsigned, @bitSizeOf(DoubleLimb)); |
| | 623 | |
| | 624 | try testing.expect((try a.to(DoubleLimb)) == maxInt(DoubleLimb) - 88); |
| | 625 | } |
| | 626 | |
| | 627 | test "big.int addWrap single-single, signed" { |
| | 628 | var a = try Managed.initSet(testing.allocator, maxInt(i21)); |
| | 629 | defer a.deinit(); |
| | 630 | |
| | 631 | var b = try Managed.initSet(testing.allocator, 1 + 1 + maxInt(u21)); |
| | 632 | defer b.deinit(); |
| | 633 | |
| | 634 | try a.addWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(i21)); |
| | 635 | |
| | 636 | try testing.expect((try a.to(i21)) == minInt(i21)); |
| | 637 | } |
| | 638 | |
| | 639 | test "big.int subWrap single-single, signed" { |
| | 640 | var a = try Managed.initSet(testing.allocator, minInt(i21)); |
| | 641 | defer a.deinit(); |
| | 642 | |
| | 643 | var b = try Managed.initSet(testing.allocator, 1); |
| | 644 | defer b.deinit(); |
| | 645 | |
| | 646 | try a.subWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(i21)); |
| | 647 | |
| | 648 | try testing.expect((try a.to(i21)) == maxInt(i21)); |
| | 649 | } |
| | 650 | |
| | 651 | test "big.int addWrap multi-multi, signed, limb aligned" { |
| | 652 | var a = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb)); |
| | 653 | defer a.deinit(); |
| | 654 | |
| | 655 | var b = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb)); |
| | 656 | defer b.deinit(); |
| | 657 | |
| | 658 | try a.addWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(SignedDoubleLimb)); |
| | 659 | |
| | 660 | try testing.expect((try a.to(SignedDoubleLimb)) == -2); |
| | 661 | } |
| | 662 | |
| | 663 | test "big.int subWrap single-multi, signed, limb aligned" { |
| | 664 | var a = try Managed.initSet(testing.allocator, minInt(SignedDoubleLimb)); |
| | 665 | defer a.deinit(); |
| | 666 | |
| | 667 | var b = try Managed.initSet(testing.allocator, 1); |
| | 668 | defer b.deinit(); |
| | 669 | |
| | 670 | try a.subWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(SignedDoubleLimb)); |
| | 671 | |
| | 672 | try testing.expect((try a.to(SignedDoubleLimb)) == maxInt(SignedDoubleLimb)); |
| | 673 | } |
| | 674 | |
| 578 | test "big.int sub single-single" { | 675 | test "big.int sub single-single" { |
| 579 | var a = try Managed.initSet(testing.allocator, 50); | 676 | var a = try Managed.initSet(testing.allocator, 50); |
| 580 | defer a.deinit(); | 677 | defer a.deinit(); |