diff options
| author | Friedemann Kleint <friedemann.kleint@qt.io> | 2023-05-10 13:50:56 +0200 |
|---|---|---|
| committer | Cristián Maureira-Fredes <cristian.maureira-fredes@qt.io> | 2025-11-24 12:06:06 +0100 |
| commit | 845630ad239c4b37ff37e49ef5bb969a8946744b (patch) | |
| tree | 5c65f2e270511459d346c14f0ad8d01f5e6e39a0 /sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp | |
| parent | 3cf2077a1b060bbea3419ccde23c5da6485a2e24 (diff) | |
Move the shiboken-generator source around
THIS COMMIT WAS GENERATED BY A SCRIPT
Task-number: PYSIDE-962
Task-number: PYSIDE-1587
Change-Id: I58b05c3d05606efb6303193f2d7f907a0ab5741b
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp')
| -rw-r--r-- | sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp | 522 |
1 files changed, 0 insertions, 522 deletions
diff --git a/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp b/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp deleted file mode 100644 index db58188c3..000000000 --- a/sources/shiboken6/ApiExtractor/tests/testaddfunction.cpp +++ /dev/null @@ -1,522 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "testaddfunction.h" -#include "testutil.h" -#include <abstractmetaargument.h> -#include <abstractmetafunction.h> -#include <abstractmetalang.h> -#include <abstractmetatype.h> -#include <codesnip.h> -#include <addedfunction.h> -#include <addedfunction_p.h> -#include <complextypeentry.h> -#include <primitivetypeentry.h> - -#include <qtcompat.h> - -#include <QtTest/qtest.h> - -using namespace Qt::StringLiterals; - -static constexpr auto voidT = "void"_L1; - -void TestAddFunction::testParsingFuncNameAndConstness() -{ - // generic test... - static constexpr auto sig1 = "func(type1, const type2, const type3* const)"_L1; - QString errorMessage; - auto f1 = AddedFunction::createAddedFunction(sig1, voidT, &errorMessage); - QVERIFY2(f1, qPrintable(errorMessage)); - QCOMPARE(f1->name(), u"func"); - QCOMPARE(f1->arguments().size(), 3); - TypeInfo retval = f1->returnType(); - QCOMPARE(retval.qualifiedName(), QStringList{voidT}); - QCOMPARE(retval.indirections(), 0); - QCOMPARE(retval.isConstant(), false); - QCOMPARE(retval.referenceType(), NoReference); - - // test with a ugly template as argument and other ugly stuff - static constexpr auto sig2 = - " _fu__nc_ ( type1, const type2, const Abc<int& , C<char*> * >" - " * *@my_name@, const type3* const ) const "_L1; - auto f2 = AddedFunction::createAddedFunction(sig2, - u"const Abc<int& , C<char*> * > * *"_s, - &errorMessage); - QVERIFY2(f2, qPrintable(errorMessage)); - QCOMPARE(f2->name(), u"_fu__nc_"); - const auto &args = f2->arguments(); - QCOMPARE(args.size(), 4); - retval = f2->returnType(); - QCOMPARE(retval.qualifiedName(), QStringList{u"Abc"_s}); - QCOMPARE(retval.instantiations().size(), 2); - QCOMPARE(retval.toString(), u"const Abc<int&, C<char*>*>**"); - QCOMPARE(retval.indirections(), 2); - QCOMPARE(retval.isConstant(), true); - QCOMPARE(retval.referenceType(), NoReference); - QVERIFY(args.at(0).name.isEmpty()); - QVERIFY(args.at(1).name.isEmpty()); - - QCOMPARE(args.at(2).name, u"my_name"); - auto arg2Type = args.at(2).typeInfo; - QCOMPARE(arg2Type.qualifiedName(), QStringList{u"Abc"_s}); - QCOMPARE(arg2Type.instantiations().size(), 2); - QCOMPARE(arg2Type.toString(), u"const Abc<int&, C<char*>*>**"); - QCOMPARE(arg2Type.indirections(), 2); - QCOMPARE(arg2Type.isConstant(), true); - QCOMPARE(arg2Type.referenceType(), NoReference); - - QVERIFY(args.at(3).name.isEmpty()); - - // function with no args. - auto f3 = AddedFunction::createAddedFunction("func()"_L1, voidT, &errorMessage); - QVERIFY2(f3, qPrintable(errorMessage)); - QCOMPARE(f3->name(), u"func"); - QCOMPARE(f3->arguments().size(), 0); - - // const call operator - auto f4 = AddedFunction::createAddedFunction("operator()(int)const"_L1, - "int"_L1, &errorMessage); - QVERIFY2(f4, qPrintable(errorMessage)); - QCOMPARE(f4->name(), u"operator()"); - QCOMPARE(f4->arguments().size(), 1); - QVERIFY(f4->isConstant()); -} - -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&)' 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); - auto *typeDb = TypeDatabase::instance(); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - // default ctor, default copy ctor, func a() and the added functions - QCOMPARE(classA->functions().size(), 5); - - auto addedFunc = classA->findFunction("b"); - QVERIFY(addedFunc); - QCOMPARE(addedFunc->access(), Access::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(u"int"_s)); - const AbstractMetaArgumentList &args = addedFunc->arguments(); - QCOMPARE(args.size(), 3); - QCOMPARE(args.at(0).type().typeEntry(), returnType.typeEntry()); - QCOMPARE(args.at(1).defaultValueExpression(), u"4.6"); - QCOMPARE(args.at(2).type().typeEntry(), typeDb->findType(u"B"_s)); - - auto addedCallOperator = classA->findFunction("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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - QCOMPARE(classA->functions().size(), 3); // default and added ctors - const auto addedFunc = classA->functions().constLast(); - QCOMPARE(addedFunc->access(), Access::Public); - QCOMPARE(addedFunc->functionType(), AbstractMetaFunction::ConstructorFunction); - QCOMPARE(addedFunc->arguments().size(), 1); - QVERIFY(addedFunc->isUserAdded()); - QVERIFY(addedFunc->isVoid()); -} - -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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - // default ctor, default copy ctor and the added function - QCOMPARE(classA->functions().size(), 3); - const auto addedFunc = classA->functions().constLast(); - QCOMPARE(addedFunc->access(), Access::Public); - QCOMPARE(addedFunc->functionType(), AbstractMetaFunction::NormalFunction); - QVERIFY(addedFunc->isUserAdded()); - QVERIFY(addedFunc->isVoid()); -} - -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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - const auto addedFunc = classA->functions().constLast(); - QVERIFY(addedFunc->hasInjectedCode()); -} - -void TestAddFunction::testAddFunctionWithoutParenteses() -{ - static constexpr auto sig1 = "func"_L1; - QString errorMessage; - auto f1 = AddedFunction::createAddedFunction(sig1, voidT, &errorMessage); - QVERIFY2(f1, qPrintable(errorMessage)); - QCOMPARE(f1->name(), u"func"); - QCOMPARE(f1->arguments().size(), 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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - const auto addedFunc = classA->findFunction(sig1); - QVERIFY(addedFunc); - QVERIFY(addedFunc->hasInjectedCode()); - const auto snips = addedFunc->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, - TypeSystem::TargetLangCode); - QCOMPARE(snips.size(), 1); -} - -void TestAddFunction::testAddFunctionWithDefaultArgs() -{ - static constexpr auto sig1 = "func"_L1; - QString errorMessage; - auto f1 = AddedFunction::createAddedFunction(sig1, voidT, &errorMessage); - QVERIFY2(f1, qPrintable(errorMessage)); - QCOMPARE(f1->name(), u"func"); - QCOMPARE(f1->arguments().size(), 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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - const auto addedFunc = classA->findFunction(sig1); - QVERIFY(addedFunc); - const AbstractMetaArgument &arg = addedFunc->arguments().at(1); - QCOMPARE(arg.defaultValueExpression(), u"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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - - auto *typeDb = TypeDatabase::instance(); - - AddedFunctionList addedFuncs = typeDb->findGlobalUserFunctions(u"func"_s); - - QCOMPARE(addedFuncs.size(), 1); - - auto &mods = addedFuncs.constFirst()->modifications(); - - QCOMPARE(mods.size(), 1); - QVERIFY(mods.constFirst().isCodeInjection()); - CodeSnip snip = mods.constFirst().snips().constFirst(); - QCOMPARE(snip.code().trimmed(), u"custom_code();"); -} - -void TestAddFunction::testAddFunctionWithVarargs() -{ - QString errorMessage; - auto f1 = AddedFunction::createAddedFunction("func(int,char,...)"_L1, voidT, - &errorMessage); - QVERIFY2(f1, qPrintable(errorMessage)); - QCOMPARE(f1->name(), u"func"); - QCOMPARE(f1->arguments().size(), 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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - const auto addedFunc = classA->findFunction("func"); - QVERIFY(addedFunc); - const AbstractMetaArgument &arg = addedFunc->arguments().constLast(); - 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); - AbstractMetaClassList classes = builder->classes(); - const auto classA = AbstractMetaClass::findClass(classes, "A"); - QVERIFY(classA); - const auto addedFunc = classA->findFunction("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); - const auto globalFuncs = builder->globalFunctions(); - QCOMPARE(globalFuncs.size(), 2); - const auto classB = AbstractMetaClass::findClass(builder->classes(), "B"); - QVERIFY(classB); - QVERIFY(!classB->findFunction("globalFunc")); - QVERIFY(!classB->findFunction("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, u"0.1"_s)); - QVERIFY(builder); - const auto globalFuncs = builder->globalFunctions(); - QCOMPARE(globalFuncs.size(), 1); -} - -void TestAddFunction::testModifyAddedFunction() -{ - const char cppCode[] = "class Foo { };\n"; - const char xmlCode[] = R"( -<typesystem package='Package'> - <primitive-type name='float'/> - <primitive-type name='int'/> - <value-type name='Foo'> - <add-function signature='method(float, int)'> - <inject-code class='target' position='beginning'>custom_code();</inject-code> - <modify-argument index='2' rename='varName'> - <replace-default-expression with='0'/> - </modify-argument> - </add-function> - </value-type> -</typesystem> -)"; - QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode)); - QVERIFY(builder); - AbstractMetaClassList classes = builder->classes(); - const auto foo = AbstractMetaClass::findClass(classes, "Foo"); - const auto method = foo->findFunction("method"); - QVERIFY(method); - QCOMPARE(method->arguments().size(), 2); - const AbstractMetaArgument &arg = method->arguments().at(1); - QCOMPARE(arg.defaultValueExpression(), u"0"); - QCOMPARE(arg.name(), u"varName"); - QCOMPARE(method->argumentName(2), u"varName"); -} - -void TestAddFunction::testAddFunctionOnTypedef() -{ - const char cppCode[] = "template<class T> class Foo { }; typedef Foo<int> FooInt;\n"; - const char xmlCode[] = "\ - <typesystem package='Package'>\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); - AbstractMetaClassList classes = builder->classes(); - const auto foo = AbstractMetaClass::findClass(classes, "FooInt"); - QVERIFY(foo); - QVERIFY(foo->hasNonPrivateConstructor()); - const auto &lst = foo->queryFunctions(FunctionQueryOption::AnyConstructor); - for (const auto &f : lst) - QVERIFY(f->signature().startsWith(f->name())); - QCOMPARE(lst.size(), 2); - const auto method = foo->findFunction("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<int>)'/>\n\ - </typesystem>\n"; - - QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode)); - QVERIFY(builder); - QCOMPARE(builder->globalFunctions().size(), 1); - const auto func = builder->globalFunctions().constFirst(); - const AbstractMetaArgument &arg = func->arguments().constFirst(); - QCOMPARE(arg.type().instantiations().size(), 1); -} - -// Test splitting of <add-function> parameter lists. - -Q_DECLARE_METATYPE(AddedFunctionParser::Argument) - -using Arguments = AddedFunctionParser::Arguments; - -void TestAddFunction::testAddFunctionTypeParser_data() -{ - QTest::addColumn<QString>("parameterList"); - QTest::addColumn<Arguments>("expected"); - - QTest::newRow("empty") - << QString() << Arguments{}; - - QTest::newRow("1-arg") - << QString::fromLatin1("int @a@=42") - << Arguments{{u"int"_s, u"a"_s, u"42"_s}}; - - QTest::newRow("2-args") - << QString::fromLatin1("double @d@, int @a@=42") - << Arguments{{u"double"_s, u"d"_s, {}}, - {u"int"_s, u"a"_s, u"42"_s}}; - - QTest::newRow("template-var_args") - << QString::fromLatin1("const QList<X,Y> &@list@ = QList<X,Y>{1,2}, int @b@=5, ...") - << Arguments{{u"const QList<X,Y> &"_s, u"list"_s, u"QList<X,Y>{1,2}"_s}, - {u"int"_s, u"b"_s, u"5"_s}, - {u"..."_s, {}, {}}}; -} - -void TestAddFunction::testAddFunctionTypeParser() -{ - - QFETCH(QString, parameterList); - QFETCH(Arguments, expected); - - const auto actual = AddedFunctionParser::splitParameters(parameterList); - QCOMPARE(actual, expected); -} - -QTEST_APPLESS_MAIN(TestAddFunction) |
