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
|
|
|
|