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;
55pub const int = @import("big/int.zig");
66pub const Limb = usize;
77const limb_info = @typeInfo(Limb).Int;
8pub const SignedLimb = std.meta.Int(.signed, limb_info.bits);
89pub const DoubleLimb = std.meta.Int(.unsigned, 2 * limb_info.bits);
910pub const SignedDoubleLimb = std.meta.Int(.signed, 2 * limb_info.bits);
1011pub const Log2Limb = std.math.Log2Int(Limb);
......@@ -19,6 +20,7 @@ test {
1920 _ = int;
2021 _ = Rational;
2122 _ = Limb;
23 _ = SignedLimb;
2224 _ = DoubleLimb;
2325 _ = SignedDoubleLimb;
2426 _ = Log2Limb;
lib/std/math/big/int_test.zig+97
......@@ -4,6 +4,7 @@ const testing = std.testing;
44const Managed = std.math.big.int.Managed;
55const Mutable = std.math.big.int.Mutable;
66const Limb = std.math.big.Limb;
7const SignedLimb = std.math.big.SignedLimb;
78const DoubleLimb = std.math.big.DoubleLimb;
89const SignedDoubleLimb = std.math.big.SignedDoubleLimb;
910const maxInt = std.math.maxInt;
......@@ -575,6 +576,102 @@ test "big.int add scalar" {
575576 try testing.expect((try b.to(u32)) == 55);
576577}
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
578675test "big.int sub single-single" {
579676 var a = try Managed.initSet(testing.allocator, 50);
580677 defer a.deinit();