rippled
Loading...
Searching...
No Matches
RippleStateTests.cpp
1// Auto-generated unit tests for ledger entry RippleState
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/RippleState.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(RippleStateTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const balanceValue = canonical_AMOUNT();
24 auto const lowLimitValue = canonical_AMOUNT();
25 auto const highLimitValue = canonical_AMOUNT();
26 auto const previousTxnIDValue = canonical_UINT256();
27 auto const previousTxnLgrSeqValue = canonical_UINT32();
28 auto const lowNodeValue = canonical_UINT64();
29 auto const lowQualityInValue = canonical_UINT32();
30 auto const lowQualityOutValue = canonical_UINT32();
31 auto const highNodeValue = canonical_UINT64();
32 auto const highQualityInValue = canonical_UINT32();
33 auto const highQualityOutValue = canonical_UINT32();
34
35 RippleStateBuilder builder{
36 balanceValue,
37 lowLimitValue,
38 highLimitValue,
39 previousTxnIDValue,
40 previousTxnLgrSeqValue
41 };
42
43 builder.setLowNode(lowNodeValue);
44 builder.setLowQualityIn(lowQualityInValue);
45 builder.setLowQualityOut(lowQualityOutValue);
46 builder.setHighNode(highNodeValue);
47 builder.setHighQualityIn(highQualityInValue);
48 builder.setHighQualityOut(highQualityOutValue);
49
50 builder.setLedgerIndex(index);
51 builder.setFlags(0x1u);
52
53 EXPECT_TRUE(builder.validate());
54
55 auto const entry = builder.build(index);
56
57 EXPECT_TRUE(entry.validate());
58
59 {
60 auto const& expected = balanceValue;
61 auto const actual = entry.getBalance();
62 expectEqualField(expected, actual, "sfBalance");
63 }
64
65 {
66 auto const& expected = lowLimitValue;
67 auto const actual = entry.getLowLimit();
68 expectEqualField(expected, actual, "sfLowLimit");
69 }
70
71 {
72 auto const& expected = highLimitValue;
73 auto const actual = entry.getHighLimit();
74 expectEqualField(expected, actual, "sfHighLimit");
75 }
76
77 {
78 auto const& expected = previousTxnIDValue;
79 auto const actual = entry.getPreviousTxnID();
80 expectEqualField(expected, actual, "sfPreviousTxnID");
81 }
82
83 {
84 auto const& expected = previousTxnLgrSeqValue;
85 auto const actual = entry.getPreviousTxnLgrSeq();
86 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
87 }
88
89 {
90 auto const& expected = lowNodeValue;
91 auto const actualOpt = entry.getLowNode();
92 ASSERT_TRUE(actualOpt.has_value());
93 expectEqualField(expected, *actualOpt, "sfLowNode");
94 EXPECT_TRUE(entry.hasLowNode());
95 }
96
97 {
98 auto const& expected = lowQualityInValue;
99 auto const actualOpt = entry.getLowQualityIn();
100 ASSERT_TRUE(actualOpt.has_value());
101 expectEqualField(expected, *actualOpt, "sfLowQualityIn");
102 EXPECT_TRUE(entry.hasLowQualityIn());
103 }
104
105 {
106 auto const& expected = lowQualityOutValue;
107 auto const actualOpt = entry.getLowQualityOut();
108 ASSERT_TRUE(actualOpt.has_value());
109 expectEqualField(expected, *actualOpt, "sfLowQualityOut");
110 EXPECT_TRUE(entry.hasLowQualityOut());
111 }
112
113 {
114 auto const& expected = highNodeValue;
115 auto const actualOpt = entry.getHighNode();
116 ASSERT_TRUE(actualOpt.has_value());
117 expectEqualField(expected, *actualOpt, "sfHighNode");
118 EXPECT_TRUE(entry.hasHighNode());
119 }
120
121 {
122 auto const& expected = highQualityInValue;
123 auto const actualOpt = entry.getHighQualityIn();
124 ASSERT_TRUE(actualOpt.has_value());
125 expectEqualField(expected, *actualOpt, "sfHighQualityIn");
126 EXPECT_TRUE(entry.hasHighQualityIn());
127 }
128
129 {
130 auto const& expected = highQualityOutValue;
131 auto const actualOpt = entry.getHighQualityOut();
132 ASSERT_TRUE(actualOpt.has_value());
133 expectEqualField(expected, *actualOpt, "sfHighQualityOut");
134 EXPECT_TRUE(entry.hasHighQualityOut());
135 }
136
137 EXPECT_TRUE(entry.hasLedgerIndex());
138 auto const ledgerIndex = entry.getLedgerIndex();
139 ASSERT_TRUE(ledgerIndex.has_value());
140 EXPECT_EQ(*ledgerIndex, index);
141 EXPECT_EQ(entry.getKey(), index);
142}
143
144// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
145// from that SLE, build a new wrapper, and verify all fields (and validate()).
146TEST(RippleStateTests, BuilderFromSleRoundTrip)
147{
148 uint256 const index{2u};
149
150 auto const balanceValue = canonical_AMOUNT();
151 auto const lowLimitValue = canonical_AMOUNT();
152 auto const highLimitValue = canonical_AMOUNT();
153 auto const previousTxnIDValue = canonical_UINT256();
154 auto const previousTxnLgrSeqValue = canonical_UINT32();
155 auto const lowNodeValue = canonical_UINT64();
156 auto const lowQualityInValue = canonical_UINT32();
157 auto const lowQualityOutValue = canonical_UINT32();
158 auto const highNodeValue = canonical_UINT64();
159 auto const highQualityInValue = canonical_UINT32();
160 auto const highQualityOutValue = canonical_UINT32();
161
163
164 sle->at(sfBalance) = balanceValue;
165 sle->at(sfLowLimit) = lowLimitValue;
166 sle->at(sfHighLimit) = highLimitValue;
167 sle->at(sfPreviousTxnID) = previousTxnIDValue;
168 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
169 sle->at(sfLowNode) = lowNodeValue;
170 sle->at(sfLowQualityIn) = lowQualityInValue;
171 sle->at(sfLowQualityOut) = lowQualityOutValue;
172 sle->at(sfHighNode) = highNodeValue;
173 sle->at(sfHighQualityIn) = highQualityInValue;
174 sle->at(sfHighQualityOut) = highQualityOutValue;
175
176 RippleStateBuilder builderFromSle{sle};
177 EXPECT_TRUE(builderFromSle.validate());
178
179 auto const entryFromBuilder = builderFromSle.build(index);
180
181 RippleState entryFromSle{sle};
182 EXPECT_TRUE(entryFromBuilder.validate());
183 EXPECT_TRUE(entryFromSle.validate());
184
185 {
186 auto const& expected = balanceValue;
187
188 auto const fromSle = entryFromSle.getBalance();
189 auto const fromBuilder = entryFromBuilder.getBalance();
190
191 expectEqualField(expected, fromSle, "sfBalance");
192 expectEqualField(expected, fromBuilder, "sfBalance");
193 }
194
195 {
196 auto const& expected = lowLimitValue;
197
198 auto const fromSle = entryFromSle.getLowLimit();
199 auto const fromBuilder = entryFromBuilder.getLowLimit();
200
201 expectEqualField(expected, fromSle, "sfLowLimit");
202 expectEqualField(expected, fromBuilder, "sfLowLimit");
203 }
204
205 {
206 auto const& expected = highLimitValue;
207
208 auto const fromSle = entryFromSle.getHighLimit();
209 auto const fromBuilder = entryFromBuilder.getHighLimit();
210
211 expectEqualField(expected, fromSle, "sfHighLimit");
212 expectEqualField(expected, fromBuilder, "sfHighLimit");
213 }
214
215 {
216 auto const& expected = previousTxnIDValue;
217
218 auto const fromSle = entryFromSle.getPreviousTxnID();
219 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
220
221 expectEqualField(expected, fromSle, "sfPreviousTxnID");
222 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
223 }
224
225 {
226 auto const& expected = previousTxnLgrSeqValue;
227
228 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
229 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
230
231 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
232 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
233 }
234
235 {
236 auto const& expected = lowNodeValue;
237
238 auto const fromSleOpt = entryFromSle.getLowNode();
239 auto const fromBuilderOpt = entryFromBuilder.getLowNode();
240
241 ASSERT_TRUE(fromSleOpt.has_value());
242 ASSERT_TRUE(fromBuilderOpt.has_value());
243
244 expectEqualField(expected, *fromSleOpt, "sfLowNode");
245 expectEqualField(expected, *fromBuilderOpt, "sfLowNode");
246 }
247
248 {
249 auto const& expected = lowQualityInValue;
250
251 auto const fromSleOpt = entryFromSle.getLowQualityIn();
252 auto const fromBuilderOpt = entryFromBuilder.getLowQualityIn();
253
254 ASSERT_TRUE(fromSleOpt.has_value());
255 ASSERT_TRUE(fromBuilderOpt.has_value());
256
257 expectEqualField(expected, *fromSleOpt, "sfLowQualityIn");
258 expectEqualField(expected, *fromBuilderOpt, "sfLowQualityIn");
259 }
260
261 {
262 auto const& expected = lowQualityOutValue;
263
264 auto const fromSleOpt = entryFromSle.getLowQualityOut();
265 auto const fromBuilderOpt = entryFromBuilder.getLowQualityOut();
266
267 ASSERT_TRUE(fromSleOpt.has_value());
268 ASSERT_TRUE(fromBuilderOpt.has_value());
269
270 expectEqualField(expected, *fromSleOpt, "sfLowQualityOut");
271 expectEqualField(expected, *fromBuilderOpt, "sfLowQualityOut");
272 }
273
274 {
275 auto const& expected = highNodeValue;
276
277 auto const fromSleOpt = entryFromSle.getHighNode();
278 auto const fromBuilderOpt = entryFromBuilder.getHighNode();
279
280 ASSERT_TRUE(fromSleOpt.has_value());
281 ASSERT_TRUE(fromBuilderOpt.has_value());
282
283 expectEqualField(expected, *fromSleOpt, "sfHighNode");
284 expectEqualField(expected, *fromBuilderOpt, "sfHighNode");
285 }
286
287 {
288 auto const& expected = highQualityInValue;
289
290 auto const fromSleOpt = entryFromSle.getHighQualityIn();
291 auto const fromBuilderOpt = entryFromBuilder.getHighQualityIn();
292
293 ASSERT_TRUE(fromSleOpt.has_value());
294 ASSERT_TRUE(fromBuilderOpt.has_value());
295
296 expectEqualField(expected, *fromSleOpt, "sfHighQualityIn");
297 expectEqualField(expected, *fromBuilderOpt, "sfHighQualityIn");
298 }
299
300 {
301 auto const& expected = highQualityOutValue;
302
303 auto const fromSleOpt = entryFromSle.getHighQualityOut();
304 auto const fromBuilderOpt = entryFromBuilder.getHighQualityOut();
305
306 ASSERT_TRUE(fromSleOpt.has_value());
307 ASSERT_TRUE(fromBuilderOpt.has_value());
308
309 expectEqualField(expected, *fromSleOpt, "sfHighQualityOut");
310 expectEqualField(expected, *fromBuilderOpt, "sfHighQualityOut");
311 }
312
313 EXPECT_EQ(entryFromSle.getKey(), index);
314 EXPECT_EQ(entryFromBuilder.getKey(), index);
315}
316
317// 3) Verify wrapper throws when constructed from wrong ledger entry type.
318TEST(RippleStateTests, WrapperThrowsOnWrongEntryType)
319{
320 uint256 const index{3u};
321
322 // Build a valid ledger entry of a different type
323 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
324 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
325 TicketBuilder wrongBuilder{
331 auto wrongEntry = wrongBuilder.build(index);
332
333 EXPECT_THROW(RippleState{wrongEntry.getSle()}, std::runtime_error);
334}
335
336// 4) Verify builder throws when constructed from wrong ledger entry type.
337TEST(RippleStateTests, BuilderThrowsOnWrongEntryType)
338{
339 uint256 const index{4u};
340
341 // Build a valid ledger entry of a different type
342 TicketBuilder wrongBuilder{
348 auto wrongEntry = wrongBuilder.build(index);
349
350 EXPECT_THROW(RippleStateBuilder{wrongEntry.getSle()}, std::runtime_error);
351}
352
353// 5) Build with only required fields and verify optional fields return nullopt.
354TEST(RippleStateTests, OptionalFieldsReturnNullopt)
355{
356 uint256 const index{3u};
357
358 auto const balanceValue = canonical_AMOUNT();
359 auto const lowLimitValue = canonical_AMOUNT();
360 auto const highLimitValue = canonical_AMOUNT();
361 auto const previousTxnIDValue = canonical_UINT256();
362 auto const previousTxnLgrSeqValue = canonical_UINT32();
363
364 RippleStateBuilder builder{
365 balanceValue,
366 lowLimitValue,
367 highLimitValue,
368 previousTxnIDValue,
369 previousTxnLgrSeqValue
370 };
371
372 auto const entry = builder.build(index);
373
374 // Verify optional fields are not present
375 EXPECT_FALSE(entry.hasLowNode());
376 EXPECT_FALSE(entry.getLowNode().has_value());
377 EXPECT_FALSE(entry.hasLowQualityIn());
378 EXPECT_FALSE(entry.getLowQualityIn().has_value());
379 EXPECT_FALSE(entry.hasLowQualityOut());
380 EXPECT_FALSE(entry.getLowQualityOut().has_value());
381 EXPECT_FALSE(entry.hasHighNode());
382 EXPECT_FALSE(entry.getHighNode().has_value());
383 EXPECT_FALSE(entry.hasHighQualityIn());
384 EXPECT_FALSE(entry.getHighQualityIn().has_value());
385 EXPECT_FALSE(entry.hasHighQualityOut());
386 EXPECT_FALSE(entry.getHighQualityOut().has_value());
387}
388}
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 RippleState ledger entries.
RippleStateBuilder & setLowQualityOut(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfLowQualityOut (soeOPTIONAL)
RippleStateBuilder & setHighNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfHighNode (soeOPTIONAL)
RippleStateBuilder & setLowNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfLowNode (soeOPTIONAL)
RippleStateBuilder & setHighQualityOut(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfHighQualityOut (soeOPTIONAL)
RippleStateBuilder & setHighQualityIn(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfHighQualityIn (soeOPTIONAL)
RippleStateBuilder & setLowQualityIn(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfLowQualityIn (soeOPTIONAL)
Ledger Entry: RippleState.
Definition RippleState.h:28
static constexpr LedgerEntryType entryType
Definition RippleState.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)