2 from budget_sync
.money
import Money
, CENTS_PER_EURO
6 class TestMoney(unittest
.TestCase
):
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)))
18 def test_from_str(self
):
19 with self
.assertRaisesRegex(TypeError, "^Can't use Money\\.from_str to convert from non-str value$"):
21 with self
.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
23 with self
.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
25 with self
.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
27 with self
.assertRaisesRegex(ValueError, "^invalid Money string: missing digits$"):
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"))
54 self
.assertEqual(repr(Money("123.45")), "Money('123.45')")
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
))
67 for i
in range(-10, 10):
68 self
.assertEqual(bool(Money(cents
=i
)), bool(i
))
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
)
81 self
.add_sub_helper(operator
.add
)
82 self
.add_sub_helper(operator
.iadd
)
85 self
.add_sub_helper(operator
.sub
)
86 self
.add_sub_helper(operator
.isub
)
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
))
99 self
.mul_helper(operator
.mul
)
100 self
.mul_helper(operator
.imul
)
103 if __name__
== "__main__":