Support pathname pattern expansion in convert_hack_test_inputs_base.py
[hiphop-php.git] / hphp / hack / src / h2tp / test / convert_hack_test_inputs_base.py
blobccec49709246951614cb56513b07e2d5debc9061
1 from __future__ import absolute_import
2 from __future__ import division
3 from __future__ import unicode_literals
4 from __future__ import print_function
5 from .engine import PHP5
6 from .converter import Converter
7 import unittest
8 import subprocess
9 import tempfile
10 import os
11 import shutil
12 import glob
13 import re
15 class ConvertHackTestInputsBase(unittest.TestCase):
16 def setUp(self):
17 self.converter = Converter(self.binary_path())
18 self.engine = PHP5(self.execution_prefix())
20 def verify(self):
21 tmp = tempfile.mkdtemp()
22 tmpInput = os.path.join(tmp, 'input')
23 shutil.copytree(self.testsDir(), tmpInput)
24 self.delete_unsupported_inputs(tmpInput)
25 tmpOutput = os.path.join(tmp, 'output')
26 (success, output) = self.converter.convert(tmpInput, tmpOutput, [])
27 if not success:
28 self.fail(output)
29 files = glob.glob(tmpOutput + '/*.php')
30 if self.engine.exists():
31 unparseable = []
32 for f in files:
33 fname = os.path.basename(f)
34 if fname not in UNPARSEABLE_OUTPUT:
35 (success, output) = self.engine.parse(f)
36 if not success:
37 unparseable.append(fname)
38 msg = "The following files could not be parsed\n" + "\n".join(unparseable)
39 self.assertFalse(unparseable, msg)
41 def files_with_parse_errors(self, directory):
42 proc = subprocess.Popen([
43 "grep",
44 '-rn',
45 r"Parsing\[1002\]",
46 "--include",
47 "*.exp",
48 directory
50 stdout=subprocess.PIPE,
51 stderr=subprocess.STDOUT,
52 shell=False)
53 res = proc.wait()
54 output = '\n'.join([l for l in proc.stdout])
55 self.assertTrue(res == 0, "grep command failed with error\n" + output)
56 lines = output.split("\n")
57 get_file_re = re.compile(re.escape(directory) + r"\/([^:]*)\.exp:")
58 return [m.group(1) for m in (get_file_re.match(line)
59 for line in lines if line.strip() != '')]
61 def delete_unsupported_inputs(self, directory):
62 all_patterns = self.files_with_parse_errors(directory)
63 all_patterns += [f for files in UNSUPPORTED_FILES_UNPARSER.values()
64 for f in files]
65 all_patterns += [f for files in UNSUPPORTED_FILES_CONVERTER.values()
66 for f in files]
67 all_patterns += [f for files in INTERNAL_ERRORS.values()
68 for f in files]
69 all_patterns += OTHER_UNPARSEABLE_FILES
70 all_files = [f for p in all_patterns
71 for f in glob.iglob(os.path.join(directory, p))]
72 for f in set(all_files):
73 os.remove(f)
75 UNSUPPORTED_FILES_UNPARSER = {
76 "c_is_xhp": [
77 'backtick_xhp.php',
78 'decl_alias.php',
79 'extra_scope.php',
80 'functional_xhp.php',
81 'typing_ok_xhp.php',
82 'xhp_deep_parse.php',
83 'xhp_enum_decl.php',
84 'xhp_reserved_keywords.php',
85 'xhpchild.php',
86 'xhpchild_implicit_return.php',
87 'xhp_colon.php',
88 'xhp_disallowed.php',
89 'xhp_attr_1.php',
90 'xhp_attr_2.php',
91 'xhp_attr_3.php',
92 'xhp_attr_4.php',
93 'xhp_attr_5.php',
94 'xhp_attr_6.php',
95 'xhp_attr_7.php',
96 'xhp_attr_8.php',
97 'xhp_attr_9.php',
98 'xhp_attr_10.php',
99 'xhp_attr_11.php',
100 'xhp_attr_12.php',
101 'xhp_attr_13.php',
102 'xhp_attr_14.php',
103 'xhp_attr_15.php',
104 'xhp_attr_16.php',
105 'xhp_attr_17.php',
106 'xhp_attr_18.php',
107 'xhp_attr_19.php',
108 'xhp_attr_20.php',
109 'xhp_attr_21.php',
110 'xhp_attr_22.php',
111 'xhp_attr_23.php',
112 'xhp_attr_24.php',
113 'xhp_hint.php',
115 "XhpAttr": [
116 'lexing_stack_fail.php',
118 "Xml": [
119 'attr_children.php',
120 'dollar_xhp.php',
121 'global_const15.php',
122 'hh_fixme12.php',
123 'hh_fixme13.php',
124 'string_expressions12.php',
125 'xhp_parse.php',
127 "TypeConst": [
128 'tconst/*.php',
132 UNSUPPORTED_FILES_CONVERTER = {
133 "Unsupported collection type Tuple (Other[0])": [
134 "tuple-literal-1.php"
136 "Traits implementing interfaces are currently not supported. (Other[0])": [
137 'dynamic_yield/IUseDynamicYield_trait1.php',
138 'dynamic_yield/IUseDynamicYield_trait2.php',
139 'dynamic_yield/IUseDynamicYield_trait3.php',
140 'dynamic_yield/IUseDynamicYield_trait4.php',
141 'dynamic_yield/IUseDynamicYield_trait5.php',
142 'dynamic_yield/IUseDynamicYield_trait7.php',
143 'dynamic_yield/IUseDynamicYield_trait8.php',
144 'abstract_implement3.php',
145 'abstract_implement4.php',
146 'abstract_implement5.php',
147 'iface_require_incompat6.php',
148 'static_in_trait.php',
149 'trait_implements.php',
151 "Unsupported collection type \\Map (Other[0])": [
152 "namespace_collections1.php",
153 "namespace_collections2.php",
155 "Collection initializers in instance variables are currently not supported. (Other[0])": [
156 "reset_after_foreach.php",
157 "static_collection_init.php"
159 "Unsupported collection type StableMap (Other[0])": [
160 "collection_literals.php",
162 "async is currently not supported. (Other[0])": [
163 'dynamic_yield/DynamicYield1.php',
164 'dynamic_yield/DynamicYield2.php',
165 'dynamic_yield/DynamicYield4.php',
166 'dynamic_yield/DynamicYield_final1.php',
167 'dynamic_yield/DynamicYield_final2.php',
168 'dynamic_yield/DynamicYield_inherit2.php',
169 'dynamic_yield/DynamicYield_inherit5.php',
170 'dynamic_yield/DynamicYield_inherit7.php',
171 'dynamic_yield/IUseDynamicYield_interface1.php',
172 'dynamic_yield/IUseDynamicYield_interface2.php',
173 'dynamic_yield/IUseDynamicYield_interface5.php',
174 'dynamic_yield/IUseDynamicYield_interface6.php',
175 'dynamic_yield/IUseDynamicYield_interface7.php',
176 'dynamic_yield/IUseDynamicYield_trait1.php',
177 'dynamic_yield/IUseDynamicYield_trait2.php',
178 'dynamic_yield/IUseDynamicYield_trait3.php',
179 'dynamic_yield/IUseDynamicYield_trait4.php',
180 'dynamic_yield/IUseDynamicYield_trait5.php',
181 'dynamic_yield/IUseDynamicYield_trait7.php',
182 'dynamic_yield/IUseDynamicYield_trait8.php',
183 'anon_yield.php',
184 'array_option_unify.php',
185 'async_anon_function_explicit_return.php',
186 'async_anon_function_explicit_return_wrong_type.php',
187 'async_function_explicit_null_return_wrong_type.php',
188 'async_function_explicit_return.php',
189 'async_function_explicit_return_nothing.php',
190 'async_function_implicit_return.php',
191 'async_function_implicit_return2.php',
192 'async_function_implicit_return_wrong_type.php',
193 'async_function_implicit_return_wrong_type2.php',
194 'async_function_explicit_return_type_error.php',
195 'async_function_return_types_are_infectious.php',
196 'async_function_untyped1.php',
197 'async_function_untyped2.php',
198 'async_function_untyped3.php',
199 'async_function_untyped4.php',
200 'async_function_untyped5.php',
201 'async_function_untyped6.php',
202 'asyncgen1.php',
203 'asyncgen10.php',
204 'asyncgen11.php',
205 'asyncgen2.php',
206 'asyncgen3.php',
207 'asyncgen4.php',
208 'asyncgen5.php',
209 'asyncgen6.php',
210 'asyncgen7.php',
211 'asyncgen8.php',
212 'async_block1.php',
213 'async_block2.php',
214 'async_block3.php',
215 'async_block4.php',
216 'async_lambda.php',
217 'async_lambda2.php',
218 'async_lambda3.php',
219 'await_on_async_function.php',
220 'await_on_awaitable.php',
221 'await_on_illegal_value.php',
222 'await_on_new.php',
223 'await_preserves_nullability.php',
224 'await_twice.php',
225 'awaitable_subtype_error.php',
226 'awaitable_yield_result_error.php',
227 'awaitable_yield_result_noerror1.php',
228 'awaitable_yield_waitfor_error.php',
229 'awaitable_yield_waitfor_noerror1.php',
230 'continuation_is_not_awaitable1.php',
231 'continuation_return.php',
232 'fake_members9.php',
233 'foreach_kv_list_async.php',
234 'foreach_kv_list_async2.php',
235 'foreach_list_async.php',
236 'foreach_list_async2.php',
237 'functional_generator.php',
238 'generator_ok_throw.php',
239 'genva_preserves_type_signatures1.php',
240 'dynamic_yield/iface_require_extends5.php',
241 'instantiate_unresolved2.php',
242 'mixed_option.php',
243 'namespace_async_1.php',
244 'namespace_async_2.php',
245 'noreturn_option2.php',
246 'noreturn_typehint_basic.php',
247 'preparable.php',
248 'this5.php',
249 'this_tparam.php',
250 'this_tparam2.php',
251 'try_generator.php',
252 'typing_ok_sub_type_continuation.php',
253 'unused_awaitable.php',
254 'unused_awaitable2.php',
255 'unused_awaitable3.php',
256 'unused_awaitable4.php',
257 'unused_awaitable5.php',
258 'unused_awaitable6.php',
259 'void_option2.php',
260 'void_usage_placeholder.php',
261 'weird.php',
262 'yield_blank_result.php',
263 'yield_decl.php',
264 'yield_implicit_result.php',
265 'yield_jan_test_case.php',
266 'yield_return3.php',
267 'yield_return4.php',
268 'yield_wait_forv.php',
269 'yield_wait_forv_bad1.php',
270 'yield_wait_forv_bad2.php',
271 'yield_wait_forv_result.php',
272 'yield_wait_forv_result_bad1.php',
273 'yield_wait_forv_result_bad2.php',
274 'yield_wait_forv_result_bad3.php',
275 'yield_wait_forva.php',
276 'yield_wait_forva_bad1.php',
277 'yield_wait_forvr.php',
278 'yield_wait_forvr_result_bad1.php',
280 "await is currently not supported. (Other[0])": [
281 'dynamic_yield/IUseDynamicYield_interface1.php',
282 'dynamic_yield/IUseDynamicYield_interface2.php',
283 'dynamic_yield/IUseDynamicYield_interface5.php',
284 'dynamic_yield/IUseDynamicYield_trait1.php',
285 'dynamic_yield/IUseDynamicYield_trait2.php',
286 'dynamic_yield/IUseDynamicYield_trait3.php',
287 'dynamic_yield/IUseDynamicYield_trait4.php',
288 'dynamic_yield/IUseDynamicYield_trait5.php',
289 'dynamic_yield/IUseDynamicYield_trait7.php',
290 'dynamic_yield/IUseDynamicYield_trait8.php',
291 'async_function_implicit_return2.php',
292 'asyncgen1.php',
293 'asyncgen2.php',
294 'asyncgen3.php',
295 'asyncgen4.php',
296 'asyncgen6.php',
297 'await_on_async_function.php',
298 'await_on_awaitable.php',
299 'await_on_awaitable_type_mismatch.php',
300 'await_on_illegal_value.php',
301 'await_on_new.php',
302 'await_on_unresolved.php',
303 'await_preserves_nullability.php',
304 'await_twice.php',
305 'awaitable_subtype_error.php',
306 'awaitable_yield_waitfor_error.php',
307 'awaitable_yield_waitfor_noerror1.php',
308 'fake_members9.php',
309 'forbid_await_in_sync_functions1.php',
310 'forbid_await_in_sync_functions2.php',
311 'forbid_await_in_sync_functions3.php',
312 'forbid_await_in_sync_functions4.php',
313 'forbid_await_in_sync_functions5.php',
314 'function_decl_untyped.php',
315 'functional_generator.php',
316 'genva_allows_awaiting_on_multiple_awaitables.php',
317 'dynamic_yield/iface_require_extends5.php',
318 'instantiate_unresolved2.php',
319 'instantiate_unresolved3.php',
320 'preparable.php',
321 'this_tparam.php',
322 'this_tparam2.php',
323 'weird.php',
324 'yield_blank_result.php',
325 'yield_jan_test_case.php',
326 'yield_wait_forv.php',
327 'yield_wait_forv_bad1.php',
328 'yield_wait_forv_bad2.php',
329 'yield_wait_forv_result.php',
330 'yield_wait_forv_result_bad1.php',
331 'yield_wait_forv_result_bad2.php',
332 'yield_wait_forv_result_bad3.php',
333 'yield_wait_forva.php',
334 'yield_wait_forva_bad1.php',
335 'yield_wait_forvr.php',
336 'yield_wait_forvr_result_bad1.php'
340 INTERNAL_ERRORS = {
341 "Naming Error during lambda variable capture": [
342 'lambda09.php'
346 OTHER_UNPARSEABLE_FILES = [
347 'capitalization2.php',
348 'capitalization4.php',
349 'class_abstract_final_1.php',
350 'class_abstract_final_3.php',
351 'class_abstract_final_10.php',
352 'class_abstract_final_2.php',
353 'class_abstract_final_4.php',
354 'class_abstract_final_8.php',
355 'class_abstract_final_6.php',
356 'class_abstract_final_7.php',
357 'class_abstract_final_5.php',
358 'class_abstract_final_9.php',
359 'concat_untyped_with_string.php',
360 'covariance7.php',
361 'covariance8.php',
362 'dynamic_new1.php',
363 'dynamic_new3.php',
364 'dynamic_new5.php',
365 'dynamic_new7.php',
366 'enum_3.php',
367 'enum_5.php',
368 'enum_6.php',
369 'fc_enum_case_10.php',
370 'fc_enum_case_4.php',
371 'hh_fixme3.php',
372 'hh_fixme7.php',
373 'instanceof_static_with_reqs.php',
374 'namespace_global_class1.php',
375 'namespace_global_class2.php',
376 'namespace_global_function1.php',
377 'namespace_global_function2.php',
378 'namespace_global_function3.php',
379 'namespace_global_function4.php',
380 'namespace_global_qualified.php',
381 'namespace_use.php',
382 'namespace_newtype.php',
383 'namespace_use_outside_namespace.php',
384 'newtype1.php',
385 'newtype2.php',
386 'newtype3.php',
387 'newtype4.php',
388 'newtype5.php',
389 'newtype6.php',
390 'newtype7.php',
391 'newtype8.php',
392 'nowdoc.php',
393 'partial_in_strict.php',
394 'printf_crash.php',
395 'relaxed_strict_array1.php',
396 'shapes_cc_10.php',
397 'shapes_cc_11.php',
398 'shapes_cc_9.php',
399 'shapes_cc_8.php',
400 'strict_call_tany1.php',
401 'strict_call_tany2.php',
402 'strict_call_tany3.php',
403 'strict_call_tany4.php',
404 'strict_method_call.php',
405 'subtype_bug_6.php',
406 'typedef_as6.php',
407 'typedef_string_concat1.php',
408 'typedef_as5.php',
409 'unsafeexpr.php',
410 'unsafeexpr2.php',
411 'unsafeexpr3.php',
412 'variadic_args1.php',
415 UNPARSEABLE_OUTPUT = set([
416 'abstract_constructor3.php',
417 'array_filter1.php',
418 'capitalization1.php',
419 'class_extends_trait.php',
420 'closure.php',
421 'compile_test_cast.php',
422 'foreach_ref3.php',
423 'global_const10.php',
424 'global_const11.php',
425 'global_const13.php',
426 'global_const14.php',
427 'global_const16.php',
428 'global_const18.php',
429 'global_const20.php',
430 'global_const24.php',
431 'global_const25.php',
432 'global_const26.php',
433 'global_const4.php',
434 'global_const5.php',
435 'global_const6.php',
436 'global_const7.php',
437 'global_const8.php',
438 'global_const9.php',
439 'hh_fixme5.php',
440 'hhvm_lambda8.php',
441 'interface.php',
442 'interface_instance_variable.php',
443 'interface_static_variable.php',
444 'override_final.php',
445 'override_final2.php',
446 'override_final3.php',
447 'override_final_class.php',
448 'printf.php',
449 'printf2.php',
450 'printf3.php',
451 'printf4.php',
452 'printf5.php',
453 'printf7.php',
454 'printf_opt_1.php',
455 'printf_opt_2.php',
456 'recursive_type_expansion.php',
457 'storoman1.php',
458 'storoman2.php',
459 'storoman3.php',
460 'string_expressions15.php',
461 'subst_implement.php',
462 'test_consts4.php',
463 'test_consts6.php',
464 'test_to_sort_test2.php',
465 'this_forbid.php',
466 'trait_require_inherit.php',
467 'typedef14.php',
468 'typing_fail_implement_abstract.php',
469 'typing_fail_inherit1.php',
470 'typing_fail_inherit2.php',
471 'typing_fail_interface_extend_class.php',
472 'typing_fail_magic1.php',
473 'void_cast.php',
474 'yield_return2.php',
475 'yield_send1.php',
476 'yield_send2.php',
477 'yield_send3.php',
478 'yield_send4.php',
479 'yield_send5.php',