diff options
author | Jakob Lykke Andersen <jakob@caput.dk> | 2014-07-24 01:40:48 +0200 |
---|---|---|
committer | Jakob Lykke Andersen <jakob@caput.dk> | 2014-07-24 01:40:48 +0200 |
commit | 967ca06545b4432c6ec3e6a13aed9ea03d3874cc (patch) | |
tree | 3a22296a0de0fe12514a64d56fae9be5ec97a1b2 /tests/test_cpp_domain.py | |
parent | 55eb97e9c519a655444108e15e82ca89289e1c8d (diff) | |
download | sphinx-git-967ca06545b4432c6ec3e6a13aed9ea03d3874cc.tar.gz |
Revamp of C++ domain.
Diffstat (limited to 'tests/test_cpp_domain.py')
-rw-r--r-- | tests/test_cpp_domain.py | 232 |
1 files changed, 93 insertions, 139 deletions
diff --git a/tests/test_cpp_domain.py b/tests/test_cpp_domain.py index 15bb29af6..20160da9e 100644 --- a/tests/test_cpp_domain.py +++ b/tests/test_cpp_domain.py @@ -15,151 +15,105 @@ from util import raises from sphinx.domains.cpp import DefinitionParser, DefinitionError - def parse(name, string): - return getattr(DefinitionParser(string), 'parse_' + name)() - + parser = DefinitionParser(string) + res = getattr(parser, "parse_" + name + "_object")() + if not parser.eof: + print("Parsing stopped at", parser.pos) + print(string) + print('-'*parser.pos + '^') + raise DefinitionError("") + return res + +def check(name, input, output=None): + # first a simple check of the AST + if output == None: output = input + ast = parse(name, input) + res = text_type(ast) + if res != output: + print("Input: ", text_type(input)) + print("Result:", res) + raise DefinitionError("") + # now check describe_signature + ast.describe_signature([], 'lastIsName', None) def test_type_definitions(): - rv = parse('member_object', ' const std::string & name = 42') - assert text_type(rv) == 'const std::string& name = 42' - - rv = parse('member_object', ' const std::string & name leftover') - assert text_type(rv) == 'const std::string& name' - - rv = parse('member_object', ' const std::string & name [n] leftover') - assert text_type(rv) == 'const std::string& name[n]' - - rv = parse('member_object', 'const std::vector< unsigned int, long> &name') - assert text_type(rv) == 'const std::vector<unsigned int, long>& name' - - x = 'std::vector<std::pair<std::string, int>>& module::test(register ' \ - 'foo, bar, std::string baz="foobar, blah, bleh") const = 0' - assert text_type(parse('function', x)) == x - - x = 'module::myclass::operator std::vector<std::string>()' - assert text_type(parse('function', x)) == x - x = 'explicit module::myclass::foo::foo()' - assert text_type(parse('function', x)) == x - - x = 'int printf(const char* fmt, ...)' - assert text_type(parse('function', x)) == x - - x = 'int foo(const unsigned int j)' - assert text_type(parse('function', x)) == x - - x = 'int foo(const unsigned int const j)' - assert text_type(parse('function', x)) == x - - x = 'int foo(const int* const ptr)' - assert text_type(parse('function', x)) == x - - x = 'std::vector<std::pair<std::string, long long>> module::blah' - assert text_type(parse('type_object', x)) == x - - assert text_type(parse('type_object', 'long long int foo')) == 'long long foo' - - x = 'void operator()(const boost::array<VertexID, 2>& v) const' - assert text_type(parse('function', x)) == x - - x = 'void operator()(const boost::array<VertexID, 2, "foo, bar">& v) const' - assert text_type(parse('function', x)) == x - - x = 'MyClass::MyClass(MyClass::MyClass&&)' - assert text_type(parse('function', x)) == x - - x = 'constexpr int get_value()' - assert text_type(parse('function', x)) == x - - x = 'static constexpr int get_value()' - assert text_type(parse('function', x)) == x - - x = 'int get_value() const noexcept' - assert text_type(parse('function', x)) == x - - x = 'int get_value() const noexcept = delete' - assert text_type(parse('function', x)) == x - - x = 'MyClass::MyClass(MyClass::MyClass&&) = default' - assert text_type(parse('function', x)) == x - - x = 'MyClass::a_virtual_function() const override' - assert text_type(parse('function', x)) == x - - x = 'MyClass::a_member_function() volatile' - assert text_type(parse('function', x)) == x - - x = 'MyClass::a_member_function() const volatile' - assert text_type(parse('function', x)) == x - - x = 'MyClass::a_member_function() &&' - assert text_type(parse('function', x)) == x - - x = 'MyClass::a_member_function() &' - assert text_type(parse('function', x)) == x - - x = 'MyClass::a_member_function() const &' - assert text_type(parse('function', x)) == x - - x = 'int main(int argc, char* argv[][])' - assert text_type(parse('function', x)) == x - - x = 'std::vector<std::pair<std::string, int>>& module::test(register ' \ - 'foo, bar[n], std::string baz="foobar, blah, bleh") const = 0' - assert text_type(parse('function', x)) == x - - x = 'module::myclass foo[n]' - assert text_type(parse('member_object', x)) == x - - x = 'int foo(Foo f=Foo(double(), std::make_pair(int(2), double(3.4))))' - assert text_type(parse('function', x)) == x - - x = 'int foo(A a=x(a))' - assert text_type(parse('function', x)) == x - - x = 'int foo(B b=x(a)' - raises(DefinitionError, parse, 'function', x) - - x = 'int foo)C c=x(a))' - raises(DefinitionError, parse, 'function', x) - - x = 'int foo(D d=x(a' - raises(DefinitionError, parse, 'function', x) - - x = 'int foo(const A&... a)' - assert text_type(parse('function', x)) == x - - x = 'virtual void f()' - assert text_type(parse('function', x)) == x - + check("type", "public bool b", "bool b") + check("type", "bool A::b") + check("type", "bool *b") + check("type", "bool *const b") + check("type", "bool *volatile const b") + check("type", "bool *volatile const b") + check("type", "bool *volatile const *b") + check("type", "bool &b") + check("type", "bool b[]") + check("type", "std::pair<int, int> coord") + check("type", "long long int foo") + check("type", 'std::vector<std::pair<std::string, long long>> module::blah') + check("type", "std::function<void()> F") + check("type", "std::function<R(A1, A2, A3)> F") + check("type", "std::function<R(A1, A2, A3, As...)> F") + + check('member', ' const std::string & name = 42', 'const std::string &name = 42') + check('member', ' const std::string & name', 'const std::string &name') + check('member', ' const std::string & name [ n ]', 'const std::string &name[n]') + check('member', 'const std::vector< unsigned int, long> &name', 'const std::vector<unsigned int, long> &name') + check('member', 'module::myclass foo[n]') + + x = 'std::vector<std::pair<std::string, int>> &module::test(register ' \ + 'foo, bar, std::string baz = "foobar, blah, bleh") const = 0' + check('function', x) + check('function', 'explicit module::myclass::foo::foo()') + check('function', 'module::myclass::foo::~foo()') + check('function', 'int printf(const char *fmt, ...)') + check('function', 'int foo(const unsigned int j)') + check('function', 'int foo(const int *const ptr)') + check('function', 'module::myclass::operator std::vector<std::string>()') + check('function', 'void operator()(const boost::array<VertexID, 2> &v) const') + check('function', 'void operator()(const boost::array<VertexID, 2, "foo, bar"> &v) const') + check('function', 'MyClass::MyClass(MyClass::MyClass&&)') + check('function', 'constexpr int get_value()') + check('function', 'static constexpr int get_value()') + check('function', 'int get_value() const noexcept') + check('function', 'int get_value() const noexcept = delete') + check('function', 'MyClass::MyClass(MyClass::MyClass&&) = default') + check('function', 'MyClass::a_virtual_function() const override') + check('function', 'A B() override') + check('function', 'A B() final') + check('function', 'A B() final override') + check('function', 'A B() override final', 'A B() final override') + check('function', 'MyClass::a_member_function() volatile') + check('function', 'MyClass::a_member_function() volatile const') + check('function', 'MyClass::a_member_function() &&') + check('function', 'MyClass::a_member_function() &') + check('function', 'MyClass::a_member_function() const &') + check('function', 'int main(int argc, char *argv[][])') + check('function', 'MyClass &MyClass::operator++()') + check('function', 'MyClass::pointer MyClass::operator->()') + + x = 'std::vector<std::pair<std::string, int>> &module::test(register ' \ + 'foo, bar[n], std::string baz = "foobar, blah, bleh") const = 0' + check('function', x) + check('function', 'int foo(Foo f = Foo(double(), std::make_pair(int(2), double(3.4))))') + check('function', 'int foo(A a = x(a))') + raises(DefinitionError, parse, 'function', 'int foo(B b=x(a)') + raises(DefinitionError, parse, 'function', 'int foo)C c=x(a))') + raises(DefinitionError, parse, 'function', 'int foo(D d=x(a') + check('function', 'int foo(const A&... a)') + check('function', 'virtual void f()') def test_bases(): - x = 'A' - assert text_type(parse('class', x)) == x - - x = 'A : B' - assert text_type(parse('class', x)) == x - - x = 'A : private B' - assert text_type(parse('class', x)) == 'A : B' - - x = 'A : public B' - assert text_type(parse('class', x)) == x - - x = 'A : B, C' - assert text_type(parse('class', x)) == x - - x = 'A : B, protected C, D' - assert text_type(parse('class', x)) == x + check('class', 'A') + check('class', 'A::B::C') + check('class', 'A : B') + check('class', 'A : private B', 'A : B') + check('class', 'A : public B') + check('class', 'A : B, C') + check('class', 'A : B, protected C, D') def test_operators(): - x = parse('function', 'void operator new [ ] ()') - assert text_type(x) == 'void operator new[]()' - - x = parse('function', 'void operator delete ()') - assert text_type(x) == 'void operator delete()' - + check('function', 'void operator new [ ] ()', 'void operator new[]()') + check('function', 'void operator delete ()', 'void operator delete()') for op in '*-+=/%!': - x = parse('function', 'void operator %s ()' % op) - assert text_type(x) == 'void operator%s()' % op + check('function', 'void operator %s ()' % op, 'void operator%s()' % op) |