Initial commit
This commit is contained in:
511
tests/test_using.py
Normal file
511
tests/test_using.py
Normal file
@@ -0,0 +1,511 @@
|
||||
# Note: testcases generated via `python -m cxxheaderparser.gentest`
|
||||
|
||||
from cxxheaderparser.types import (
|
||||
BaseClass,
|
||||
ClassDecl,
|
||||
Function,
|
||||
FundamentalSpecifier,
|
||||
Method,
|
||||
NameSpecifier,
|
||||
PQName,
|
||||
Parameter,
|
||||
Pointer,
|
||||
Reference,
|
||||
TemplateArgument,
|
||||
TemplateDecl,
|
||||
TemplateSpecialization,
|
||||
TemplateTypeParam,
|
||||
Token,
|
||||
Type,
|
||||
UsingAlias,
|
||||
UsingDecl,
|
||||
)
|
||||
from cxxheaderparser.simple import (
|
||||
ClassScope,
|
||||
NamespaceScope,
|
||||
UsingNamespace,
|
||||
parse_string,
|
||||
ParsedData,
|
||||
)
|
||||
|
||||
|
||||
def test_using_namespace():
|
||||
content = """
|
||||
using namespace foo;
|
||||
using namespace foo::bar;
|
||||
using namespace ::foo;
|
||||
using namespace ::foo::bar;
|
||||
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_ns=[
|
||||
UsingNamespace(ns="foo"),
|
||||
UsingNamespace(ns="foo::bar"),
|
||||
UsingNamespace(ns="::foo"),
|
||||
UsingNamespace(ns="::foo::bar"),
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_using_declaration():
|
||||
content = """
|
||||
using ::foo;
|
||||
using foo::bar;
|
||||
using ::foo::bar;
|
||||
using typename ::foo::bar;
|
||||
using typename foo::bar;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using=[
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name=""), NameSpecifier(name="foo")]
|
||||
)
|
||||
),
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name="foo"), NameSpecifier(name="bar")]
|
||||
)
|
||||
),
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name=""),
|
||||
NameSpecifier(name="foo"),
|
||||
NameSpecifier(name="bar"),
|
||||
]
|
||||
)
|
||||
),
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name=""),
|
||||
NameSpecifier(name="foo"),
|
||||
NameSpecifier(name="bar"),
|
||||
]
|
||||
)
|
||||
),
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name="foo"), NameSpecifier(name="bar")]
|
||||
)
|
||||
),
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# alias-declaration
|
||||
def test_alias_declaration_1():
|
||||
content = """
|
||||
using alias = foo;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="alias",
|
||||
type=Type(typename=PQName(segments=[NameSpecifier(name="foo")])),
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_alias_declaration_2():
|
||||
content = """
|
||||
template <typename T> using alias = foo<T>;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="alias",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(
|
||||
name="foo",
|
||||
specialization=TemplateSpecialization(
|
||||
args=[
|
||||
TemplateArgument(tokens=[Token(value="T")])
|
||||
]
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
),
|
||||
template=TemplateDecl(
|
||||
params=[TemplateTypeParam(typekey="typename", name="T")]
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_alias_declaration_3():
|
||||
content = """
|
||||
using alias = ::foo::bar;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="alias",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name=""),
|
||||
NameSpecifier(name="foo"),
|
||||
NameSpecifier(name="bar"),
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_alias_declaration_4():
|
||||
content = """
|
||||
template <typename T> using alias = ::foo::bar<T>;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="alias",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name=""),
|
||||
NameSpecifier(name="foo"),
|
||||
NameSpecifier(
|
||||
name="bar",
|
||||
specialization=TemplateSpecialization(
|
||||
args=[
|
||||
TemplateArgument(tokens=[Token(value="T")])
|
||||
]
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
),
|
||||
template=TemplateDecl(
|
||||
params=[TemplateTypeParam(typekey="typename", name="T")]
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_alias_declaration_5():
|
||||
content = """
|
||||
using alias = foo::bar;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="alias",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="foo"),
|
||||
NameSpecifier(name="bar"),
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_alias_declaration_6():
|
||||
content = """
|
||||
template <typename T> using alias = foo<T>::bar;
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="alias",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(
|
||||
name="foo",
|
||||
specialization=TemplateSpecialization(
|
||||
args=[
|
||||
TemplateArgument(tokens=[Token(value="T")])
|
||||
]
|
||||
),
|
||||
),
|
||||
NameSpecifier(name="bar"),
|
||||
]
|
||||
)
|
||||
),
|
||||
template=TemplateDecl(
|
||||
params=[TemplateTypeParam(typekey="typename", name="T")]
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_using_many_things():
|
||||
content = """
|
||||
// clang-format off
|
||||
|
||||
using std::thing;
|
||||
using MyThing = SomeThing;
|
||||
namespace a {
|
||||
using std::string;
|
||||
using VoidFunction = std::function<void()>;
|
||||
|
||||
void fn(string &s, VoidFunction fn, thing * t);
|
||||
|
||||
class A : public B {
|
||||
public:
|
||||
using B::B;
|
||||
using IntFunction = std::function<int()>;
|
||||
|
||||
void a(string &s, IntFunction fn, thing * t);
|
||||
};
|
||||
}
|
||||
"""
|
||||
data = parse_string(content, cleandoc=True)
|
||||
|
||||
assert data == ParsedData(
|
||||
namespace=NamespaceScope(
|
||||
using=[
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="std"),
|
||||
NameSpecifier(name="thing"),
|
||||
]
|
||||
)
|
||||
)
|
||||
],
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="MyThing",
|
||||
type=Type(
|
||||
typename=PQName(segments=[NameSpecifier(name="SomeThing")])
|
||||
),
|
||||
)
|
||||
],
|
||||
namespaces={
|
||||
"a": NamespaceScope(
|
||||
name="a",
|
||||
classes=[
|
||||
ClassScope(
|
||||
class_decl=ClassDecl(
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name="A")], classkey="class"
|
||||
),
|
||||
bases=[
|
||||
BaseClass(
|
||||
access="public",
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name="B")]
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
methods=[
|
||||
Method(
|
||||
return_type=Type(
|
||||
typename=PQName(
|
||||
segments=[FundamentalSpecifier(name="void")]
|
||||
)
|
||||
),
|
||||
name=PQName(segments=[NameSpecifier(name="a")]),
|
||||
parameters=[
|
||||
Parameter(
|
||||
type=Reference(
|
||||
ref_to=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="string")
|
||||
]
|
||||
)
|
||||
)
|
||||
),
|
||||
name="s",
|
||||
),
|
||||
Parameter(
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(
|
||||
name="IntFunction"
|
||||
)
|
||||
]
|
||||
)
|
||||
),
|
||||
name="fn",
|
||||
),
|
||||
Parameter(
|
||||
type=Pointer(
|
||||
ptr_to=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="thing")
|
||||
]
|
||||
)
|
||||
)
|
||||
),
|
||||
name="t",
|
||||
),
|
||||
],
|
||||
access="public",
|
||||
)
|
||||
],
|
||||
using=[
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="B"),
|
||||
NameSpecifier(name="B"),
|
||||
]
|
||||
),
|
||||
access="public",
|
||||
)
|
||||
],
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="IntFunction",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="std"),
|
||||
NameSpecifier(
|
||||
name="function",
|
||||
specialization=TemplateSpecialization(
|
||||
args=[
|
||||
TemplateArgument(
|
||||
tokens=[
|
||||
Token(value="int"),
|
||||
Token(value="("),
|
||||
Token(value=")"),
|
||||
]
|
||||
)
|
||||
]
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
),
|
||||
access="public",
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
functions=[
|
||||
Function(
|
||||
return_type=Type(
|
||||
typename=PQName(
|
||||
segments=[FundamentalSpecifier(name="void")]
|
||||
)
|
||||
),
|
||||
name=PQName(segments=[NameSpecifier(name="fn")]),
|
||||
parameters=[
|
||||
Parameter(
|
||||
type=Reference(
|
||||
ref_to=Type(
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name="string")]
|
||||
)
|
||||
)
|
||||
),
|
||||
name="s",
|
||||
),
|
||||
Parameter(
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="VoidFunction")
|
||||
]
|
||||
)
|
||||
),
|
||||
name="fn",
|
||||
),
|
||||
Parameter(
|
||||
type=Pointer(
|
||||
ptr_to=Type(
|
||||
typename=PQName(
|
||||
segments=[NameSpecifier(name="thing")]
|
||||
)
|
||||
)
|
||||
),
|
||||
name="t",
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
using=[
|
||||
UsingDecl(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="std"),
|
||||
NameSpecifier(name="string"),
|
||||
]
|
||||
)
|
||||
)
|
||||
],
|
||||
using_alias=[
|
||||
UsingAlias(
|
||||
alias="VoidFunction",
|
||||
type=Type(
|
||||
typename=PQName(
|
||||
segments=[
|
||||
NameSpecifier(name="std"),
|
||||
NameSpecifier(
|
||||
name="function",
|
||||
specialization=TemplateSpecialization(
|
||||
args=[
|
||||
TemplateArgument(
|
||||
tokens=[
|
||||
Token(value="void"),
|
||||
Token(value="("),
|
||||
Token(value=")"),
|
||||
]
|
||||
)
|
||||
]
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
},
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user