// 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 "testmodifydocumentation.h" #include "testutil.h" #include #include #include #include #include #include #include #include #include #include using namespace Qt::StringLiterals; void TestModifyDocumentation::testModifyDocumentation() { const char cppCode[] = "struct B { void b(); }; class A {};\n"; const char xmlCode[] = R"( <brief>Modified Brief</brief> <para>Some changed contents here</para> )"; QScopedPointer builder(TestUtil::parse(cppCode, xmlCode)); QVERIFY(builder); const auto classA = AbstractMetaClass::findClass(builder->classes(), "A"); QVERIFY(classA); DocModificationList docMods = classA->typeEntry()->docModifications(); QCOMPARE(docMods.size(), 2); QCOMPARE(docMods[0].code().trimmed(), u"Modified Brief"); QCOMPARE(docMods[0].signature(), QString()); QCOMPARE(docMods[1].code().trimmed(), u"Some changed contents here"); QCOMPARE(docMods[1].signature(), QString()); // Create a temporary directory for the documentation file since libxml2 // cannot handle Qt resources. QTemporaryDir tempDir(QDir::tempPath() + u"/shiboken_testmodifydocXXXXXX"_s); QVERIFY2(tempDir.isValid(), qPrintable(tempDir.errorString())); constexpr auto docFileName = "a.xml"_L1; QVERIFY(QFile::copy(u":/"_s + docFileName, tempDir.filePath(docFileName))); QtDocParser docParser; docParser.setDocumentationDataDirectory(tempDir.path()); docParser.fillDocumentation(classA); const Documentation &doc = classA->documentation(); const QString actualDocSimplified = doc.detailed().simplified(); const QString actualBriefSimplified = doc.brief().simplified(); QVERIFY(!actualDocSimplified.isEmpty()); const char expectedDoc[] = R"( oi Paragraph number 1 Paragraph number 2 Some changed contents here )"; const QString expectedDocSimplified = QString::fromLatin1(expectedDoc).simplified(); // Check whether the first modification worked. QVERIFY(actualBriefSimplified.contains(u"Modified Brief")); #ifndef HAVE_LIBXSLT // QtXmlPatterns is unable to handle para[3] in style sheets, // this only works in its XPath search. QEXPECT_FAIL("", "QtXmlPatterns cannot handle para[3] (QTBUG-66925)", Abort); #endif QCOMPARE(actualDocSimplified, expectedDocSimplified); } void TestModifyDocumentation::testInjectAddedFunctionDocumentation() { const char cppCode[] ="class A {};\n"; const char xmlCode[] = R"XML( Injected documentation of added function foo. )XML"; QScopedPointer builder(TestUtil::parse(cppCode, xmlCode)); QVERIFY(builder); const auto classA = AbstractMetaClass::findClass(builder->classes(), "A"); QVERIFY(classA); const auto f = classA->findFunction("foo"); QVERIFY(f); QVERIFY(f->isUserAdded()); auto docMods = f->addedFunctionDocModifications(); QCOMPARE(docMods.size(), 1); const QString code = docMods.constFirst().code(); QVERIFY(code.contains(u"Injected documentation of added function foo.")); } // We expand QTEST_MAIN macro but using QCoreApplication instead of QApplication // because this test needs an event loop but can't use QApplication to avoid a crash // on our ARMEL/FRAMANTLE buildbot int main(int argc, char** argv) { QCoreApplication app(argc, argv); TestModifyDocumentation tc; return QTest::qExec(&tc, argc, argv); }