rippled
Loading...
Searching...
No Matches
LoanBrokerTests.cpp
1// Auto-generated unit tests for ledger entry LoanBroker
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/LoanBroker.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(LoanBrokerTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const previousTxnIDValue = canonical_UINT256();
24 auto const previousTxnLgrSeqValue = canonical_UINT32();
25 auto const sequenceValue = canonical_UINT32();
26 auto const ownerNodeValue = canonical_UINT64();
27 auto const vaultNodeValue = canonical_UINT64();
28 auto const vaultIDValue = canonical_UINT256();
29 auto const accountValue = canonical_ACCOUNT();
30 auto const ownerValue = canonical_ACCOUNT();
31 auto const loanSequenceValue = canonical_UINT32();
32 auto const dataValue = canonical_VL();
33 auto const managementFeeRateValue = canonical_UINT16();
34 auto const ownerCountValue = canonical_UINT32();
35 auto const debtTotalValue = canonical_NUMBER();
36 auto const debtMaximumValue = canonical_NUMBER();
37 auto const coverAvailableValue = canonical_NUMBER();
38 auto const coverRateMinimumValue = canonical_UINT32();
39 auto const coverRateLiquidationValue = canonical_UINT32();
40
41 LoanBrokerBuilder builder{
42 previousTxnIDValue,
43 previousTxnLgrSeqValue,
44 sequenceValue,
45 ownerNodeValue,
46 vaultNodeValue,
47 vaultIDValue,
48 accountValue,
49 ownerValue,
50 loanSequenceValue
51 };
52
53 builder.setData(dataValue);
54 builder.setManagementFeeRate(managementFeeRateValue);
55 builder.setOwnerCount(ownerCountValue);
56 builder.setDebtTotal(debtTotalValue);
57 builder.setDebtMaximum(debtMaximumValue);
58 builder.setCoverAvailable(coverAvailableValue);
59 builder.setCoverRateMinimum(coverRateMinimumValue);
60 builder.setCoverRateLiquidation(coverRateLiquidationValue);
61
62 builder.setLedgerIndex(index);
63 builder.setFlags(0x1u);
64
65 EXPECT_TRUE(builder.validate());
66
67 auto const entry = builder.build(index);
68
69 EXPECT_TRUE(entry.validate());
70
71 {
72 auto const& expected = previousTxnIDValue;
73 auto const actual = entry.getPreviousTxnID();
74 expectEqualField(expected, actual, "sfPreviousTxnID");
75 }
76
77 {
78 auto const& expected = previousTxnLgrSeqValue;
79 auto const actual = entry.getPreviousTxnLgrSeq();
80 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
81 }
82
83 {
84 auto const& expected = sequenceValue;
85 auto const actual = entry.getSequence();
86 expectEqualField(expected, actual, "sfSequence");
87 }
88
89 {
90 auto const& expected = ownerNodeValue;
91 auto const actual = entry.getOwnerNode();
92 expectEqualField(expected, actual, "sfOwnerNode");
93 }
94
95 {
96 auto const& expected = vaultNodeValue;
97 auto const actual = entry.getVaultNode();
98 expectEqualField(expected, actual, "sfVaultNode");
99 }
100
101 {
102 auto const& expected = vaultIDValue;
103 auto const actual = entry.getVaultID();
104 expectEqualField(expected, actual, "sfVaultID");
105 }
106
107 {
108 auto const& expected = accountValue;
109 auto const actual = entry.getAccount();
110 expectEqualField(expected, actual, "sfAccount");
111 }
112
113 {
114 auto const& expected = ownerValue;
115 auto const actual = entry.getOwner();
116 expectEqualField(expected, actual, "sfOwner");
117 }
118
119 {
120 auto const& expected = loanSequenceValue;
121 auto const actual = entry.getLoanSequence();
122 expectEqualField(expected, actual, "sfLoanSequence");
123 }
124
125 {
126 auto const& expected = dataValue;
127 auto const actualOpt = entry.getData();
128 ASSERT_TRUE(actualOpt.has_value());
129 expectEqualField(expected, *actualOpt, "sfData");
130 EXPECT_TRUE(entry.hasData());
131 }
132
133 {
134 auto const& expected = managementFeeRateValue;
135 auto const actualOpt = entry.getManagementFeeRate();
136 ASSERT_TRUE(actualOpt.has_value());
137 expectEqualField(expected, *actualOpt, "sfManagementFeeRate");
138 EXPECT_TRUE(entry.hasManagementFeeRate());
139 }
140
141 {
142 auto const& expected = ownerCountValue;
143 auto const actualOpt = entry.getOwnerCount();
144 ASSERT_TRUE(actualOpt.has_value());
145 expectEqualField(expected, *actualOpt, "sfOwnerCount");
146 EXPECT_TRUE(entry.hasOwnerCount());
147 }
148
149 {
150 auto const& expected = debtTotalValue;
151 auto const actualOpt = entry.getDebtTotal();
152 ASSERT_TRUE(actualOpt.has_value());
153 expectEqualField(expected, *actualOpt, "sfDebtTotal");
154 EXPECT_TRUE(entry.hasDebtTotal());
155 }
156
157 {
158 auto const& expected = debtMaximumValue;
159 auto const actualOpt = entry.getDebtMaximum();
160 ASSERT_TRUE(actualOpt.has_value());
161 expectEqualField(expected, *actualOpt, "sfDebtMaximum");
162 EXPECT_TRUE(entry.hasDebtMaximum());
163 }
164
165 {
166 auto const& expected = coverAvailableValue;
167 auto const actualOpt = entry.getCoverAvailable();
168 ASSERT_TRUE(actualOpt.has_value());
169 expectEqualField(expected, *actualOpt, "sfCoverAvailable");
170 EXPECT_TRUE(entry.hasCoverAvailable());
171 }
172
173 {
174 auto const& expected = coverRateMinimumValue;
175 auto const actualOpt = entry.getCoverRateMinimum();
176 ASSERT_TRUE(actualOpt.has_value());
177 expectEqualField(expected, *actualOpt, "sfCoverRateMinimum");
178 EXPECT_TRUE(entry.hasCoverRateMinimum());
179 }
180
181 {
182 auto const& expected = coverRateLiquidationValue;
183 auto const actualOpt = entry.getCoverRateLiquidation();
184 ASSERT_TRUE(actualOpt.has_value());
185 expectEqualField(expected, *actualOpt, "sfCoverRateLiquidation");
186 EXPECT_TRUE(entry.hasCoverRateLiquidation());
187 }
188
189 EXPECT_TRUE(entry.hasLedgerIndex());
190 auto const ledgerIndex = entry.getLedgerIndex();
191 ASSERT_TRUE(ledgerIndex.has_value());
192 EXPECT_EQ(*ledgerIndex, index);
193 EXPECT_EQ(entry.getKey(), index);
194}
195
196// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
197// from that SLE, build a new wrapper, and verify all fields (and validate()).
198TEST(LoanBrokerTests, BuilderFromSleRoundTrip)
199{
200 uint256 const index{2u};
201
202 auto const previousTxnIDValue = canonical_UINT256();
203 auto const previousTxnLgrSeqValue = canonical_UINT32();
204 auto const sequenceValue = canonical_UINT32();
205 auto const ownerNodeValue = canonical_UINT64();
206 auto const vaultNodeValue = canonical_UINT64();
207 auto const vaultIDValue = canonical_UINT256();
208 auto const accountValue = canonical_ACCOUNT();
209 auto const ownerValue = canonical_ACCOUNT();
210 auto const loanSequenceValue = canonical_UINT32();
211 auto const dataValue = canonical_VL();
212 auto const managementFeeRateValue = canonical_UINT16();
213 auto const ownerCountValue = canonical_UINT32();
214 auto const debtTotalValue = canonical_NUMBER();
215 auto const debtMaximumValue = canonical_NUMBER();
216 auto const coverAvailableValue = canonical_NUMBER();
217 auto const coverRateMinimumValue = canonical_UINT32();
218 auto const coverRateLiquidationValue = canonical_UINT32();
219
221
222 sle->at(sfPreviousTxnID) = previousTxnIDValue;
223 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
224 sle->at(sfSequence) = sequenceValue;
225 sle->at(sfOwnerNode) = ownerNodeValue;
226 sle->at(sfVaultNode) = vaultNodeValue;
227 sle->at(sfVaultID) = vaultIDValue;
228 sle->at(sfAccount) = accountValue;
229 sle->at(sfOwner) = ownerValue;
230 sle->at(sfLoanSequence) = loanSequenceValue;
231 sle->at(sfData) = dataValue;
232 sle->at(sfManagementFeeRate) = managementFeeRateValue;
233 sle->at(sfOwnerCount) = ownerCountValue;
234 sle->at(sfDebtTotal) = debtTotalValue;
235 sle->at(sfDebtMaximum) = debtMaximumValue;
236 sle->at(sfCoverAvailable) = coverAvailableValue;
237 sle->at(sfCoverRateMinimum) = coverRateMinimumValue;
238 sle->at(sfCoverRateLiquidation) = coverRateLiquidationValue;
239
240 LoanBrokerBuilder builderFromSle{sle};
241 EXPECT_TRUE(builderFromSle.validate());
242
243 auto const entryFromBuilder = builderFromSle.build(index);
244
245 LoanBroker entryFromSle{sle};
246 EXPECT_TRUE(entryFromBuilder.validate());
247 EXPECT_TRUE(entryFromSle.validate());
248
249 {
250 auto const& expected = previousTxnIDValue;
251
252 auto const fromSle = entryFromSle.getPreviousTxnID();
253 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
254
255 expectEqualField(expected, fromSle, "sfPreviousTxnID");
256 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
257 }
258
259 {
260 auto const& expected = previousTxnLgrSeqValue;
261
262 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
263 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
264
265 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
266 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
267 }
268
269 {
270 auto const& expected = sequenceValue;
271
272 auto const fromSle = entryFromSle.getSequence();
273 auto const fromBuilder = entryFromBuilder.getSequence();
274
275 expectEqualField(expected, fromSle, "sfSequence");
276 expectEqualField(expected, fromBuilder, "sfSequence");
277 }
278
279 {
280 auto const& expected = ownerNodeValue;
281
282 auto const fromSle = entryFromSle.getOwnerNode();
283 auto const fromBuilder = entryFromBuilder.getOwnerNode();
284
285 expectEqualField(expected, fromSle, "sfOwnerNode");
286 expectEqualField(expected, fromBuilder, "sfOwnerNode");
287 }
288
289 {
290 auto const& expected = vaultNodeValue;
291
292 auto const fromSle = entryFromSle.getVaultNode();
293 auto const fromBuilder = entryFromBuilder.getVaultNode();
294
295 expectEqualField(expected, fromSle, "sfVaultNode");
296 expectEqualField(expected, fromBuilder, "sfVaultNode");
297 }
298
299 {
300 auto const& expected = vaultIDValue;
301
302 auto const fromSle = entryFromSle.getVaultID();
303 auto const fromBuilder = entryFromBuilder.getVaultID();
304
305 expectEqualField(expected, fromSle, "sfVaultID");
306 expectEqualField(expected, fromBuilder, "sfVaultID");
307 }
308
309 {
310 auto const& expected = accountValue;
311
312 auto const fromSle = entryFromSle.getAccount();
313 auto const fromBuilder = entryFromBuilder.getAccount();
314
315 expectEqualField(expected, fromSle, "sfAccount");
316 expectEqualField(expected, fromBuilder, "sfAccount");
317 }
318
319 {
320 auto const& expected = ownerValue;
321
322 auto const fromSle = entryFromSle.getOwner();
323 auto const fromBuilder = entryFromBuilder.getOwner();
324
325 expectEqualField(expected, fromSle, "sfOwner");
326 expectEqualField(expected, fromBuilder, "sfOwner");
327 }
328
329 {
330 auto const& expected = loanSequenceValue;
331
332 auto const fromSle = entryFromSle.getLoanSequence();
333 auto const fromBuilder = entryFromBuilder.getLoanSequence();
334
335 expectEqualField(expected, fromSle, "sfLoanSequence");
336 expectEqualField(expected, fromBuilder, "sfLoanSequence");
337 }
338
339 {
340 auto const& expected = dataValue;
341
342 auto const fromSleOpt = entryFromSle.getData();
343 auto const fromBuilderOpt = entryFromBuilder.getData();
344
345 ASSERT_TRUE(fromSleOpt.has_value());
346 ASSERT_TRUE(fromBuilderOpt.has_value());
347
348 expectEqualField(expected, *fromSleOpt, "sfData");
349 expectEqualField(expected, *fromBuilderOpt, "sfData");
350 }
351
352 {
353 auto const& expected = managementFeeRateValue;
354
355 auto const fromSleOpt = entryFromSle.getManagementFeeRate();
356 auto const fromBuilderOpt = entryFromBuilder.getManagementFeeRate();
357
358 ASSERT_TRUE(fromSleOpt.has_value());
359 ASSERT_TRUE(fromBuilderOpt.has_value());
360
361 expectEqualField(expected, *fromSleOpt, "sfManagementFeeRate");
362 expectEqualField(expected, *fromBuilderOpt, "sfManagementFeeRate");
363 }
364
365 {
366 auto const& expected = ownerCountValue;
367
368 auto const fromSleOpt = entryFromSle.getOwnerCount();
369 auto const fromBuilderOpt = entryFromBuilder.getOwnerCount();
370
371 ASSERT_TRUE(fromSleOpt.has_value());
372 ASSERT_TRUE(fromBuilderOpt.has_value());
373
374 expectEqualField(expected, *fromSleOpt, "sfOwnerCount");
375 expectEqualField(expected, *fromBuilderOpt, "sfOwnerCount");
376 }
377
378 {
379 auto const& expected = debtTotalValue;
380
381 auto const fromSleOpt = entryFromSle.getDebtTotal();
382 auto const fromBuilderOpt = entryFromBuilder.getDebtTotal();
383
384 ASSERT_TRUE(fromSleOpt.has_value());
385 ASSERT_TRUE(fromBuilderOpt.has_value());
386
387 expectEqualField(expected, *fromSleOpt, "sfDebtTotal");
388 expectEqualField(expected, *fromBuilderOpt, "sfDebtTotal");
389 }
390
391 {
392 auto const& expected = debtMaximumValue;
393
394 auto const fromSleOpt = entryFromSle.getDebtMaximum();
395 auto const fromBuilderOpt = entryFromBuilder.getDebtMaximum();
396
397 ASSERT_TRUE(fromSleOpt.has_value());
398 ASSERT_TRUE(fromBuilderOpt.has_value());
399
400 expectEqualField(expected, *fromSleOpt, "sfDebtMaximum");
401 expectEqualField(expected, *fromBuilderOpt, "sfDebtMaximum");
402 }
403
404 {
405 auto const& expected = coverAvailableValue;
406
407 auto const fromSleOpt = entryFromSle.getCoverAvailable();
408 auto const fromBuilderOpt = entryFromBuilder.getCoverAvailable();
409
410 ASSERT_TRUE(fromSleOpt.has_value());
411 ASSERT_TRUE(fromBuilderOpt.has_value());
412
413 expectEqualField(expected, *fromSleOpt, "sfCoverAvailable");
414 expectEqualField(expected, *fromBuilderOpt, "sfCoverAvailable");
415 }
416
417 {
418 auto const& expected = coverRateMinimumValue;
419
420 auto const fromSleOpt = entryFromSle.getCoverRateMinimum();
421 auto const fromBuilderOpt = entryFromBuilder.getCoverRateMinimum();
422
423 ASSERT_TRUE(fromSleOpt.has_value());
424 ASSERT_TRUE(fromBuilderOpt.has_value());
425
426 expectEqualField(expected, *fromSleOpt, "sfCoverRateMinimum");
427 expectEqualField(expected, *fromBuilderOpt, "sfCoverRateMinimum");
428 }
429
430 {
431 auto const& expected = coverRateLiquidationValue;
432
433 auto const fromSleOpt = entryFromSle.getCoverRateLiquidation();
434 auto const fromBuilderOpt = entryFromBuilder.getCoverRateLiquidation();
435
436 ASSERT_TRUE(fromSleOpt.has_value());
437 ASSERT_TRUE(fromBuilderOpt.has_value());
438
439 expectEqualField(expected, *fromSleOpt, "sfCoverRateLiquidation");
440 expectEqualField(expected, *fromBuilderOpt, "sfCoverRateLiquidation");
441 }
442
443 EXPECT_EQ(entryFromSle.getKey(), index);
444 EXPECT_EQ(entryFromBuilder.getKey(), index);
445}
446
447// 3) Verify wrapper throws when constructed from wrong ledger entry type.
448TEST(LoanBrokerTests, WrapperThrowsOnWrongEntryType)
449{
450 uint256 const index{3u};
451
452 // Build a valid ledger entry of a different type
453 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
454 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
455 TicketBuilder wrongBuilder{
461 auto wrongEntry = wrongBuilder.build(index);
462
463 EXPECT_THROW(LoanBroker{wrongEntry.getSle()}, std::runtime_error);
464}
465
466// 4) Verify builder throws when constructed from wrong ledger entry type.
467TEST(LoanBrokerTests, BuilderThrowsOnWrongEntryType)
468{
469 uint256 const index{4u};
470
471 // Build a valid ledger entry of a different type
472 TicketBuilder wrongBuilder{
478 auto wrongEntry = wrongBuilder.build(index);
479
480 EXPECT_THROW(LoanBrokerBuilder{wrongEntry.getSle()}, std::runtime_error);
481}
482
483// 5) Build with only required fields and verify optional fields return nullopt.
484TEST(LoanBrokerTests, OptionalFieldsReturnNullopt)
485{
486 uint256 const index{3u};
487
488 auto const previousTxnIDValue = canonical_UINT256();
489 auto const previousTxnLgrSeqValue = canonical_UINT32();
490 auto const sequenceValue = canonical_UINT32();
491 auto const ownerNodeValue = canonical_UINT64();
492 auto const vaultNodeValue = canonical_UINT64();
493 auto const vaultIDValue = canonical_UINT256();
494 auto const accountValue = canonical_ACCOUNT();
495 auto const ownerValue = canonical_ACCOUNT();
496 auto const loanSequenceValue = canonical_UINT32();
497
498 LoanBrokerBuilder builder{
499 previousTxnIDValue,
500 previousTxnLgrSeqValue,
501 sequenceValue,
502 ownerNodeValue,
503 vaultNodeValue,
504 vaultIDValue,
505 accountValue,
506 ownerValue,
507 loanSequenceValue
508 };
509
510 auto const entry = builder.build(index);
511
512 // Verify optional fields are not present
513 EXPECT_FALSE(entry.hasData());
514 EXPECT_FALSE(entry.getData().has_value());
515 EXPECT_FALSE(entry.hasManagementFeeRate());
516 EXPECT_FALSE(entry.getManagementFeeRate().has_value());
517 EXPECT_FALSE(entry.hasOwnerCount());
518 EXPECT_FALSE(entry.getOwnerCount().has_value());
519 EXPECT_FALSE(entry.hasDebtTotal());
520 EXPECT_FALSE(entry.getDebtTotal().has_value());
521 EXPECT_FALSE(entry.hasDebtMaximum());
522 EXPECT_FALSE(entry.getDebtMaximum().has_value());
523 EXPECT_FALSE(entry.hasCoverAvailable());
524 EXPECT_FALSE(entry.getCoverAvailable().has_value());
525 EXPECT_FALSE(entry.hasCoverRateMinimum());
526 EXPECT_FALSE(entry.getCoverRateMinimum().has_value());
527 EXPECT_FALSE(entry.hasCoverRateLiquidation());
528 EXPECT_FALSE(entry.getCoverRateLiquidation().has_value());
529}
530}
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 LoanBroker ledger entries.
Definition LoanBroker.h:348
LoanBrokerBuilder & setCoverRateMinimum(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfCoverRateMinimum (soeDEFAULT)
Definition LoanBroker.h:562
LoanBrokerBuilder & setDebtTotal(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfDebtTotal (soeDEFAULT)
Definition LoanBroker.h:529
LoanBrokerBuilder & setDebtMaximum(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfDebtMaximum (soeDEFAULT)
Definition LoanBroker.h:540
LoanBrokerBuilder & setCoverAvailable(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfCoverAvailable (soeDEFAULT)
Definition LoanBroker.h:551
LoanBrokerBuilder & setData(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfData (soeDEFAULT)
Definition LoanBroker.h:496
LoanBrokerBuilder & setCoverRateLiquidation(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfCoverRateLiquidation (soeDEFAULT)
Definition LoanBroker.h:573
LoanBrokerBuilder & setManagementFeeRate(std::decay_t< typename SF_UINT16::type::value_type > const &value)
Set sfManagementFeeRate (soeDEFAULT)
Definition LoanBroker.h:507
LoanBrokerBuilder & setOwnerCount(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfOwnerCount (soeDEFAULT)
Definition LoanBroker.h:518
Ledger Entry: LoanBroker.
Definition LoanBroker.h:28
static constexpr LedgerEntryType entryType
Definition LoanBroker.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)