GnuCash  5.6-150-g038405b370+
test_function_class.py
1 # test cases for function_class.py
2 #
3 # @date 2020-06-18
4 # @author Christoph Holtermann <mail@c-holtermann.net>
5 
6 import sys
7 from unittest import TestCase, main
8 from gnucash.function_class import ClassFromFunctions, default_arguments_decorator
9 
10 
11 class Instance:
12  """instance class for ClassFromFunction tests"""
13 
14  pass
15 
16 
17 def prefix_new_function():
18  """new function for ClassFromFunction tests
19 
20  returns instance of Instance class"""
21  return Instance()
22 
23 
24 def prefix_test_function(self):
25  """test function for ClassFromFunction tests"""
26  return True
27 
28 
29 def prefix_test_function_return_args(self, *args, **kargs):
30  return self, args, kargs
31 
32 
33 b_default = "b default value"
34 
35 
36 def prefix_test_function_return_arg_karg(self, a, b=b_default):
37  return {"self": self, "a": a, "b": b}
38 
39 
40 def other_function(self, arg=None):
41  return self, arg
42 
43 
44 class TestClass(ClassFromFunctions):
45  _module = sys.modules[__name__]
46 
47  pass
48 
49 
50 class TestFunctionClass(TestCase):
51  def test_add_constructor_and_methods_with_prefix(self):
52  TestClass.add_constructor_and_methods_with_prefix("prefix_", "new_function")
53  self.TestClass = TestClass
54  self.testClass = TestClass()
55  self.assertIsInstance(self.testClass.instance, Instance)
56  self.assertTrue(self.testClass.test_function())
57 
58  def test_add_method(self):
59  """test if add_method adds method and if in case of FunctionClass
60  Instance instances get returned instead of FunctionClass instances"""
61  TestClass.add_method("other_function", "other_method")
62  self.t = TestClass()
63  obj, arg = self.t.other_method()
64  self.assertIsInstance(obj, Instance)
65  obj, arg = self.t.other_method(self.t)
66  self.assertIsInstance(arg, Instance)
67  obj, arg = self.t.other_method(arg=self.t)
68  self.assertIsInstance(arg, Instance)
69 
70  def test_ya_add_method(self):
71  """test if ya_add_method adds method and if in case of FunctionClass
72  Instance instances get returned instead of FunctionClass instances
73  with the exception of self (first) argument"""
74  TestClass.ya_add_method("other_function", "other_method")
75  self.t = TestClass()
76  obj, arg = self.t.other_method()
77  self.assertIsInstance(obj, TestClass)
78  obj, arg = self.t.other_method(self.t)
79  self.assertIsInstance(arg, Instance)
80  obj, arg = self.t.other_method(arg=self.t)
81  self.assertIsInstance(arg, Instance)
82 
84  """test default_arguments_decorator()"""
85  TestClass.backup_test_function_return_args = TestClass.test_function_return_args
86  TestClass.backup_test_function_return_arg_karg = (
87  TestClass.test_function_return_arg_karg
88  )
89  self.t = TestClass()
90 
91  arg1 = "arg1"
92  arg2 = "arg2"
93  arg3 = {"arg3": arg2}
94  arg4 = 4
95  TestClass.decorate_method(
96  default_arguments_decorator, "test_function_return_args", arg1, arg2
97  )
98  self.assertEqual(
99  self.t.test_function_return_args(), (self.t.instance, (arg2,), {})
100  ) # default arg1 gets overwritten by class instances instance attribute
101  self.assertEqual(
102  self.t.test_function_return_args(arg3), (self.t.instance, (arg3,), {})
103  )
104  self.assertEqual(
105  self.t.test_function_return_args(arg1, arg3),
106  (self.t.instance, (arg1, arg3), {}),
107  )
108  self.assertEqual(
109  self.t.test_function_return_args(arg1, arg3, arg4=arg4),
110  (self.t.instance, (arg1, arg3), {"arg4": arg4}),
111  )
112 
113  TestClass.test_function_return_args = TestClass.backup_test_function_return_args
114  TestClass.decorate_method(
115  default_arguments_decorator,
116  "test_function_return_args",
117  arg1,
118  arg2,
119  arg4=arg4,
120  )
121  self.assertEqual(
122  self.t.test_function_return_args(),
123  (self.t.instance, (arg2,), {"arg4": arg4}),
124  )
125  self.assertEqual(
126  self.t.test_function_return_args(arg1, arg3, arg4=arg2),
127  (self.t.instance, (arg1, arg3), {"arg4": arg2}),
128  )
129 
130  with self.assertRaises(TypeError):
131  # should fail because a is set both as a positional and as a keyword argument
132  TestClass.decorate_method(
133  default_arguments_decorator,
134  "test_function_return_arg_karg",
135  None,
136  arg1,
137  a=arg2,
138  kargs_pos={"a": 1, "b": 2},
139  )
140  TestClass.decorate_method(
141  default_arguments_decorator,
142  "test_function_return_arg_karg",
143  None,
144  a=arg1,
145  kargs_pos={"a": 1, "b": 2},
146  )
147  self.assertEqual(
148  self.t.test_function_return_arg_karg(),
149  {"self": self.t.instance, "a": arg1, "b": b_default},
150  )
151 
152  TestClass.test_function_return_arg_karg = (
153  TestClass.backup_test_function_return_arg_karg
154  )
155  TestClass.decorate_method(
156  default_arguments_decorator,
157  "test_function_return_arg_karg",
158  None,
159  arg1,
160  kargs_pos={"a": 1, "b": 2},
161  )
162  self.assertEqual(
163  self.t.test_function_return_arg_karg(),
164  {"self": self.t.instance, "a": arg1, "b": b_default},
165  )
166  self.assertEqual(
167  self.t.test_function_return_arg_karg(arg2),
168  {"self": self.t.instance, "a": arg2, "b": b_default},
169  )
170  self.assertEqual(
171  self.t.test_function_return_arg_karg(arg2, arg3),
172  {"self": self.t.instance, "a": arg2, "b": arg3},
173  )
174 
175 
176 if __name__ == "__main__":
177  main()