nim-stint/tests/property_based_uint256.nim

315 lines
10 KiB
Nim
Raw Normal View History

2018-04-24 17:07:22 +00:00
# Mpint
# Copyright 2018 Status Research & Development GmbH
# Licensed under either of
#
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
#
# at your option. This file may not be copied, modified, or distributed except according to those terms.
import ../src/mpint, unittest, quicktest, ttmath
const itercount = 1000
suite "Property-based testing (testing with random inputs) - uint64 on 64-bit / uint32 on 32-bit":
when defined(release):
echo "Testing in release mode"
else:
echo "Testing in normal (non-release) mode"
let hi = 1'u shl (sizeof(uint)*7)
quicktest "`or`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x or ttm_y
mp_z = mp_x or mp_y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`and`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x and ttm_y
mp_z = mp_x and mp_y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`xor`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x xor ttm_y
mp_z = mp_x xor mp_y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
# Not defined for ttmath
# quicktest "`not`", itercount do(x0: uint(min=0, max=hi),
# x1: uint(min=0, max=hi),
# x2: uint(min=0, max=hi),
# x3: uint(min=0, max=hi):
# let
# x = [x0, x1, x2, x3]
# y = [y0, y1, y2, y3]
# ttm_x = cast[ttmath.UInt256](x)
# mp_x = cast[MpUint[256]](x)
# let
# ttm_z = not ttm_x
# mp_z = not mp_x
# check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`<`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x < ttm_y
mp_z = mp_x < mp_y
check(ttm_z == mp_z)
quicktest "`<=`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x <= ttm_y
mp_z = mp_x <= mp_y
check(ttm_z == mp_z)
quicktest "`+`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x + ttm_y
mp_z = mp_x + mp_y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`-`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x - ttm_y
mp_z = mp_x - mp_y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`*`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x * ttm_y
mp_z = mp_x * mp_y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`shl`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y: int(min = 0, max=(255))):
let
x = [x0, x1, x2, x3]
ttm_x = cast[ttmath.UInt256](x)
mp_x = cast[MpUint[256]](x)
let
ttm_z = ttm_x shl y
mp_z = mp_x shl y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`shr`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y: int(min = 0, max=(255))):
let
x = [x0, x1, x2, x3]
ttm_x = cast[ttmath.UInt256](x)
mp_x = cast[MpUint[256]](x)
let
ttm_z = ttm_x shr y
mp_z = mp_x shr y
check(cast[array[4, uint64]](ttm_z) == cast[array[4, uint64]](mp_z))
quicktest "`mod`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x mod ttm_y
mp_z = mp_x mod mp_y
quicktest "`div`", itercount do(x0: uint(min=0, max=hi),
x1: uint(min=0, max=hi),
x2: uint(min=0, max=hi),
x3: uint(min=0, max=hi),
y0: uint(min=0, max=hi),
y1: uint(min=0, max=hi),
y2: uint(min=0, max=hi),
y3: uint(min=0, max=hi)):
let
x = [x0, x1, x2, x3]
y = [y0, y1, y2, y3]
ttm_x = cast[ttmath.UInt256](x)
ttm_y = cast[ttmath.UInt256](y)
mp_x = cast[MpUint[256]](x)
mp_y = cast[MpUint[256]](y)
let
ttm_z = ttm_x div ttm_y
mp_z = mp_x div mp_y