rippled
Loading...
Searching...
No Matches
MPTokenTests.cpp
1// Auto-generated unit tests for ledger entry MPToken
2
3
4#include <gtest/gtest.h>
5
6#include <protocol_autogen/TestHelpers.h>
7
8#include <xrpl/protocol/STLedgerEntry.h>
9#include <xrpl/protocol_autogen/ledger_entries/MPToken.h>
10#include <xrpl/protocol_autogen/ledger_entries/Ticket.h>
11
12#include <string>
13
14namespace xrpl::ledger_entries {
15
16// 1 & 4) Set fields via builder setters, build, then read them back via
17// wrapper getters. After build(), validate() should succeed for both the
18// builder's STObject and the wrapper's SLE.
19TEST(MPTokenTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const accountValue = canonical_ACCOUNT();
24 auto const mPTokenIssuanceIDValue = canonical_UINT192();
25 auto const mPTAmountValue = canonical_UINT64();
26 auto const lockedAmountValue = canonical_UINT64();
27 auto const ownerNodeValue = canonical_UINT64();
28 auto const previousTxnIDValue = canonical_UINT256();
29 auto const previousTxnLgrSeqValue = canonical_UINT32();
30
31 MPTokenBuilder builder{
32 accountValue,
33 mPTokenIssuanceIDValue,
34 ownerNodeValue,
35 previousTxnIDValue,
36 previousTxnLgrSeqValue
37 };
38
39 builder.setMPTAmount(mPTAmountValue);
40 builder.setLockedAmount(lockedAmountValue);
41
42 builder.setLedgerIndex(index);
43 builder.setFlags(0x1u);
44
45 EXPECT_TRUE(builder.validate());
46
47 auto const entry = builder.build(index);
48
49 EXPECT_TRUE(entry.validate());
50
51 {
52 auto const& expected = accountValue;
53 auto const actual = entry.getAccount();
54 expectEqualField(expected, actual, "sfAccount");
55 }
56
57 {
58 auto const& expected = mPTokenIssuanceIDValue;
59 auto const actual = entry.getMPTokenIssuanceID();
60 expectEqualField(expected, actual, "sfMPTokenIssuanceID");
61 }
62
63 {
64 auto const& expected = ownerNodeValue;
65 auto const actual = entry.getOwnerNode();
66 expectEqualField(expected, actual, "sfOwnerNode");
67 }
68
69 {
70 auto const& expected = previousTxnIDValue;
71 auto const actual = entry.getPreviousTxnID();
72 expectEqualField(expected, actual, "sfPreviousTxnID");
73 }
74
75 {
76 auto const& expected = previousTxnLgrSeqValue;
77 auto const actual = entry.getPreviousTxnLgrSeq();
78 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
79 }
80
81 {
82 auto const& expected = mPTAmountValue;
83 auto const actualOpt = entry.getMPTAmount();
84 ASSERT_TRUE(actualOpt.has_value());
85 expectEqualField(expected, *actualOpt, "sfMPTAmount");
86 EXPECT_TRUE(entry.hasMPTAmount());
87 }
88
89 {
90 auto const& expected = lockedAmountValue;
91 auto const actualOpt = entry.getLockedAmount();
92 ASSERT_TRUE(actualOpt.has_value());
93 expectEqualField(expected, *actualOpt, "sfLockedAmount");
94 EXPECT_TRUE(entry.hasLockedAmount());
95 }
96
97 EXPECT_TRUE(entry.hasLedgerIndex());
98 auto const ledgerIndex = entry.getLedgerIndex();
99 ASSERT_TRUE(ledgerIndex.has_value());
100 EXPECT_EQ(*ledgerIndex, index);
101 EXPECT_EQ(entry.getKey(), index);
102}
103
104// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
105// from that SLE, build a new wrapper, and verify all fields (and validate()).
106TEST(MPTokenTests, BuilderFromSleRoundTrip)
107{
108 uint256 const index{2u};
109
110 auto const accountValue = canonical_ACCOUNT();
111 auto const mPTokenIssuanceIDValue = canonical_UINT192();
112 auto const mPTAmountValue = canonical_UINT64();
113 auto const lockedAmountValue = canonical_UINT64();
114 auto const ownerNodeValue = canonical_UINT64();
115 auto const previousTxnIDValue = canonical_UINT256();
116 auto const previousTxnLgrSeqValue = canonical_UINT32();
117
118 auto sle = std::make_shared<SLE>(MPToken::entryType, index);
119
120 sle->at(sfAccount) = accountValue;
121 sle->at(sfMPTokenIssuanceID) = mPTokenIssuanceIDValue;
122 sle->at(sfMPTAmount) = mPTAmountValue;
123 sle->at(sfLockedAmount) = lockedAmountValue;
124 sle->at(sfOwnerNode) = ownerNodeValue;
125 sle->at(sfPreviousTxnID) = previousTxnIDValue;
126 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
127
128 MPTokenBuilder builderFromSle{sle};
129 EXPECT_TRUE(builderFromSle.validate());
130
131 auto const entryFromBuilder = builderFromSle.build(index);
132
133 MPToken entryFromSle{sle};
134 EXPECT_TRUE(entryFromBuilder.validate());
135 EXPECT_TRUE(entryFromSle.validate());
136
137 {
138 auto const& expected = accountValue;
139
140 auto const fromSle = entryFromSle.getAccount();
141 auto const fromBuilder = entryFromBuilder.getAccount();
142
143 expectEqualField(expected, fromSle, "sfAccount");
144 expectEqualField(expected, fromBuilder, "sfAccount");
145 }
146
147 {
148 auto const& expected = mPTokenIssuanceIDValue;
149
150 auto const fromSle = entryFromSle.getMPTokenIssuanceID();
151 auto const fromBuilder = entryFromBuilder.getMPTokenIssuanceID();
152
153 expectEqualField(expected, fromSle, "sfMPTokenIssuanceID");
154 expectEqualField(expected, fromBuilder, "sfMPTokenIssuanceID");
155 }
156
157 {
158 auto const& expected = ownerNodeValue;
159
160 auto const fromSle = entryFromSle.getOwnerNode();
161 auto const fromBuilder = entryFromBuilder.getOwnerNode();
162
163 expectEqualField(expected, fromSle, "sfOwnerNode");
164 expectEqualField(expected, fromBuilder, "sfOwnerNode");
165 }
166
167 {
168 auto const& expected = previousTxnIDValue;
169
170 auto const fromSle = entryFromSle.getPreviousTxnID();
171 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
172
173 expectEqualField(expected, fromSle, "sfPreviousTxnID");
174 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
175 }
176
177 {
178 auto const& expected = previousTxnLgrSeqValue;
179
180 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
181 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
182
183 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
184 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
185 }
186
187 {
188 auto const& expected = mPTAmountValue;
189
190 auto const fromSleOpt = entryFromSle.getMPTAmount();
191 auto const fromBuilderOpt = entryFromBuilder.getMPTAmount();
192
193 ASSERT_TRUE(fromSleOpt.has_value());
194 ASSERT_TRUE(fromBuilderOpt.has_value());
195
196 expectEqualField(expected, *fromSleOpt, "sfMPTAmount");
197 expectEqualField(expected, *fromBuilderOpt, "sfMPTAmount");
198 }
199
200 {
201 auto const& expected = lockedAmountValue;
202
203 auto const fromSleOpt = entryFromSle.getLockedAmount();
204 auto const fromBuilderOpt = entryFromBuilder.getLockedAmount();
205
206 ASSERT_TRUE(fromSleOpt.has_value());
207 ASSERT_TRUE(fromBuilderOpt.has_value());
208
209 expectEqualField(expected, *fromSleOpt, "sfLockedAmount");
210 expectEqualField(expected, *fromBuilderOpt, "sfLockedAmount");
211 }
212
213 EXPECT_EQ(entryFromSle.getKey(), index);
214 EXPECT_EQ(entryFromBuilder.getKey(), index);
215}
216
217// 3) Verify wrapper throws when constructed from wrong ledger entry type.
218TEST(MPTokenTests, WrapperThrowsOnWrongEntryType)
219{
220 uint256 const index{3u};
221
222 // Build a valid ledger entry of a different type
223 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
224 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
225 TicketBuilder wrongBuilder{
231 auto wrongEntry = wrongBuilder.build(index);
232
233 EXPECT_THROW(MPToken{wrongEntry.getSle()}, std::runtime_error);
234}
235
236// 4) Verify builder throws when constructed from wrong ledger entry type.
237TEST(MPTokenTests, BuilderThrowsOnWrongEntryType)
238{
239 uint256 const index{4u};
240
241 // Build a valid ledger entry of a different type
242 TicketBuilder wrongBuilder{
248 auto wrongEntry = wrongBuilder.build(index);
249
250 EXPECT_THROW(MPTokenBuilder{wrongEntry.getSle()}, std::runtime_error);
251}
252
253// 5) Build with only required fields and verify optional fields return nullopt.
254TEST(MPTokenTests, OptionalFieldsReturnNullopt)
255{
256 uint256 const index{3u};
257
258 auto const accountValue = canonical_ACCOUNT();
259 auto const mPTokenIssuanceIDValue = canonical_UINT192();
260 auto const ownerNodeValue = canonical_UINT64();
261 auto const previousTxnIDValue = canonical_UINT256();
262 auto const previousTxnLgrSeqValue = canonical_UINT32();
263
264 MPTokenBuilder builder{
265 accountValue,
266 mPTokenIssuanceIDValue,
267 ownerNodeValue,
268 previousTxnIDValue,
269 previousTxnLgrSeqValue
270 };
271
272 auto const entry = builder.build(index);
273
274 // Verify optional fields are not present
275 EXPECT_FALSE(entry.hasMPTAmount());
276 EXPECT_FALSE(entry.getMPTAmount().has_value());
277 EXPECT_FALSE(entry.hasLockedAmount());
278 EXPECT_FALSE(entry.getLockedAmount().has_value());
279}
280}
std::shared_ptr< SLE const > getSle() const
Get the underlying SLE object.
Derived & setLedgerIndex(uint256 const &value)
Set the ledger index.
Derived & setFlags(uint32_t value)
Set the flags.
Builder for MPToken ledger entries.
Definition MPToken.h:160
MPTokenBuilder & setLockedAmount(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfLockedAmount (soeOPTIONAL)
Definition MPToken.h:234
MPTokenBuilder & setMPTAmount(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfMPTAmount (soeDEFAULT)
Definition MPToken.h:223
Ledger Entry: MPToken.
Definition MPToken.h:28
static constexpr LedgerEntryType entryType
Definition MPToken.h:30
Builder for Ticket ledger entries.
Definition Ticket.h:112
T is_same_v
TEST(AccountRootTests, BuilderSettersRoundTrip)
void expectEqualField(T const &expected, T const &actual, char const *fieldName)