From b765e78e940d9d099dafc3500342fb4e3f65fce9 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 22 Jul 2026 18:14:55 -0400 Subject: [PATCH] add test --- src/test/rpc/Simulate_test.cpp | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/test/rpc/Simulate_test.cpp b/src/test/rpc/Simulate_test.cpp index 16df733a66..e821b9af01 100644 --- a/src/test/rpc/Simulate_test.cpp +++ b/src/test/rpc/Simulate_test.cpp @@ -56,6 +56,7 @@ class Simulate_test : public beast::unit_test::Suite BEAST_EXPECT(result.isMember(jss::engine_result)); BEAST_EXPECT(result.isMember(jss::engine_result_code)); BEAST_EXPECT(result.isMember(jss::engine_result_message)); + BEAST_EXPECT(result.isMember(jss::engine_result_reason)); BEAST_EXPECT(result.isMember(jss::tx_json) || result.isMember(jss::tx_blob)); json::Value txJson; @@ -681,6 +682,8 @@ class Simulate_test : public beast::unit_test::Suite BEAST_EXPECT(result[jss::engine_result] == "temBAD_AMOUNT"); BEAST_EXPECT(result[jss::engine_result_code] == -298); BEAST_EXPECT(result[jss::engine_result_message] == "Malformed: Bad amount."); + // No custom reason was set; reason falls back to the default transHuman string. + BEAST_EXPECT(result[jss::engine_result_reason] == "Malformed: Bad amount."); BEAST_EXPECT(!result.isMember(jss::meta) && !result.isMember(jss::meta_blob)); }; @@ -727,6 +730,10 @@ class Simulate_test : public beast::unit_test::Suite "Destination does not exist. Too little XRP sent to " "create " "it."); + // No custom reason was set; reason falls back to the default transHuman string. + BEAST_EXPECT( + result[jss::engine_result_reason] == + "Destination does not exist. Too little XRP sent to create it."); if (BEAST_EXPECT(result.isMember(jss::meta) || result.isMember(jss::meta_blob))) { @@ -772,6 +779,39 @@ class Simulate_test : public beast::unit_test::Suite // test without autofill testTx(env, tx, testSimulation); } + + // tecDST_TAG_NEEDED: custom reason set by transactor differs from + // the static transHuman message ("A destination tag is required."). + { + env.fund(XRP(10000), alice); + env(fset(alice, asfRequireDest)); + env.close(); + + std::function const& testSimulation = + [&](json::Value const& resp, json::Value const& tx) { + auto result = resp[jss::result]; + checkBasicReturnValidity( + result, tx, env.seq(env.master), env.current()->fees().base); + + BEAST_EXPECT(result[jss::engine_result] == "tecDST_TAG_NEEDED"); + BEAST_EXPECT(result[jss::engine_result_code] == 143); + // engine_result_message is the static transHuman string. + BEAST_EXPECT( + result[jss::engine_result_message] == "A destination tag is required."); + // engine_result_reason carries the custom string from the transactor. + BEAST_EXPECT( + result[jss::engine_result_reason] == + "Malformed transaction: DestinationTag required."); + }; + + json::Value tx; + tx[jss::Account] = env.master.human(); + tx[jss::TransactionType] = jss::Payment; + tx[sfDestination] = alice.human(); + tx[sfAmount] = "100000000"; // 100 XRP in drops + + testTx(env, tx, testSimulation); + } } void