| 447 | }; |
| 448 | |
| 449 | void Test(const std::string& ms, const std::string& hexscript, int mode, const KeyConverter& converter, |
| 450 | int opslimit = -1, int stacklimit = -1, std::optional<uint32_t> max_wit_size = std::nullopt, |
| 451 | std::optional<uint32_t> stack_exec = {}) |
| 452 | { |
| 453 | auto node = miniscript::FromString(ms, converter); |
| 454 | const bool is_tapscript{miniscript::IsTapscript(converter.MsContext())}; |
| 455 | if (mode == TESTMODE_INVALID || ((mode & TESTMODE_P2WSH_INVALID) && !is_tapscript) || ((mode & TESTMODE_TAPSCRIPT_INVALID) && is_tapscript)) { |
| 456 | BOOST_CHECK_MESSAGE(!node || !node->IsValid(), "Unexpectedly valid: " + ms); |
| 457 | } else { |
| 458 | BOOST_CHECK_MESSAGE(node, "Unparseable: " + ms); |
| 459 | BOOST_CHECK_MESSAGE(node->IsValid(), "Invalid: " + ms); |
| 460 | BOOST_CHECK_MESSAGE(node->IsValidTopLevel(), "Invalid top level: " + ms); |
| 461 | auto computed_script = node->ToScript(converter); |
| 462 | BOOST_CHECK_MESSAGE(node->ScriptSize() == computed_script.size(), "Script size mismatch: " + ms); |
| 463 | if (hexscript != "?") BOOST_CHECK_MESSAGE(HexStr(computed_script) == hexscript, "Script mismatch: " + ms + " (" + HexStr(computed_script) + " vs " + hexscript + ")"); |
| 464 | BOOST_CHECK_MESSAGE(node->IsNonMalleable() == !!(mode & TESTMODE_NONMAL), "Malleability mismatch: " + ms); |
| 465 | BOOST_CHECK_MESSAGE(node->NeedsSignature() == !!(mode & TESTMODE_NEEDSIG), "Signature necessity mismatch: " + ms); |
| 466 | BOOST_CHECK_MESSAGE((node->GetType() << "k"_mst) == !(mode & TESTMODE_TIMELOCKMIX), "Timelock mix mismatch: " + ms); |
| 467 | auto inferred_miniscript = miniscript::FromScript(computed_script, converter); |
| 468 | BOOST_CHECK_MESSAGE(inferred_miniscript, "Cannot infer miniscript from script: " + ms); |
| 469 | BOOST_CHECK_MESSAGE(inferred_miniscript->ToScript(converter) == computed_script, "Roundtrip failure: miniscript->script != miniscript->script->miniscript->script: " + ms); |
| 470 | if (opslimit != -1) BOOST_CHECK_MESSAGE((int)*node->GetOps() == opslimit, "Ops limit mismatch: " << ms << " (" << *node->GetOps() << " vs " << opslimit << ")"); |
| 471 | if (stacklimit != -1) BOOST_CHECK_MESSAGE((int)*node->GetStackSize() == stacklimit, "Stack limit mismatch: " << ms << " (" << *node->GetStackSize() << " vs " << stacklimit << ")"); |
| 472 | if (max_wit_size) BOOST_CHECK_MESSAGE(*node->GetWitnessSize() == *max_wit_size, "Witness size limit mismatch: " << ms << " (" << *node->GetWitnessSize() << " vs " << *max_wit_size << ")"); |
| 473 | if (stack_exec) BOOST_CHECK_MESSAGE(*node->GetExecStackSize() == *stack_exec, "Stack execution limit mismatch: " << ms << " (" << *node->GetExecStackSize() << " vs " << *stack_exec << ")"); |
| 474 | TestSatisfy(converter, *node); |
| 475 | } |
| 476 | } |
| 477 | |
| 478 | void Test(const std::string& ms, const std::string& hexscript, const std::string& hextapscript, int mode, |
| 479 | int opslimit, int stacklimit, std::optional<uint32_t> max_wit_size, |
no test coverage detected