reports: Add Balance subtraction methods.

This commit is contained in:
Brett Smith 2020-06-15 10:15:19 -04:00
parent f21ac740f2
commit b2e35d098a
2 changed files with 45 additions and 0 deletions

View file

@ -133,6 +133,9 @@ class Balance(Mapping[str, data.Amount]):
self._add_other(retval_map, other)
return type(self)(retval_map.values())
def __sub__(self: BalanceType, other: Union[data.Amount, 'Balance']) -> BalanceType:
return self.__add__(-other)
def __eq__(self, other: Any) -> bool:
if isinstance(other, Balance):
clean_self = self.clean_copy()
@ -228,6 +231,10 @@ class MutableBalance(Balance):
self._add_other(self._currency_map, other)
return self
def __isub__(self: BalanceType, other: Union[data.Amount, Balance]) -> BalanceType:
self._add_other(self._currency_map, -other)
return self
class RelatedPostings(Sequence[data.Posting]):
"""Collect and query related postings

View file

@ -270,6 +270,44 @@ def test_iadd_amount(number, currency):
assert balance['USD'] == testutil.Amount(500)
assert balance[currency] == add_amount
@pytest.mark.parametrize('number,currency', {
(50, 'USD'),
(-50, 'USD'),
(50000, 'BRL'),
(-4000, 'BRL'),
})
def test_sub_amount(number, currency):
start_amount = testutil.Amount(500, 'USD')
start_bal = core.Balance([start_amount])
sub_amount = testutil.Amount(number, currency)
actual = start_bal - sub_amount
if currency == 'USD':
assert len(actual) == 1
assert actual['USD'] == testutil.Amount(500 - number)
else:
assert len(actual) == 2
assert actual['USD'] == start_amount
assert actual[currency] == -sub_amount
assert start_bal == {'USD': start_amount}
@pytest.mark.parametrize('number,currency', {
(50, 'USD'),
(-50, 'USD'),
(50000, 'BRL'),
(-4000, 'BRL'),
})
def test_isub_amount(number, currency):
balance = core.MutableBalance([testutil.Amount(500, 'USD')])
sub_amount = testutil.Amount(number, currency)
balance -= sub_amount
if currency == 'USD':
assert len(balance) == 1
assert balance['USD'] == testutil.Amount(500 - number)
else:
assert len(balance) == 2
assert balance['USD'] == testutil.Amount(500)
assert balance[currency] == -sub_amount
@pytest.mark.parametrize('mapping', [
{},
{'USD': 0},