mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Swift: add unit tests to code generation
Tests can be run with ``` bazel test //swift/codegen:tests ``` Coverage can be checked installing `pytest-cov` and running ``` pytest --cov=swift/codegen swift/codegen/test ```
This commit is contained in:
158
swift/codegen/test/test_schema.py
Normal file
158
swift/codegen/test/test_schema.py
Normal file
@@ -0,0 +1,158 @@
|
||||
import io
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
import mock
|
||||
import pytest
|
||||
|
||||
import swift.codegen.lib.schema as schema
|
||||
from swift.codegen.test.utils import *
|
||||
|
||||
root_name = schema.root_class_name
|
||||
|
||||
@pytest.fixture
|
||||
def load(tmp_path):
|
||||
file = tmp_path / "schema.yml"
|
||||
def ret(yml):
|
||||
write(file, yml)
|
||||
return schema.load(file)
|
||||
|
||||
return ret
|
||||
|
||||
def test_empty_schema(load):
|
||||
ret = load("{}")
|
||||
assert ret.classes == [schema.Class(root_name)]
|
||||
assert ret.includes == set()
|
||||
|
||||
|
||||
def test_one_empty_class(load):
|
||||
ret = load("""
|
||||
MyClass: {}
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'MyClass'}),
|
||||
schema.Class('MyClass', bases={root_name}),
|
||||
]
|
||||
|
||||
|
||||
def test_two_empty_classes(load):
|
||||
ret = load("""
|
||||
MyClass1: {}
|
||||
MyClass2: {}
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'MyClass1', 'MyClass2'}),
|
||||
schema.Class('MyClass1', bases={root_name}),
|
||||
schema.Class('MyClass2', bases={root_name}),
|
||||
]
|
||||
|
||||
|
||||
def test_two_empty_chained_classes(load):
|
||||
ret = load("""
|
||||
MyClass1: {}
|
||||
MyClass2:
|
||||
_extends: MyClass1
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'MyClass1'}),
|
||||
schema.Class('MyClass1', bases={root_name}, derived={'MyClass2'}),
|
||||
schema.Class('MyClass2', bases={'MyClass1'}),
|
||||
]
|
||||
|
||||
|
||||
def test_empty_classes_diamond(load):
|
||||
ret = load("""
|
||||
A: {}
|
||||
B: {}
|
||||
C:
|
||||
_extends:
|
||||
- A
|
||||
- B
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'A', 'B'}),
|
||||
schema.Class('A', bases={root_name}, derived={'C'}),
|
||||
schema.Class('B', bases={root_name}, derived={'C'}),
|
||||
schema.Class('C', bases={'A', 'B'}),
|
||||
]
|
||||
|
||||
|
||||
def test_dir(load):
|
||||
ret = load("""
|
||||
A:
|
||||
_dir: other/dir
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'A'}),
|
||||
schema.Class('A', bases={root_name}, dir=pathlib.Path("other/dir")),
|
||||
]
|
||||
|
||||
|
||||
def test_directory_filter(load):
|
||||
ret = load("""
|
||||
_directories:
|
||||
first/dir: '[xy]'
|
||||
second/dir: foo$
|
||||
third/dir: bar$
|
||||
Afoo: {}
|
||||
Bbar: {}
|
||||
Abar: {}
|
||||
Bfoo: {}
|
||||
Ax: {}
|
||||
Ay: {}
|
||||
A: {}
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'Afoo', 'Bbar', 'Abar', 'Bfoo', 'Ax', 'Ay', 'A'}),
|
||||
schema.Class('Afoo', bases={root_name}, dir=pathlib.Path("second/dir")),
|
||||
schema.Class('Bbar', bases={root_name}, dir=pathlib.Path("third/dir")),
|
||||
schema.Class('Abar', bases={root_name}, dir=pathlib.Path("third/dir")),
|
||||
schema.Class('Bfoo', bases={root_name}, dir=pathlib.Path("second/dir")),
|
||||
schema.Class('Ax', bases={root_name}, dir=pathlib.Path("first/dir")),
|
||||
schema.Class('Ay', bases={root_name}, dir=pathlib.Path("first/dir")),
|
||||
schema.Class('A', bases={root_name}, dir=pathlib.Path()),
|
||||
]
|
||||
|
||||
|
||||
def test_directory_filter_override(load):
|
||||
ret = load("""
|
||||
_directories:
|
||||
one/dir: ^A$
|
||||
A:
|
||||
_dir: other/dir
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'A'}),
|
||||
schema.Class('A', bases={root_name}, dir=pathlib.Path("other/dir")),
|
||||
]
|
||||
|
||||
|
||||
def test_lowercase_rejected(load):
|
||||
with pytest.raises(AssertionError):
|
||||
load("aLowercase: {}")
|
||||
|
||||
|
||||
def test_digit_rejected(load):
|
||||
with pytest.raises(AssertionError):
|
||||
load("1digit: {}")
|
||||
|
||||
|
||||
def test_properties(load):
|
||||
ret = load("""
|
||||
A:
|
||||
one: string
|
||||
two: int?
|
||||
three: bool*
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'A'}),
|
||||
schema.Class('A', bases={root_name}, properties=[
|
||||
schema.SingleProperty('one', 'string'),
|
||||
schema.OptionalProperty('two', 'int'),
|
||||
schema.RepeatedProperty('three', 'bool'),
|
||||
]),
|
||||
]
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(pytest.main())
|
||||
Reference in New Issue
Block a user