// 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 "testnestedtypes.h" #include "testutil.h" #include #include #include #include #include #include #include #include using namespace Qt::StringLiterals; void TestNestedTypes::testNestedTypesModifications() { const char* cppCode ="\ namespace OuterNamespace {\n\ namespace InnerNamespace {\n\ struct SomeClass {\n\ void method() {}\n\ };\n\ };\n\ };\n"; const char* xmlCode = "\ \n\ \n\ \n\ custom_code1();\n\ \n\ custom_code2();\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n"; QScopedPointer builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); AbstractMetaClassList classes = builder->classes(); auto *ons = AbstractMetaClass::findClass(classes, u"OuterNamespace"); QVERIFY(ons); auto *ins = AbstractMetaClass::findClass(classes, u"OuterNamespace::InnerNamespace"); QVERIFY(ins); QCOMPARE(ins->functions().size(), 1); QCOMPARE(ins->typeEntry()->codeSnips().size(), 1); CodeSnip snip = ins->typeEntry()->codeSnips().constFirst(); QCOMPARE(snip.code().trimmed(), u"custom_code1();"); const auto addedFunc = ins->functions().constFirst(); QVERIFY(addedFunc->isUserAdded()); QCOMPARE(addedFunc->access(), Access::Public); QCOMPARE(addedFunc->functionType(), AbstractMetaFunction::NormalFunction); QCOMPARE(addedFunc->type().minimalSignature(), u"OuterNamespace::InnerNamespace::SomeClass"); QCOMPARE(addedFunc->modifications().size(), 1); QVERIFY(addedFunc->modifications().constFirst().isCodeInjection()); snip = addedFunc->modifications().constFirst().snips().constFirst(); QCOMPARE(snip.code().trimmed(), u"custom_code2();"); auto *sc = AbstractMetaClass::findClass(classes, u"OuterNamespace::InnerNamespace::SomeClass"); QVERIFY(ins); QCOMPARE(sc->functions().size(), 2); // default constructor and removed method const auto removedFunc = sc->functions().constLast(); QVERIFY(removedFunc->isModifiedRemoved()); } void TestNestedTypes::testDuplicationOfNestedTypes() { const char* cppCode ="\ namespace Namespace {\n\ class SomeClass {};\n\ };\n"; const char* xmlCode = "\ \n\ \n\ \n\ \n\ \n\ \n\ \n"; QScopedPointer builder(TestUtil::parse(cppCode, xmlCode, false)); QVERIFY(!builder.isNull()); AbstractMetaClassList classes = builder->classes(); QCOMPARE(classes.size(), 2); auto *nspace = AbstractMetaClass::findClass(classes, u"Namespace"); QVERIFY(nspace); auto *cls1 = AbstractMetaClass::findClass(classes, u"SomeClass"); QVERIFY(cls1); auto *cls2 = AbstractMetaClass::findClass(classes, u"Namespace::SomeClass"); QVERIFY(cls2); QCOMPARE(cls1, cls2); QCOMPARE(cls1->name(), u"SomeClass"); QCOMPARE(cls1->qualifiedCppName(), u"Namespace::SomeClass"); TypeEntry* t1 = TypeDatabase::instance()->findType(u"Namespace::SomeClass"_s); QVERIFY(t1); TypeEntry* t2 = TypeDatabase::instance()->findType(u"SomeClass"_s); QVERIFY(!t2); } QTEST_APPLESS_MAIN(TestNestedTypes)