Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show First 20 Lines • Show All 2,874 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(script_FindAndDelete) { | ||||
CScript s; | CScript s; | ||||
CScript d; | CScript d; | ||||
CScript expect; | CScript expect; | ||||
s = CScript() << OP_1 << OP_2; | s = CScript() << OP_1 << OP_2; | ||||
// delete nothing should be a no-op | // delete nothing should be a no-op | ||||
d = CScript(); | d = CScript(); | ||||
expect = s; | expect = s; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = CScript() << OP_1 << OP_2 << OP_3; | s = CScript() << OP_1 << OP_2 << OP_3; | ||||
d = CScript() << OP_2; | d = CScript() << OP_2; | ||||
expect = CScript() << OP_1 << OP_3; | expect = CScript() << OP_1 << OP_3; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = CScript() << OP_3 << OP_1 << OP_3 << OP_3 << OP_4 << OP_3; | s = CScript() << OP_3 << OP_1 << OP_3 << OP_3 << OP_4 << OP_3; | ||||
d = CScript() << OP_3; | d = CScript() << OP_3; | ||||
expect = CScript() << OP_1 << OP_4; | expect = CScript() << OP_1 << OP_4; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 4); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 4); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
// PUSH 0x02ff03 onto stack | // PUSH 0x02ff03 onto stack | ||||
s = ScriptFromHex("0302ff03"); | s = ScriptFromHex("0302ff03"); | ||||
d = ScriptFromHex("0302ff03"); | d = ScriptFromHex("0302ff03"); | ||||
expect = CScript(); | expect = CScript(); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
// PUSH 0x2ff03 PUSH 0x2ff03 | // PUSH 0x2ff03 PUSH 0x2ff03 | ||||
s = ScriptFromHex("0302ff030302ff03"); | s = ScriptFromHex("0302ff030302ff03"); | ||||
d = ScriptFromHex("0302ff03"); | d = ScriptFromHex("0302ff03"); | ||||
expect = CScript(); | expect = CScript(); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = ScriptFromHex("0302ff030302ff03"); | s = ScriptFromHex("0302ff030302ff03"); | ||||
d = ScriptFromHex("02"); | d = ScriptFromHex("02"); | ||||
expect = s; // FindAndDelete matches entire opcodes | expect = s; // FindAndDelete matches entire opcodes | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = ScriptFromHex("0302ff030302ff03"); | s = ScriptFromHex("0302ff030302ff03"); | ||||
d = ScriptFromHex("ff"); | d = ScriptFromHex("ff"); | ||||
expect = s; | expect = s; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
// This is an odd edge case: strip of the push-three-bytes prefix, leaving | // This is an odd edge case: strip of the push-three-bytes prefix, leaving | ||||
// 02ff03 which is push-two-bytes: | // 02ff03 which is push-two-bytes: | ||||
s = ScriptFromHex("0302ff030302ff03"); | s = ScriptFromHex("0302ff030302ff03"); | ||||
d = ScriptFromHex("03"); | d = ScriptFromHex("03"); | ||||
expect = CScript() << ParseHex("ff03") << ParseHex("ff03"); | expect = CScript() << ParseHex("ff03") << ParseHex("ff03"); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
// Byte sequence that spans multiple opcodes: | // Byte sequence that spans multiple opcodes: | ||||
// PUSH(0xfeed) OP_1 OP_VERIFY | // PUSH(0xfeed) OP_1 OP_VERIFY | ||||
s = ScriptFromHex("02feed5169"); | s = ScriptFromHex("02feed5169"); | ||||
d = ScriptFromHex("feed51"); | d = ScriptFromHex("feed51"); | ||||
expect = s; | expect = s; | ||||
// doesn't match 'inside' opcodes | // doesn't match 'inside' opcodes | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
// PUSH(0xfeed) OP_1 OP_VERIFY | // PUSH(0xfeed) OP_1 OP_VERIFY | ||||
s = ScriptFromHex("02feed5169"); | s = ScriptFromHex("02feed5169"); | ||||
d = ScriptFromHex("02feed51"); | d = ScriptFromHex("02feed51"); | ||||
expect = ScriptFromHex("69"); | expect = ScriptFromHex("69"); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = ScriptFromHex("516902feed5169"); | s = ScriptFromHex("516902feed5169"); | ||||
d = ScriptFromHex("feed51"); | d = ScriptFromHex("feed51"); | ||||
expect = s; | expect = s; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = ScriptFromHex("516902feed5169"); | s = ScriptFromHex("516902feed5169"); | ||||
d = ScriptFromHex("02feed51"); | d = ScriptFromHex("02feed51"); | ||||
expect = ScriptFromHex("516969"); | expect = ScriptFromHex("516969"); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = CScript() << OP_0 << OP_0 << OP_1 << OP_1; | s = CScript() << OP_0 << OP_0 << OP_1 << OP_1; | ||||
d = CScript() << OP_0 << OP_1; | d = CScript() << OP_0 << OP_1; | ||||
// FindAndDelete is single-pass | // FindAndDelete is single-pass | ||||
expect = CScript() << OP_0 << OP_1; | expect = CScript() << OP_0 << OP_1; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = CScript() << OP_0 << OP_0 << OP_1 << OP_0 << OP_1 << OP_1; | s = CScript() << OP_0 << OP_0 << OP_1 << OP_0 << OP_1 << OP_1; | ||||
d = CScript() << OP_0 << OP_1; | d = CScript() << OP_0 << OP_1; | ||||
// FindAndDelete is single-pass | // FindAndDelete is single-pass | ||||
expect = CScript() << OP_0 << OP_1; | expect = CScript() << OP_0 << OP_1; | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
// Another weird edge case: | // Another weird edge case: | ||||
// End with invalid push (not enough data)... | // End with invalid push (not enough data)... | ||||
s = ScriptFromHex("0003feed"); | s = ScriptFromHex("0003feed"); | ||||
// ... can remove the invalid push | // ... can remove the invalid push | ||||
d = ScriptFromHex("03feed"); | d = ScriptFromHex("03feed"); | ||||
expect = ScriptFromHex("00"); | expect = ScriptFromHex("00"); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
s = ScriptFromHex("0003feed"); | s = ScriptFromHex("0003feed"); | ||||
d = ScriptFromHex("00"); | d = ScriptFromHex("00"); | ||||
expect = ScriptFromHex("03feed"); | expect = ScriptFromHex("03feed"); | ||||
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1); | BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1); | ||||
BOOST_CHECK(s == expect); | BOOST_CHECK(s == expect); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(IsWitnessProgram) { | BOOST_AUTO_TEST_CASE(IsWitnessProgram) { | ||||
// Valid version: [0,16] | // Valid version: [0,16] | ||||
// Valid program_len: [2,40] | // Valid program_len: [2,40] | ||||
for (int version = -1; version <= 17; version++) { | for (int version = -1; version <= 17; version++) { | ||||
for (unsigned int program_len = 1; program_len <= 41; program_len++) { | for (unsigned int program_len = 1; program_len <= 41; program_len++) { | ||||
▲ Show 20 Lines • Show All 53 Lines • Show Last 20 Lines |