git / moonbite-core / src/test/compress_tests.cpp · raw
// Copyright (c) 2012-2020 The Bitcoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#include <compressor.h>#include <script/standard.h>#include <test/util/setup_common.h>#include <stdint.h>#include <boost/test/unit_test.hpp>// amounts 0.00000001 .. 0.00100000#define NUM_MULTIPLES_UNIT 100000// amounts 0.01 .. 100.00#define NUM_MULTIPLES_CENT 10000// amounts 1 .. 10000#define NUM_MULTIPLES_1BTC 10000// amounts 50 .. 21000000#define NUM_MULTIPLES_50BTC 1680000BOOST_FIXTURE_TEST_SUITE(compress_tests, BasicTestingSetup)bool static TestEncode(uint64_t in) { return in == DecompressAmount(CompressAmount(in));}bool static TestDecode(uint64_t in) { return in == CompressAmount(DecompressAmount(in));}bool static TestPair(uint64_t dec, uint64_t enc) { return CompressAmount(dec) == enc && DecompressAmount(enc) == dec;}BOOST_AUTO_TEST_CASE(compress_amounts){ BOOST_CHECK(TestPair( 0, 0x0)); BOOST_CHECK(TestPair( 1, 0x1)); BOOST_CHECK(TestPair( CENT, 0x7)); BOOST_CHECK(TestPair( COIN, 0x9)); BOOST_CHECK(TestPair( 50*COIN, 0x32)); BOOST_CHECK(TestPair(84000000*COIN, 0x501BD00)); for (uint64_t i = 1; i <= NUM_MULTIPLES_UNIT; i++) BOOST_CHECK(TestEncode(i)); for (uint64_t i = 1; i <= NUM_MULTIPLES_CENT; i++) BOOST_CHECK(TestEncode(i * CENT)); for (uint64_t i = 1; i <= NUM_MULTIPLES_1BTC; i++) BOOST_CHECK(TestEncode(i * COIN)); for (uint64_t i = 1; i <= NUM_MULTIPLES_50BTC; i++) BOOST_CHECK(TestEncode(i * 50 * COIN)); for (uint64_t i = 0; i < 100000; i++) BOOST_CHECK(TestDecode(i));}BOOST_AUTO_TEST_CASE(compress_script_to_ckey_id){ // case CKeyID CKey key; key.MakeNewKey(true); CPubKey pubkey = key.GetPubKey(); CScript script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG; BOOST_CHECK_EQUAL(script.size(), 25U); std::vector<unsigned char> out; bool done = CompressScript(script, out); BOOST_CHECK_EQUAL(done, true); // Check compressed script BOOST_CHECK_EQUAL(out.size(), 21U); BOOST_CHECK_EQUAL(out[0], 0x00); BOOST_CHECK_EQUAL(memcmp(&out[1], &script[3], 20), 0); // compare the 20 relevant chars of the CKeyId in the script}BOOST_AUTO_TEST_CASE(compress_script_to_cscript_id){ // case CScriptID CScript script, redeemScript; script << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL; BOOST_CHECK_EQUAL(script.size(), 23U); std::vector<unsigned char> out; bool done = CompressScript(script, out); BOOST_CHECK_EQUAL(done, true); // Check compressed script BOOST_CHECK_EQUAL(out.size(), 21U); BOOST_CHECK_EQUAL(out[0], 0x01); BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 20), 0); // compare the 20 relevant chars of the CScriptId in the script}BOOST_AUTO_TEST_CASE(compress_script_to_compressed_pubkey_id){ CKey key; key.MakeNewKey(true); // case compressed PubKeyID CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // COMPRESSED_PUBLIC_KEY_SIZE (33) BOOST_CHECK_EQUAL(script.size(), 35U); std::vector<unsigned char> out; bool done = CompressScript(script, out); BOOST_CHECK_EQUAL(done, true); // Check compressed script BOOST_CHECK_EQUAL(out.size(), 33U); BOOST_CHECK_EQUAL(memcmp(&out[0], &script[1], 1), 0); BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 32), 0); // compare the 32 chars of the compressed CPubKey}BOOST_AUTO_TEST_CASE(compress_script_to_uncompressed_pubkey_id){ CKey key; key.MakeNewKey(false); // case uncompressed PubKeyID CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // PUBLIC_KEY_SIZE (65) BOOST_CHECK_EQUAL(script.size(), 67U); // 1 char code + 65 char pubkey + OP_CHECKSIG std::vector<unsigned char> out; bool done = CompressScript(script, out); BOOST_CHECK_EQUAL(done, true); // Check compressed script BOOST_CHECK_EQUAL(out.size(), 33U); BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 32), 0); // first 32 chars of CPubKey are copied into out[1:] BOOST_CHECK_EQUAL(out[0], 0x04 | (script[65] & 0x01)); // least significant bit (lsb) of last char of pubkey is mapped into out[0]}BOOST_AUTO_TEST_SUITE_END()