forked frombpython/bpython
- Notifications
You must be signed in to change notification settings - Fork0
Expand file tree
/
Copy pathtest_preprocess.py
More file actions
95 lines (73 loc) · 3.31 KB
/
test_preprocess.py
File metadata and controls
95 lines (73 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# encoding: utf-8
fromcodeimportcompile_commandascompiler
fromfunctoolsimportpartial
importdifflib
importinspect
importre
frombpython.curtsiesfrontend.interpreterimportcode_finished_will_parse
frombpython.curtsiesfrontend.preprocessimportpreprocess
frombpython.testimportunittest
frombpython.test.fodderimportoriginal,processed
skip=unittest.skip
preproc=partial(preprocess,compiler=compiler)
defget_fodder_source(test_name):
pattern=r'#StartTest-%s\n(.*?)#EndTest'% (test_name,)
orig,xformed= [re.search(pattern,inspect.getsource(module),re.DOTALL)
formodulein [original,processed]]
ifnotorig:
raiseValueError("Can't locate test %s in original fodder file"%
(test_name,))
ifnotxformed:
raiseValueError("Can't locate test %s in processed fodder file"%
(test_name,))
returnorig.group(1),xformed.group(1)
classTestPreprocessing(unittest.TestCase):
defassertCompiles(self,source):
finished,parsable=code_finished_will_parse(source,compiler)
returnfinishedandparsable
deftest_indent_empty_lines_nops(self):
self.assertEqual(preproc('hello'),'hello')
self.assertEqual(preproc('hello\ngoodbye'),'hello\ngoodbye')
self.assertEqual(preproc('a\n b\nc\n'),'a\n b\nc\n')
defassertShowWhitespaceEqual(self,a,b):
self.assertEqual(
a,b,
''.join(difflib.context_diff(a.replace(' ','~').splitlines(True),
b.replace(' ','~').splitlines(True),
fromfile='actual',
tofile='expected',
n=5)))
defassertDefinitionIndented(self,obj):
name=obj.__name__
obj2=getattr(processed,name)
orig=inspect.getsource(obj)
xformed=inspect.getsource(obj2)
self.assertShowWhitespaceEqual(preproc(orig),xformed)
self.assertCompiles(xformed)
defassertLinesIndented(self,test_name):
orig,xformed=get_fodder_source(test_name)
self.assertShowWhitespaceEqual(preproc(orig),xformed)
self.assertCompiles(xformed)
defassertIndented(self,obj_or_name):
ifisinstance(obj_or_name,str):
self.assertLinesIndented(obj_or_name)
else:
self.assertDefinitionIndented(obj_or_name)
deftest_empty_line_between_methods(self):
self.assertIndented(original.BlankLineBetweenMethods)
deftest_empty_line_within_class(self):
self.assertIndented(original.BlankLineInFunction)
deftest_blank_lines_in_for_loop(self):
self.assertIndented('blank_lines_in_for_loop')
@skip("More advanced technique required: need to try compiling and "
"backtracking")
deftest_blank_line_in_try_catch(self):
self.assertIndented('blank_line_in_try_catch')
@skip("More advanced technique required: need to try compiling and "
"backtracking")
deftest_blank_line_in_try_catch_else(self):
self.assertIndented('blank_line_in_try_catch_else')
deftest_blank_trailing_line(self):
self.assertIndented('blank_trailing_line')
deftest_tabs(self):
self.assertIndented(original.tabs)