diff options
-rw-r--r-- | sources/shiboken2/ApiExtractor/tests/testtemplates.cpp | 388 |
1 files changed, 195 insertions, 193 deletions
diff --git a/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp b/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp index ea506f3b5..8d869e3f9 100644 --- a/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp @@ -35,35 +35,37 @@ void TestTemplates::testTemplateWithNamespace() { - const char cppCode[] = "\n\ - template<typename T> struct QList {}; \n\ - struct Url {\n\ - void name();\n\ - };\n\ - namespace Internet {\n\ - struct Url{};\n\ - struct Bookmarks {\n\ - QList<Url> list();\n\ - };\n\ - }"; - const char xmlCode0[] = "\n\ - <typesystem package='Pakcage.Network'>\n\ - <value-type name='Url'/>\n\ - </typesystem>"; + const char cppCode[] = R"CPP( +template<typename T> struct QList {}; +struct Url { + void name(); +}; +namespace Internet { + struct Url{}; + struct Bookmarks { + QList<Url> list(); + }; +}; +)CPP"; + + const char xmlCode0[] = R"XML( +<typesystem package='Package.Network'> + <value-type name='Url'/> +</typesystem>)XML"; QTemporaryFile file; QVERIFY(file.open()); file.write(xmlCode0); file.close(); - QString xmlCode1 = QString::fromLatin1("\n\ - <typesystem package='Package.Internet'>\n\ - <load-typesystem name='%1' generate='no'/>\n\ - <container-type name='QList' type='list'/>\n\ - <namespace-type name='Internet' generate='no'/>\n\ - <value-type name='Internet::Url'/>\n\ - <value-type name='Internet::Bookmarks'/>\n\ - </typesystem>").arg(file.fileName()); + QString xmlCode1 = QString::fromLatin1(R"XML( +<typesystem package='Package.Internet'> + <load-typesystem name='%1' generate='no'/> + <container-type name='QList' type='list'/> + <namespace-type name='Internet' generate='no'/> + <value-type name='Internet::Url'/> + <value-type name='Internet::Bookmarks'/> +</typesystem>)XML").arg(file.fileName()); QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, qPrintable(xmlCode1), false)); QVERIFY(!builder.isNull()); @@ -79,26 +81,27 @@ void TestTemplates::testTemplateWithNamespace() void TestTemplates::testTemplateOnContainers() { - const char cppCode[] = "\n\ - struct Base {};\n\ - template<typename T> struct QList {}; \n\ - namespace Namespace {\n\ - enum SomeEnum { E1, E2 };\n\ - template<SomeEnum type> struct A {\n\ - A<type> foo(const QList<A<type> >& a);\n\ - };\n\ - typedef A<E1> B;\n\ - }\n\ - "; - const char xmlCode[] = "\n\ - <typesystem package=\"Package\">\n\ - <container-type name='QList' type='list'/>\n\ - <namespace-type name='Namespace'/>\n\ - <enum-type name='Namespace::SomeEnum'/>\n\ - <object-type name='Base'/>\n\ - <object-type name='Namespace::A' generate='no'/>\n\ - <object-type name='Namespace::B'/>\n\ - </typesystem>"; + const char cppCode[] = R"CPP( +struct Base {}; +template<typename T> struct QList {}; +namespace Namespace { + enum SomeEnum { E1, E2 }; + template<SomeEnum type> struct A { + A<type> foo(const QList<A<type> >& a); + }; + typedef A<E1> B; +} +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package="Package"> + <container-type name='QList' type='list'/> + <namespace-type name='Namespace'/> + <enum-type name='Namespace::SomeEnum'/> + <object-type name='Base'/> + <object-type name='Namespace::A' generate='no'/> + <object-type name='Namespace::B'/> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -124,18 +127,17 @@ void TestTemplates::testTemplateOnContainers() void TestTemplates::testTemplateValueAsArgument() { - const char cppCode[] = "\n\ - template<typename T> struct List {};\n\ - void func(List<int> arg) {}\n\ - "; - - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <primitive-type name='int'/>\n\ - <container-type name='List' type='list'/>\n\ - <function signature='func(List<int>)'/>\n\ - </typesystem>\n\ - "; + const char cppCode[] = R"CPP( +template<typename T> struct List {}; +void func(List<int> arg) {} +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Package'> + <primitive-type name='int'/> + <container-type name='List' type='list'/> + <function signature='func(List<int>)'/> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -149,18 +151,17 @@ void TestTemplates::testTemplateValueAsArgument() void TestTemplates::testTemplatePointerAsArgument() { - const char cppCode[] = "\n\ - template<typename T> struct List {};\n\ - void func(List<int>* arg) {}\n\ - "; - - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <primitive-type name='int'/>\n\ - <container-type name='List' type='list'/>\n\ - <function signature='func(List<int>*)'/>\n\ - </typesystem>\n\ - "; + const char cppCode[] = R"CPP( +template<typename T> struct List {}; +void func(List<int>* arg) {} +)CPP"; + + const char xmlCode[] = R"XML( + <typesystem package='Package'> + <primitive-type name='int'/> + <container-type name='List' type='list'/> + <function signature='func(List<int>*)'/> + </typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -174,18 +175,17 @@ void TestTemplates::testTemplatePointerAsArgument() void TestTemplates::testTemplateReferenceAsArgument() { - const char cppCode[] = "\n\ - template<typename T> struct List {};\n\ - void func(List<int>& arg) {}\n\ - "; - - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <primitive-type name='int'/>\n\ - <container-type name='List' type='list'/>\n\ - <function signature='func(List<int>&)'/>\n\ - </typesystem>\n\ - "; + const char cppCode[] = R"CPP( +template<typename T> struct List {}; +void func(List<int>& arg) {} + )CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Package'> + <primitive-type name='int'/> + <container-type name='List' type='list'/> + <function signature='func(List<int>&)'/> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -199,19 +199,20 @@ void TestTemplates::testTemplateReferenceAsArgument() void TestTemplates::testTemplateParameterFixup() { - const char cppCode[] = "\n\ - template<typename T>\n\ - struct List {\n\ - struct Iterator {};\n\ - void append(List l);\n\ - void erase(List::Iterator it);\n\ - };\n"; - - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <container-type name='List' type='list'/>\n\ - <value-type name='List::Iterator'/>\n\ - </typesystem>\n"; + const char cppCode[] = R"CPP( +template<typename T> +struct List { + struct Iterator {}; + void append(List l); + void erase(List::Iterator it); +}; +)CPP"; + + const char xmlCode[] = R"XML( + <typesystem package='Package'> + <container-type name='List' type='list'/> + <value-type name='List::Iterator'/> + </typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -234,26 +235,25 @@ void TestTemplates::testTemplateParameterFixup() void TestTemplates::testInheritanceFromContainterTemplate() { - const char cppCode[] = "\n\ - template<typename T>\n\ - struct ListContainer {\n\ - inline void push_front(const T& t);\n\ - inline T& front();\n\ - };\n\ - struct FooBar {};\n\ - struct FooBars : public ListContainer<FooBar> {};\n\ - "; - - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <container-type name='ListContainer' type='list'/>\n\ - <value-type name='FooBar'/>\n\ - <value-type name='FooBars'>\n\ - <modify-function signature='push_front(FooBar)' remove='all'/>\n\ - <modify-function signature='front()' remove='all'/>\n\ - </value-type>\n\ - </typesystem>\n\ - "; + const char cppCode[] = R"CPP( +template<typename T> +struct ListContainer { + inline void push_front(const T& t); + inline T& front(); +}; +struct FooBar {}; +struct FooBars : public ListContainer<FooBar> {}; +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Package'> + <container-type name='ListContainer' type='list'/> + <value-type name='FooBar'/> + <value-type name='FooBars'> + <modify-function signature='push_front(FooBar)' remove='all'/> + <modify-function signature='front()' remove='all'/> + </value-type> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -271,25 +271,26 @@ void TestTemplates::testInheritanceFromContainterTemplate() void TestTemplates::testTemplateInheritanceMixedWithForwardDeclaration() { - const char cppCode[] = "\n\ - enum SomeEnum { E1, E2 };\n\ - template<SomeEnum type> struct Future;\n\ - template<SomeEnum type>\n\ - struct A {\n\ - A();\n\ - void method();\n\ - friend struct Future<type>;\n\ - };\n\ - typedef A<E1> B;\n\ - template<SomeEnum type> struct Future {};\n\ - "; - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <enum-type name='SomeEnum'/>\n\ - <value-type name='A' generate='no'/>\n\ - <value-type name='B'/>\n\ - <value-type name='Future' generate='no'/>\n\ - </typesystem>"; + const char cppCode[] = R"CPP( +enum SomeEnum { E1, E2 }; +template<SomeEnum type> struct Future; +template<SomeEnum type> +struct A { + A(); + void method(); + friend struct Future<type>; +}; +typedef A<E1> B; +template<SomeEnum type> struct Future {}; +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Package'> + <enum-type name='SomeEnum'/> + <value-type name='A' generate='no'/> + <value-type name='B'/> + <value-type name='Future' generate='no'/> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -305,28 +306,29 @@ void TestTemplates::testTemplateInheritanceMixedWithForwardDeclaration() void TestTemplates::testTemplateInheritanceMixedWithNamespaceAndForwardDeclaration() { - const char cppCode[] = "\n\ - namespace Namespace {\n\ - enum SomeEnum { E1, E2 };\n\ - template<SomeEnum type> struct Future;\n\ - template<SomeEnum type>\n\ - struct A {\n\ - A();\n\ - void method();\n\ - friend struct Future<type>;\n\ - };\n\ - typedef A<E1> B;\n\ - template<SomeEnum type> struct Future {};\n\ - };\n\ - "; - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <namespace-type name='Namespace'/>\n\ - <enum-type name='Namespace::SomeEnum'/>\n\ - <value-type name='Namespace::A' generate='no'/>\n\ - <value-type name='Namespace::B'/>\n\ - <value-type name='Namespace::Future' generate='no'/>\n\ - </typesystem>"; + const char cppCode[] = R"CPP( +namespace Namespace { +enum SomeEnum { E1, E2 }; +template<SomeEnum type> struct Future; +template<SomeEnum type> +struct A { + A(); + void method(); + friend struct Future<type>; +}; +typedef A<E1> B; +template<SomeEnum type> struct Future {}; +}; +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Package'> + <namespace-type name='Namespace'/> + <enum-type name='Namespace::SomeEnum'/> + <value-type name='Namespace::A' generate='no'/> + <value-type name='Namespace::B'/> + <value-type name='Namespace::Future' generate='no'/> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -342,28 +344,27 @@ void TestTemplates::testTemplateInheritanceMixedWithNamespaceAndForwardDeclarati void TestTemplates::testTypedefOfInstantiationOfTemplateClass() { - const char cppCode[] = "\n\ - namespace NSpace {\n\ - enum ClassType {\n\ - TypeOne\n\ - };\n\ - template<ClassType CLASS_TYPE>\n\ - struct BaseTemplateClass {\n\ - inline ClassType getClassType() const { CLASS_TYPE; }\n\ - };\n\ - typedef BaseTemplateClass<TypeOne> TypeOneClass;\n\ - }\n\ - "; - - const char xmlCode[] = "\n\ - <typesystem package='Package'>\n\ - <namespace-type name='NSpace'>\n\ - <enum-type name='ClassType'/>\n\ - <object-type name='BaseTemplateClass' generate='no'/>\n\ - <object-type name='TypeOneClass'/>\n\ - </namespace-type>\n\ - </typesystem>\n\ - "; + const char cppCode[] = R"CPP( +namespace NSpace { +enum ClassType { + TypeOne +}; +template<ClassType CLASS_TYPE> +struct BaseTemplateClass { + inline ClassType getClassType() const { CLASS_TYPE; } +}; +typedef BaseTemplateClass<TypeOne> TypeOneClass; +} +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Package'> + <namespace-type name='NSpace'> + <enum-type name='ClassType'/> + <object-type name='BaseTemplateClass' generate='no'/> + <object-type name='TypeOneClass'/> + </namespace-type> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); @@ -395,24 +396,25 @@ void TestTemplates::testTypedefOfInstantiationOfTemplateClass() void TestTemplates::testContainerTypeIncompleteArgument() { - const char* cppCode ="\n\ - template<typename T>\n\ - class Vector {\n\ - void method(const Vector& vector);\n\ - Vector otherMethod();\n\ - };\n\ - template <typename T>\n\ - void Vector<T>::method(const Vector<T>& vector) {}\n\ - template <typename T>\n\ - Vector<T> Vector<T>::otherMethod() { return Vector<T>(); }\n\ - typedef Vector<int> IntVector;\n\ - "; - const char* xmlCode = "\n\ - <typesystem package='Foo'>\n\ - <primitive-type name='int'/>\n\ - <container-type name='Vector' type='vector'/>\n\ - <value-type name='IntVector'/>\n\ - </typesystem>"; + const char cppCode[] = R"CPP( +template<typename T> +class Vector { + void method(const Vector& vector); + Vector otherMethod(); +}; +template <typename T> +void Vector<T>::method(const Vector<T>& vector) {} +template <typename T> +Vector<T> Vector<T>::otherMethod() { return Vector<T>(); } +typedef Vector<int> IntVector; +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package='Foo'> + <primitive-type name='int'/> + <container-type name='Vector' type='vector'/> + <value-type name='IntVector'/> +</typesystem>)XML"; QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, true)); QVERIFY(!builder.isNull()); |