From c48a9e71f58d9da004079599d06dd5de9343f92e Mon Sep 17 00:00:00 2001 From: playX Date: Wed, 19 Jan 2022 12:18:46 +0300 Subject: [PATCH] math.unsigned: add uint128 tests (#13213) --- vlib/math/unsigned/uint128.v | 6 +- vlib/math/unsigned/uint128_test.v | 99 +++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 vlib/math/unsigned/uint128_test.v diff --git a/vlib/math/unsigned/uint128.v b/vlib/math/unsigned/uint128.v index 66af78cd4e..4bae3c4f15 100644 --- a/vlib/math/unsigned/uint128.v +++ b/vlib/math/unsigned/uint128.v @@ -307,7 +307,7 @@ pub fn (u Uint128) lsh(n u32) Uint128 { return s } -// lsh returns u >> n +// rsh returns u >> n pub fn (u Uint128) rsh(n u32) Uint128 { mut s := Uint128{} if n > 64 { @@ -460,3 +460,7 @@ pub fn (u Uint128) - (v Uint128) Uint128 { pub fn (u Uint128) * (v Uint128) Uint128 { return u.mul(v) } + +pub fn (u Uint128) < (v Uint128) bool { + return u.cmp(v) == -1 +} diff --git a/vlib/math/unsigned/uint128_test.v b/vlib/math/unsigned/uint128_test.v new file mode 100644 index 0000000000..5ad59a9eb4 --- /dev/null +++ b/vlib/math/unsigned/uint128_test.v @@ -0,0 +1,99 @@ +import math.unsigned + +fn test_str() { + x := unsigned.uint128_from_dec_str('170141183460469231713240559642174554112') or { panic('') } + assert x.str() == '170141183460469231713240559642174554112' + y := unsigned.uint128_from_64(42) + assert y.str() == '42' +} + +fn test_ops() { + x := unsigned.uint128_from_64(18446744073709551615) + y := unsigned.uint128_from_64(18446744073709551615) + z := unsigned.uint128_from_dec_str('340282366920938463426481119284349108225') or { + assert false + panic('') + } + assert (x * y).str() == '340282366920938463426481119284349108225' + assert (x + y).str() == '36893488147419103230' + assert (z / unsigned.uint128_from_64(2)).str() == '170141183460469231713240559642174554112' + assert (unsigned.uint128_from_dec_str('170141183460469231713240559642174554112') or { + panic('') + } - unsigned.uint128_from_64(2)).str() == '170141183460469231713240559642174554110' + + assert x == y + assert unsigned.uint128_from_dec_str('340282366920938463426481119284349108225') or { + assert false + panic('') + } > y +} + +struct LeadingZeros { + l unsigned.Uint128 + r unsigned.Uint128 + zeros int +} + +fn new(x u64, y u64) unsigned.Uint128 { + return unsigned.Uint128{x, y} +} + +fn test_leading_zeros() { + tcs := [ + LeadingZeros{ + l: new(0x00, 0xf000000000000000) + r: new(0x00, 0x8000000000000000) + zeros: 1 + }, + LeadingZeros{ + l: new(0x00, 0xf000000000000000) + r: new(0x00, 0xc000000000000000) + zeros: 2 + }, + LeadingZeros{ + l: new(0x00, 0xf000000000000000) + r: new(0x00, 0xe000000000000000) + zeros: 3 + }, + LeadingZeros{ + l: new(0x00, 0xffff000000000000) + r: new(0x00, 0xff00000000000000) + zeros: 8 + }, + LeadingZeros{ + l: new(0x00, 0x000000000000ffff) + r: new(0x00, 0x000000000000ff00) + zeros: 56 + }, + LeadingZeros{ + l: new(0xf000000000000000, 0x01) + r: new(0x4000000000000000, 0x00) + zeros: 63 + }, + LeadingZeros{ + l: new(0xf000000000000000, 0x00) + r: new(0x4000000000000000, 0x00) + zeros: 64 + }, + LeadingZeros{ + l: new(0xf000000000000000, 0x00) + r: new(0x8000000000000000, 0x00) + zeros: 65 + }, + LeadingZeros{ + l: new(0x00, 0x00) + r: new(0x00, 0x00) + zeros: 128 + }, + LeadingZeros{ + l: new(0x01, 0x00) + r: new(0x00, 0x00) + zeros: 127 + }, + ] + + for tc in tcs { + zeros := tc.l.xor(tc.r).leading_zeros() + assert zeros == tc.zeros + } +}