diff --git a/gen/tests/test_basic.py b/gen/tests/test_basic.py index fc3a4be..ee69652 100755 --- a/gen/tests/test_basic.py +++ b/gen/tests/test_basic.py @@ -2,84 +2,248 @@ # -*- coding: utf-8 -*- import pytest -import os -import json -import gen_cid - -def write_json(content, outpath): - # create path if not existing - out_dir = os.path.dirname(outpath) - if not os.path.isdir(out_dir): - os.makedirs(out_dir) - # write - with open(outpath, "w+") as f: - json.dump(content, f, indent=4) - - -def main_new(): - - function_names = {""} - # function_names.add("func_void_void") - # function_names.add("func_void_int") - # function_names.add("func_int_void") - # function_names.add("func_int_int") - # function_names.add("func__PS_V") - # function_names.add("func__E_V") - # function_names.add("func_TP_V") - # function_names.add("func_V_TP") - # function_names.add("func_TP_TP") - # function_names.add("func_APS_V") - # function_names.add("func_V_APS") - # function_names.add("func_APS_APS") - # function_names.add("func_TPS_V") - # function_names.add("func_V_TPS") - # function_names.add("func_V_TPS") - # function_names.add("func_TPS_TPS") - # function_names.add("func_TPS_TPS") - - var_names = {""} - # var_names.add("var_P") - # var_names.add("var__E") - # var_names.add("var_E") - # var_names.add("var_AE") - # var_names.add("var__PS") - # var_names.add("var_PS") - # var_names.add("var_APS") - # var_names.add("var__CS") - # var_names.add("var_CS") - # var_names.add("var_ACS") - # var_names.add("var__CCS") - # var_names.add("var_CCS") - # var_names.add("var_ACCS") - var_names.add("var__HS") - # var_names.add("var__NCS") - # var_names.add("var_HS") - # var_names.add("var__NSP") - # var_names.add("var_AHS") - # var_names.add("var__HHS") - # var_names.add("var__NHS") - # var_names.add("var__NNPS") - # var_names.add("var_HHS") - # var_names.add("var__NHS1") - # var_names.add("var__NNCS") - # var_names.add("var__NENHS") - # var_names.add("var_ASHS") - # var_names.add("var__HS1") - # var_names.add("var_NEHS1") +from gen_cid import generate_cid +from gen_cid import utils +# For every stem-type P there is a type: +# if not starting wirth an _ +# * AP (prefix A) +# And anyways: +# * TP +# * TTP +types_with_alias = [] +types_no_alias = [] +types_no_alias.append({"var": ["_P"], + "type_names": [ + ]}) + +types_no_alias.append({"var": ["_E"], + "type_names": [ + "enum _E" + ]}) + +types_with_alias.append({"var": ["E"], + "type_names": [ + "enum E" + ]}) + +types_no_alias.append({"var": ["_PS"], + "type_names": [ + "struct _PS" + ]}) + +types_with_alias.append({"var": ["PS"], + "type_names": [ + "struct PS" + ]}) + +types_no_alias.append({"var": ["_CS"], + "type_names": [ + "struct _CS", + "struct PS", + "struct _PS" + ]}) + +types_with_alias.append({"var": ["CS"], + "type_names": [ + "struct CS", + "struct _PS", + "struct PS" + ]}) + +types_no_alias.append({"var": ["_CCS"], + "type_names": [ + "struct _CCS", + "struct CS", + "struct _PS", + "struct PS" + ]}) + +types_with_alias.append({"var": ["CCS"], + "type_names": [ + "struct CCS", + "struct CS", + "struct _PS", + "struct PS" + ]}) + +types_no_alias.append({"var": ["_HS"], + "type_names": [ + "struct _HS", + "struct _NCS", + "struct CS", + "struct _PS", + "struct PS" + ]}) + +types_with_alias.append({"var": ["HS"], + "type_names": [ + "struct HS", + "struct _NPS" + ]}) + +types_no_alias.append({"var": ["_NCS"], + "type_names": [ + "struct _NCS", + "struct CS", + "struct _PS", + "struct PS" + ]}) + +types_no_alias.append({"var": ["_NPS"], + "type_names": [ + "struct _NPS" + ]}) + +types_no_alias.append({"var": ["_HHS"], + "type_names": [ + "struct _HHS", + "struct _NHS", + "struct _NNPS" + ]}) + +types_with_alias.append({"var": ["HHS"], + "type_names": [ + "struct HHS", + "struct _NHS1", + "struct _NNCS", + "struct _CS", + "struct PS", + "struct _PS", + "enum _NENHS" + ]}) + +types_no_alias.append({"var": ["_NHS"], + "type_names": [ + "struct _NHS", + "struct _NNPS" + ]}) + +types_no_alias.append({"var": ["_NNPS"], + "type_names": [ + "struct _NNPS" + ]}) + +types_no_alias.append({"var": ["_NHS1"], + "type_names": [ + "struct _NHS1", + "struct _NNCS", + "struct _CS", + "struct PS", + "struct _PS", + "enum _NENHS" + ]}) + +types_no_alias.append({"var": ["_NNCS"], + "type_names": [ + "struct _NNCS", + "struct _CS", + "struct PS", + "struct _PS" + ]}) + +types_no_alias.append({"var": ["_NENHS"], + "type_names": [ + "enum _NENHS" + ]}) + +types_no_alias.append({"var": ["_HS1"], + "type_names": [ + "struct _HS1", + "enum _NEHS" + ]}) + +types_no_alias.append({"var": ["_NEHS"], + "type_names": [ + "enum _NEHS" + ]}) + + +# function_names.add("func_void_void") +# function_names.add("func_void_int") +# function_names.add("func_int_void") +# function_names.add("func_int_int") +# function_names.add("func__PS_V") +# function_names.add("func__E_V") +# function_names.add("func_TP_V") +# function_names.add("func_V_TP") +# function_names.add("func_TP_TP") +# function_names.add("func_APS_V") +# function_names.add("func_V_APS") +# function_names.add("func_APS_APS") +# function_names.add("func_TPS_V") +# function_names.add("func_V_TPS") +# function_names.add("func_V_TPS") +# function_names.add("func_TPS_TPS") +# function_names.add("func_TPS_TPS") + + +def resolve_vars_and_funcs_to_cid(vars, funcs): header_filename = "data/input/test_data/test_lib.h" libclang_path = "/opt/local/libexec/llvm-9.0/lib/libclang.dylib" - header = gen_cid.generate_cid.parse(libclang_path, function_names, header_filename, var_names) + header = generate_cid.parse(libclang_path, header_filename, funcs, vars) + + # Debug output + utils.write_json(header["ast"], header["out_dir"] + "/" + header["filename"] + ".ast.json") + utils.write_json(header["cid"], header["out_dir"] + "/" + header["filename"] + ".cid.json") + utils.write_json(header, header["out_dir"] + "/" + header["filename"] + ".header.json") + + return header["cid"] + + +def check_expected_types_resolved(vars, funcs, type_names_expected): + print("RESOLVING: ", vars, funcs) + cid = resolve_vars_and_funcs_to_cid(vars, funcs) + + # Check on unresolved vars + assert len(cid["vars_notfound"]) == 0, "vars not found" + + # Check on unresolved functions + assert len(cid["functions_notfound"]) == 0, "vars not found" + + # Check on unresolved typerefs + assert len(cid["typerefs_notfound"]) == 0, "vars not found" + + type_names = cid["type_names"] + # test for no dup types + for tn in type_names: + assert type_names.count(tn) == 1, "duplicate type" + + type_names.sort() + type_names_expected.sort() + + # test expected types match in no specific order + # print("GOT: ", type_names) + # print("EXPECTED: ", type_names_expected) + assert type_names == type_names_expected + + +@pytest.mark.skip +@pytest.mark.parametrize('vars', [["var_TP"]]) +@pytest.mark.parametrize('funcs', [""]) +def test_manual(vars, funcs): + resolve_vars_and_funcs_to_cid(vars, funcs) + - write_json(header["ast"], header["out_dir"] + "/" + header["filename"] + ".ast.json") - write_json(header["cid"], header["out_dir"] + "/" + header["filename"] + ".cid.json") - write_json(header["views"], header["out_dir"] + "/" + header["filename"] + ".views.json") - write_json(header, header["out_dir"] + "/" + header["filename"] + ".header.json") +# @pytest.mark.skip +@pytest.mark.parametrize('variation', ["var_", "var_A", "var_T", "var_TA", "var_TT", "var_TTA"]) +@pytest.mark.parametrize('data', types_with_alias) +def test_single_var(data, variation): + var_list = [] + for var in data["var"]: + var_name = variation + var + var_list.append(var_name) + check_expected_types_resolved(var_list, [], data["type_names"]) -def test_main_new(): - main_new() +@pytest.mark.parametrize('variation', ["var_", "var_T", "var_TT"]) +@pytest.mark.parametrize('data', types_no_alias) +def test_single_varfd(data, variation): + var_list = [] + for var in data["var"]: + var_name = variation + var + var_list.append(var_name) -main_new() + check_expected_types_resolved(var_list, [], data["type_names"])