|
|
|
@ -1349,43 +1349,43 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
|
|
|
|
|
s = CScript() << OP_1 << OP_2;
|
|
|
|
|
d = CScript(); // delete nothing should be a no-op
|
|
|
|
|
expect = s;
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = CScript() << OP_1 << OP_2 << OP_3;
|
|
|
|
|
d = CScript() << OP_2;
|
|
|
|
|
expect = CScript() << OP_1 << OP_3;
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = CScript() << OP_3 << OP_1 << OP_3 << OP_3 << OP_4 << OP_3;
|
|
|
|
|
d = CScript() << OP_3;
|
|
|
|
|
expect = CScript() << OP_1 << OP_4;
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 4);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 4);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff03"); // PUSH 0x02ff03 onto stack
|
|
|
|
|
d = ScriptFromHex("0302ff03");
|
|
|
|
|
expect = CScript();
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03"); // PUSH 0x2ff03 PUSH 0x2ff03
|
|
|
|
|
d = ScriptFromHex("0302ff03");
|
|
|
|
|
expect = CScript();
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03");
|
|
|
|
|
d = ScriptFromHex("02");
|
|
|
|
|
expect = s; // FindAndDelete matches entire opcodes
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03");
|
|
|
|
|
d = ScriptFromHex("ff");
|
|
|
|
|
expect = s;
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
// This is an odd edge case: strip of the push-three-bytes
|
|
|
|
@ -1393,44 +1393,44 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
|
|
|
|
|
s = ScriptFromHex("0302ff030302ff03");
|
|
|
|
|
d = ScriptFromHex("03");
|
|
|
|
|
expect = CScript() << ParseHex("ff03") << ParseHex("ff03");
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
// Byte sequence that spans multiple opcodes:
|
|
|
|
|
s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
|
|
|
|
|
d = ScriptFromHex("feed51");
|
|
|
|
|
expect = s;
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0); // doesn't match 'inside' opcodes
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0); // doesn't match 'inside' opcodes
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("02feed5169"); // PUSH(0xfeed) OP_1 OP_VERIFY
|
|
|
|
|
d = ScriptFromHex("02feed51");
|
|
|
|
|
expect = ScriptFromHex("69");
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("516902feed5169");
|
|
|
|
|
d = ScriptFromHex("feed51");
|
|
|
|
|
expect = s;
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 0);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 0);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("516902feed5169");
|
|
|
|
|
d = ScriptFromHex("02feed51");
|
|
|
|
|
expect = ScriptFromHex("516969");
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = CScript() << OP_0 << OP_0 << OP_1 << OP_1;
|
|
|
|
|
d = CScript() << OP_0 << OP_1;
|
|
|
|
|
expect = CScript() << OP_0 << OP_1; // FindAndDelete is single-pass
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = CScript() << OP_0 << OP_0 << OP_1 << OP_0 << OP_1 << OP_1;
|
|
|
|
|
d = CScript() << OP_0 << OP_1;
|
|
|
|
|
expect = CScript() << OP_0 << OP_1; // FindAndDelete is single-pass
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 2);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 2);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
// Another weird edge case:
|
|
|
|
@ -1438,13 +1438,13 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
|
|
|
|
|
s = ScriptFromHex("0003feed");
|
|
|
|
|
d = ScriptFromHex("03feed"); // ... can remove the invalid push
|
|
|
|
|
expect = ScriptFromHex("00");
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
|
|
|
|
|
s = ScriptFromHex("0003feed");
|
|
|
|
|
d = ScriptFromHex("00");
|
|
|
|
|
expect = ScriptFromHex("03feed");
|
|
|
|
|
BOOST_CHECK_EQUAL(s.FindAndDelete(d), 1);
|
|
|
|
|
BOOST_CHECK_EQUAL(FindAndDelete(s, d), 1);
|
|
|
|
|
BOOST_CHECK(s == expect);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|