cxxheaderparser/tests/test_class_base.py
2020-12-30 03:22:29 -05:00

256 lines
8.6 KiB
Python

# Note: testcases generated via `python -m cxxheaderparser.gentest`
from cxxheaderparser.types import (
BaseClass,
ClassDecl,
Field,
FundamentalSpecifier,
Method,
NameSpecifier,
PQName,
TemplateArgument,
TemplateSpecialization,
Token,
Type,
)
from cxxheaderparser.simple import (
ClassScope,
NamespaceScope,
parse_string,
ParsedData,
)
def test_class_private_base():
content = """
namespace Citrus
{
class BloodOrange { };
}
class Bananna: public Citrus::BloodOrange
{
};
class ExcellentCake: private Citrus::BloodOrange, Convoluted::Nested::Mixin
{
};
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
classes=[
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="Bananna")], classkey="class"
),
bases=[
BaseClass(
access="public",
typename=PQName(
segments=[
NameSpecifier(name="Citrus"),
NameSpecifier(name="BloodOrange"),
]
),
)
],
)
),
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="ExcellentCake")],
classkey="class",
),
bases=[
BaseClass(
access="private",
typename=PQName(
segments=[
NameSpecifier(name="Citrus"),
NameSpecifier(name="BloodOrange"),
]
),
),
BaseClass(
access="private",
typename=PQName(
segments=[
NameSpecifier(name="Convoluted"),
NameSpecifier(name="Nested"),
NameSpecifier(name="Mixin"),
]
),
),
],
)
),
],
namespaces={
"Citrus": NamespaceScope(
name="Citrus",
classes=[
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="BloodOrange")],
classkey="class",
)
)
)
],
)
},
)
)
def test_class_virtual_base():
content = """
class BaseMangoClass {};
class MangoClass : virtual public BaseMangoClass {};
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
classes=[
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="BaseMangoClass")],
classkey="class",
)
)
),
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="MangoClass")],
classkey="class",
),
bases=[
BaseClass(
access="public",
typename=PQName(
segments=[NameSpecifier(name="BaseMangoClass")]
),
virtual=True,
)
],
)
),
]
)
)
def test_class_multiple_base_with_virtual():
content = """
class BlueJay : public Bird, public virtual Food {
public:
BlueJay() {}
};
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
classes=[
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="BlueJay")], classkey="class"
),
bases=[
BaseClass(
access="public",
typename=PQName(segments=[NameSpecifier(name="Bird")]),
),
BaseClass(
access="public",
typename=PQName(segments=[NameSpecifier(name="Food")]),
virtual=True,
),
],
),
methods=[
Method(
return_type=None,
name=PQName(segments=[NameSpecifier(name="BlueJay")]),
parameters=[],
has_body=True,
access="public",
constructor=True,
)
],
)
]
)
)
def test_class_base_specialized():
content = """
class Pea : public Vegetable<Green> {
int i;
};
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
classes=[
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="Pea")], classkey="class"
),
bases=[
BaseClass(
access="public",
typename=PQName(
segments=[
NameSpecifier(
name="Vegetable",
specialization=TemplateSpecialization(
args=[
TemplateArgument(
arg=Type(
typename=PQName(
segments=[
NameSpecifier(
name="Green"
)
]
)
)
)
]
),
)
]
),
)
],
),
fields=[
Field(
access="private",
type=Type(
typename=PQName(
segments=[FundamentalSpecifier(name="int")]
)
),
name="i",
)
],
)
]
)
)