Changeset View
Changeset View
Standalone View
Standalone View
src/test/monolith_opcodes.cpp
Show First 20 Lines • Show All 371 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(bitwise_opcodes_test) { | ||||
CheckAllBitwiseOpErrors({{}, a}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | CheckAllBitwiseOpErrors({{}, a}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | ||||
CheckAllBitwiseOpErrors({b, {}}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | CheckAllBitwiseOpErrors({b, {}}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | ||||
} | } | ||||
/** | /** | ||||
* String opcodes. | * String opcodes. | ||||
*/ | */ | ||||
static void CheckStringOp(const valtype &a, const valtype &b, | static void CheckStringOp(const valtype &a, const valtype &b, | ||||
const valtype &expected) { | const valtype &n) { | ||||
CheckBinaryOp(a, b, OP_CAT, expected); | CheckBinaryOp(a, b, OP_CAT, n); | ||||
// Check concatenation with empty elements. | // Check concatenation with empty elements. | ||||
CheckBinaryOp(a, {}, OP_CAT, a); | CheckBinaryOp(a, {}, OP_CAT, a); | ||||
CheckBinaryOp(b, {}, OP_CAT, b); | CheckBinaryOp(b, {}, OP_CAT, b); | ||||
CheckBinaryOp({}, a, OP_CAT, a); | CheckBinaryOp({}, a, OP_CAT, a); | ||||
CheckBinaryOp({}, b, OP_CAT, b); | CheckBinaryOp({}, b, OP_CAT, b); | ||||
// Split n into a and b. | |||||
CheckTestResultForAllFlags({n}, CScript() << a.size() << OP_SPLIT, {a, b}); | |||||
// Combine split and cat. | |||||
CheckTestResultForAllFlags({n}, CScript() << a.size() << OP_SPLIT << OP_CAT, | |||||
{n}); | |||||
CheckTestResultForAllFlags( | |||||
{a, b}, CScript() << OP_CAT << a.size() << OP_SPLIT, {a, b}); | |||||
// Split away empty elements. | |||||
CheckTestResultForAllFlags({a}, CScript() << 0 << OP_SPLIT, {{}, a}); | |||||
CheckTestResultForAllFlags({b}, CScript() << 0 << OP_SPLIT, {{}, b}); | |||||
CheckTestResultForAllFlags({a}, CScript() << a.size() << OP_SPLIT, {a, {}}); | |||||
CheckTestResultForAllFlags({b}, CScript() << b.size() << OP_SPLIT, {b, {}}); | |||||
// Out of bound split. | |||||
CheckErrorForAllFlags({a}, CScript() << (a.size() + 1) << OP_SPLIT, | |||||
SCRIPT_ERR_INVALID_SPLIT_RANGE); | |||||
CheckErrorForAllFlags({b}, CScript() << (b.size() + 1) << OP_SPLIT, | |||||
SCRIPT_ERR_INVALID_SPLIT_RANGE); | |||||
CheckErrorForAllFlags({n}, CScript() << (n.size() + 1) << OP_SPLIT, | |||||
SCRIPT_ERR_INVALID_SPLIT_RANGE); | |||||
CheckErrorForAllFlags({a}, CScript() << (-1) << OP_SPLIT, | |||||
SCRIPT_ERR_INVALID_SPLIT_RANGE); | |||||
} | } | ||||
BOOST_AUTO_TEST_CASE(string_opcodes_test) { | BOOST_AUTO_TEST_CASE(string_opcodes_test) { | ||||
// Check for empty string. | // Check for empty string. | ||||
CheckStringOp({}, {}, {}); | CheckStringOp({}, {}, {}); | ||||
// Check for simple concats. | // Check for simple concats. | ||||
CheckStringOp({0x00}, {0x00}, {0x00, 0x00}); | CheckStringOp({0x00}, {0x00}, {0x00, 0x00}); | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | for (size_t i = 0; i <= MAX_SCRIPT_ELEMENT_SIZE; i++) { | ||||
CheckOpError({extraA, b}, OP_CAT, SCRIPT_ERR_PUSH_SIZE); | CheckOpError({extraA, b}, OP_CAT, SCRIPT_ERR_PUSH_SIZE); | ||||
CheckOpError({a, extraB}, OP_CAT, SCRIPT_ERR_PUSH_SIZE); | CheckOpError({a, extraB}, OP_CAT, SCRIPT_ERR_PUSH_SIZE); | ||||
CheckOpError({extraA, extraB}, OP_CAT, SCRIPT_ERR_PUSH_SIZE); | CheckOpError({extraA, extraB}, OP_CAT, SCRIPT_ERR_PUSH_SIZE); | ||||
} | } | ||||
// Check error conditions. | // Check error conditions. | ||||
CheckOpError({}, OP_CAT, SCRIPT_ERR_INVALID_STACK_OPERATION); | CheckOpError({}, OP_CAT, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
CheckOpError({}, OP_SPLIT, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
CheckOpError({{}}, OP_CAT, SCRIPT_ERR_INVALID_STACK_OPERATION); | CheckOpError({{}}, OP_CAT, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
CheckOpError({{}}, OP_SPLIT, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
CheckOpError({{0x00}}, OP_CAT, SCRIPT_ERR_INVALID_STACK_OPERATION); | CheckOpError({{0x00}}, OP_CAT, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
CheckOpError({{0x00}}, OP_SPLIT, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
CheckOpError({{0xab, 0xcd, 0xef}}, OP_CAT, | CheckOpError({{0xab, 0xcd, 0xef}}, OP_CAT, | ||||
SCRIPT_ERR_INVALID_STACK_OPERATION); | SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
CheckOpError({{0xab, 0xcd, 0xef}}, OP_SPLIT, | |||||
SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
} | } | ||||
/** | /** | ||||
* Type conversion opcodes. | * Type conversion opcodes. | ||||
*/ | */ | ||||
static void CheckTypeConversionOp(const valtype &bin, const valtype &num) { | static void CheckTypeConversionOp(const valtype &bin, const valtype &num) { | ||||
// Check BIN2NUM. | // Check BIN2NUM. | ||||
CheckTestResultForAllFlags({bin}, CScript() << OP_BIN2NUM, {num}); | CheckTestResultForAllFlags({bin}, CScript() << OP_BIN2NUM, {num}); | ||||
▲ Show 20 Lines • Show All 107 Lines • Show Last 20 Lines |