Browse Source

test typeref resolution of all types. Cover combinations of types algorithmicly. (prove test-data)

master
heck 5 years ago
parent
commit
5612a8a3fb
  1. 308
      gen/tests/test_basic.py

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

Loading…
Cancel
Save