rippled
Loading...
Searching...
No Matches
NFTokenOfferTests.cpp
1// Auto-generated unit tests for ledger entry NFTokenOffer
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/NFTokenOffer.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(NFTokenOfferTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const ownerValue = canonical_ACCOUNT();
24 auto const nFTokenIDValue = canonical_UINT256();
25 auto const amountValue = canonical_AMOUNT();
26 auto const ownerNodeValue = canonical_UINT64();
27 auto const nFTokenOfferNodeValue = canonical_UINT64();
28 auto const destinationValue = canonical_ACCOUNT();
29 auto const expirationValue = canonical_UINT32();
30 auto const previousTxnIDValue = canonical_UINT256();
31 auto const previousTxnLgrSeqValue = canonical_UINT32();
32
33 NFTokenOfferBuilder builder{
34 ownerValue,
35 nFTokenIDValue,
36 amountValue,
37 ownerNodeValue,
38 nFTokenOfferNodeValue,
39 previousTxnIDValue,
40 previousTxnLgrSeqValue
41 };
42
43 builder.setDestination(destinationValue);
44 builder.setExpiration(expirationValue);
45
46 builder.setLedgerIndex(index);
47 builder.setFlags(0x1u);
48
49 EXPECT_TRUE(builder.validate());
50
51 auto const entry = builder.build(index);
52
53 EXPECT_TRUE(entry.validate());
54
55 {
56 auto const& expected = ownerValue;
57 auto const actual = entry.getOwner();
58 expectEqualField(expected, actual, "sfOwner");
59 }
60
61 {
62 auto const& expected = nFTokenIDValue;
63 auto const actual = entry.getNFTokenID();
64 expectEqualField(expected, actual, "sfNFTokenID");
65 }
66
67 {
68 auto const& expected = amountValue;
69 auto const actual = entry.getAmount();
70 expectEqualField(expected, actual, "sfAmount");
71 }
72
73 {
74 auto const& expected = ownerNodeValue;
75 auto const actual = entry.getOwnerNode();
76 expectEqualField(expected, actual, "sfOwnerNode");
77 }
78
79 {
80 auto const& expected = nFTokenOfferNodeValue;
81 auto const actual = entry.getNFTokenOfferNode();
82 expectEqualField(expected, actual, "sfNFTokenOfferNode");
83 }
84
85 {
86 auto const& expected = previousTxnIDValue;
87 auto const actual = entry.getPreviousTxnID();
88 expectEqualField(expected, actual, "sfPreviousTxnID");
89 }
90
91 {
92 auto const& expected = previousTxnLgrSeqValue;
93 auto const actual = entry.getPreviousTxnLgrSeq();
94 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
95 }
96
97 {
98 auto const& expected = destinationValue;
99 auto const actualOpt = entry.getDestination();
100 ASSERT_TRUE(actualOpt.has_value());
101 expectEqualField(expected, *actualOpt, "sfDestination");
102 EXPECT_TRUE(entry.hasDestination());
103 }
104
105 {
106 auto const& expected = expirationValue;
107 auto const actualOpt = entry.getExpiration();
108 ASSERT_TRUE(actualOpt.has_value());
109 expectEqualField(expected, *actualOpt, "sfExpiration");
110 EXPECT_TRUE(entry.hasExpiration());
111 }
112
113 EXPECT_TRUE(entry.hasLedgerIndex());
114 auto const ledgerIndex = entry.getLedgerIndex();
115 ASSERT_TRUE(ledgerIndex.has_value());
116 EXPECT_EQ(*ledgerIndex, index);
117 EXPECT_EQ(entry.getKey(), index);
118}
119
120// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
121// from that SLE, build a new wrapper, and verify all fields (and validate()).
122TEST(NFTokenOfferTests, BuilderFromSleRoundTrip)
123{
124 uint256 const index{2u};
125
126 auto const ownerValue = canonical_ACCOUNT();
127 auto const nFTokenIDValue = canonical_UINT256();
128 auto const amountValue = canonical_AMOUNT();
129 auto const ownerNodeValue = canonical_UINT64();
130 auto const nFTokenOfferNodeValue = canonical_UINT64();
131 auto const destinationValue = canonical_ACCOUNT();
132 auto const expirationValue = canonical_UINT32();
133 auto const previousTxnIDValue = canonical_UINT256();
134 auto const previousTxnLgrSeqValue = canonical_UINT32();
135
137
138 sle->at(sfOwner) = ownerValue;
139 sle->at(sfNFTokenID) = nFTokenIDValue;
140 sle->at(sfAmount) = amountValue;
141 sle->at(sfOwnerNode) = ownerNodeValue;
142 sle->at(sfNFTokenOfferNode) = nFTokenOfferNodeValue;
143 sle->at(sfDestination) = destinationValue;
144 sle->at(sfExpiration) = expirationValue;
145 sle->at(sfPreviousTxnID) = previousTxnIDValue;
146 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
147
148 NFTokenOfferBuilder builderFromSle{sle};
149 EXPECT_TRUE(builderFromSle.validate());
150
151 auto const entryFromBuilder = builderFromSle.build(index);
152
153 NFTokenOffer entryFromSle{sle};
154 EXPECT_TRUE(entryFromBuilder.validate());
155 EXPECT_TRUE(entryFromSle.validate());
156
157 {
158 auto const& expected = ownerValue;
159
160 auto const fromSle = entryFromSle.getOwner();
161 auto const fromBuilder = entryFromBuilder.getOwner();
162
163 expectEqualField(expected, fromSle, "sfOwner");
164 expectEqualField(expected, fromBuilder, "sfOwner");
165 }
166
167 {
168 auto const& expected = nFTokenIDValue;
169
170 auto const fromSle = entryFromSle.getNFTokenID();
171 auto const fromBuilder = entryFromBuilder.getNFTokenID();
172
173 expectEqualField(expected, fromSle, "sfNFTokenID");
174 expectEqualField(expected, fromBuilder, "sfNFTokenID");
175 }
176
177 {
178 auto const& expected = amountValue;
179
180 auto const fromSle = entryFromSle.getAmount();
181 auto const fromBuilder = entryFromBuilder.getAmount();
182
183 expectEqualField(expected, fromSle, "sfAmount");
184 expectEqualField(expected, fromBuilder, "sfAmount");
185 }
186
187 {
188 auto const& expected = ownerNodeValue;
189
190 auto const fromSle = entryFromSle.getOwnerNode();
191 auto const fromBuilder = entryFromBuilder.getOwnerNode();
192
193 expectEqualField(expected, fromSle, "sfOwnerNode");
194 expectEqualField(expected, fromBuilder, "sfOwnerNode");
195 }
196
197 {
198 auto const& expected = nFTokenOfferNodeValue;
199
200 auto const fromSle = entryFromSle.getNFTokenOfferNode();
201 auto const fromBuilder = entryFromBuilder.getNFTokenOfferNode();
202
203 expectEqualField(expected, fromSle, "sfNFTokenOfferNode");
204 expectEqualField(expected, fromBuilder, "sfNFTokenOfferNode");
205 }
206
207 {
208 auto const& expected = previousTxnIDValue;
209
210 auto const fromSle = entryFromSle.getPreviousTxnID();
211 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
212
213 expectEqualField(expected, fromSle, "sfPreviousTxnID");
214 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
215 }
216
217 {
218 auto const& expected = previousTxnLgrSeqValue;
219
220 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
221 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
222
223 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
224 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
225 }
226
227 {
228 auto const& expected = destinationValue;
229
230 auto const fromSleOpt = entryFromSle.getDestination();
231 auto const fromBuilderOpt = entryFromBuilder.getDestination();
232
233 ASSERT_TRUE(fromSleOpt.has_value());
234 ASSERT_TRUE(fromBuilderOpt.has_value());
235
236 expectEqualField(expected, *fromSleOpt, "sfDestination");
237 expectEqualField(expected, *fromBuilderOpt, "sfDestination");
238 }
239
240 {
241 auto const& expected = expirationValue;
242
243 auto const fromSleOpt = entryFromSle.getExpiration();
244 auto const fromBuilderOpt = entryFromBuilder.getExpiration();
245
246 ASSERT_TRUE(fromSleOpt.has_value());
247 ASSERT_TRUE(fromBuilderOpt.has_value());
248
249 expectEqualField(expected, *fromSleOpt, "sfExpiration");
250 expectEqualField(expected, *fromBuilderOpt, "sfExpiration");
251 }
252
253 EXPECT_EQ(entryFromSle.getKey(), index);
254 EXPECT_EQ(entryFromBuilder.getKey(), index);
255}
256
257// 3) Verify wrapper throws when constructed from wrong ledger entry type.
258TEST(NFTokenOfferTests, WrapperThrowsOnWrongEntryType)
259{
260 uint256 const index{3u};
261
262 // Build a valid ledger entry of a different type
263 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
264 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
265 TicketBuilder wrongBuilder{
271 auto wrongEntry = wrongBuilder.build(index);
272
273 EXPECT_THROW(NFTokenOffer{wrongEntry.getSle()}, std::runtime_error);
274}
275
276// 4) Verify builder throws when constructed from wrong ledger entry type.
277TEST(NFTokenOfferTests, BuilderThrowsOnWrongEntryType)
278{
279 uint256 const index{4u};
280
281 // Build a valid ledger entry of a different type
282 TicketBuilder wrongBuilder{
288 auto wrongEntry = wrongBuilder.build(index);
289
290 EXPECT_THROW(NFTokenOfferBuilder{wrongEntry.getSle()}, std::runtime_error);
291}
292
293// 5) Build with only required fields and verify optional fields return nullopt.
294TEST(NFTokenOfferTests, OptionalFieldsReturnNullopt)
295{
296 uint256 const index{3u};
297
298 auto const ownerValue = canonical_ACCOUNT();
299 auto const nFTokenIDValue = canonical_UINT256();
300 auto const amountValue = canonical_AMOUNT();
301 auto const ownerNodeValue = canonical_UINT64();
302 auto const nFTokenOfferNodeValue = canonical_UINT64();
303 auto const previousTxnIDValue = canonical_UINT256();
304 auto const previousTxnLgrSeqValue = canonical_UINT32();
305
306 NFTokenOfferBuilder builder{
307 ownerValue,
308 nFTokenIDValue,
309 amountValue,
310 ownerNodeValue,
311 nFTokenOfferNodeValue,
312 previousTxnIDValue,
313 previousTxnLgrSeqValue
314 };
315
316 auto const entry = builder.build(index);
317
318 // Verify optional fields are not present
319 EXPECT_FALSE(entry.hasDestination());
320 EXPECT_FALSE(entry.getDestination().has_value());
321 EXPECT_FALSE(entry.hasExpiration());
322 EXPECT_FALSE(entry.getExpiration().has_value());
323}
324}
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 NFTokenOffer ledger entries.
NFTokenOfferBuilder & setExpiration(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfExpiration (soeOPTIONAL)
NFTokenOfferBuilder & setDestination(std::decay_t< typename SF_ACCOUNT::type::value_type > const &value)
Set sfDestination (soeOPTIONAL)
Ledger Entry: NFTokenOffer.
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)