You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
7.1 KiB
225 lines
7.1 KiB
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
import pytest
|
|
|
|
from gen_cid import generate_cid
|
|
from gen_cid import utils
|
|
|
|
|
|
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"
|
|
]})
|
|
|
|
|
|
|
|
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 = 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)
|
|
|
|
|
|
# @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"])
|
|
|
|
|
|
@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)
|
|
|
|
check_expected_types_resolved(var_list, [], data["type_names"])
|
|
|