aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp')
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp467
1 files changed, 0 insertions, 467 deletions
diff --git a/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp b/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
deleted file mode 100644
index c50084b8e..000000000
--- a/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
+++ /dev/null
@@ -1,467 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of Qt for Python.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "testaddfunction.h"
-#include <QtTest/QTest>
-#include "testutil.h"
-#include <abstractmetalang.h>
-#include <typesystem.h>
-
-void TestAddFunction::testParsingFuncNameAndConstness()
-{
- // generic test...
- const char sig1[] = "func(type1, const type2, const type3* const)";
- AddedFunction f1(QLatin1String(sig1), QLatin1String("void"));
- QCOMPARE(f1.name(), QLatin1String("func"));
- QCOMPARE(f1.arguments().count(), 3);
- AddedFunction::TypeInfo retval = f1.returnType();
- QCOMPARE(retval.name, QLatin1String("void"));
- QCOMPARE(retval.indirections, 0);
- QCOMPARE(retval.isConstant, false);
- QCOMPARE(retval.isReference, false);
-
- // test with a ugly template as argument and other ugly stuff
- const char sig2[] = " _fu__nc_ ( type1, const type2, const Abc<int& , C<char*> * > * *@my_name@, const type3* const ) const ";
- AddedFunction f2(QLatin1String(sig2), QLatin1String("const Abc<int& , C<char*> * > * *"));
- QCOMPARE(f2.name(), QLatin1String("_fu__nc_"));
- const auto &args = f2.arguments();
- QCOMPARE(args.count(), 4);
- retval = f2.returnType();
- QCOMPARE(retval.name, QLatin1String("Abc<int& , C<char*> * >"));
- QCOMPARE(retval.indirections, 2);
- QCOMPARE(retval.isConstant, true);
- QCOMPARE(retval.isReference, false);
- retval = args.at(2).typeInfo;
- QVERIFY(args.at(0).name.isEmpty());
- QVERIFY(args.at(1).name.isEmpty());
- QCOMPARE(args.at(2).name, QLatin1String("my_name"));
- QVERIFY(args.at(3).name.isEmpty());
- QCOMPARE(retval.name, QLatin1String("Abc<int& , C<char*> * >"));
- QCOMPARE(retval.indirections, 2);
- QCOMPARE(retval.isConstant, true);
- QCOMPARE(retval.isReference, false);
-
- // function with no args.
- const char sig3[] = "func()";
- AddedFunction f3(QLatin1String(sig3), QLatin1String("void"));
- QCOMPARE(f3.name(), QLatin1String("func"));
- QCOMPARE(f3.arguments().count(), 0);
-}
-
-void TestAddFunction::testAddFunction()
-{
- const char cppCode[] = R"CPP(
-struct B {};
-struct A {
- void a(int);
-};)CPP";
- const char xmlCode[] = R"XML(
-<typesystem package='Foo'>
- <primitive-type name='int'/>
- <primitive-type name='float'/>
- <value-type name='B'/>
- <value-type name='A'>
- <add-function signature='b(int, float = 4.6, const B&amp;)' return-type='int' access='protected'/>
- <add-function signature='operator()(int)' return-type='int' access='public'/>
- </value-type>
-</typesystem>)XML";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- TypeDatabase* typeDb = TypeDatabase::instance();
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- QCOMPARE(classA->functions().count(), 5); // default ctor, default copy ctor, func a() and the added functions
-
- auto addedFunc = classA->findFunction(QLatin1String("b"));
- QVERIFY(addedFunc);
- QCOMPARE(addedFunc->visibility(), AbstractMetaFunction::Protected);
- QCOMPARE(addedFunc->functionType(), AbstractMetaFunction::NormalFunction);
- QVERIFY(addedFunc->isUserAdded());
- QCOMPARE(addedFunc->ownerClass(), classA);
- QCOMPARE(addedFunc->implementingClass(), classA);
- QCOMPARE(addedFunc->declaringClass(), classA);
- QVERIFY(!addedFunc->isVirtual());
- QVERIFY(!addedFunc->isSignal());
- QVERIFY(!addedFunc->isSlot());
- QVERIFY(!addedFunc->isStatic());
-
- AbstractMetaType* returnType = addedFunc->type();
- QCOMPARE(returnType->typeEntry(), typeDb->findPrimitiveType(QLatin1String("int")));
- AbstractMetaArgumentList args = addedFunc->arguments();
- QCOMPARE(args.count(), 3);
- QCOMPARE(args[0]->type()->typeEntry(), returnType->typeEntry());
- QCOMPARE(args[1]->defaultValueExpression(), QLatin1String("4.6"));
- QCOMPARE(args[2]->type()->typeEntry(), typeDb->findType(QLatin1String("B")));
-
- auto addedCallOperator = classA->findFunction(QLatin1String("operator()"));
- QVERIFY(addedCallOperator);
-}
-
-void TestAddFunction::testAddFunctionConstructor()
-{
- const char cppCode[] = "struct A { A() {} };\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <value-type name='A'>\n\
- <add-function signature='A(int)'/>\n\
- </value-type>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- QCOMPARE(classA->functions().count(), 3); // default and added ctors
- AbstractMetaFunction* addedFunc = classA->functions().last();
- QCOMPARE(addedFunc->visibility(), AbstractMetaFunction::Public);
- QCOMPARE(addedFunc->functionType(), AbstractMetaFunction::ConstructorFunction);
- QCOMPARE(addedFunc->arguments().size(), 1);
- QVERIFY(addedFunc->isUserAdded());
- QVERIFY(!addedFunc->type());
-}
-
-void TestAddFunction::testAddFunctionTagDefaultValues()
-{
- const char cppCode[] = "struct A {};\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <value-type name='A'>\n\
- <add-function signature='func()'/>\n\
- </value-type>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- QCOMPARE(classA->functions().count(), 3); // default ctor, default copy ctor and the added function
- AbstractMetaFunction* addedFunc = classA->functions().last();
- QCOMPARE(addedFunc->visibility(), AbstractMetaFunction::Public);
- QCOMPARE(addedFunc->functionType(), AbstractMetaFunction::NormalFunction);
- QVERIFY(addedFunc->isUserAdded());
- QVERIFY(!addedFunc->type());
-}
-
-void TestAddFunction::testAddFunctionCodeSnippets()
-{
- const char cppCode[] = "struct A {};\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <value-type name='A'>\n\
- <add-function signature='func()'>\n\
- <inject-code class='target' position='end'>Hi!, I am the code.</inject-code>\n\
- </add-function>\n\
- </value-type>\n\
- </typesystem>\n";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- AbstractMetaFunction* addedFunc = classA->functions().last();
- QVERIFY(addedFunc->hasInjectedCode());
-}
-
-void TestAddFunction::testAddFunctionWithoutParenteses()
-{
- const char sig1[] = "func";
- AddedFunction f1(QLatin1String(sig1), QLatin1String("void"));
-
- QCOMPARE(f1.name(), QLatin1String("func"));
- QCOMPARE(f1.arguments().count(), 0);
- QCOMPARE(f1.isConstant(), false);
-
- const char cppCode[] = "struct A {};\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <value-type name='A'>\n\
- <add-function signature='func'>\n\
- <inject-code class='target' position='end'>Hi!, I am the code.</inject-code>\n\
- </add-function>\n\
- </value-type>\n\
- </typesystem>\n";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- const AbstractMetaFunction* addedFunc = classA->findFunction(QLatin1String("func"));
- QVERIFY(addedFunc);
- QVERIFY(addedFunc->hasInjectedCode());
- QCOMPARE(addedFunc->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode).count(), 1);
-}
-
-void TestAddFunction::testAddFunctionWithDefaultArgs()
-{
- const char sig1[] = "func";
- AddedFunction f1(QLatin1String(sig1), QLatin1String("void"));
-
- QCOMPARE(f1.name(), QLatin1String("func"));
- QCOMPARE(f1.arguments().count(), 0);
- QCOMPARE(f1.isConstant(), false);
-
- const char cppCode[] = "struct A { };\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <value-type name='A'>\n\
- <add-function signature='func(int, int)'>\n\
- <modify-argument index='2'>\n\
- <replace-default-expression with='2'/>\n\
- </modify-argument>\n\
- </add-function>\n\
- </value-type>\n\
- </typesystem>\n";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- const AbstractMetaFunction* addedFunc = classA->findFunction(QLatin1String("func"));
- QVERIFY(addedFunc);
- AbstractMetaArgument *arg = addedFunc->arguments()[1];
- QCOMPARE(arg->defaultValueExpression(), QLatin1String("2"));
-}
-
-void TestAddFunction::testAddFunctionAtModuleLevel()
-{
- const char cppCode[] = "struct A { };\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <value-type name='A'/>\n\
- <add-function signature='func(int, int)'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- </typesystem>\n";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
-
- TypeDatabase* typeDb = TypeDatabase::instance();
-
- AddedFunctionList addedFuncs = typeDb->findGlobalUserFunctions(QLatin1String("func"));
-
- QCOMPARE(addedFuncs.size(), 1);
-
- const FunctionModificationList mods = addedFuncs.constFirst()->modifications;
-
- QCOMPARE(mods.size(), 1);
- QVERIFY(mods.first().isCodeInjection());
- CodeSnip snip = mods.first().snips.first();
- QCOMPARE(snip.code(), QLatin1String("custom_code();"));
-}
-
-void TestAddFunction::testAddFunctionWithVarargs()
-{
- const char sig1[] = "func(int,char,...)";
- AddedFunction f1( QLatin1String(sig1), QLatin1String("void"));
-
- QCOMPARE(f1.name(), QLatin1String("func"));
- QCOMPARE(f1.arguments().count(), 3);
- QVERIFY(!f1.isConstant());
-
- const char cppCode[] = "struct A {};\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <primitive-type name='char'/>\n\
- <value-type name='A'>\n\
- <add-function signature='func(int,char,...)'/>\n\
- </value-type>\n\
- </typesystem>\n";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- const AbstractMetaFunction* addedFunc = classA->findFunction(QLatin1String("func"));
- QVERIFY(addedFunc);
- const AbstractMetaArgument* arg = addedFunc->arguments().last();
- QVERIFY(arg->type()->isVarargs());
- QVERIFY(arg->type()->typeEntry()->isVarargs());
-}
-
-void TestAddFunction::testAddStaticFunction()
-{
- const char cppCode[] = "struct A { };\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <value-type name='A'>\n\
- <add-function signature='func(int, int)' static='yes'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- </value-type>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
- QVERIFY(classA);
- const AbstractMetaFunction* addedFunc = classA->findFunction(QLatin1String("func"));
- QVERIFY(addedFunc);
- QVERIFY(addedFunc->isStatic());
-}
-
-void TestAddFunction::testAddGlobalFunction()
-{
- const char cppCode[] = "struct A { };struct B {};\n";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <value-type name='A'/>\n\
- <add-function signature='globalFunc(int, int)' static='yes'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- <add-function signature='globalFunc2(int, int)' static='yes'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- <value-type name='B'/>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaFunctionList globalFuncs = builder->globalFunctions();
- QCOMPARE(globalFuncs.count(), 2);
- const AbstractMetaClass *classB = AbstractMetaClass::findClass(builder->classes(), QLatin1String("B"));
- QVERIFY(classB);
- QVERIFY(!classB->findFunction(QLatin1String("globalFunc")));
- QVERIFY(!classB->findFunction(QLatin1String("globalFunc2")));
- QVERIFY(!globalFuncs[0]->injectedCodeSnips().isEmpty());
- QVERIFY(!globalFuncs[1]->injectedCodeSnips().isEmpty());
-}
-
-void TestAddFunction::testAddFunctionWithApiVersion()
-{
- const char cppCode[] = "";
- const char xmlCode[] = "\
- <typesystem package='Foo'>\n\
- <primitive-type name='int'/>\n\
- <add-function signature='globalFunc(int, int)' static='yes' since='1.3'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- <add-function signature='globalFunc2(int, int)' static='yes' since='0.1'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode,
- true, QLatin1String("0.1")));
- QVERIFY(!builder.isNull());
- AbstractMetaFunctionList globalFuncs = builder->globalFunctions();
- QCOMPARE(globalFuncs.count(), 1);
-}
-
-void TestAddFunction::testModifyAddedFunction()
-{
- const char cppCode[] = "class Foo { };\n";
- const char xmlCode[] = "\
- <typesystem package='Package'>\n\
- <primitive-type name='float'/>\n\
- <primitive-type name='int'/>\n\
- <value-type name='Foo'>\n\
- <add-function signature='method(float, int)'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- <modify-argument index='2'>\n\
- <replace-default-expression with='0'/>\n\
- <rename to='varName'/>\n\
- </modify-argument>\n\
- </add-function>\n\
- </value-type>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- AbstractMetaClass* foo = AbstractMetaClass::findClass(classes, QLatin1String("Foo"));
- const AbstractMetaFunction* method = foo->findFunction(QLatin1String("method"));
- QCOMPARE(method->arguments().size(), 2);
- AbstractMetaArgument* arg = method->arguments().at(1);
- QCOMPARE(arg->defaultValueExpression(), QLatin1String("0"));
- QCOMPARE(arg->name(), QLatin1String("varName"));
- QCOMPARE(method->argumentName(2), QLatin1String("varName"));
-}
-
-void TestAddFunction::testAddFunctionOnTypedef()
-{
- const char cppCode[] = "template<class T> class Foo { }; typedef Foo<int> FooInt;\n";
- const char xmlCode[] = "\
- <typesystem package='Package'>\n\
- <custom-type name='PySequence'/>\n\
- <primitive-type name='int'/>\n\
- <value-type name='FooInt'>\n\
- <add-function signature='FooInt(PySequence)'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- <add-function signature='method()'>\n\
- <inject-code class='target' position='beginning'>custom_code();</inject-code>\n\
- </add-function>\n\
- </value-type>\n\
- </typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- AbstractMetaClassList classes = builder->classes();
- AbstractMetaClass* foo = AbstractMetaClass::findClass(classes, QLatin1String("FooInt"));
- QVERIFY(foo);
- QVERIFY(foo->hasNonPrivateConstructor());
- const AbstractMetaFunctionList &lst = foo->queryFunctions(AbstractMetaClass::Constructors);
- for (const AbstractMetaFunction *f : lst)
- QVERIFY(f->signature().startsWith(f->name()));
- QCOMPARE(lst.size(), 2);
- const AbstractMetaFunction* method = foo->findFunction(QLatin1String("method"));
- QVERIFY(method);
-}
-
-void TestAddFunction::testAddFunctionWithTemplateArg()
-{
- const char cppCode[] = "template<class T> class Foo { };\n";
- const char xmlCode[] = "\
- <typesystem package='Package'>\n\
- <primitive-type name='int'/>\n\
- <container-type name='Foo' type='list'/>\n\
- <add-function signature='func(Foo&lt;int>)'/>\n\
- </typesystem>\n";
-
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
- QVERIFY(!builder.isNull());
- QCOMPARE(builder->globalFunctions().size(), 1);
- AbstractMetaFunction* func = builder->globalFunctions().first();
- AbstractMetaArgument* arg = func->arguments().first();
- QCOMPARE(arg->type()->instantiations().count(), 1);
-}
-
-QTEST_APPLESS_MAIN(TestAddFunction)
-