From 725f4b7289cc771fd8f5b9ac687fff1888993d06 Mon Sep 17 00:00:00 2001 From: Mikko Ahlroth Date: Thu, 15 Feb 2024 18:42:15 +0200 Subject: [PATCH] More tests --- src/ranged_int/builtin/int128.gleam | 2 +- src/ranged_int/builtin/int64.gleam | 2 +- src/ranged_int/builtin/uint128.gleam | 2 +- src/ranged_int/builtin/uint64.gleam | 2 +- test/builtin/builtin_test.gleam | 206 +++++++++++++++++++++++++++ 5 files changed, 210 insertions(+), 4 deletions(-) diff --git a/src/ranged_int/builtin/int128.gleam b/src/ranged_int/builtin/int128.gleam index 7f14216..ac90d8c 100644 --- a/src/ranged_int/builtin/int128.gleam +++ b/src/ranged_int/builtin/int128.gleam @@ -81,7 +81,7 @@ fn limits() { bigi.power(bigi.from_int(2), bigi.from_int(127)), bigi.from_int(-1), ) - let max = bigi.subtract(bigi.absolute(min), bigi.from_int(-1)) + let max = bigi.subtract(bigi.absolute(min), bigi.from_int(1)) interface.overflowable_limits(min, max) } diff --git a/src/ranged_int/builtin/int64.gleam b/src/ranged_int/builtin/int64.gleam index 6a91304..4de6bec 100644 --- a/src/ranged_int/builtin/int64.gleam +++ b/src/ranged_int/builtin/int64.gleam @@ -81,7 +81,7 @@ fn limits() { bigi.power(bigi.from_int(2), bigi.from_int(63)), bigi.from_int(-1), ) - let max = bigi.subtract(bigi.absolute(min), bigi.from_int(-1)) + let max = bigi.subtract(bigi.absolute(min), bigi.from_int(1)) interface.overflowable_limits(min, max) } diff --git a/src/ranged_int/builtin/uint128.gleam b/src/ranged_int/builtin/uint128.gleam index 0d65c0c..8cc7e8f 100644 --- a/src/ranged_int/builtin/uint128.gleam +++ b/src/ranged_int/builtin/uint128.gleam @@ -76,7 +76,7 @@ fn limits() { let max = bigi.subtract( bigi.power(bigi.from_int(2), bigi.from_int(128)), - bigi.from_int(-1), + bigi.from_int(1), ) interface.overflowable_limits(min, max) diff --git a/src/ranged_int/builtin/uint64.gleam b/src/ranged_int/builtin/uint64.gleam index 0374fef..e568786 100644 --- a/src/ranged_int/builtin/uint64.gleam +++ b/src/ranged_int/builtin/uint64.gleam @@ -76,7 +76,7 @@ fn limits() { let max = bigi.subtract( bigi.power(bigi.from_int(2), bigi.from_int(64)), - bigi.from_int(-1), + bigi.from_int(1), ) interface.overflowable_limits(min, max) diff --git a/test/builtin/builtin_test.gleam b/test/builtin/builtin_test.gleam index d91a717..2d350b8 100644 --- a/test/builtin/builtin_test.gleam +++ b/test/builtin/builtin_test.gleam @@ -1,3 +1,4 @@ +import gleam/function import gleeunit/should import bigi.{type BigInt} import ranged_int/interface @@ -96,6 +97,211 @@ pub fn add_overflow_test() { binary(uint128.from_bigint, uint128.add)(input1, input2, should.be_error) } +pub fn add_overflow_eject_test() { + binary(int8.from_bigint, int8.add)( + bigi.from_int(-127), + bigi.from_int(1000), + function.compose(int8.eject, should.equal(_, bigi.from_int(873))), + ) + + binary(int16.from_bigint, int16.add)( + bigi.from_int(32_767), + bigi.from_int(1), + function.compose(int16.eject, should.equal(_, bigi.from_int(32_768))), + ) + + binary(int32.from_bigint, int32.add)( + bigi.from_int(2_000_000_000), + bigi.from_int(3_000_000_000), + function.compose(int32.eject, should.equal(_, bigi.from_int(5_000_000_000))), + ) + + binary(int64.from_bigint, int64.add)( + bigi.subtract( + bigi.power(bigi.from_int(2), bigi.from_int(63)), + bigi.from_int(1), + ), + bigi.from_int(1), + function.compose(int64.eject, should.equal(_, bigi.power( + bigi.from_int(2), + bigi.from_int(63), + ))), + ) + + binary(int128.from_bigint, int128.add)( + bigi.subtract( + bigi.power(bigi.from_int(2), bigi.from_int(127)), + bigi.from_int(1), + ), + bigi.from_int(1), + function.compose(int128.eject, should.equal(_, bigi.power( + bigi.from_int(2), + bigi.from_int(127), + ))), + ) + + binary(uint8.from_bigint, uint8.add)( + bigi.from_int(0), + bigi.from_int(1000), + function.compose(uint8.eject, should.equal(_, bigi.from_int(1000))), + ) + + binary(uint16.from_bigint, uint16.add)( + bigi.from_int(32_768), + bigi.from_int(32_768), + function.compose(uint16.eject, should.equal(_, bigi.from_int(65_536))), + ) + + binary(uint32.from_bigint, uint32.add)( + bigi.from_int(2_000_000_000), + bigi.from_int(3_000_000_000), + function.compose(uint32.eject, should.equal(_, bigi.from_int(5_000_000_000))), + ) + + binary(uint64.from_bigint, uint64.add)( + bigi.subtract( + bigi.power(bigi.from_int(2), bigi.from_int(64)), + bigi.from_int(1), + ), + bigi.from_int(1), + function.compose(uint64.eject, should.equal(_, bigi.power( + bigi.from_int(2), + bigi.from_int(64), + ))), + ) + + binary(uint128.from_bigint, uint128.add)( + bigi.subtract( + bigi.power(bigi.from_int(2), bigi.from_int(128)), + bigi.from_int(1), + ), + bigi.from_int(1), + function.compose(uint128.eject, should.equal(_, bigi.power( + bigi.from_int(2), + bigi.from_int(128), + ))), + ) +} + +pub fn add_overflow_wrap_test() { + overflow_wrap( + bigi.from_int(127), + bigi.from_int(1), + bigi.from_int(-128), + int8.from_bigint, + int8.add, + int8.overflow, + ) + + overflow_wrap( + bigi.from_int(-32_768), + bigi.from_int(-1), + bigi.from_int(32_767), + int16.from_bigint, + int16.add, + int16.overflow, + ) + + overflow_wrap( + bigi.from_int(2_000_000_000), + bigi.from_int(3_000_000_000), + bigi.from_int(705_032_704), + int32.from_bigint, + int32.add, + int32.overflow, + ) + + overflow_wrap( + bigi.subtract( + bigi.power(bigi.from_int(2), bigi.from_int(63)), + bigi.from_int(255), + ), + bigi.from_int(255), + bigi.multiply( + bigi.power(bigi.from_int(2), bigi.from_int(63)), + bigi.from_int(-1), + ), + int64.from_bigint, + int64.add, + int64.overflow, + ) + + overflow_wrap( + bigi.multiply( + bigi.power(bigi.from_int(2), bigi.from_int(127)), + bigi.from_int(-1), + ), + bigi.power(bigi.from_int(2), bigi.from_int(128)), + bigi.multiply( + bigi.power(bigi.from_int(2), bigi.from_int(127)), + bigi.from_int(-1), + ), + int128.from_bigint, + int128.add, + int128.overflow, + ) + + overflow_wrap( + bigi.from_int(255), + bigi.from_int(1), + bigi.zero(), + uint8.from_bigint, + uint8.add, + uint8.overflow, + ) + + overflow_wrap( + bigi.from_int(65_535), + bigi.from_int(1), + bigi.zero(), + uint16.from_bigint, + uint16.add, + uint16.overflow, + ) + + overflow_wrap( + bigi.from_int(2_000_000_000), + bigi.from_int(3_000_000_000), + bigi.from_int(705_032_704), + uint32.from_bigint, + uint32.add, + uint32.overflow, + ) + + overflow_wrap( + bigi.subtract( + bigi.power(bigi.from_int(2), bigi.from_int(64)), + bigi.from_int(1), + ), + bigi.from_int(1), + bigi.zero(), + uint64.from_bigint, + uint64.add, + uint64.overflow, + ) + + overflow_wrap( + bigi.power(bigi.from_int(2), bigi.from_int(127)), + bigi.power(bigi.from_int(2), bigi.from_int(127)), + bigi.zero(), + uint128.from_bigint, + uint128.add, + uint128.overflow, + ) +} + +fn overflow_wrap( + int1: BigInt, + int2: BigInt, + expected: BigInt, + from_bigint: fn(BigInt) -> Result(a, b), + fun: fn(a, BigInt) -> interface.OpResult(a), + overflow: fn(interface.OpResult(a)) -> a, +) { + let assert Ok(expected) = from_bigint(expected) + should.equal(binary(from_bigint, fun)(int1, int2, overflow), expected) +} + fn unary( from_bigint: fn(BigInt) -> Result(a, b), fun: fn(a) -> interface.OpResult(a),