all unit tests pass
[utils.git] / src / budget_sync / test / test_money.py
1 import unittest
2 from budget_sync.money import Money, CENTS_PER_EURO
3 import operator
4
5
6 class TestMoney(unittest.TestCase):
7 def test_str(self):
8 self.assertEqual("123.45", str(Money(cents=12345)))
9 self.assertEqual("123", str(Money(cents=12300)))
10 self.assertEqual("123.40", str(Money(cents=12340)))
11 self.assertEqual("120", str(Money(cents=12000)))
12 self.assertEqual("-123.45", str(Money(cents=-12345)))
13 self.assertEqual("-123", str(Money(cents=-12300)))
14 self.assertEqual("-123.40", str(Money(cents=-12340)))
15 self.assertEqual("-120", str(Money(cents=-12000)))
16 self.assertEqual("0", str(Money(cents=0)))
17
18 def test_from_str(self):
19 with self.assertRaisesRegex(TypeError, "^Can't use Money\\.from_str to convert from non-str value$"):
20 Money.from_str(123)
21 with self.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
22 Money.from_str("")
23 with self.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
24 Money.from_str(".")
25 with self.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
26 Money.from_str("-")
27 with self.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
28 Money.from_str("-.")
29 with self.assertRaisesRegex(ValueError, "^invalid Money string: characters after sign and before first `\\.` must be ascii digits$"):
30 Money.from_str("+asdjkhfk")
31 with self.assertRaisesRegex(ValueError, "^invalid Money string: too many digits after `\\.`$"):
32 Money.from_str("12.345")
33 with self.assertRaisesRegex(ValueError, "^invalid Money string: too many `\\.` characters$"):
34 Money.from_str("12.3.4")
35 self.assertEqual(Money(cents=0), Money.from_str("0"))
36 self.assertEqual(Money(cents=0), Money.from_str("+0"))
37 self.assertEqual(Money(cents=0), Money.from_str("-0"))
38 self.assertEqual(Money(cents=-1000), Money.from_str("-010"))
39 self.assertEqual(Money(cents=1000), Money.from_str("+010"))
40 self.assertEqual(Money(cents=1000), Money.from_str("010"))
41 self.assertEqual(Money(cents=1000), Money.from_str("10"))
42 self.assertEqual(Money(cents=1234), Money.from_str("12.34"))
43 self.assertEqual(Money(cents=-1234), Money.from_str("-12.34"))
44 self.assertEqual(Money(cents=-1234), Money.from_str("-12.34"))
45 self.assertEqual(Money(cents=1230), Money.from_str("12.3"))
46 self.assertEqual(Money(cents=1200), Money.from_str("12."))
47 self.assertEqual(Money(cents=1200), Money.from_str("12"))
48 self.assertEqual(Money(cents=0), Money.from_str(".0"))
49 self.assertEqual(Money(cents=10), Money.from_str(".1"))
50 self.assertEqual(Money(cents=12), Money.from_str(".12"))
51 self.assertEqual(Money(cents=-12), Money.from_str("-.12"))
52
53 def test_repr(self):
54 self.assertEqual(repr(Money("123.45")), "Money('123.45')")
55
56 def test_cmp(self):
57 for l in (-10, 10):
58 for r in (-10, 10):
59 self.assertEqual(l == r, Money(cents=l) == Money(cents=r))
60 self.assertEqual(l != r, Money(cents=l) != Money(cents=r))
61 self.assertEqual(l <= r, Money(cents=l) <= Money(cents=r))
62 self.assertEqual(l >= r, Money(cents=l) >= Money(cents=r))
63 self.assertEqual(l < r, Money(cents=l) < Money(cents=r))
64 self.assertEqual(l > r, Money(cents=l) > Money(cents=r))
65
66 def test_bool(self):
67 for i in range(-10, 10):
68 self.assertEqual(bool(Money(cents=i)), bool(i))
69
70 def add_sub_helper(self, op):
71 for l in range(-10, 10):
72 for r in range(-10, 10):
73 self.assertEqual(op(l, r * CENTS_PER_EURO),
74 op(Money(cents=l), r).cents)
75 self.assertEqual(op(l * CENTS_PER_EURO, r),
76 op(l, Money(cents=r)).cents)
77 self.assertEqual(op(l, r),
78 op(Money(cents=l), Money(cents=r)).cents)
79
80 def test_add(self):
81 self.add_sub_helper(operator.add)
82 self.add_sub_helper(operator.iadd)
83
84 def test_sub(self):
85 self.add_sub_helper(operator.sub)
86 self.add_sub_helper(operator.isub)
87
88 def mul_helper(self, op):
89 for l in range(-10, 10):
90 for r in range(-10, 10):
91 self.assertEqual(op(l, r),
92 op(Money(cents=l), r).cents)
93 self.assertEqual(op(l, r),
94 op(l, Money(cents=r)).cents)
95 with self.assertRaises(TypeError):
96 op(Money(cents=l), Money(cents=r))
97
98 def test_mul(self):
99 self.mul_helper(operator.mul)
100 self.mul_helper(operator.imul)
101
102
103 if __name__ == "__main__":
104 unittest.main()