GnuCash c935c2f+
Loading...
Searching...
No Matches
test_numeric.py
1from unittest import TestCase, main
2
3from gnucash import GncNumeric, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED, \
4 GNC_HOW_RND_NEVER, GNC_HOW_RND_FLOOR, GNC_HOW_RND_CEIL
5
6class TestGncNumeric(TestCase):
7 def test_defaut(self):
8 num = GncNumeric()
9 self.assertEqual(str(num), "0/1")
10 self.assertEqual(num.num(), 0)
11 self.assertEqual(num.denom(), 1)
12
13 def test_from_num_denom(self):
14 num = GncNumeric(1, 2)
15 self.assertEqual(str(num), "1/2")
16 self.assertEqual(num.num(), 1)
17 self.assertEqual(num.denom(), 2)
18
19 def test_from_int(self):
20 num = GncNumeric(3)
21 self.assertEqual(str(num), "3/1")
22 self.assertEqual(num.num(), 3)
23 self.assertEqual(num.denom(), 1)
24
25 with self.assertRaises(Exception) as context:
26 GncNumeric((2**64)+1)
27
28 #On Linux it raises an OverflowError while on MacOS it's a TypeError.
29 self.assertTrue(isinstance(context.exception, TypeError) or
30 isinstance(context.exception, OverflowError))
31
32 def test_from_float(self):
33 num = GncNumeric(3.1, 20, GNC_HOW_DENOM_FIXED | GNC_HOW_RND_NEVER)
34 self.assertEqual(str(num), "62/20")
35 self.assertEqual(num.num(), 62)
36 self.assertEqual(num.denom(), 20)
37
38 num = GncNumeric(1/3.0, 10000000000, GNC_HOW_RND_FLOOR)
39 self.assertEqual(str(num), "3333333333/10000000000")
40 self.assertEqual(num.num(), 3333333333)
41 self.assertEqual(num.denom(), 10000000000)
42
43 num = GncNumeric(1/3.0, 10000000000, GNC_HOW_RND_CEIL)
44 self.assertEqual(str(num), "3333333334/10000000000")
45 self.assertEqual(num.num(), 3333333334)
46 self.assertEqual(num.denom(), 10000000000)
47
48 def test_from_float_auto(self):
49 num = GncNumeric(3.1)
50 self.assertEqual(str(num), "31/10")
51 self.assertEqual(num.num(), 31)
52 self.assertEqual(num.denom(), 10)
53
54 def test_from_instance(self):
55 orig = GncNumeric(3)
56 num = GncNumeric(instance=orig.instance)
57 self.assertEqual(str(num), "3/1")
58 self.assertEqual(num.num(), 3)
59 self.assertEqual(num.denom(), 1)
60
61 def test_from_str(self):
62 num = GncNumeric("3.1")
63 self.assertEqual(str(num), "31/10")
64 self.assertEqual(num.num(), 31)
65 self.assertEqual(num.denom(), 10)
66
67 num = GncNumeric("1/3")
68 self.assertEqual(str(num), "1/3")
69 self.assertEqual(num.num(), 1)
70 self.assertEqual(num.denom(), 3)
71
72 def test_to_str(self):
73 num = GncNumeric("1000/3")
74 self.assertEqual(str(num), "1000/3")
75
76 num = GncNumeric(1, 0)
77 self.assertEqual(str(num), "1/0")
78
79 def test_to_double(self):
80 for test_num in [0.0, 1.1, -1.1, 1/3.0]:
81 self.assertEqual(GncNumeric(test_num).to_double(), test_num)
82
83 def test_to_fraction(self):
84 fraction = GncNumeric("1000/3").to_fraction()
85 self.assertEqual(fraction.numerator, 1000)
86 self.assertEqual(fraction.denominator, 3)
87
88 def test_incorect_args(self):
89 with self.assertRaises(TypeError):
90 GncNumeric(1, 2, 3)
91
92 with self.assertRaises(TypeError):
93 GncNumeric("1", 2)
94
95 with self.assertRaises(TypeError):
96 GncNumeric(1.1, "round")
97
98 with self.assertRaises(TypeError):
99 GncNumeric(complex(1, 1))
100
101if __name__ == '__main__':
102 main()