GnuCash  5.6-150-g038405b370+
test_numeric.py
1 from unittest import TestCase, main
2 
3 from gnucash import GncNumeric, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED, \
4  GNC_HOW_RND_NEVER, GNC_HOW_RND_FLOOR, GNC_HOW_RND_CEIL
5 
6 class 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 
101 if __name__ == '__main__':
102  main()