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
15 class ConvertHackTestInputsBase(unittest
.TestCase
):
17 self
.converter
= Converter(self
.binary_path())
18 self
.engine
= PHP5(self
.execution_prefix())
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
, [])
29 files
= glob
.glob(tmpOutput
+ '/*.php')
30 if self
.engine
.exists():
33 fname
= os
.path
.basename(f
)
34 if fname
not in UNPARSEABLE_OUTPUT
:
35 (success
, output
) = self
.engine
.parse(f
)
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([
50 stdout
=subprocess
.PIPE
,
51 stderr
=subprocess
.STDOUT
,
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()
65 all_patterns
+= [f
for files
in UNSUPPORTED_FILES_CONVERTER
.values()
67 all_patterns
+= [f
for files
in INTERNAL_ERRORS
.values()
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
):
75 UNSUPPORTED_FILES_UNPARSER
= {
84 'xhp_reserved_keywords.php',
86 'xhpchild_implicit_return.php',
116 'lexing_stack_fail.php',
121 'global_const15.php',
124 'string_expressions12.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',
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',
219 'await_on_async_function.php',
220 'await_on_awaitable.php',
221 'await_on_illegal_value.php',
223 'await_preserves_nullability.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',
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',
243 'namespace_async_1.php',
244 'namespace_async_2.php',
245 'noreturn_option2.php',
246 'noreturn_typehint_basic.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',
260 'void_usage_placeholder.php',
262 'yield_blank_result.php',
264 'yield_implicit_result.php',
265 'yield_jan_test_case.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',
297 'await_on_async_function.php',
298 'await_on_awaitable.php',
299 'await_on_awaitable_type_mismatch.php',
300 'await_on_illegal_value.php',
302 'await_on_unresolved.php',
303 'await_preserves_nullability.php',
305 'awaitable_subtype_error.php',
306 'awaitable_yield_waitfor_error.php',
307 'awaitable_yield_waitfor_noerror1.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',
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'
341 "Naming Error during lambda variable capture": [
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',
369 'fc_enum_case_10.php',
370 'fc_enum_case_4.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',
382 'namespace_newtype.php',
383 'namespace_use_outside_namespace.php',
393 'partial_in_strict.php',
395 'relaxed_strict_array1.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',
407 'typedef_string_concat1.php',
412 'variadic_args1.php',
415 UNPARSEABLE_OUTPUT
= set([
416 'abstract_constructor3.php',
418 'capitalization1.php',
419 'class_extends_trait.php',
421 'compile_test_cast.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',
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',
456 'recursive_type_expansion.php',
460 'string_expressions15.php',
461 'subst_implement.php',
464 'test_to_sort_test2.php',
466 'trait_require_inherit.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',