From 52721d3a7eb2695c63e22978c0247027b1790f9e Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Fri, 1 Oct 2021 15:22:51 +0200 Subject: [PATCH] big ints: [add|sub]Wrap tests --- lib/std/math/big.zig | 2 + lib/std/math/big/int_test.zig | 97 +++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/lib/std/math/big.zig b/lib/std/math/big.zig index 8c0f7f5e1e..e7f8a7fb34 100644 --- a/lib/std/math/big.zig +++ b/lib/std/math/big.zig @@ -5,6 +5,7 @@ pub const Rational = @import("big/rational.zig").Rational; pub const int = @import("big/int.zig"); pub const Limb = usize; const limb_info = @typeInfo(Limb).Int; +pub const SignedLimb = std.meta.Int(.signed, limb_info.bits); pub const DoubleLimb = std.meta.Int(.unsigned, 2 * limb_info.bits); pub const SignedDoubleLimb = std.meta.Int(.signed, 2 * limb_info.bits); pub const Log2Limb = std.math.Log2Int(Limb); @@ -19,6 +20,7 @@ test { _ = int; _ = Rational; _ = Limb; + _ = SignedLimb; _ = DoubleLimb; _ = SignedDoubleLimb; _ = Log2Limb; diff --git a/lib/std/math/big/int_test.zig b/lib/std/math/big/int_test.zig index bdf75cc6fe..d47346a84c 100644 --- a/lib/std/math/big/int_test.zig +++ b/lib/std/math/big/int_test.zig @@ -4,6 +4,7 @@ const testing = std.testing; const Managed = std.math.big.int.Managed; const Mutable = std.math.big.int.Mutable; const Limb = std.math.big.Limb; +const SignedLimb = std.math.big.SignedLimb; const DoubleLimb = std.math.big.DoubleLimb; const SignedDoubleLimb = std.math.big.SignedDoubleLimb; const maxInt = std.math.maxInt; @@ -575,6 +576,102 @@ test "big.int add scalar" { try testing.expect((try b.to(u32)) == 55); } +test "big.int addWrap single-single, unsigned" { + var a = try Managed.initSet(testing.allocator, maxInt(u17)); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, 10); + defer b.deinit(); + + try a.addWrap(a.toConst(), b.toConst(), .unsigned, 17); + + try testing.expect((try a.to(u17)) == 9); +} + +test "big.int subWrap single-single, unsigned" { + var a = try Managed.initSet(testing.allocator, 0); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, maxInt(u17)); + defer b.deinit(); + + try a.subWrap(a.toConst(), b.toConst(), .unsigned, 17); + + try testing.expect((try a.to(u17)) == 1); +} + +test "big.int addWrap multi-multi, unsigned, limb aligned" { + var a = try Managed.initSet(testing.allocator, maxInt(DoubleLimb)); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, maxInt(DoubleLimb)); + defer b.deinit(); + + try a.addWrap(a.toConst(), b.toConst(), .unsigned, @bitSizeOf(DoubleLimb)); + + try testing.expect((try a.to(DoubleLimb)) == maxInt(DoubleLimb) - 1); +} + +test "big.int subWrap single-multi, unsigned, limb aligned" { + var a = try Managed.initSet(testing.allocator, 10); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, maxInt(DoubleLimb) + 100); + defer b.deinit(); + + try a.subWrap(a.toConst(), b.toConst(), .unsigned, @bitSizeOf(DoubleLimb)); + + try testing.expect((try a.to(DoubleLimb)) == maxInt(DoubleLimb) - 88); +} + +test "big.int addWrap single-single, signed" { + var a = try Managed.initSet(testing.allocator, maxInt(i21)); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, 1 + 1 + maxInt(u21)); + defer b.deinit(); + + try a.addWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(i21)); + + try testing.expect((try a.to(i21)) == minInt(i21)); +} + +test "big.int subWrap single-single, signed" { + var a = try Managed.initSet(testing.allocator, minInt(i21)); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, 1); + defer b.deinit(); + + try a.subWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(i21)); + + try testing.expect((try a.to(i21)) == maxInt(i21)); +} + +test "big.int addWrap multi-multi, signed, limb aligned" { + var a = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb)); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb)); + defer b.deinit(); + + try a.addWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(SignedDoubleLimb)); + + try testing.expect((try a.to(SignedDoubleLimb)) == -2); +} + +test "big.int subWrap single-multi, signed, limb aligned" { + var a = try Managed.initSet(testing.allocator, minInt(SignedDoubleLimb)); + defer a.deinit(); + + var b = try Managed.initSet(testing.allocator, 1); + defer b.deinit(); + + try a.subWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(SignedDoubleLimb)); + + try testing.expect((try a.to(SignedDoubleLimb)) == maxInt(SignedDoubleLimb)); +} + test "big.int sub single-single" { var a = try Managed.initSet(testing.allocator, 50); defer a.deinit();