Add unit tests

This commit is contained in:
JCW
2026-02-11 11:38:44 +00:00
parent 93e98ac714
commit 281dbd2873
7 changed files with 3108 additions and 7738 deletions

View File

@@ -106,8 +106,7 @@ template <class T>
concept Integral64 = std::is_same_v<T, std::int64_t> || std::is_same_v<T, std::uint64_t>;
template <class STAmount, class Asset>
concept CanUseAsScale = requires(Asset a, Number n) { STAmount(a, n); } &&
requires(STAmount s) { s.exponent(); };
concept CanUseAsScale = requires(Asset a, Number n) { STAmount(a, n); } && requires(STAmount s) { s.exponent(); };
/** Number is a floating point type that can represent a wide range of values.
*

View File

@@ -3728,8 +3728,7 @@ class Invariants_test : public beast::unit_test::suite
NumberMantissaScaleGuard g{MantissaRange::large};
auto makeDelta =
[&vaultAsset](Number const& n) -> ValidVault::DeltaInfo {
auto makeDelta = [&vaultAsset](Number const& n) -> ValidVault::DeltaInfo {
return {n, n.scale<STAmount>(vaultAsset.raw())};
};
@@ -3742,24 +3741,17 @@ class Invariants_test : public beast::unit_test::suite
{
.name = "Mixed integer and Number values",
.expectedMinScale = -15,
.values =
{makeDelta(1), makeDelta(-1), makeDelta(Number{10, -1})},
.values = {makeDelta(1), makeDelta(-1), makeDelta(Number{10, -1})},
},
{
.name = "Mixed scales",
.expectedMinScale = -17,
.values =
{makeDelta(Number{1, -2}),
makeDelta(Number{5, -3}),
makeDelta(Number{3, -2})},
.values = {makeDelta(Number{1, -2}), makeDelta(Number{5, -3}), makeDelta(Number{3, -2})},
},
{
.name = "Equal scales",
.expectedMinScale = -16,
.values =
{makeDelta(Number{1, -1}),
makeDelta(Number{5, -1}),
makeDelta(Number{1, -1})},
.values = {makeDelta(Number{1, -1}), makeDelta(Number{5, -1}), makeDelta(Number{1, -1})},
},
{
.name = "Mixed mantissa sizes",
@@ -3776,24 +3768,20 @@ class Invariants_test : public beast::unit_test::suite
{
testcase("vault computeMinScale: " + tc.name);
auto const actualScale =
ValidVault::computeMinScale(vaultAsset, tc.values);
auto const actualScale = ValidVault::computeMinScale(vaultAsset, tc.values);
BEAST_EXPECTS(
actualScale == tc.expectedMinScale,
"expected: " + std::to_string(tc.expectedMinScale) +
", actual: " + std::to_string(actualScale));
"expected: " + std::to_string(tc.expectedMinScale) + ", actual: " + std::to_string(actualScale));
for (auto const& num : tc.values)
{
// None of these scales are far enough apart that rounding the
// values would lose information, so check that the rounded
// value matches the original.
auto const actualRounded =
roundToAsset(vaultAsset, num.delta, actualScale);
auto const actualRounded = roundToAsset(vaultAsset, num.delta, actualScale);
BEAST_EXPECTS(
actualRounded == num.delta,
"number " + to_string(num.delta) + " rounded to scale " +
std::to_string(actualScale) + " is " +
"number " + to_string(num.delta) + " rounded to scale " + std::to_string(actualScale) + " is " +
to_string(actualRounded));
}
}
@@ -3817,13 +3805,11 @@ class Invariants_test : public beast::unit_test::suite
{
testcase("vault computeMinScale: " + tc.name);
auto const actualScale =
ValidVault::computeMinScale(vaultAsset, tc.values);
auto const actualScale = ValidVault::computeMinScale(vaultAsset, tc.values);
BEAST_EXPECTS(
actualScale == tc.expectedMinScale,
"expected: " + std::to_string(tc.expectedMinScale) +
", actual: " + std::to_string(actualScale));
"expected: " + std::to_string(tc.expectedMinScale) + ", actual: " + std::to_string(actualScale));
std::optional<Number> first;
Number firstRounded;
for (auto const& num : tc.values)
@@ -3831,16 +3817,14 @@ class Invariants_test : public beast::unit_test::suite
if (!first)
{
first = num.delta;
firstRounded =
roundToAsset(vaultAsset, num.delta, actualScale);
firstRounded = roundToAsset(vaultAsset, num.delta, actualScale);
continue;
}
auto const numRounded =
roundToAsset(vaultAsset, num.delta, actualScale);
auto const numRounded = roundToAsset(vaultAsset, num.delta, actualScale);
BEAST_EXPECTS(
numRounded != firstRounded,
"at a scale of " + std::to_string(actualScale) + " " +
to_string(num.delta) + " == " + to_string(*first));
"at a scale of " + std::to_string(actualScale) + " " + to_string(num.delta) +
" == " + to_string(*first));
}
}
}

2513
src/test/app/Loan/LoanBase.h Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -14,7 +14,8 @@ namespace jtx {
std::tuple<Json::Value, Keylet>
Vault::create(CreateArgs const& args)
{
auto keylet = keylet::vault(args.owner.id(), env.seq(args.owner));
auto sequence = args.sequence ? *args.sequence : env.seq(args.owner);
auto keylet = keylet::vault(args.owner.id(), sequence);
Json::Value jv;
jv[jss::TransactionType] = jss::VaultCreate;
jv[jss::Account] = args.owner.human();

View File

@@ -26,6 +26,7 @@ struct Vault
Account owner;
Asset asset;
std::optional<std::uint32_t> flags{};
std::optional<uint32_t> sequence;
};
/** Return a VaultCreate transaction and the Vault's expected keylet. */