rippled
Loading...
Searching...
No Matches
NFTokenPageTests.cpp
1// Auto-generated unit tests for ledger entry NFTokenPage
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/NFTokenPage.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(NFTokenPageTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const previousPageMinValue = canonical_UINT256();
24 auto const nextPageMinValue = canonical_UINT256();
25 auto const nFTokensValue = canonical_ARRAY();
26 auto const previousTxnIDValue = canonical_UINT256();
27 auto const previousTxnLgrSeqValue = canonical_UINT32();
28
29 NFTokenPageBuilder builder{
30 nFTokensValue,
31 previousTxnIDValue,
32 previousTxnLgrSeqValue
33 };
34
35 builder.setPreviousPageMin(previousPageMinValue);
36 builder.setNextPageMin(nextPageMinValue);
37
38 builder.setLedgerIndex(index);
39 builder.setFlags(0x1u);
40
41 EXPECT_TRUE(builder.validate());
42
43 auto const entry = builder.build(index);
44
45 EXPECT_TRUE(entry.validate());
46
47 {
48 auto const& expected = nFTokensValue;
49 auto const actual = entry.getNFTokens();
50 expectEqualField(expected, actual, "sfNFTokens");
51 }
52
53 {
54 auto const& expected = previousTxnIDValue;
55 auto const actual = entry.getPreviousTxnID();
56 expectEqualField(expected, actual, "sfPreviousTxnID");
57 }
58
59 {
60 auto const& expected = previousTxnLgrSeqValue;
61 auto const actual = entry.getPreviousTxnLgrSeq();
62 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
63 }
64
65 {
66 auto const& expected = previousPageMinValue;
67 auto const actualOpt = entry.getPreviousPageMin();
68 ASSERT_TRUE(actualOpt.has_value());
69 expectEqualField(expected, *actualOpt, "sfPreviousPageMin");
70 EXPECT_TRUE(entry.hasPreviousPageMin());
71 }
72
73 {
74 auto const& expected = nextPageMinValue;
75 auto const actualOpt = entry.getNextPageMin();
76 ASSERT_TRUE(actualOpt.has_value());
77 expectEqualField(expected, *actualOpt, "sfNextPageMin");
78 EXPECT_TRUE(entry.hasNextPageMin());
79 }
80
81 EXPECT_TRUE(entry.hasLedgerIndex());
82 auto const ledgerIndex = entry.getLedgerIndex();
83 ASSERT_TRUE(ledgerIndex.has_value());
84 EXPECT_EQ(*ledgerIndex, index);
85 EXPECT_EQ(entry.getKey(), index);
86}
87
88// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
89// from that SLE, build a new wrapper, and verify all fields (and validate()).
90TEST(NFTokenPageTests, BuilderFromSleRoundTrip)
91{
92 uint256 const index{2u};
93
94 auto const previousPageMinValue = canonical_UINT256();
95 auto const nextPageMinValue = canonical_UINT256();
96 auto const nFTokensValue = canonical_ARRAY();
97 auto const previousTxnIDValue = canonical_UINT256();
98 auto const previousTxnLgrSeqValue = canonical_UINT32();
99
101
102 sle->at(sfPreviousPageMin) = previousPageMinValue;
103 sle->at(sfNextPageMin) = nextPageMinValue;
104 sle->setFieldArray(sfNFTokens, nFTokensValue);
105 sle->at(sfPreviousTxnID) = previousTxnIDValue;
106 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
107
108 NFTokenPageBuilder builderFromSle{sle};
109 EXPECT_TRUE(builderFromSle.validate());
110
111 auto const entryFromBuilder = builderFromSle.build(index);
112
113 NFTokenPage entryFromSle{sle};
114 EXPECT_TRUE(entryFromBuilder.validate());
115 EXPECT_TRUE(entryFromSle.validate());
116
117 {
118 auto const& expected = nFTokensValue;
119
120 auto const fromSle = entryFromSle.getNFTokens();
121 auto const fromBuilder = entryFromBuilder.getNFTokens();
122
123 expectEqualField(expected, fromSle, "sfNFTokens");
124 expectEqualField(expected, fromBuilder, "sfNFTokens");
125 }
126
127 {
128 auto const& expected = previousTxnIDValue;
129
130 auto const fromSle = entryFromSle.getPreviousTxnID();
131 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
132
133 expectEqualField(expected, fromSle, "sfPreviousTxnID");
134 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
135 }
136
137 {
138 auto const& expected = previousTxnLgrSeqValue;
139
140 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
141 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
142
143 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
144 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
145 }
146
147 {
148 auto const& expected = previousPageMinValue;
149
150 auto const fromSleOpt = entryFromSle.getPreviousPageMin();
151 auto const fromBuilderOpt = entryFromBuilder.getPreviousPageMin();
152
153 ASSERT_TRUE(fromSleOpt.has_value());
154 ASSERT_TRUE(fromBuilderOpt.has_value());
155
156 expectEqualField(expected, *fromSleOpt, "sfPreviousPageMin");
157 expectEqualField(expected, *fromBuilderOpt, "sfPreviousPageMin");
158 }
159
160 {
161 auto const& expected = nextPageMinValue;
162
163 auto const fromSleOpt = entryFromSle.getNextPageMin();
164 auto const fromBuilderOpt = entryFromBuilder.getNextPageMin();
165
166 ASSERT_TRUE(fromSleOpt.has_value());
167 ASSERT_TRUE(fromBuilderOpt.has_value());
168
169 expectEqualField(expected, *fromSleOpt, "sfNextPageMin");
170 expectEqualField(expected, *fromBuilderOpt, "sfNextPageMin");
171 }
172
173 EXPECT_EQ(entryFromSle.getKey(), index);
174 EXPECT_EQ(entryFromBuilder.getKey(), index);
175}
176
177// 3) Verify wrapper throws when constructed from wrong ledger entry type.
178TEST(NFTokenPageTests, WrapperThrowsOnWrongEntryType)
179{
180 uint256 const index{3u};
181
182 // Build a valid ledger entry of a different type
183 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
184 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
185 TicketBuilder wrongBuilder{
191 auto wrongEntry = wrongBuilder.build(index);
192
193 EXPECT_THROW(NFTokenPage{wrongEntry.getSle()}, std::runtime_error);
194}
195
196// 4) Verify builder throws when constructed from wrong ledger entry type.
197TEST(NFTokenPageTests, BuilderThrowsOnWrongEntryType)
198{
199 uint256 const index{4u};
200
201 // Build a valid ledger entry of a different type
202 TicketBuilder wrongBuilder{
208 auto wrongEntry = wrongBuilder.build(index);
209
210 EXPECT_THROW(NFTokenPageBuilder{wrongEntry.getSle()}, std::runtime_error);
211}
212
213// 5) Build with only required fields and verify optional fields return nullopt.
214TEST(NFTokenPageTests, OptionalFieldsReturnNullopt)
215{
216 uint256 const index{3u};
217
218 auto const nFTokensValue = canonical_ARRAY();
219 auto const previousTxnIDValue = canonical_UINT256();
220 auto const previousTxnLgrSeqValue = canonical_UINT32();
221
222 NFTokenPageBuilder builder{
223 nFTokensValue,
224 previousTxnIDValue,
225 previousTxnLgrSeqValue
226 };
227
228 auto const entry = builder.build(index);
229
230 // Verify optional fields are not present
231 EXPECT_FALSE(entry.hasPreviousPageMin());
232 EXPECT_FALSE(entry.getPreviousPageMin().has_value());
233 EXPECT_FALSE(entry.hasNextPageMin());
234 EXPECT_FALSE(entry.getNextPageMin().has_value());
235}
236}
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 NFTokenPage ledger entries.
NFTokenPageBuilder & setNextPageMin(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfNextPageMin (soeOPTIONAL)
NFTokenPageBuilder & setPreviousPageMin(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Ledger entry-specific field setters.
Ledger Entry: NFTokenPage.
Definition NFTokenPage.h:28
static constexpr LedgerEntryType entryType
Definition NFTokenPage.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)