|
|
@ -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"]) |
|
|
|