reports: Add Balance subtraction methods.
This commit is contained in:
parent
f21ac740f2
commit
b2e35d098a
2 changed files with 45 additions and 0 deletions
|
@ -133,6 +133,9 @@ class Balance(Mapping[str, data.Amount]):
|
||||||
self._add_other(retval_map, other)
|
self._add_other(retval_map, other)
|
||||||
return type(self)(retval_map.values())
|
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:
|
def __eq__(self, other: Any) -> bool:
|
||||||
if isinstance(other, Balance):
|
if isinstance(other, Balance):
|
||||||
clean_self = self.clean_copy()
|
clean_self = self.clean_copy()
|
||||||
|
@ -228,6 +231,10 @@ class MutableBalance(Balance):
|
||||||
self._add_other(self._currency_map, other)
|
self._add_other(self._currency_map, other)
|
||||||
return self
|
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]):
|
class RelatedPostings(Sequence[data.Posting]):
|
||||||
"""Collect and query related postings
|
"""Collect and query related postings
|
||||||
|
|
|
@ -270,6 +270,44 @@ def test_iadd_amount(number, currency):
|
||||||
assert balance['USD'] == testutil.Amount(500)
|
assert balance['USD'] == testutil.Amount(500)
|
||||||
assert balance[currency] == add_amount
|
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', [
|
@pytest.mark.parametrize('mapping', [
|
||||||
{},
|
{},
|
||||||
{'USD': 0},
|
{'USD': 0},
|
||||||
|
|
Loading…
Reference in a new issue