rippled
Loading...
Searching...
No Matches
MPTokenIssuanceTests.cpp
1// Auto-generated unit tests for ledger entry MPTokenIssuance
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/MPTokenIssuance.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(MPTokenIssuanceTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const issuerValue = canonical_ACCOUNT();
24 auto const sequenceValue = canonical_UINT32();
25 auto const transferFeeValue = canonical_UINT16();
26 auto const ownerNodeValue = canonical_UINT64();
27 auto const assetScaleValue = canonical_UINT8();
28 auto const maximumAmountValue = canonical_UINT64();
29 auto const outstandingAmountValue = canonical_UINT64();
30 auto const lockedAmountValue = canonical_UINT64();
31 auto const mPTokenMetadataValue = canonical_VL();
32 auto const previousTxnIDValue = canonical_UINT256();
33 auto const previousTxnLgrSeqValue = canonical_UINT32();
34 auto const domainIDValue = canonical_UINT256();
35 auto const mutableFlagsValue = canonical_UINT32();
36
38 issuerValue,
39 sequenceValue,
40 ownerNodeValue,
41 outstandingAmountValue,
42 previousTxnIDValue,
43 previousTxnLgrSeqValue
44 };
45
46 builder.setTransferFee(transferFeeValue);
47 builder.setAssetScale(assetScaleValue);
48 builder.setMaximumAmount(maximumAmountValue);
49 builder.setLockedAmount(lockedAmountValue);
50 builder.setMPTokenMetadata(mPTokenMetadataValue);
51 builder.setDomainID(domainIDValue);
52 builder.setMutableFlags(mutableFlagsValue);
53
54 builder.setLedgerIndex(index);
55 builder.setFlags(0x1u);
56
57 EXPECT_TRUE(builder.validate());
58
59 auto const entry = builder.build(index);
60
61 EXPECT_TRUE(entry.validate());
62
63 {
64 auto const& expected = issuerValue;
65 auto const actual = entry.getIssuer();
66 expectEqualField(expected, actual, "sfIssuer");
67 }
68
69 {
70 auto const& expected = sequenceValue;
71 auto const actual = entry.getSequence();
72 expectEqualField(expected, actual, "sfSequence");
73 }
74
75 {
76 auto const& expected = ownerNodeValue;
77 auto const actual = entry.getOwnerNode();
78 expectEqualField(expected, actual, "sfOwnerNode");
79 }
80
81 {
82 auto const& expected = outstandingAmountValue;
83 auto const actual = entry.getOutstandingAmount();
84 expectEqualField(expected, actual, "sfOutstandingAmount");
85 }
86
87 {
88 auto const& expected = previousTxnIDValue;
89 auto const actual = entry.getPreviousTxnID();
90 expectEqualField(expected, actual, "sfPreviousTxnID");
91 }
92
93 {
94 auto const& expected = previousTxnLgrSeqValue;
95 auto const actual = entry.getPreviousTxnLgrSeq();
96 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
97 }
98
99 {
100 auto const& expected = transferFeeValue;
101 auto const actualOpt = entry.getTransferFee();
102 ASSERT_TRUE(actualOpt.has_value());
103 expectEqualField(expected, *actualOpt, "sfTransferFee");
104 EXPECT_TRUE(entry.hasTransferFee());
105 }
106
107 {
108 auto const& expected = assetScaleValue;
109 auto const actualOpt = entry.getAssetScale();
110 ASSERT_TRUE(actualOpt.has_value());
111 expectEqualField(expected, *actualOpt, "sfAssetScale");
112 EXPECT_TRUE(entry.hasAssetScale());
113 }
114
115 {
116 auto const& expected = maximumAmountValue;
117 auto const actualOpt = entry.getMaximumAmount();
118 ASSERT_TRUE(actualOpt.has_value());
119 expectEqualField(expected, *actualOpt, "sfMaximumAmount");
120 EXPECT_TRUE(entry.hasMaximumAmount());
121 }
122
123 {
124 auto const& expected = lockedAmountValue;
125 auto const actualOpt = entry.getLockedAmount();
126 ASSERT_TRUE(actualOpt.has_value());
127 expectEqualField(expected, *actualOpt, "sfLockedAmount");
128 EXPECT_TRUE(entry.hasLockedAmount());
129 }
130
131 {
132 auto const& expected = mPTokenMetadataValue;
133 auto const actualOpt = entry.getMPTokenMetadata();
134 ASSERT_TRUE(actualOpt.has_value());
135 expectEqualField(expected, *actualOpt, "sfMPTokenMetadata");
136 EXPECT_TRUE(entry.hasMPTokenMetadata());
137 }
138
139 {
140 auto const& expected = domainIDValue;
141 auto const actualOpt = entry.getDomainID();
142 ASSERT_TRUE(actualOpt.has_value());
143 expectEqualField(expected, *actualOpt, "sfDomainID");
144 EXPECT_TRUE(entry.hasDomainID());
145 }
146
147 {
148 auto const& expected = mutableFlagsValue;
149 auto const actualOpt = entry.getMutableFlags();
150 ASSERT_TRUE(actualOpt.has_value());
151 expectEqualField(expected, *actualOpt, "sfMutableFlags");
152 EXPECT_TRUE(entry.hasMutableFlags());
153 }
154
155 EXPECT_TRUE(entry.hasLedgerIndex());
156 auto const ledgerIndex = entry.getLedgerIndex();
157 ASSERT_TRUE(ledgerIndex.has_value());
158 EXPECT_EQ(*ledgerIndex, index);
159 EXPECT_EQ(entry.getKey(), index);
160}
161
162// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
163// from that SLE, build a new wrapper, and verify all fields (and validate()).
164TEST(MPTokenIssuanceTests, BuilderFromSleRoundTrip)
165{
166 uint256 const index{2u};
167
168 auto const issuerValue = canonical_ACCOUNT();
169 auto const sequenceValue = canonical_UINT32();
170 auto const transferFeeValue = canonical_UINT16();
171 auto const ownerNodeValue = canonical_UINT64();
172 auto const assetScaleValue = canonical_UINT8();
173 auto const maximumAmountValue = canonical_UINT64();
174 auto const outstandingAmountValue = canonical_UINT64();
175 auto const lockedAmountValue = canonical_UINT64();
176 auto const mPTokenMetadataValue = canonical_VL();
177 auto const previousTxnIDValue = canonical_UINT256();
178 auto const previousTxnLgrSeqValue = canonical_UINT32();
179 auto const domainIDValue = canonical_UINT256();
180 auto const mutableFlagsValue = canonical_UINT32();
181
183
184 sle->at(sfIssuer) = issuerValue;
185 sle->at(sfSequence) = sequenceValue;
186 sle->at(sfTransferFee) = transferFeeValue;
187 sle->at(sfOwnerNode) = ownerNodeValue;
188 sle->at(sfAssetScale) = assetScaleValue;
189 sle->at(sfMaximumAmount) = maximumAmountValue;
190 sle->at(sfOutstandingAmount) = outstandingAmountValue;
191 sle->at(sfLockedAmount) = lockedAmountValue;
192 sle->at(sfMPTokenMetadata) = mPTokenMetadataValue;
193 sle->at(sfPreviousTxnID) = previousTxnIDValue;
194 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
195 sle->at(sfDomainID) = domainIDValue;
196 sle->at(sfMutableFlags) = mutableFlagsValue;
197
198 MPTokenIssuanceBuilder builderFromSle{sle};
199 EXPECT_TRUE(builderFromSle.validate());
200
201 auto const entryFromBuilder = builderFromSle.build(index);
202
203 MPTokenIssuance entryFromSle{sle};
204 EXPECT_TRUE(entryFromBuilder.validate());
205 EXPECT_TRUE(entryFromSle.validate());
206
207 {
208 auto const& expected = issuerValue;
209
210 auto const fromSle = entryFromSle.getIssuer();
211 auto const fromBuilder = entryFromBuilder.getIssuer();
212
213 expectEqualField(expected, fromSle, "sfIssuer");
214 expectEqualField(expected, fromBuilder, "sfIssuer");
215 }
216
217 {
218 auto const& expected = sequenceValue;
219
220 auto const fromSle = entryFromSle.getSequence();
221 auto const fromBuilder = entryFromBuilder.getSequence();
222
223 expectEqualField(expected, fromSle, "sfSequence");
224 expectEqualField(expected, fromBuilder, "sfSequence");
225 }
226
227 {
228 auto const& expected = ownerNodeValue;
229
230 auto const fromSle = entryFromSle.getOwnerNode();
231 auto const fromBuilder = entryFromBuilder.getOwnerNode();
232
233 expectEqualField(expected, fromSle, "sfOwnerNode");
234 expectEqualField(expected, fromBuilder, "sfOwnerNode");
235 }
236
237 {
238 auto const& expected = outstandingAmountValue;
239
240 auto const fromSle = entryFromSle.getOutstandingAmount();
241 auto const fromBuilder = entryFromBuilder.getOutstandingAmount();
242
243 expectEqualField(expected, fromSle, "sfOutstandingAmount");
244 expectEqualField(expected, fromBuilder, "sfOutstandingAmount");
245 }
246
247 {
248 auto const& expected = previousTxnIDValue;
249
250 auto const fromSle = entryFromSle.getPreviousTxnID();
251 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
252
253 expectEqualField(expected, fromSle, "sfPreviousTxnID");
254 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
255 }
256
257 {
258 auto const& expected = previousTxnLgrSeqValue;
259
260 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
261 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
262
263 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
264 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
265 }
266
267 {
268 auto const& expected = transferFeeValue;
269
270 auto const fromSleOpt = entryFromSle.getTransferFee();
271 auto const fromBuilderOpt = entryFromBuilder.getTransferFee();
272
273 ASSERT_TRUE(fromSleOpt.has_value());
274 ASSERT_TRUE(fromBuilderOpt.has_value());
275
276 expectEqualField(expected, *fromSleOpt, "sfTransferFee");
277 expectEqualField(expected, *fromBuilderOpt, "sfTransferFee");
278 }
279
280 {
281 auto const& expected = assetScaleValue;
282
283 auto const fromSleOpt = entryFromSle.getAssetScale();
284 auto const fromBuilderOpt = entryFromBuilder.getAssetScale();
285
286 ASSERT_TRUE(fromSleOpt.has_value());
287 ASSERT_TRUE(fromBuilderOpt.has_value());
288
289 expectEqualField(expected, *fromSleOpt, "sfAssetScale");
290 expectEqualField(expected, *fromBuilderOpt, "sfAssetScale");
291 }
292
293 {
294 auto const& expected = maximumAmountValue;
295
296 auto const fromSleOpt = entryFromSle.getMaximumAmount();
297 auto const fromBuilderOpt = entryFromBuilder.getMaximumAmount();
298
299 ASSERT_TRUE(fromSleOpt.has_value());
300 ASSERT_TRUE(fromBuilderOpt.has_value());
301
302 expectEqualField(expected, *fromSleOpt, "sfMaximumAmount");
303 expectEqualField(expected, *fromBuilderOpt, "sfMaximumAmount");
304 }
305
306 {
307 auto const& expected = lockedAmountValue;
308
309 auto const fromSleOpt = entryFromSle.getLockedAmount();
310 auto const fromBuilderOpt = entryFromBuilder.getLockedAmount();
311
312 ASSERT_TRUE(fromSleOpt.has_value());
313 ASSERT_TRUE(fromBuilderOpt.has_value());
314
315 expectEqualField(expected, *fromSleOpt, "sfLockedAmount");
316 expectEqualField(expected, *fromBuilderOpt, "sfLockedAmount");
317 }
318
319 {
320 auto const& expected = mPTokenMetadataValue;
321
322 auto const fromSleOpt = entryFromSle.getMPTokenMetadata();
323 auto const fromBuilderOpt = entryFromBuilder.getMPTokenMetadata();
324
325 ASSERT_TRUE(fromSleOpt.has_value());
326 ASSERT_TRUE(fromBuilderOpt.has_value());
327
328 expectEqualField(expected, *fromSleOpt, "sfMPTokenMetadata");
329 expectEqualField(expected, *fromBuilderOpt, "sfMPTokenMetadata");
330 }
331
332 {
333 auto const& expected = domainIDValue;
334
335 auto const fromSleOpt = entryFromSle.getDomainID();
336 auto const fromBuilderOpt = entryFromBuilder.getDomainID();
337
338 ASSERT_TRUE(fromSleOpt.has_value());
339 ASSERT_TRUE(fromBuilderOpt.has_value());
340
341 expectEqualField(expected, *fromSleOpt, "sfDomainID");
342 expectEqualField(expected, *fromBuilderOpt, "sfDomainID");
343 }
344
345 {
346 auto const& expected = mutableFlagsValue;
347
348 auto const fromSleOpt = entryFromSle.getMutableFlags();
349 auto const fromBuilderOpt = entryFromBuilder.getMutableFlags();
350
351 ASSERT_TRUE(fromSleOpt.has_value());
352 ASSERT_TRUE(fromBuilderOpt.has_value());
353
354 expectEqualField(expected, *fromSleOpt, "sfMutableFlags");
355 expectEqualField(expected, *fromBuilderOpt, "sfMutableFlags");
356 }
357
358 EXPECT_EQ(entryFromSle.getKey(), index);
359 EXPECT_EQ(entryFromBuilder.getKey(), index);
360}
361
362// 3) Verify wrapper throws when constructed from wrong ledger entry type.
363TEST(MPTokenIssuanceTests, WrapperThrowsOnWrongEntryType)
364{
365 uint256 const index{3u};
366
367 // Build a valid ledger entry of a different type
368 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
369 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
370 TicketBuilder wrongBuilder{
376 auto wrongEntry = wrongBuilder.build(index);
377
378 EXPECT_THROW(MPTokenIssuance{wrongEntry.getSle()}, std::runtime_error);
379}
380
381// 4) Verify builder throws when constructed from wrong ledger entry type.
382TEST(MPTokenIssuanceTests, BuilderThrowsOnWrongEntryType)
383{
384 uint256 const index{4u};
385
386 // Build a valid ledger entry of a different type
387 TicketBuilder wrongBuilder{
393 auto wrongEntry = wrongBuilder.build(index);
394
395 EXPECT_THROW(MPTokenIssuanceBuilder{wrongEntry.getSle()}, std::runtime_error);
396}
397
398// 5) Build with only required fields and verify optional fields return nullopt.
399TEST(MPTokenIssuanceTests, OptionalFieldsReturnNullopt)
400{
401 uint256 const index{3u};
402
403 auto const issuerValue = canonical_ACCOUNT();
404 auto const sequenceValue = canonical_UINT32();
405 auto const ownerNodeValue = canonical_UINT64();
406 auto const outstandingAmountValue = canonical_UINT64();
407 auto const previousTxnIDValue = canonical_UINT256();
408 auto const previousTxnLgrSeqValue = canonical_UINT32();
409
411 issuerValue,
412 sequenceValue,
413 ownerNodeValue,
414 outstandingAmountValue,
415 previousTxnIDValue,
416 previousTxnLgrSeqValue
417 };
418
419 auto const entry = builder.build(index);
420
421 // Verify optional fields are not present
422 EXPECT_FALSE(entry.hasTransferFee());
423 EXPECT_FALSE(entry.getTransferFee().has_value());
424 EXPECT_FALSE(entry.hasAssetScale());
425 EXPECT_FALSE(entry.getAssetScale().has_value());
426 EXPECT_FALSE(entry.hasMaximumAmount());
427 EXPECT_FALSE(entry.getMaximumAmount().has_value());
428 EXPECT_FALSE(entry.hasLockedAmount());
429 EXPECT_FALSE(entry.getLockedAmount().has_value());
430 EXPECT_FALSE(entry.hasMPTokenMetadata());
431 EXPECT_FALSE(entry.getMPTokenMetadata().has_value());
432 EXPECT_FALSE(entry.hasDomainID());
433 EXPECT_FALSE(entry.getDomainID().has_value());
434 EXPECT_FALSE(entry.hasMutableFlags());
435 EXPECT_FALSE(entry.getMutableFlags().has_value());
436}
437}
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 MPTokenIssuance ledger entries.
MPTokenIssuanceBuilder & setLockedAmount(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfLockedAmount (soeOPTIONAL)
MPTokenIssuanceBuilder & setMaximumAmount(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfMaximumAmount (soeOPTIONAL)
MPTokenIssuanceBuilder & setDomainID(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfDomainID (soeOPTIONAL)
MPTokenIssuanceBuilder & setTransferFee(std::decay_t< typename SF_UINT16::type::value_type > const &value)
Set sfTransferFee (soeDEFAULT)
MPTokenIssuanceBuilder & setMPTokenMetadata(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfMPTokenMetadata (soeOPTIONAL)
MPTokenIssuanceBuilder & setAssetScale(std::decay_t< typename SF_UINT8::type::value_type > const &value)
Set sfAssetScale (soeDEFAULT)
MPTokenIssuanceBuilder & setMutableFlags(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfMutableFlags (soeDEFAULT)
Ledger Entry: MPTokenIssuance.
static constexpr LedgerEntryType entryType
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)