mirror of
https://github.com/github/codeql.git
synced 2026-04-28 10:15:14 +02:00
Swift: fix codegen unit tests
This commit is contained in:
@@ -218,18 +218,19 @@ def generate(opts, renderer):
|
||||
existing |= {q for q in test_out.rglob(missing_test_source_filename)}
|
||||
|
||||
data = schema.load(input)
|
||||
inheritance_graph = {name: cls.bases for name, cls in data.classes.items()}
|
||||
input_classes = [data.classes[name] for name in toposort_flatten(inheritance_graph)]
|
||||
|
||||
classes = [get_ql_class(cls, data.classes) for cls in input_classes]
|
||||
classes = {name: get_ql_class(cls, data.classes) for name, cls in data.classes.items()}
|
||||
imports = {}
|
||||
|
||||
renderer.render(ql.DbClasses(cls for cls in classes if not cls.ipa), out / "Db.qll")
|
||||
inheritance_graph = {name: cls.bases for name, cls in data.classes.items()}
|
||||
db_classes = [classes[name] for name in toposort_flatten(inheritance_graph) if not classes[name].ipa]
|
||||
renderer.render(ql.DbClasses(db_classes), out / "Db.qll")
|
||||
|
||||
for c in classes:
|
||||
classes_by_dir_and_name = sorted(classes.values(), key=lambda cls: (cls.dir, cls.name))
|
||||
for c in classes_by_dir_and_name:
|
||||
imports[c.name] = get_import(stub_out / c.path, opts.swift_dir)
|
||||
|
||||
for c in classes:
|
||||
for c in classes.values():
|
||||
qll = out / c.path.with_suffix(".qll")
|
||||
c.imports = [imports[t] for t in get_classes_used_by(c)]
|
||||
renderer.render(c, qll)
|
||||
@@ -243,10 +244,9 @@ def generate(opts, renderer):
|
||||
include_file = stub_out.with_suffix(".qll")
|
||||
renderer.render(ql.ImportList(list(imports.values())), include_file)
|
||||
|
||||
renderer.render(ql.GetParentImplementation(
|
||||
classes), out / 'GetImmediateParent.qll')
|
||||
renderer.render(ql.GetParentImplementation(classes_by_dir_and_name), out / 'GetImmediateParent.qll')
|
||||
|
||||
for c in input_classes:
|
||||
for c in data.classes.values():
|
||||
if _should_skip_qltest(c, data.classes):
|
||||
continue
|
||||
test_dir = test_out / c.dir / c.name
|
||||
@@ -267,7 +267,7 @@ def generate(opts, renderer):
|
||||
final_ipa_types = []
|
||||
non_final_ipa_types = []
|
||||
constructor_imports = []
|
||||
for cls in input_classes:
|
||||
for cls in sorted(data.classes.values(), key=lambda cls: (cls.dir, cls.name)):
|
||||
ipa_type = get_ql_ipa_class(cls)
|
||||
if ipa_type.is_final:
|
||||
final_ipa_types.append(ipa_type)
|
||||
|
||||
@@ -79,7 +79,7 @@ class Class:
|
||||
qltest_skip: bool = False
|
||||
qltest_collapse_hierarchy: bool = False
|
||||
qltest_uncollapse_hierarchy: bool = False
|
||||
has_db_id: bool = False
|
||||
has_db_id: bool = True
|
||||
ipa: bool = False
|
||||
|
||||
def __post_init__(self):
|
||||
|
||||
@@ -21,7 +21,7 @@ def test_property_has_first_table_param_marked():
|
||||
])
|
||||
def test_property_is_a_class(type, expected):
|
||||
tableparams = ["a", "result", "b"]
|
||||
expected_tableparams = ["a", "x" if expected else "result", "b"]
|
||||
expected_tableparams = ["a", "result" if expected else "result", "b"]
|
||||
prop = ql.Property("Prop", type, tableparams=tableparams)
|
||||
assert prop.type_is_class is expected
|
||||
assert [p.param for p in prop.tableparams] == expected_tableparams
|
||||
@@ -46,7 +46,7 @@ def test_property_indefinite_article(name, expected_getter):
|
||||
("X", True),
|
||||
])
|
||||
def test_property_is_repeated(plural, expected):
|
||||
prop = ql.Property("foo", "Foo", "props", ["x"], plural=plural)
|
||||
prop = ql.Property("foo", "Foo", "props", ["result"], plural=plural)
|
||||
assert prop.is_repeated is expected
|
||||
|
||||
|
||||
@@ -58,12 +58,12 @@ def test_property_is_repeated(plural, expected):
|
||||
(False, True, None, False),
|
||||
])
|
||||
def test_property_is_single(is_optional, is_predicate, plural, expected):
|
||||
prop = ql.Property("foo", "Foo", "props", ["x"], plural=plural, is_predicate=is_predicate, is_optional=is_optional)
|
||||
prop = ql.Property("foo", "Foo", "props", ["result"], plural=plural, is_predicate=is_predicate, is_optional=is_optional)
|
||||
assert prop.is_single is expected
|
||||
|
||||
|
||||
def test_property_no_plural_no_indefinite_getter():
|
||||
prop = ql.Property("Prop", "Foo", "props", ["x"])
|
||||
prop = ql.Property("Prop", "Foo", "props", ["result"])
|
||||
assert prop.indefinite_getter is None
|
||||
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ def _filter_generated_classes(ret, output_test_files=False):
|
||||
str(f): ret[ql_test_output_path() / f]
|
||||
for f in test_files
|
||||
}
|
||||
base_files -= {pathlib.Path("IpaTypes.qll"), pathlib.Path("IpaConstructors.qll")}
|
||||
base_files -= {pathlib.Path(f"{name}.qll") for name in ("Db", "IpaTypes", "IpaConstructors")}
|
||||
assert stub_files == base_files
|
||||
return {
|
||||
str(f): (ret[stub_path() / f], ret[ql_output_path() / f])
|
||||
@@ -131,6 +131,8 @@ def test_empty(generate):
|
||||
children_file(): ql.GetParentImplementation(),
|
||||
ql_output_path() / "IpaTypes.qll": ql.Ipa.Types(schema.root_class_name),
|
||||
ql_output_path() / "IpaConstructors.qll": ql.ImportList(),
|
||||
ql_output_path() / "Db.qll": ql.DbClasses(),
|
||||
ql_output_path() / "Db.qll": ql.DbClasses(),
|
||||
}
|
||||
|
||||
|
||||
@@ -139,7 +141,7 @@ def test_one_empty_class(generate_classes):
|
||||
schema.Class("A")
|
||||
]) == {
|
||||
"A.qll": (ql.Stub(name="A", base_import=gen_import_prefix + "A"),
|
||||
ql.Class(name="A", final=True, fields=[ql.Field('id', type='@a')])),
|
||||
ql.Class(name="A", final=True)),
|
||||
}
|
||||
|
||||
|
||||
@@ -157,7 +159,7 @@ def test_hierarchy(generate_classes):
|
||||
"C.qll": (ql.Stub(name="C", base_import=gen_import_prefix + "C"),
|
||||
ql.Class(name="C", bases=["A"], imports=[stub_import_prefix + "A"])),
|
||||
"D.qll": (ql.Stub(name="D", base_import=gen_import_prefix + "D"),
|
||||
ql.Class(name="D", final=True, bases=["B", "C"], fields=[ql.Field("id", type="@d")],
|
||||
ql.Class(name="D", final=True, bases=["B", "C"],
|
||||
imports=[stub_import_prefix + cls for cls in "BC"])),
|
||||
}
|
||||
|
||||
@@ -183,7 +185,7 @@ def test_hierarchy_children(generate_children_implementations):
|
||||
stub_import_prefix + "A"]),
|
||||
ql.Class(name="C", bases=["A"], imports=[
|
||||
stub_import_prefix + "A"]),
|
||||
ql.Class(name="D", final=True, bases=["B", "C"], fields=[ql.Field("id", type="@d")],
|
||||
ql.Class(name="D", final=True, bases=["B", "C"],
|
||||
imports=[stub_import_prefix + cls for cls in "BC"]),
|
||||
],
|
||||
)
|
||||
@@ -195,10 +197,10 @@ def test_single_property(generate_classes):
|
||||
schema.SingleProperty("foo", "bar")]),
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")],
|
||||
ql.Class(name="MyObject", final=True,
|
||||
properties=[
|
||||
ql.Property(singular="Foo", type="bar", tablename="my_objects",
|
||||
tableparams=["id", "result"]),
|
||||
tableparams=["this", "result"]),
|
||||
])),
|
||||
}
|
||||
|
||||
@@ -212,14 +214,14 @@ def test_single_properties(generate_classes):
|
||||
]),
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")],
|
||||
ql.Class(name="MyObject", final=True,
|
||||
properties=[
|
||||
ql.Property(singular="One", type="x", tablename="my_objects",
|
||||
tableparams=["id", "result", "_", "_"]),
|
||||
tableparams=["this", "result", "_", "_"]),
|
||||
ql.Property(singular="Two", type="y", tablename="my_objects",
|
||||
tableparams=["id", "_", "result", "_"]),
|
||||
tableparams=["this", "_", "result", "_"]),
|
||||
ql.Property(singular="Three", type="z", tablename="my_objects",
|
||||
tableparams=["id", "_", "_", "result"]),
|
||||
tableparams=["this", "_", "_", "result"]),
|
||||
])),
|
||||
}
|
||||
|
||||
@@ -231,9 +233,9 @@ def test_optional_property(generate_classes, is_child):
|
||||
schema.OptionalProperty("foo", "bar", is_child=is_child)]),
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")], properties=[
|
||||
ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="Foo", type="bar", tablename="my_object_foos",
|
||||
tableparams=["id", "result"],
|
||||
tableparams=["this", "result"],
|
||||
is_optional=True, is_child=is_child),
|
||||
])),
|
||||
}
|
||||
@@ -246,9 +248,9 @@ def test_repeated_property(generate_classes, is_child):
|
||||
schema.RepeatedProperty("foo", "bar", is_child=is_child)]),
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")], properties=[
|
||||
ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="Foo", plural="Foos", type="bar", tablename="my_object_foos",
|
||||
tableparams=["id", "index", "result"], is_child=is_child),
|
||||
tableparams=["this", "index", "result"], is_child=is_child),
|
||||
])),
|
||||
}
|
||||
|
||||
@@ -260,9 +262,9 @@ def test_repeated_optional_property(generate_classes, is_child):
|
||||
schema.RepeatedOptionalProperty("foo", "bar", is_child=is_child)]),
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")], properties=[
|
||||
ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="Foo", plural="Foos", type="bar", tablename="my_object_foos",
|
||||
tableparams=["id", "index", "result"], is_optional=True,
|
||||
tableparams=["this", "index", "result"], is_optional=True,
|
||||
is_child=is_child),
|
||||
])),
|
||||
}
|
||||
@@ -274,9 +276,9 @@ def test_predicate_property(generate_classes):
|
||||
schema.PredicateProperty("is_foo")]),
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")], properties=[
|
||||
ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="isFoo", type="predicate", tablename="my_object_is_foo",
|
||||
tableparams=["id"],
|
||||
tableparams=["this"],
|
||||
is_predicate=True),
|
||||
])),
|
||||
}
|
||||
@@ -291,15 +293,15 @@ def test_single_class_property(generate_classes, is_child):
|
||||
]) == {
|
||||
"MyObject.qll": (ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql.Class(
|
||||
name="MyObject", final=True, fields=[ql.Field("id", type="@my_object")], imports=[stub_import_prefix + "Bar"], properties=[
|
||||
name="MyObject", final=True, imports=[stub_import_prefix + "Bar"], properties=[
|
||||
ql.Property(singular="Foo", type="Bar", tablename="my_objects",
|
||||
tableparams=[
|
||||
"id", "result"],
|
||||
"this", "result"],
|
||||
is_child=is_child),
|
||||
],
|
||||
)),
|
||||
"Bar.qll": (ql.Stub(name="Bar", base_import=gen_import_prefix + "Bar"),
|
||||
ql.Class(name="Bar", final=True, fields=[ql.Field("id", type="@bar")])),
|
||||
ql.Class(name="Bar", final=True)),
|
||||
}
|
||||
|
||||
|
||||
@@ -312,7 +314,7 @@ def test_class_dir(generate_classes):
|
||||
f"{dir}/A.qll": (ql.Stub(name="A", base_import=gen_import_prefix + "another.rel.path.A"),
|
||||
ql.Class(name="A", dir=dir)),
|
||||
"B.qll": (ql.Stub(name="B", base_import=gen_import_prefix + "B"),
|
||||
ql.Class(name="B", final=True, fields=[ql.Field("id", type="@b")], bases=["A"],
|
||||
ql.Class(name="B", final=True, bases=["A"],
|
||||
imports=[stub_import_prefix + "another.rel.path.A"])),
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user