Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(vaultFactory): refactor to macro #5900

Merged
merged 2 commits into from
Sep 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/SwingSet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
},
"peerDependencies": {
"@endo/ses-ava": "^0.2.31",
"ava": "^3.12.1"
"ava": "^4.3.1"
},
"files": [
"bin/vat",
Expand Down
82 changes: 37 additions & 45 deletions packages/inter-protocol/test/test-interest-math.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ import { makeIssuerKit, AmountMath } from '@agoric/ertp';
import { makeRatio } from '@agoric/zoe/src/contractSupport/ratio.js';
import { calculateCurrentDebt, reverseInterest } from '../src/interest-math.js';

const runBrand = makeIssuerKit('run').brand;
const brand = makeIssuerKit('foo').brand;

/**
* @param {*} t
* @param {readonly [bigint, bigint, bigint]} input
* @param {bigint} result
*/
function checkDebt(t, input, result) {
function checkDebt(t, [debt, interest, compounded], result) {
/** @type {Amount<'nat'>} */
const debtSnapshot = AmountMath.make(runBrand, input[0]);
const interestSnapshot = makeRatio(100n + input[1], runBrand);
const currentCompoundedInterest = makeRatio(100n + input[2], runBrand);
const debtSnapshot = AmountMath.make(brand, debt);
const interestSnapshot = makeRatio(100n + interest, brand);
const currentCompoundedInterest = makeRatio(100n + compounded, brand);
t.is(
calculateCurrentDebt(
debtSnapshot,
Expand All @@ -28,47 +28,39 @@ function checkDebt(t, input, result) {
);
}

for (const [input, result] of /** @type {const} */ ([
// no debt
[[0n, 0n, 0n], 0n],
[[0n, 0n, 250n], 0n],
test('no debt wo/compounding', checkDebt, [0n, 0n, 0n], 0n);
test('no debt w/ compounding', checkDebt, [0n, 0n, 250n], 0n);
test('some debt wo/compounding', checkDebt, [1_000_000n, 0n, 0n], 1_000_000n);
test('some debt w/ compounding', checkDebt, [1_000_000n, 0n, 2n], 1_020_000n);
test(
'previous interest wo/compounding',
checkDebt,
[1_000_000n, 2n, 2n],
1_000_000n,
);
test(
'previous interest w/ compounding',
checkDebt,
[1_000_000n, 2n, 4n],
1_019_608n,
);
test(
'previous interest, compounded down',
checkDebt,
[1_000_000n, 2n, 0n], // negative interest since snapshot
980_392n,
);

// some debt
[[1_000_000n, 0n, 0n], 1_000_000n],
[[1_000_000n, 0n, 2n], 1_020_000n],

// some debt and previous interest
[[1_000_000n, 2n, 0n], 980_392n], // negative interest since snapshot
[[1_000_000n, 2n, 2n], 1_000_000n],
[[1_000_000n, 2n, 4n], 1_019_608n],
])) {
test(
`calculateCurrentDebt ${input} returns ${result}`,
checkDebt,
input,
result,
);
function checkReverse(t, [debt, interest], result) {
// /** @type {Amount<'nat'>} */
const debtSnap = AmountMath.make(brand, debt);
const interestApplied = makeRatio(100n + interest, brand);
t.deepEqual(reverseInterest(debtSnap, interestApplied).value, result);
}

function checkReverse(t, input, result) {
/** @type {Amount<'nat'>} */
const debt = AmountMath.make(runBrand, input[0]);
const interestApplied = makeRatio(100n + input[1], runBrand);
t.deepEqual(reverseInterest(debt, interestApplied).value, result);
}
test('none', checkReverse, [0n, 0n], 0n);
test('none w/interest', checkReverse, [0n, 1n], 0n);

for (const [input, result] of /** @type {const} */ ([
[[0n, 0n], 0n],
[[0n, 1n], 0n],

[[1_000_000n, 0n], 1_000_000n],
[[1_000_000n, 2n], 980_392n],
[[1_000_000n, 100n], 500_000n],
])) {
test(
`reverseInterest ${input} returns ${result}`,
checkReverse,
input,
result,
);
}
test('some', checkReverse, [1_000_000n, 0n], 1_000_000n);
test('some w/interest', checkReverse, [1_000_000n, 2n], 980_392n);
test('some w/100% interest', checkReverse, [1_000_000n, 100n], 500_000n);
76 changes: 42 additions & 34 deletions packages/inter-protocol/test/vaultFactory/test-storeUtils.js
Original file line number Diff line number Diff line change
@@ -1,50 +1,58 @@
// @ts-check
// Must be first to set up globals
import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js';
import '@endo/init/debug.js';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add TODO comment to switch back to ses-ava once endojs/endo#1235 is fixed. (I see you already include the need to fix ava macros in the issue, thanks)

// Consider ses-ava once https://github.com/endojs/endo/issues/1235 is resolved
import test from 'ava';

import { AmountMath } from '@agoric/ertp';
import { Far } from '@endo/marshal';
import * as StoreUtils from '../../src/vaultFactory/storeUtils.js';

export const mockBrand = Far('brand');

for (const [debt, collat, vaultId, expectedKey, numberOut] of [
[0, 100, 'vault-A', 'fc399000000000000:vault-A', 450359962737049600], // Infinity collateralized but we treat 0 as epsilon for safer serialization
[1, 100, 'vault-B', 'fc059000000000000:vault-B', 100.0],
[1000, 100, 'vault-C', 'fbfb999999999999a:vault-C', 0.1],
[1000, 101, 'vault-D', 'fbfb9db22d0e56042:vault-D', 0.101],
[
100,
Number.MAX_SAFE_INTEGER,
'vault-MAX-COLLATERAL',
'fc2d47ae147ae147a:vault-MAX-COLLATERAL',
90071992547409.9,
],
[
Number.MAX_SAFE_INTEGER,
100,
'vault-MAX-DEBT',
'fbd09000000000001:vault-MAX-DEBT',
1.1102230246251567e-14,
],
[
Number.MAX_SAFE_INTEGER,
Number.MAX_SAFE_INTEGER,
'vault-MAX-EVEN',
'fbff0000000000000:vault-MAX-EVEN',
1,
],
[1, 0, 'vault-NOCOLLATERAL', 'f8000000000000000:vault-NOCOLLATERAL', 0],
]) {
test(`vault keys: (${debt}/${collat}, ${vaultId}) => ${expectedKey} ==> ${numberOut}, ${vaultId}`, t => {
const keysMatch = test.macro({
exec(t, [debt, collat, vaultId], [expectedKey, numberOut]) {
const key = StoreUtils.toVaultKey(
// @ts-expect-error cast to NormalizedDebt
AmountMath.make(mockBrand, BigInt(debt)),
AmountMath.make(mockBrand, BigInt(collat)),
String(vaultId),
);
// @ts-expect-error TODO use macros
t.is(key, expectedKey);
t.deepEqual(StoreUtils.fromVaultKey(key), [numberOut, vaultId]);
});
}
},
title(providedTitle = '', [debt, collat, vaultId], [expectedKey, numberOut]) {
return `${providedTitle} (${debt}/${collat}, ${vaultId}) => ${expectedKey} ==> ${numberOut}, ${vaultId})`;
},
});

test(
'Infinity collateralized',
keysMatch,
[0, 100, 'vault-A'],
// treat 0 as epsilon for safer serialization
['fc399000000000000:vault-A', 450359962737049600],
);
test(keysMatch, [1, 100, 'vault-B'], ['fc059000000000000:vault-B', 100.0]);
test(keysMatch, [1000, 100, 'vault-C'], ['fbfb999999999999a:vault-C', 0.1]);
test(keysMatch, [1000, 101, 'vault-D'], ['fbfb9db22d0e56042:vault-D', 0.101]);

test(
keysMatch,
[100, Number.MAX_SAFE_INTEGER, 'vault-MAX-COLLATERAL'],
['fc2d47ae147ae147a:vault-MAX-COLLATERAL', 90071992547409.9],
);
test(
keysMatch,
[Number.MAX_SAFE_INTEGER, 100, 'vault-MAX-DEBT'],
['fbd09000000000001:vault-MAX-DEBT', 1.1102230246251567e-14],
);
test(
keysMatch,
[Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 'vault-MAX-EVEN'],
['fbff0000000000000:vault-MAX-EVEN', 1],
);
test(
keysMatch,
[1, 0, 'vault-NOCOLLATERAL'],
['f8000000000000000:vault-NOCOLLATERAL', 0],
);