diff --git a/src/script/script.cpp b/src/script/script.cpp --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -274,23 +274,24 @@ } // Check for a negative bit - uint8_t msb = data[0] & 0x80; - bool start = false; + uint8_t neg = data[0] & 0x80; + bool pushedRes = false; for (size_t i = 0; i < data.size(); ++i) { uint8_t x = data[i]; if (i == 0 && (x & 0x7f) == 0) { continue; } - if (!start && x == 0) { + if (!pushedRes && x == 0) { continue; } - start = true; + pushedRes = true; res.push_back(x); } - if (res.size() != 0) { - res[0] |= msb; + if (res.size() == 0) { + res.push_back(0); } + res[0] |= neg; return res; } diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -415,19 +415,53 @@ } // namespace BOOST_AUTO_TEST_CASE(minimize_big_endian_test) { - std::vector input( - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01}}); - std::vector negInput( - {{0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01}}); + // Empty array case + BOOST_CHECK(MinimalizeBigEndianArray(std::vector()) == std::vector()); + + // Zero arrays of various lengths + std::vector zeroArray; + std::vector negZeroArray({{0x80}}); + for (int i = 0; i < 16; i++) { + zeroArray.push_back(0x00); + if (i > 0) { + negZeroArray.insert(negZeroArray.begin(), 0x00); + } + + BOOST_CHECK(MinimalizeBigEndianArray(zeroArray) == + std::vector({{0x00}})); + BOOST_CHECK(MinimalizeBigEndianArray(negZeroArray) == + std::vector({{0x80}})); + } + + // Shouldn't minimalize these arrays to negative numbers + std::vector notNegArray({{0x05, 0x80, 0x00}}); + std::vector notNegArrayRightPadded({{0x80, 0x00}}); + for (int i = 0; i < 16; i++) { + notNegArray.insert(notNegArray.begin() + 1, 0x00); + notNegArrayRightPadded.insert(notNegArrayRightPadded.end(), 0x00); + BOOST_CHECK(MinimalizeBigEndianArray(notNegArray) == notNegArray); + BOOST_CHECK(MinimalizeBigEndianArray(notNegArrayRightPadded) == notNegArrayRightPadded); + } + + // Shouldn't minimalize these arrays at all + std::vector noMinArray; + for (int i = 0; i < 14; i++) { + noMinArray.push_back(i); + BOOST_CHECK(MinimalizeBigEndianArray(noMinArray) == noMinArray); + } + - std::vector check({0x01, 0x00, 0x00, 0x01}); - std::vector negCheck({0x81, 0x00, 0x00, 0x01}); - std::vector out = MinimalizeBigEndianArray(input); - std::vector negOut = MinimalizeBigEndianArray(negInput); + // TODO check these for partial minimalization + // Long arrays get minimalized + BOOST_CHECK(MinimalizeBigEndianArray( + std::vector({0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01})) == + std::vector({0x01, 0x00, 0x00, 0x01})); - BOOST_CHECK(out == check); - BOOST_CHECK(negOut == negCheck); + // Long negative arrays get minimalized + BOOST_CHECK(MinimalizeBigEndianArray( + std::vector({0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01})) == + std::vector({0x81, 0x00, 0x00, 0x01})); } BOOST_AUTO_TEST_CASE(script_build) {