rippled
Loading...
Searching...
No Matches
DirectoryNodeTests.cpp
1// Auto-generated unit tests for ledger entry DirectoryNode
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/DirectoryNode.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(DirectoryNodeTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const ownerValue = canonical_ACCOUNT();
24 auto const takerPaysCurrencyValue = canonical_UINT160();
25 auto const takerPaysIssuerValue = canonical_UINT160();
26 auto const takerGetsCurrencyValue = canonical_UINT160();
27 auto const takerGetsIssuerValue = canonical_UINT160();
28 auto const exchangeRateValue = canonical_UINT64();
29 auto const indexesValue = canonical_VECTOR256();
30 auto const rootIndexValue = canonical_UINT256();
31 auto const indexNextValue = canonical_UINT64();
32 auto const indexPreviousValue = canonical_UINT64();
33 auto const nFTokenIDValue = canonical_UINT256();
34 auto const previousTxnIDValue = canonical_UINT256();
35 auto const previousTxnLgrSeqValue = canonical_UINT32();
36 auto const domainIDValue = canonical_UINT256();
37
39 indexesValue,
40 rootIndexValue
41 };
42
43 builder.setOwner(ownerValue);
44 builder.setTakerPaysCurrency(takerPaysCurrencyValue);
45 builder.setTakerPaysIssuer(takerPaysIssuerValue);
46 builder.setTakerGetsCurrency(takerGetsCurrencyValue);
47 builder.setTakerGetsIssuer(takerGetsIssuerValue);
48 builder.setExchangeRate(exchangeRateValue);
49 builder.setIndexNext(indexNextValue);
50 builder.setIndexPrevious(indexPreviousValue);
51 builder.setNFTokenID(nFTokenIDValue);
52 builder.setPreviousTxnID(previousTxnIDValue);
53 builder.setPreviousTxnLgrSeq(previousTxnLgrSeqValue);
54 builder.setDomainID(domainIDValue);
55
56 builder.setLedgerIndex(index);
57 builder.setFlags(0x1u);
58
59 EXPECT_TRUE(builder.validate());
60
61 auto const entry = builder.build(index);
62
63 EXPECT_TRUE(entry.validate());
64
65 {
66 auto const& expected = indexesValue;
67 auto const actual = entry.getIndexes();
68 expectEqualField(expected, actual, "sfIndexes");
69 }
70
71 {
72 auto const& expected = rootIndexValue;
73 auto const actual = entry.getRootIndex();
74 expectEqualField(expected, actual, "sfRootIndex");
75 }
76
77 {
78 auto const& expected = ownerValue;
79 auto const actualOpt = entry.getOwner();
80 ASSERT_TRUE(actualOpt.has_value());
81 expectEqualField(expected, *actualOpt, "sfOwner");
82 EXPECT_TRUE(entry.hasOwner());
83 }
84
85 {
86 auto const& expected = takerPaysCurrencyValue;
87 auto const actualOpt = entry.getTakerPaysCurrency();
88 ASSERT_TRUE(actualOpt.has_value());
89 expectEqualField(expected, *actualOpt, "sfTakerPaysCurrency");
90 EXPECT_TRUE(entry.hasTakerPaysCurrency());
91 }
92
93 {
94 auto const& expected = takerPaysIssuerValue;
95 auto const actualOpt = entry.getTakerPaysIssuer();
96 ASSERT_TRUE(actualOpt.has_value());
97 expectEqualField(expected, *actualOpt, "sfTakerPaysIssuer");
98 EXPECT_TRUE(entry.hasTakerPaysIssuer());
99 }
100
101 {
102 auto const& expected = takerGetsCurrencyValue;
103 auto const actualOpt = entry.getTakerGetsCurrency();
104 ASSERT_TRUE(actualOpt.has_value());
105 expectEqualField(expected, *actualOpt, "sfTakerGetsCurrency");
106 EXPECT_TRUE(entry.hasTakerGetsCurrency());
107 }
108
109 {
110 auto const& expected = takerGetsIssuerValue;
111 auto const actualOpt = entry.getTakerGetsIssuer();
112 ASSERT_TRUE(actualOpt.has_value());
113 expectEqualField(expected, *actualOpt, "sfTakerGetsIssuer");
114 EXPECT_TRUE(entry.hasTakerGetsIssuer());
115 }
116
117 {
118 auto const& expected = exchangeRateValue;
119 auto const actualOpt = entry.getExchangeRate();
120 ASSERT_TRUE(actualOpt.has_value());
121 expectEqualField(expected, *actualOpt, "sfExchangeRate");
122 EXPECT_TRUE(entry.hasExchangeRate());
123 }
124
125 {
126 auto const& expected = indexNextValue;
127 auto const actualOpt = entry.getIndexNext();
128 ASSERT_TRUE(actualOpt.has_value());
129 expectEqualField(expected, *actualOpt, "sfIndexNext");
130 EXPECT_TRUE(entry.hasIndexNext());
131 }
132
133 {
134 auto const& expected = indexPreviousValue;
135 auto const actualOpt = entry.getIndexPrevious();
136 ASSERT_TRUE(actualOpt.has_value());
137 expectEqualField(expected, *actualOpt, "sfIndexPrevious");
138 EXPECT_TRUE(entry.hasIndexPrevious());
139 }
140
141 {
142 auto const& expected = nFTokenIDValue;
143 auto const actualOpt = entry.getNFTokenID();
144 ASSERT_TRUE(actualOpt.has_value());
145 expectEqualField(expected, *actualOpt, "sfNFTokenID");
146 EXPECT_TRUE(entry.hasNFTokenID());
147 }
148
149 {
150 auto const& expected = previousTxnIDValue;
151 auto const actualOpt = entry.getPreviousTxnID();
152 ASSERT_TRUE(actualOpt.has_value());
153 expectEqualField(expected, *actualOpt, "sfPreviousTxnID");
154 EXPECT_TRUE(entry.hasPreviousTxnID());
155 }
156
157 {
158 auto const& expected = previousTxnLgrSeqValue;
159 auto const actualOpt = entry.getPreviousTxnLgrSeq();
160 ASSERT_TRUE(actualOpt.has_value());
161 expectEqualField(expected, *actualOpt, "sfPreviousTxnLgrSeq");
162 EXPECT_TRUE(entry.hasPreviousTxnLgrSeq());
163 }
164
165 {
166 auto const& expected = domainIDValue;
167 auto const actualOpt = entry.getDomainID();
168 ASSERT_TRUE(actualOpt.has_value());
169 expectEqualField(expected, *actualOpt, "sfDomainID");
170 EXPECT_TRUE(entry.hasDomainID());
171 }
172
173 EXPECT_TRUE(entry.hasLedgerIndex());
174 auto const ledgerIndex = entry.getLedgerIndex();
175 ASSERT_TRUE(ledgerIndex.has_value());
176 EXPECT_EQ(*ledgerIndex, index);
177 EXPECT_EQ(entry.getKey(), index);
178}
179
180// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
181// from that SLE, build a new wrapper, and verify all fields (and validate()).
182TEST(DirectoryNodeTests, BuilderFromSleRoundTrip)
183{
184 uint256 const index{2u};
185
186 auto const ownerValue = canonical_ACCOUNT();
187 auto const takerPaysCurrencyValue = canonical_UINT160();
188 auto const takerPaysIssuerValue = canonical_UINT160();
189 auto const takerGetsCurrencyValue = canonical_UINT160();
190 auto const takerGetsIssuerValue = canonical_UINT160();
191 auto const exchangeRateValue = canonical_UINT64();
192 auto const indexesValue = canonical_VECTOR256();
193 auto const rootIndexValue = canonical_UINT256();
194 auto const indexNextValue = canonical_UINT64();
195 auto const indexPreviousValue = canonical_UINT64();
196 auto const nFTokenIDValue = canonical_UINT256();
197 auto const previousTxnIDValue = canonical_UINT256();
198 auto const previousTxnLgrSeqValue = canonical_UINT32();
199 auto const domainIDValue = canonical_UINT256();
200
202
203 sle->at(sfOwner) = ownerValue;
204 sle->at(sfTakerPaysCurrency) = takerPaysCurrencyValue;
205 sle->at(sfTakerPaysIssuer) = takerPaysIssuerValue;
206 sle->at(sfTakerGetsCurrency) = takerGetsCurrencyValue;
207 sle->at(sfTakerGetsIssuer) = takerGetsIssuerValue;
208 sle->at(sfExchangeRate) = exchangeRateValue;
209 sle->at(sfIndexes) = indexesValue;
210 sle->at(sfRootIndex) = rootIndexValue;
211 sle->at(sfIndexNext) = indexNextValue;
212 sle->at(sfIndexPrevious) = indexPreviousValue;
213 sle->at(sfNFTokenID) = nFTokenIDValue;
214 sle->at(sfPreviousTxnID) = previousTxnIDValue;
215 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
216 sle->at(sfDomainID) = domainIDValue;
217
218 DirectoryNodeBuilder builderFromSle{sle};
219 EXPECT_TRUE(builderFromSle.validate());
220
221 auto const entryFromBuilder = builderFromSle.build(index);
222
223 DirectoryNode entryFromSle{sle};
224 EXPECT_TRUE(entryFromBuilder.validate());
225 EXPECT_TRUE(entryFromSle.validate());
226
227 {
228 auto const& expected = indexesValue;
229
230 auto const fromSle = entryFromSle.getIndexes();
231 auto const fromBuilder = entryFromBuilder.getIndexes();
232
233 expectEqualField(expected, fromSle, "sfIndexes");
234 expectEqualField(expected, fromBuilder, "sfIndexes");
235 }
236
237 {
238 auto const& expected = rootIndexValue;
239
240 auto const fromSle = entryFromSle.getRootIndex();
241 auto const fromBuilder = entryFromBuilder.getRootIndex();
242
243 expectEqualField(expected, fromSle, "sfRootIndex");
244 expectEqualField(expected, fromBuilder, "sfRootIndex");
245 }
246
247 {
248 auto const& expected = ownerValue;
249
250 auto const fromSleOpt = entryFromSle.getOwner();
251 auto const fromBuilderOpt = entryFromBuilder.getOwner();
252
253 ASSERT_TRUE(fromSleOpt.has_value());
254 ASSERT_TRUE(fromBuilderOpt.has_value());
255
256 expectEqualField(expected, *fromSleOpt, "sfOwner");
257 expectEqualField(expected, *fromBuilderOpt, "sfOwner");
258 }
259
260 {
261 auto const& expected = takerPaysCurrencyValue;
262
263 auto const fromSleOpt = entryFromSle.getTakerPaysCurrency();
264 auto const fromBuilderOpt = entryFromBuilder.getTakerPaysCurrency();
265
266 ASSERT_TRUE(fromSleOpt.has_value());
267 ASSERT_TRUE(fromBuilderOpt.has_value());
268
269 expectEqualField(expected, *fromSleOpt, "sfTakerPaysCurrency");
270 expectEqualField(expected, *fromBuilderOpt, "sfTakerPaysCurrency");
271 }
272
273 {
274 auto const& expected = takerPaysIssuerValue;
275
276 auto const fromSleOpt = entryFromSle.getTakerPaysIssuer();
277 auto const fromBuilderOpt = entryFromBuilder.getTakerPaysIssuer();
278
279 ASSERT_TRUE(fromSleOpt.has_value());
280 ASSERT_TRUE(fromBuilderOpt.has_value());
281
282 expectEqualField(expected, *fromSleOpt, "sfTakerPaysIssuer");
283 expectEqualField(expected, *fromBuilderOpt, "sfTakerPaysIssuer");
284 }
285
286 {
287 auto const& expected = takerGetsCurrencyValue;
288
289 auto const fromSleOpt = entryFromSle.getTakerGetsCurrency();
290 auto const fromBuilderOpt = entryFromBuilder.getTakerGetsCurrency();
291
292 ASSERT_TRUE(fromSleOpt.has_value());
293 ASSERT_TRUE(fromBuilderOpt.has_value());
294
295 expectEqualField(expected, *fromSleOpt, "sfTakerGetsCurrency");
296 expectEqualField(expected, *fromBuilderOpt, "sfTakerGetsCurrency");
297 }
298
299 {
300 auto const& expected = takerGetsIssuerValue;
301
302 auto const fromSleOpt = entryFromSle.getTakerGetsIssuer();
303 auto const fromBuilderOpt = entryFromBuilder.getTakerGetsIssuer();
304
305 ASSERT_TRUE(fromSleOpt.has_value());
306 ASSERT_TRUE(fromBuilderOpt.has_value());
307
308 expectEqualField(expected, *fromSleOpt, "sfTakerGetsIssuer");
309 expectEqualField(expected, *fromBuilderOpt, "sfTakerGetsIssuer");
310 }
311
312 {
313 auto const& expected = exchangeRateValue;
314
315 auto const fromSleOpt = entryFromSle.getExchangeRate();
316 auto const fromBuilderOpt = entryFromBuilder.getExchangeRate();
317
318 ASSERT_TRUE(fromSleOpt.has_value());
319 ASSERT_TRUE(fromBuilderOpt.has_value());
320
321 expectEqualField(expected, *fromSleOpt, "sfExchangeRate");
322 expectEqualField(expected, *fromBuilderOpt, "sfExchangeRate");
323 }
324
325 {
326 auto const& expected = indexNextValue;
327
328 auto const fromSleOpt = entryFromSle.getIndexNext();
329 auto const fromBuilderOpt = entryFromBuilder.getIndexNext();
330
331 ASSERT_TRUE(fromSleOpt.has_value());
332 ASSERT_TRUE(fromBuilderOpt.has_value());
333
334 expectEqualField(expected, *fromSleOpt, "sfIndexNext");
335 expectEqualField(expected, *fromBuilderOpt, "sfIndexNext");
336 }
337
338 {
339 auto const& expected = indexPreviousValue;
340
341 auto const fromSleOpt = entryFromSle.getIndexPrevious();
342 auto const fromBuilderOpt = entryFromBuilder.getIndexPrevious();
343
344 ASSERT_TRUE(fromSleOpt.has_value());
345 ASSERT_TRUE(fromBuilderOpt.has_value());
346
347 expectEqualField(expected, *fromSleOpt, "sfIndexPrevious");
348 expectEqualField(expected, *fromBuilderOpt, "sfIndexPrevious");
349 }
350
351 {
352 auto const& expected = nFTokenIDValue;
353
354 auto const fromSleOpt = entryFromSle.getNFTokenID();
355 auto const fromBuilderOpt = entryFromBuilder.getNFTokenID();
356
357 ASSERT_TRUE(fromSleOpt.has_value());
358 ASSERT_TRUE(fromBuilderOpt.has_value());
359
360 expectEqualField(expected, *fromSleOpt, "sfNFTokenID");
361 expectEqualField(expected, *fromBuilderOpt, "sfNFTokenID");
362 }
363
364 {
365 auto const& expected = previousTxnIDValue;
366
367 auto const fromSleOpt = entryFromSle.getPreviousTxnID();
368 auto const fromBuilderOpt = entryFromBuilder.getPreviousTxnID();
369
370 ASSERT_TRUE(fromSleOpt.has_value());
371 ASSERT_TRUE(fromBuilderOpt.has_value());
372
373 expectEqualField(expected, *fromSleOpt, "sfPreviousTxnID");
374 expectEqualField(expected, *fromBuilderOpt, "sfPreviousTxnID");
375 }
376
377 {
378 auto const& expected = previousTxnLgrSeqValue;
379
380 auto const fromSleOpt = entryFromSle.getPreviousTxnLgrSeq();
381 auto const fromBuilderOpt = entryFromBuilder.getPreviousTxnLgrSeq();
382
383 ASSERT_TRUE(fromSleOpt.has_value());
384 ASSERT_TRUE(fromBuilderOpt.has_value());
385
386 expectEqualField(expected, *fromSleOpt, "sfPreviousTxnLgrSeq");
387 expectEqualField(expected, *fromBuilderOpt, "sfPreviousTxnLgrSeq");
388 }
389
390 {
391 auto const& expected = domainIDValue;
392
393 auto const fromSleOpt = entryFromSle.getDomainID();
394 auto const fromBuilderOpt = entryFromBuilder.getDomainID();
395
396 ASSERT_TRUE(fromSleOpt.has_value());
397 ASSERT_TRUE(fromBuilderOpt.has_value());
398
399 expectEqualField(expected, *fromSleOpt, "sfDomainID");
400 expectEqualField(expected, *fromBuilderOpt, "sfDomainID");
401 }
402
403 EXPECT_EQ(entryFromSle.getKey(), index);
404 EXPECT_EQ(entryFromBuilder.getKey(), index);
405}
406
407// 3) Verify wrapper throws when constructed from wrong ledger entry type.
408TEST(DirectoryNodeTests, WrapperThrowsOnWrongEntryType)
409{
410 uint256 const index{3u};
411
412 // Build a valid ledger entry of a different type
413 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
414 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
415 TicketBuilder wrongBuilder{
421 auto wrongEntry = wrongBuilder.build(index);
422
423 EXPECT_THROW(DirectoryNode{wrongEntry.getSle()}, std::runtime_error);
424}
425
426// 4) Verify builder throws when constructed from wrong ledger entry type.
427TEST(DirectoryNodeTests, BuilderThrowsOnWrongEntryType)
428{
429 uint256 const index{4u};
430
431 // Build a valid ledger entry of a different type
432 TicketBuilder wrongBuilder{
438 auto wrongEntry = wrongBuilder.build(index);
439
440 EXPECT_THROW(DirectoryNodeBuilder{wrongEntry.getSle()}, std::runtime_error);
441}
442
443// 5) Build with only required fields and verify optional fields return nullopt.
444TEST(DirectoryNodeTests, OptionalFieldsReturnNullopt)
445{
446 uint256 const index{3u};
447
448 auto const indexesValue = canonical_VECTOR256();
449 auto const rootIndexValue = canonical_UINT256();
450
451 DirectoryNodeBuilder builder{
452 indexesValue,
453 rootIndexValue
454 };
455
456 auto const entry = builder.build(index);
457
458 // Verify optional fields are not present
459 EXPECT_FALSE(entry.hasOwner());
460 EXPECT_FALSE(entry.getOwner().has_value());
461 EXPECT_FALSE(entry.hasTakerPaysCurrency());
462 EXPECT_FALSE(entry.getTakerPaysCurrency().has_value());
463 EXPECT_FALSE(entry.hasTakerPaysIssuer());
464 EXPECT_FALSE(entry.getTakerPaysIssuer().has_value());
465 EXPECT_FALSE(entry.hasTakerGetsCurrency());
466 EXPECT_FALSE(entry.getTakerGetsCurrency().has_value());
467 EXPECT_FALSE(entry.hasTakerGetsIssuer());
468 EXPECT_FALSE(entry.getTakerGetsIssuer().has_value());
469 EXPECT_FALSE(entry.hasExchangeRate());
470 EXPECT_FALSE(entry.getExchangeRate().has_value());
471 EXPECT_FALSE(entry.hasIndexNext());
472 EXPECT_FALSE(entry.getIndexNext().has_value());
473 EXPECT_FALSE(entry.hasIndexPrevious());
474 EXPECT_FALSE(entry.getIndexPrevious().has_value());
475 EXPECT_FALSE(entry.hasNFTokenID());
476 EXPECT_FALSE(entry.getNFTokenID().has_value());
477 EXPECT_FALSE(entry.hasPreviousTxnID());
478 EXPECT_FALSE(entry.getPreviousTxnID().has_value());
479 EXPECT_FALSE(entry.hasPreviousTxnLgrSeq());
480 EXPECT_FALSE(entry.getPreviousTxnLgrSeq().has_value());
481 EXPECT_FALSE(entry.hasDomainID());
482 EXPECT_FALSE(entry.getDomainID().has_value());
483}
484}
Builder for DirectoryNode ledger entries.
DirectoryNodeBuilder & setTakerGetsIssuer(std::decay_t< typename SF_UINT160::type::value_type > const &value)
Set sfTakerGetsIssuer (soeOPTIONAL)
DirectoryNodeBuilder & setDomainID(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfDomainID (soeOPTIONAL)
DirectoryNodeBuilder & setPreviousTxnLgrSeq(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfPreviousTxnLgrSeq (soeOPTIONAL)
DirectoryNodeBuilder & setTakerGetsCurrency(std::decay_t< typename SF_UINT160::type::value_type > const &value)
Set sfTakerGetsCurrency (soeOPTIONAL)
DirectoryNodeBuilder & setIndexNext(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfIndexNext (soeOPTIONAL)
DirectoryNodeBuilder & setTakerPaysIssuer(std::decay_t< typename SF_UINT160::type::value_type > const &value)
Set sfTakerPaysIssuer (soeOPTIONAL)
DirectoryNodeBuilder & setIndexPrevious(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfIndexPrevious (soeOPTIONAL)
DirectoryNodeBuilder & setNFTokenID(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfNFTokenID (soeOPTIONAL)
DirectoryNodeBuilder & setPreviousTxnID(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfPreviousTxnID (soeOPTIONAL)
DirectoryNodeBuilder & setExchangeRate(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfExchangeRate (soeOPTIONAL)
DirectoryNodeBuilder & setTakerPaysCurrency(std::decay_t< typename SF_UINT160::type::value_type > const &value)
Set sfTakerPaysCurrency (soeOPTIONAL)
DirectoryNodeBuilder & setOwner(std::decay_t< typename SF_ACCOUNT::type::value_type > const &value)
Ledger entry-specific field setters.
Ledger Entry: DirectoryNode.
static constexpr LedgerEntryType entryType
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 Ticket ledger entries.
Definition Ticket.h:112
T is_same_v
TEST(AccountRootTests, BuilderSettersRoundTrip)
Vector256Value canonical_VECTOR256()
void expectEqualField(T const &expected, T const &actual, char const *fieldName)