More tests

This commit is contained in:
Mikko Ahlroth 2024-02-15 18:42:15 +02:00
parent a289a9587d
commit 725f4b7289
5 changed files with 210 additions and 4 deletions

View file

@ -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)
}

View file

@ -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)
}

View file

@ -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)

View file

@ -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)

View file

@ -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),