/* This file is part of GNU Taler (C) 2022 Taler Systems S.A. GNU Taler is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ import { AbsoluteTime, AgeRestriction, AmountJson, Amounts, DenomKeyType, Duration, TransactionAmountMode, } from "@gnu-taler/taler-util"; import test, { ExecutionContext } from "ava"; import { testing_greedySelectPeer } from "./coinSelection.js" type Tester = { deep: { equal(another: T): ReturnType; equals(another: T): ReturnType; } } function expect(t: ExecutionContext, thing: T): Tester { return { deep: { equal: (another: T) => t.deepEqual(thing, another), equals: (another: T) => t.deepEqual(thing, another), }, }; } const inTheDistantFuture = AbsoluteTime.toProtocolTimestamp( AbsoluteTime.addDuration(AbsoluteTime.now(), Duration.fromSpec({ hours: 1 })) ) const inThePast = AbsoluteTime.toProtocolTimestamp( AbsoluteTime.subtractDuraction(AbsoluteTime.now(), Duration.fromSpec({ hours: 1 })) ) test("should select the coin", (t) => { const instructedAmount = Amounts.parseOrThrow("LOCAL:2") const tally = { amountAcc: Amounts.zeroOfCurrency(instructedAmount.currency), depositFeesAcc: Amounts.zeroOfCurrency(instructedAmount.currency), lastDepositFee: Amounts.zeroOfCurrency(instructedAmount.currency), }; const coins = testing_greedySelectPeer( // candidates available [{ "denomPub": { "age_mask": 0, "cipher": DenomKeyType.Rsa, "rsa_public_key": "PPP" }, "denomPubHash": "XXX", "value": "LOCAL:10", "feeDeposit": "LOCAL:0.1", "feeRefresh": "LOCAL:0", "feeRefund": "LOCAL:0", "feeWithdraw": "LOCAL:0", "stampExpireDeposit": inTheDistantFuture, "stampExpireLegal": inTheDistantFuture, "stampExpireWithdraw": inTheDistantFuture, "stampStart": inThePast, "exchangeBaseUrl": "http://exchange.localhost/", "numAvailable": 5, "maxAge": 32 }], instructedAmount, tally); expect(t, coins).deep.equal({ "XXX;32;http://exchange.localhost/": { exchangeBaseUrl: "http://exchange.localhost/", denomPubHash: "XXX", maxAge: 32, contributions: [Amounts.parseOrThrow("LOCAL:2")], } }); });