|
1
|
|
|
import platform |
|
2
|
|
|
|
|
3
|
|
|
|
|
4
|
|
|
class Sys: |
|
5
|
|
|
__UNIX_SLASH = '/' |
|
6
|
|
|
__WINDOWS_SLASH = '\\' |
|
7
|
|
|
PY = '.py' |
|
8
|
|
|
SLASH = __WINDOWS_SLASH if platform.system == 'Windows' else __UNIX_SLASH |
|
9
|
|
|
TEST_FILE_ENDING = '__test.py' |
|
10
|
|
|
|
|
11
|
|
|
|
|
12
|
|
|
class Keys: |
|
13
|
|
|
IMPORTS = 'imports' |
|
14
|
|
|
NAME = 'name' |
|
15
|
|
|
TESTS = 'tests' |
|
16
|
|
|
TEST = 'test' |
|
17
|
|
|
STR = 'str' |
|
18
|
|
|
EXAMPLES = 'examples' |
|
19
|
|
|
FROM = 'from' |
|
20
|
|
|
EXPECT = 'expect' |
|
21
|
|
|
VARIABLES = 'variables' |
|
22
|
|
|
PARAMS = 'params' |
|
23
|
|
|
RETURN = 'return' |
|
24
|
|
|
EXCEPTION = 'exception' |
|
25
|
|
|
|
|
26
|
|
|
|
|
27
|
|
|
class Content: |
|
28
|
|
|
CLASS_CREATE_TEMPLATE = '\nclass Test{}{}(unittest.TestCase):\n' |
|
29
|
|
|
IMPORT_UNITTEST = 'import unittest\n' |
|
30
|
|
|
DEPS_IMPORT_TEMPLATE = 'from {} import {}\n' |
|
31
|
|
|
TEST_CASE_TEMPLATE = ' def test__{function_name}__{case_id}(self):' |
|
32
|
|
|
TESTERS_NOTES_TEMPLATE = ' {testers_notes}' |
|
33
|
|
|
VARIABLES_TEMPLATE = ' {variables}\n' |
|
34
|
|
|
TYPE_ASSERT_TEMPLATE = '\n self.assertIsInstance({function}, {value})' |
|
35
|
|
|
ASSERTION_TEMPLATE = '\n self.assertEqual({function}, {value})\n' |
|
36
|
|
|
EXCEPTION_TEMPLATE = '\n self.assertRaises({value}, {function}, {args})\n\n' |
|
37
|
|
|
|
|
38
|
|
|
|
|
39
|
|
|
class Patterns: |
|
40
|
|
|
FUNCTION_CALL = r'example: [\s\S]+?(?=->)' |
|
41
|
|
|
IMPORT_DEC = '@need\n' |
|
42
|
|
|
VAR_DEC = r'@let ' |
|
43
|
|
|
NEED_IMPORT = r'@need[\s\S]+?(?=@end)' |
|
44
|
|
|
NEEDED_VARIABLES = r'@let[\s\S]+?(?=@end)' |
|
45
|
|
|
NUMBER_BULLET = r'\d\) ' |
|
46
|
|
|
TEST_CASE_EXAMPLE = r'\d\) [\s\S]+?(?=\n)' |
|
47
|
|
|
EXAMPLE_PASSAGE = r'-{3,}[\s\S]+?(?=---)' |
|
48
|
|
|
TEST_SEP = ' -> ' |
|
49
|
|
|
EXCEPTION_CASE_EXAMPLE = r'!! [\s\S]+?(?=\n)' |
|
50
|
|
|
|
|
51
|
|
|
class TestBodies: |
|
52
|
|
|
GET_FUNCTIONS_TEST_CASE_1 = """ |
|
53
|
|
|
def function_1(): |
|
54
|
|
|
return 1 |
|
55
|
|
|
""" |
|
56
|
|
|
GET_FUNCTIONS_TEST_CASE_1_EXPECT = [{'name': 'function_1', 'tests': {}}] |
|
57
|
|
|
TYPE_TEST_CASE_1 = '\n self.assertIsInstance(function_1(str, str), str)' |
|
58
|
|
|
TYPE_TEST_CASE_2 = '\n self.assertIsInstance(function_1(str, str), str)' |
|
59
|
|
|
ASSERTION_TEST_1 = ' a = 5\n' |
|
60
|
|
|
NAIVE_TEST_RESULT = """ def test__function_1__A55EFF11ED(self): a = 5 |
|
61
|
|
|
|
|
62
|
|
|
self.assertEqual(function_1, 2)\n""" |
|
63
|
|
|
EXCEPTION_TEST_RESULT = """ def test__function_1__A55EFF11ED(self): a = 5 |
|
64
|
|
|
|
|
65
|
|
|
self.assertRaises(TypeError, function_1, None)\n |
|
66
|
|
|
""" |
|
67
|
|
|
TEST_STACK_IMPORTS_OUTPUT = ['from datetime import datetime\n', 'import numpy as np\n'] |
|
68
|
|
|
TEST_STACK_IMPORTS_INPUT = ['from datetime import datetime ', ' import numpy as np '] |
|
69
|
|
|
EXAMPLE_WITH_IMPORTS = """ |
|
70
|
|
|
@need |
|
71
|
|
|
from datetime import datetime |
|
72
|
|
|
import numpy as np |
|
73
|
|
|
@end |
|
74
|
|
|
""" |
|
75
|
|
|
TEST_IMPORT_EXTRACTION = [ |
|
76
|
|
|
'from datetime import datetime\n', |
|
77
|
|
|
'import numpy as np\n', |
|
78
|
|
|
'\n' |
|
79
|
|
|
] |
|
80
|
|
|
|
|
81
|
|
|
TEST_VARIABLES_FROM_DOCSTRING = """ |
|
82
|
|
|
@let |
|
83
|
|
|
a = 4 |
|
84
|
|
|
@end |
|
85
|
|
|
""" |
|
86
|
|
|
TEST_VARIABLES_FROM_DOCSTRING_RESULT = ['', ' a = 4', ' '] |
|
87
|
|
|
STACK_EXAMPLES_TEST = ['1) square(5) -> 25'] |
|
88
|
|
|
GET_PARAMS_FROM_DOCSTRING_TEST = """ |
|
89
|
|
|
:param item: int |
|
90
|
|
|
:param store: dict |
|
91
|
|
|
""" |
|
92
|
|
|
EXPECT_PARAMS = ['int', 'dict'] |
|
93
|
|
|
RETURN_TYPE_TEST = """ |
|
94
|
|
|
:return: int |
|
95
|
|
|
""" |
|
96
|
|
|
TEST_EXAMPLE_PASSAGE = """ |
|
97
|
|
|
1) square(4) -> 16 |
|
98
|
|
|
2) page(20) -> [] |
|
99
|
|
|
""" |
|
100
|
|
|
TEST_EXAMPLE_PASSAGE_RESULT = [ |
|
101
|
|
|
{'expect': '16', 'from': 'square(4)'}, |
|
102
|
|
|
{'expect': '[]', 'from': 'page(20)'} |
|
103
|
|
|
] |
|
104
|
|
|
NAIVE_CASE_TEST_STATEMENT = """ |
|
105
|
|
|
---- |
|
106
|
|
|
example: |
|
107
|
|
|
|
|
108
|
|
|
@need |
|
109
|
|
|
from datetime import datetime |
|
110
|
|
|
@end |
|
111
|
|
|
|
|
112
|
|
|
@let |
|
113
|
|
|
a = 2 |
|
114
|
|
|
x = 2 |
|
115
|
|
|
@end |
|
116
|
|
|
|
|
117
|
|
|
1) pow(a, x) -> 4 |
|
118
|
|
|
---- |
|
119
|
|
|
:param x: int |
|
120
|
|
|
:return: int |
|
121
|
|
|
""" |
|
122
|
|
|
NAIVE_CASE_TEST_RESULT = { |
|
123
|
|
|
'examples': [{'expect': '4', 'from': 'pow(a, x)'}], |
|
124
|
|
|
'imports': ['from datetime import datetime\n', '\n'], |
|
125
|
|
|
'params': ['int'], |
|
126
|
|
|
'return': 'int', |
|
127
|
|
|
'variables': ['', ' a = 2', ' x = 2', ' '] |
|
128
|
|
|
} |
|
129
|
|
|
CREATE_TEST_CLASS_RESULT = ({'from fastest/__main__ import add_imports_for_test_case\n', |
|
130
|
|
|
'import random', |
|
131
|
|
|
'import unittest\n'}, |
|
132
|
|
|
['', '\nclass TestFastestAddImportsForTestCase(unittest.TestCase):\n']) |
|
133
|
|
|
|
|
134
|
|
|
TEST_CASE_CONTENT_RESULT = ({'from fastest.constants import TestBodies\n', 'import random'}, |
|
135
|
|
|
['', |
|
136
|
|
|
' def test__add_imports_for_test_case__0A856D9D76(self): \n' |
|
137
|
|
|
" empty_test = { 'imports': None }\n" |
|
138
|
|
|
" test = { 'imports': ['from datetime import datetime'] }\n" |
|
139
|
|
|
" imports = {'import numpy as np'}\n" |
|
140
|
|
|
" updated_imports = {'import numpy as np', 'from datetime import " |
|
141
|
|
|
"datetime'}\n" |
|
142
|
|
|
' \n' |
|
143
|
|
|
'\n' |
|
144
|
|
|
' self.assertEqual(add_imports_for_test_case(empty_test, imports), ' |
|
145
|
|
|
'imports)\n', |
|
146
|
|
|
' def test__add_imports_for_test_case__B502446AEB(self): \n' |
|
147
|
|
|
" empty_test = { 'imports': None }\n" |
|
148
|
|
|
" test = { 'imports': ['from datetime import datetime'] }\n" |
|
149
|
|
|
" imports = {'import numpy as np'}\n" |
|
150
|
|
|
" updated_imports = {'import numpy as np', 'from datetime import " |
|
151
|
|
|
"datetime'}\n" |
|
152
|
|
|
' \n' |
|
153
|
|
|
'\n' |
|
154
|
|
|
' self.assertEqual(add_imports_for_test_case(test, imports), ' |
|
155
|
|
|
'updated_imports)\n']) |
|
156
|
|
|
MOCK_FUNCTION_OBJECT = { |
|
157
|
|
|
'name': 'add_imports_for_test_case', |
|
158
|
|
|
'tests': { |
|
159
|
|
|
'examples': [{ |
|
160
|
|
|
'expect': 'imports', |
|
161
|
|
|
'from': 'add_imports_for_test_case(empty_test, ' |
|
162
|
|
|
'imports)' |
|
163
|
|
|
}, { |
|
164
|
|
|
'expect': 'updated_imports', |
|
165
|
|
|
'from': 'add_imports_for_test_case(test, ' |
|
166
|
|
|
'imports)' |
|
167
|
|
|
}], |
|
168
|
|
|
'imports': ['from fastest.constants import TestBodies\n'], |
|
169
|
|
|
'params': ['dict', 'set'], |
|
170
|
|
|
'return': 'set', |
|
171
|
|
|
'variables': ['', |
|
172
|
|
|
"empty_test = { 'imports': None }", |
|
173
|
|
|
"test = { 'imports': ['from datetime import " |
|
174
|
|
|
"datetime'] }", |
|
175
|
|
|
"imports = {'import numpy as np'}", |
|
176
|
|
|
"updated_imports = {'import numpy as np', 'from " |
|
177
|
|
|
"datetime import datetime'}", |
|
178
|
|
|
''] |
|
179
|
|
|
} |
|
180
|
|
|
} |
|
181
|
|
|
PAGE_WITH_SYNTAX_ERRORS = 'def f(' |
|
182
|
|
|
SEPARATOR_ERR_EXAMPLE = '' |
|
183
|
|
|
EXCEPTION_EXAMPLE_HAPPY_CASE = '!! exception_fn(None) -> TypeError\n' |
|
184
|
|
|
EXCEPTION_EXAMPLE_SEP_MISSING = '!! func_do_work(None)\n' |
|
185
|
|
|
EXCEPTION_HAPPY_CASE_OUTPUT = [{ |
|
186
|
|
|
'from': 'exception_fn(None)', |
|
187
|
|
|
'exception': 'TypeError' |
|
188
|
|
|
}] |
|
189
|
|
|
|