GnuCash c935c2f+
Loading...
Searching...
No Matches
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
6import sys
7from unittest import TestCase, main
8from gnucash.function_class import ClassFromFunctions, default_arguments_decorator
9
10
12 """instance class for ClassFromFunction tests"""
13
14 pass
15
16
17def prefix_new_function():
18 """new function for ClassFromFunction tests
19
20 returns instance of Instance class"""
21 return Instance()
22
23
24def prefix_test_function(self):
25 """test function for ClassFromFunction tests"""
26 return True
27
28
29def prefix_test_function_return_args(self, *args, **kargs):
30 return self, args, kargs
31
32
33b_default = "b default value"
34
35
36def prefix_test_function_return_arg_karg(self, a, b=b_default):
37 return {"self": self, "a": a, "b": b}
38
39
40def other_function(self, arg=None):
41 return self, arg
42
43
44class TestClass(ClassFromFunctions):
45 _module = sys.modules[__name__]
46
47 pass
48
49
50class 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
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
176if __name__ == "__main__":
177 main()