authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-01 15:22:51+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-04 11:25:29+02:00
log52721d3a7eb2695c63e22978c0247027b1790f9e
treeda52b8da62a9342d7794c67db6c3e9bb21d4718f
parentbb53f4f15a76fd306c8ec2f51369d7ffcdf4c0ca

big ints: [add|sub]Wrap tests


2 files changed, 99 insertions(+), 0 deletions(-)

lib/std/math/big.zig+2
...@@ -5,6 +5,7 @@ pub const Rational = @import("big/rational.zig").Rational;...@@ -5,6 +5,7 @@ pub const Rational = @import("big/rational.zig").Rational;
5pub const int = @import("big/int.zig");5pub const int = @import("big/int.zig");
6pub const Limb = usize;6pub const Limb = usize;
7const limb_info = @typeInfo(Limb).Int;7const limb_info = @typeInfo(Limb).Int;
8pub const SignedLimb = std.meta.Int(.signed, limb_info.bits);
8pub const DoubleLimb = std.meta.Int(.unsigned, 2 * limb_info.bits);9pub const DoubleLimb = std.meta.Int(.unsigned, 2 * limb_info.bits);
9pub const SignedDoubleLimb = std.meta.Int(.signed, 2 * limb_info.bits);10pub const SignedDoubleLimb = std.meta.Int(.signed, 2 * limb_info.bits);
10pub const Log2Limb = std.math.Log2Int(Limb);11pub const Log2Limb = std.math.Log2Int(Limb);
...@@ -19,6 +20,7 @@ test {...@@ -19,6 +20,7 @@ test {
19 _ = int;20 _ = int;
20 _ = Rational;21 _ = Rational;
21 _ = Limb;22 _ = Limb;
23 _ = SignedLimb;
22 _ = DoubleLimb;24 _ = DoubleLimb;
23 _ = SignedDoubleLimb;25 _ = SignedDoubleLimb;
24 _ = Log2Limb;26 _ = Log2Limb;
lib/std/math/big/int_test.zig+97
...@@ -4,6 +4,7 @@ const testing = std.testing;...@@ -4,6 +4,7 @@ const testing = std.testing;
4const Managed = std.math.big.int.Managed;4const Managed = std.math.big.int.Managed;
5const Mutable = std.math.big.int.Mutable;5const Mutable = std.math.big.int.Mutable;
6const Limb = std.math.big.Limb;6const Limb = std.math.big.Limb;
7const SignedLimb = std.math.big.SignedLimb;
7const DoubleLimb = std.math.big.DoubleLimb;8const DoubleLimb = std.math.big.DoubleLimb;
8const SignedDoubleLimb = std.math.big.SignedDoubleLimb;9const SignedDoubleLimb = std.math.big.SignedDoubleLimb;
9const maxInt = std.math.maxInt;10const 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}
577578
579test "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
591test "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
603test "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
615test "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
627test "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
639test "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
651test "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
663test "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
578test "big.int sub single-single" {675test "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();