#include "storm/Big.hpp" #include "storm/big/Ops.hpp" #include "test/Test.hpp" TEST_CASE("ExtractLowPart", "[big]") { SECTION("extracts low part of 0") { uint64_t value = 0; auto low = ExtractLowPart(value); REQUIRE(low == 0); REQUIRE(value == 0); } SECTION("extracts low part of 0x12345678") { uint64_t value = 0x12345678; auto low = ExtractLowPart(value); REQUIRE(low == 0x12345678); REQUIRE(value == 0); } SECTION("extracts low part of 0xAAAABBBBCCCCDDDD") { uint64_t value = 0xAAAABBBBCCCCDDDD; auto low = ExtractLowPart(value); REQUIRE(low == 0xCCCCDDDD); REQUIRE(value == 0xAAAABBBB); } } TEST_CASE("ExtractLowPartSx", "[big]") { SECTION("extracts low part of 0") { uint64_t value = 0; auto low = ExtractLowPartSx(value); REQUIRE(low == 0); REQUIRE(value == 0); } SECTION("extracts low part of 0x12345678") { uint64_t value = 0x12345678; auto low = ExtractLowPartSx(value); REQUIRE(low == 0x12345678); REQUIRE(value == 0); } SECTION("extracts low part of 0xAAAABBBBCCCCDDDD") { uint64_t value = 0xAAAABBBBCCCCDDDD; auto low = ExtractLowPartSx(value); REQUIRE(low == 0xCCCCDDDD); REQUIRE(value == 0xFFFFFFFFAAAABBBB); } } TEST_CASE("Mul", "[big]") { SECTION("multiplies 0 and 1") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0); uint64_t c = 1; Mul(a->Primary(), b->Primary(), c); a->Primary().Trim(); CHECK(a->Primary().Count() == 0); SBigDel(a); SBigDel(b); } SECTION("multiplies 2 and 4") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 2); uint64_t c = 4; Mul(a->Primary(), b->Primary(), c); a->Primary().Trim(); CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 8); SBigDel(a); SBigDel(b); } SECTION("multiplies 0xFFFFFFFF and 0x100") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0xFFFFFFFF); uint64_t c = 0x100; Mul(a->Primary(), b->Primary(), c); a->Primary().Trim(); CHECK(a->Primary().Count() == 2); CHECK(a->Primary()[0] == 0xFFFFFF00); CHECK(a->Primary()[1] == 0xFF); SBigDel(a); SBigDel(b); } } TEST_CASE("MakeLarge", "[big]") { SECTION("creates uint64_t out of 0xAABBCCDD and 0x11223344") { uint64_t value = MakeLarge(0xAABBCCDD, 0x11223344); REQUIRE(value == 0x11223344AABBCCDD); } SECTION("creates uint64_t out of 0 and 0x11223344") { uint64_t value = MakeLarge(0x00000000, 0x11223344); REQUIRE(value == 0x1122334400000000); } } TEST_CASE("SBigAdd", "[big]") { SECTION("adds 0 and 1") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 1); SBigAdd(a, b, c); CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 1); SBigDel(a); SBigDel(b); SBigDel(c); } SECTION("adds 1 and 2") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 1); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 2); SBigAdd(a, b, c); CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 3); SBigDel(a); SBigDel(b); SBigDel(c); } SECTION("adds 0x12345678 and 0x23456789") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0x12345678); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 0x23456789); SBigAdd(a, b, c); CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 0x3579BE01); SBigDel(a); SBigDel(b); SBigDel(c); } SECTION("adds 0xFFFFFFFF and 0xF0F0F0F0") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0xFFFFFFFF); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 0xF0F0F0F0); SBigAdd(a, b, c); CHECK(a->Primary().Count() == 2); CHECK(a->Primary()[0] == 0xF0F0F0EF); CHECK(a->Primary()[1] == 0x1); SBigDel(a); SBigDel(b); SBigDel(c); } } TEST_CASE("SBigFromBinary", "[big]") { SECTION("creates bigdata from 0") { BigData* num; SBigNew(&num); uint32_t data = 0; SBigFromBinary(num, reinterpret_cast(&data), sizeof(data)); CHECK(num->Primary().Count() == 1); CHECK(num->Primary()[0] == 0); SBigDel(num); } SECTION("creates bigdata from 0x123456789ABCDEF0") { BigData* num; SBigNew(&num); uint64_t data = 0x123456789ABCDEF0; SBigFromBinary(num, reinterpret_cast(&data), sizeof(data)); CHECK(num->Primary().Count() == 2); CHECK(num->Primary()[0] == 0x9ABCDEF0); CHECK(num->Primary()[1] == 0x12345678); SBigDel(num); } } TEST_CASE("SBigFromUnsigned", "[big]") { SECTION("creates bigdata from 0") { BigData* num; SBigNew(&num); SBigFromUnsigned(num, 0); CHECK(num->Primary().Count() == 1); CHECK(num->Primary()[0] == 0); SBigDel(num); } SECTION("creates bigdata from 0x12345678") { BigData* num; SBigNew(&num); SBigFromUnsigned(num, 0x12345678); CHECK(num->Primary().Count() == 1); CHECK(num->Primary()[0] == 0x12345678); SBigDel(num); } } TEST_CASE("SBigMul", "[big]") { SECTION("multiplies 0 and 1") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 1); SBigMul(a, b, c); a->Primary().Trim(); CHECK(a->Primary().Count() == 0); SBigDel(a); SBigDel(b); SBigDel(c); } SECTION("multiplies 2 and 4") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 2); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 4); SBigMul(a, b, c); a->Primary().Trim(); CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 8); SBigDel(a); SBigDel(b); SBigDel(c); } SECTION("multiplies 0xFFFFFFFF and 0x100") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0xFFFFFFFF); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 0x100); SBigMul(a, b, c); a->Primary().Trim(); CHECK(a->Primary().Count() == 2); CHECK(a->Primary()[0] == 0xFFFFFF00); CHECK(a->Primary()[1] == 0xFF); SBigDel(a); SBigDel(b); SBigDel(c); } SECTION("multiplies 0xFFFFFF and 0x11223344") { BigData* a; SBigNew(&a); BigData* b; SBigNew(&b); SBigFromUnsigned(b, 0xFFFFFF); BigData* c; SBigNew(&c); SBigFromUnsigned(c, 0x11223344); SBigMul(a, b, c); a->Primary().Trim(); CHECK(a->Primary().Count() == 2); CHECK(a->Primary()[0] == 0x32DDCCBC); CHECK(a->Primary()[1] == 0x112233); SBigDel(a); SBigDel(b); SBigDel(c); } } TEST_CASE("SBigToBinaryBuffer", "[big]") { SECTION("returns expected buffer for bigdata representing 0") { BigData* num; SBigNew(&num); SBigFromUnsigned(num, 0); uint8_t buffer[4]; uint32_t bytes; SBigToBinaryBuffer(num, buffer, sizeof(buffer), &bytes); REQUIRE(bytes == 0); SBigDel(num); } SECTION("returns expected buffer for bigdata representing 0x12345678") { BigData* num; SBigNew(&num); SBigFromUnsigned(num, 0x12345678); uint8_t buffer[4]; uint32_t bytes; SBigToBinaryBuffer(num, buffer, sizeof(buffer), &bytes); CHECK(bytes == 4); CHECK(*reinterpret_cast(buffer) == 0x12345678); SBigDel(num); } SECTION("returns expected buffer for bigdata representing 0x123456789ABCDEF0") { BigData* num; SBigNew(&num); uint64_t data = 0x123456789ABCDEF0; SBigFromBinary(num, reinterpret_cast(&data), sizeof(data)); uint8_t buffer[8]; uint32_t bytes; SBigToBinaryBuffer(num, buffer, sizeof(buffer), &bytes); CHECK(bytes == 8); CHECK(*reinterpret_cast(buffer) == 0x123456789ABCDEF0); SBigDel(num); } }