usawa

Signed, immutable accounting.
Log | Files | Refs | Submodules | LICENSE

balance.py (4120B)


      1 import logging
      2 import unittest
      3 import datetime
      4 import os
      5 
      6 from usawa import EntryPart, Entry, UnitIndex
      7 from usawa.balance import Balancer
      8 
      9 logging.basicConfig(level=logging.DEBUG)
     10 logg = logging.getLogger()
     11 
     12 testdir = os.path.realpath(os.path.dirname(__file__))
     13 
     14 class TestBalancer(unittest.TestCase):
     15 
     16 
     17     def setUp(self):
     18         self.parent = bytes.fromhex('0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6')
     19         self.ref = '1bda7dfa-b8fd-400d-8b42-1d2861ad7f70'
     20         self.uidx = UnitIndex('FOO')
     21         self.uidx.add('BAR', 3)
     22         self.description = "foo bar baz"
     23         self.dtreg = datetime.datetime.now()
     24 
     25 
     26     def test_balancer_parts_simple(self):
     27         o = Balancer(self.uidx)
     28         src = EntryPart('FOO.Income/baz', 1337, debit=True)
     29         o.apply_part(src)
     30         dst = EntryPart('FOO.Asset/foo', 1337)
     31         o.apply_part(dst)
     32         self.assertTrue(o.balanced())
     33 
     34 
     35     def test_balancer_parts_exchange(self):
     36         o = Balancer(self.uidx)
     37         self.uidx.set_rate('BAR', 230000000)
     38         src = EntryPart('BAR.Income/baz', 420000, debit=True)
     39         o.apply_part(src)
     40         dst = EntryPart('FOO.Asset/foo', 9660)
     41         o.apply_part(dst)
     42         self.assertTrue(o.balanced())
     43 
     44 
     45     def test_balance_accumulate_simple(self):
     46         o = Balancer(self.uidx)
     47         src = EntryPart('FOO.Asset/baz', -1337, debit=True)
     48         o.apply_part(src)
     49         dst = EntryPart('FOO.Asset/foo', 1337)
     50         o.apply_part(dst)
     51         self.assertTrue(o.balanced())
     52         self.assertEqual(o.value(), 1337)
     53 
     54         o = Balancer(self.uidx)
     55         src = EntryPart('FOO.Liability/baz', 1337, debit=True)
     56         o.apply_part(src)
     57         dst = EntryPart('FOO.Asset/foo', 1337)
     58         o.apply_part(dst)
     59         self.assertTrue(o.balanced())
     60         self.assertEqual(o.value(), 1337)
     61 
     62         o = Balancer(self.uidx)
     63         src = EntryPart('FOO.Liability/baz', 1337, debit=True)
     64         o.apply_part(src)
     65         dst = EntryPart('FOO.Liability/foo', -1337)
     66         o.apply_part(dst)
     67         self.assertTrue(o.balanced())
     68         self.assertEqual(o.value(), 1337)
     69 
     70         o = Balancer(self.uidx)
     71         src = EntryPart('FOO.Asset/baz', -1337, debit=True)
     72         o.apply_part(src)
     73         dst = EntryPart('FOO.Liability/foo', -1337)
     74         o.apply_part(dst)
     75         self.assertTrue(o.balanced())
     76         self.assertEqual(o.value(), 1337)
     77 
     78 
     79     def test_flow_accumulate_simple(self):
     80         o = Balancer(self.uidx)
     81         src = EntryPart('FOO.Asset/baz', -1337, debit=True)
     82         o.apply_part(src)
     83         dst = EntryPart('FOO.Expense/foo', 1337)
     84         o.apply_part(dst)
     85         self.assertTrue(o.balanced())
     86         self.assertEqual(o.value(), 1337)
     87 
     88         o = Balancer(self.uidx)
     89         src = EntryPart('FOO.Income/baz', 1337, debit=True)
     90         o.apply_part(src)
     91         dst = EntryPart('FOO.Asset/foo', 1337)
     92         o.apply_part(dst)
     93         self.assertTrue(o.balanced())
     94         self.assertEqual(o.value(), 1337)
     95 
     96         o = Balancer(self.uidx)
     97         src = EntryPart('FOO.Income/baz', 1337, debit=True)
     98         o.apply_part(src)
     99         dst = EntryPart('FOO.Expense/foo', 1337)
    100         o.apply_part(dst)
    101         self.assertTrue(o.balanced())
    102         self.assertEqual(o.value(), 1337)
    103 
    104         o = Balancer(self.uidx)
    105         src = EntryPart('FOO.Income/baz', 1337, debit=True)
    106         o.apply_part(src)
    107         dst = EntryPart('FOO.Liability/foo', -1337)
    108         o.apply_part(dst)
    109         self.assertTrue(o.balanced())
    110         self.assertEqual(o.value(), 1337)
    111 
    112 
    113     def test_balance_running(self):
    114         o = Balancer(self.uidx)
    115         src = EntryPart('FOO.Liability/foo', 1337, debit=True)
    116         o.apply_part(src)
    117         self.assertEqual(o.balance(), -1337)
    118 
    119         dst = EntryPart('FOO.Asset/bar', 42)
    120         o.apply_part(dst)
    121         self.assertEqual(o.balance(), -1295)
    122 
    123         dst = EntryPart('FOO.Expense/baz', 1295)
    124         o.apply_part(dst)
    125         self.assertTrue(o.balanced())
    126         self.assertEqual(o.value(), 1337)
    127 
    128 
    129 if __name__ == '__main__':
    130     unittest.main()