256 lines
8.6 KiB
Python
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",
|
|
)
|
|
],
|
|
)
|
|
]
|
|
)
|
|
)
|