xrpld
Loading...
Searching...
No Matches
SponsorshipTests.cpp
1// Auto-generated unit tests for ledger entry Sponsorship
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/Sponsorship.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(SponsorshipTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const previousTxnIDValue = canonical_UINT256();
24 auto const previousTxnLgrSeqValue = canonical_UINT32();
25 auto const ownerValue = canonical_ACCOUNT();
26 auto const sponseeValue = canonical_ACCOUNT();
27 auto const feeAmountValue = canonical_AMOUNT();
28 auto const maxFeeValue = canonical_AMOUNT();
29 auto const remainingOwnerCountValue = canonical_UINT32();
30 auto const ownerNodeValue = canonical_UINT64();
31 auto const sponseeNodeValue = canonical_UINT64();
32
33 SponsorshipBuilder builder{
34 previousTxnIDValue,
35 previousTxnLgrSeqValue,
36 ownerValue,
37 sponseeValue,
38 ownerNodeValue,
39 sponseeNodeValue
40 };
41
42 builder.setFeeAmount(feeAmountValue);
43 builder.setMaxFee(maxFeeValue);
44 builder.setRemainingOwnerCount(remainingOwnerCountValue);
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 = previousTxnIDValue;
57 auto const actual = entry.getPreviousTxnID();
58 expectEqualField(expected, actual, "sfPreviousTxnID");
59 }
60
61 {
62 auto const& expected = previousTxnLgrSeqValue;
63 auto const actual = entry.getPreviousTxnLgrSeq();
64 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
65 }
66
67 {
68 auto const& expected = ownerValue;
69 auto const actual = entry.getOwner();
70 expectEqualField(expected, actual, "sfOwner");
71 }
72
73 {
74 auto const& expected = sponseeValue;
75 auto const actual = entry.getSponsee();
76 expectEqualField(expected, actual, "sfSponsee");
77 }
78
79 {
80 auto const& expected = ownerNodeValue;
81 auto const actual = entry.getOwnerNode();
82 expectEqualField(expected, actual, "sfOwnerNode");
83 }
84
85 {
86 auto const& expected = sponseeNodeValue;
87 auto const actual = entry.getSponseeNode();
88 expectEqualField(expected, actual, "sfSponseeNode");
89 }
90
91 {
92 auto const& expected = feeAmountValue;
93 auto const actualOpt = entry.getFeeAmount();
94 ASSERT_TRUE(actualOpt.has_value());
95 expectEqualField(expected, *actualOpt, "sfFeeAmount");
96 EXPECT_TRUE(entry.hasFeeAmount());
97 }
98
99 {
100 auto const& expected = maxFeeValue;
101 auto const actualOpt = entry.getMaxFee();
102 ASSERT_TRUE(actualOpt.has_value());
103 expectEqualField(expected, *actualOpt, "sfMaxFee");
104 EXPECT_TRUE(entry.hasMaxFee());
105 }
106
107 {
108 auto const& expected = remainingOwnerCountValue;
109 auto const actualOpt = entry.getRemainingOwnerCount();
110 ASSERT_TRUE(actualOpt.has_value());
111 expectEqualField(expected, *actualOpt, "sfRemainingOwnerCount");
112 EXPECT_TRUE(entry.hasRemainingOwnerCount());
113 }
114
115 EXPECT_TRUE(entry.hasLedgerIndex());
116 auto const ledgerIndex = entry.getLedgerIndex();
117 ASSERT_TRUE(ledgerIndex.has_value());
118 EXPECT_EQ(*ledgerIndex, index);
119 EXPECT_EQ(entry.getKey(), index);
120}
121
122// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
123// from that SLE, build a new wrapper, and verify all fields (and validate()).
124TEST(SponsorshipTests, BuilderFromSleRoundTrip)
125{
126 uint256 const index{2u};
127
128 auto const previousTxnIDValue = canonical_UINT256();
129 auto const previousTxnLgrSeqValue = canonical_UINT32();
130 auto const ownerValue = canonical_ACCOUNT();
131 auto const sponseeValue = canonical_ACCOUNT();
132 auto const feeAmountValue = canonical_AMOUNT();
133 auto const maxFeeValue = canonical_AMOUNT();
134 auto const remainingOwnerCountValue = canonical_UINT32();
135 auto const ownerNodeValue = canonical_UINT64();
136 auto const sponseeNodeValue = canonical_UINT64();
137
139
140 sle->at(sfPreviousTxnID) = previousTxnIDValue;
141 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
142 sle->at(sfOwner) = ownerValue;
143 sle->at(sfSponsee) = sponseeValue;
144 sle->at(sfFeeAmount) = feeAmountValue;
145 sle->at(sfMaxFee) = maxFeeValue;
146 sle->at(sfRemainingOwnerCount) = remainingOwnerCountValue;
147 sle->at(sfOwnerNode) = ownerNodeValue;
148 sle->at(sfSponseeNode) = sponseeNodeValue;
149
150 SponsorshipBuilder builderFromSle{sle};
151 EXPECT_TRUE(builderFromSle.validate());
152
153 auto const entryFromBuilder = builderFromSle.build(index);
154
155 Sponsorship entryFromSle{sle};
156 EXPECT_TRUE(entryFromBuilder.validate());
157 EXPECT_TRUE(entryFromSle.validate());
158
159 {
160 auto const& expected = previousTxnIDValue;
161
162 auto const fromSle = entryFromSle.getPreviousTxnID();
163 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
164
165 expectEqualField(expected, fromSle, "sfPreviousTxnID");
166 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
167 }
168
169 {
170 auto const& expected = previousTxnLgrSeqValue;
171
172 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
173 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
174
175 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
176 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
177 }
178
179 {
180 auto const& expected = ownerValue;
181
182 auto const fromSle = entryFromSle.getOwner();
183 auto const fromBuilder = entryFromBuilder.getOwner();
184
185 expectEqualField(expected, fromSle, "sfOwner");
186 expectEqualField(expected, fromBuilder, "sfOwner");
187 }
188
189 {
190 auto const& expected = sponseeValue;
191
192 auto const fromSle = entryFromSle.getSponsee();
193 auto const fromBuilder = entryFromBuilder.getSponsee();
194
195 expectEqualField(expected, fromSle, "sfSponsee");
196 expectEqualField(expected, fromBuilder, "sfSponsee");
197 }
198
199 {
200 auto const& expected = ownerNodeValue;
201
202 auto const fromSle = entryFromSle.getOwnerNode();
203 auto const fromBuilder = entryFromBuilder.getOwnerNode();
204
205 expectEqualField(expected, fromSle, "sfOwnerNode");
206 expectEqualField(expected, fromBuilder, "sfOwnerNode");
207 }
208
209 {
210 auto const& expected = sponseeNodeValue;
211
212 auto const fromSle = entryFromSle.getSponseeNode();
213 auto const fromBuilder = entryFromBuilder.getSponseeNode();
214
215 expectEqualField(expected, fromSle, "sfSponseeNode");
216 expectEqualField(expected, fromBuilder, "sfSponseeNode");
217 }
218
219 {
220 auto const& expected = feeAmountValue;
221
222 auto const fromSleOpt = entryFromSle.getFeeAmount();
223 auto const fromBuilderOpt = entryFromBuilder.getFeeAmount();
224
225 ASSERT_TRUE(fromSleOpt.has_value());
226 ASSERT_TRUE(fromBuilderOpt.has_value());
227
228 expectEqualField(expected, *fromSleOpt, "sfFeeAmount");
229 expectEqualField(expected, *fromBuilderOpt, "sfFeeAmount");
230 }
231
232 {
233 auto const& expected = maxFeeValue;
234
235 auto const fromSleOpt = entryFromSle.getMaxFee();
236 auto const fromBuilderOpt = entryFromBuilder.getMaxFee();
237
238 ASSERT_TRUE(fromSleOpt.has_value());
239 ASSERT_TRUE(fromBuilderOpt.has_value());
240
241 expectEqualField(expected, *fromSleOpt, "sfMaxFee");
242 expectEqualField(expected, *fromBuilderOpt, "sfMaxFee");
243 }
244
245 {
246 auto const& expected = remainingOwnerCountValue;
247
248 auto const fromSleOpt = entryFromSle.getRemainingOwnerCount();
249 auto const fromBuilderOpt = entryFromBuilder.getRemainingOwnerCount();
250
251 ASSERT_TRUE(fromSleOpt.has_value());
252 ASSERT_TRUE(fromBuilderOpt.has_value());
253
254 expectEqualField(expected, *fromSleOpt, "sfRemainingOwnerCount");
255 expectEqualField(expected, *fromBuilderOpt, "sfRemainingOwnerCount");
256 }
257
258 EXPECT_EQ(entryFromSle.getKey(), index);
259 EXPECT_EQ(entryFromBuilder.getKey(), index);
260}
261
262// 3) Verify wrapper throws when constructed from wrong ledger entry type.
263TEST(SponsorshipTests, WrapperThrowsOnWrongEntryType)
264{
265 uint256 const index{3u};
266
267 // Build a valid ledger entry of a different type
268 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
269 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
270 TicketBuilder wrongBuilder{
276 auto wrongEntry = wrongBuilder.build(index);
277
278 EXPECT_THROW(Sponsorship{wrongEntry.getSle()}, std::runtime_error);
279}
280
281// 4) Verify builder throws when constructed from wrong ledger entry type.
282TEST(SponsorshipTests, BuilderThrowsOnWrongEntryType)
283{
284 uint256 const index{4u};
285
286 // Build a valid ledger entry of a different type
287 TicketBuilder wrongBuilder{
293 auto wrongEntry = wrongBuilder.build(index);
294
295 EXPECT_THROW(SponsorshipBuilder{wrongEntry.getSle()}, std::runtime_error);
296}
297
298// 5) Build with only required fields and verify optional fields return nullopt.
299TEST(SponsorshipTests, OptionalFieldsReturnNullopt)
300{
301 uint256 const index{3u};
302
303 auto const previousTxnIDValue = canonical_UINT256();
304 auto const previousTxnLgrSeqValue = canonical_UINT32();
305 auto const ownerValue = canonical_ACCOUNT();
306 auto const sponseeValue = canonical_ACCOUNT();
307 auto const ownerNodeValue = canonical_UINT64();
308 auto const sponseeNodeValue = canonical_UINT64();
309
310 SponsorshipBuilder builder{
311 previousTxnIDValue,
312 previousTxnLgrSeqValue,
313 ownerValue,
314 sponseeValue,
315 ownerNodeValue,
316 sponseeNodeValue
317 };
318
319 auto const entry = builder.build(index);
320
321 // Verify optional fields are not present
322 EXPECT_FALSE(entry.hasFeeAmount());
323 EXPECT_FALSE(entry.getFeeAmount().has_value());
324 EXPECT_FALSE(entry.hasMaxFee());
325 EXPECT_FALSE(entry.getMaxFee().has_value());
326 EXPECT_FALSE(entry.hasRemainingOwnerCount());
327 EXPECT_FALSE(entry.getRemainingOwnerCount().has_value());
328}
329}
bool validate() const
Validate the ledger entry.
uint256 const & getKey() const
Get the key (index) of this ledger entry.
Derived & setLedgerIndex(uint256 const &value)
Set the ledger index.
Derived & setFlags(uint32_t value)
Set the flags.
bool validate() const
Validate the ledger entry.
Builder for Sponsorship ledger entries.
Sponsorship build(uint256 const &index)
Build and return the completed Sponsorship wrapper.
SponsorshipBuilder & setRemainingOwnerCount(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfRemainingOwnerCount (SoeDefault).
SponsorshipBuilder & setMaxFee(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfMaxFee (SoeOptional).
SponsorshipBuilder & setFeeAmount(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfFeeAmount (SoeOptional).
Ledger Entry: Sponsorship.
Definition Sponsorship.h:28
SF_UINT256::type::value_type getPreviousTxnID() const
Get sfPreviousTxnID (SoeRequired).
Definition Sponsorship.h:54
SF_ACCOUNT::type::value_type getSponsee() const
Get sfSponsee (SoeRequired).
Definition Sponsorship.h:87
SF_UINT64::type::value_type getOwnerNode() const
Get sfOwnerNode (SoeRequired).
SF_UINT64::type::value_type getSponseeNode() const
Get sfSponseeNode (SoeRequired).
protocol_autogen::Optional< SF_UINT32::type::value_type > getRemainingOwnerCount() const
Get sfRemainingOwnerCount (SoeDefault).
SF_UINT32::type::value_type getPreviousTxnLgrSeq() const
Get sfPreviousTxnLgrSeq (SoeRequired).
Definition Sponsorship.h:65
protocol_autogen::Optional< SF_AMOUNT::type::value_type > getMaxFee() const
Get sfMaxFee (SoeOptional).
SF_ACCOUNT::type::value_type getOwner() const
Get sfOwner (SoeRequired).
Definition Sponsorship.h:76
static constexpr LedgerEntryType entryType
Definition Sponsorship.h:30
protocol_autogen::Optional< SF_AMOUNT::type::value_type > getFeeAmount() const
Get sfFeeAmount (SoeOptional).
Definition Sponsorship.h:98
Builder for Ticket ledger entries.
Definition Ticket.h:112
Ticket build(uint256 const &index)
Build and return the completed Ticket wrapper.
Definition Ticket.h:211
T make_shared(T... args)
TEST(AccountRootTests, BuilderSettersRoundTrip)
BaseUInt< 256 > uint256
Definition base_uint.h:580
void expectEqualField(T const &expected, T const &actual, char const *fieldName)