File indexing completed on 2024-05-12 04:38:20

0001 /*
0002     SPDX-FileCopyrightText: 2011 Damien Flament <contact.damienflament@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "test_documentcontroller.h"
0008 
0009 #include <QString>
0010 
0011 #include <KTextEditor/Document>
0012 #include <KTextEditor/Cursor>
0013 
0014 #include <tests/autotestshell.h>
0015 #include <shell/core.h>
0016 #include <interfaces/idocumentcontroller.h>
0017 #include <ilanguagecontroller.h>
0018 #include <language/backgroundparser/backgroundparser.h>
0019 #include <languagecontroller.h>
0020 #include <documentcontroller.h>
0021 #include <tests/testcore.h>
0022 #include <tests/testhelpers.h>
0023 
0024 #include <QTest>
0025 #include <QSignalSpy>
0026 
0027 using namespace KDevelop;
0028 
0029 void TestDocumentController::initTestCase()
0030 {
0031     AutoTestShell::init({{}}); // do not load plugins at all
0032     TestCore::initialize();
0033     Core::self()->languageController()->backgroundParser()->disableProcessing();
0034     m_subject = Core::self()->documentController();
0035 }
0036 
0037 void TestDocumentController::init()
0038 {
0039     Core::self()->documentControllerInternal()->initialize();
0040 
0041     // create temp files
0042     m_file1.setFileTemplate(m_tempDir.path() + "/tmp_XXXXXX.txt");
0043     m_file2.setFileTemplate(m_tempDir.path() + "/tmp_XXXXXX.txt");
0044     if(!m_file1.open() || !m_file2.open()) {
0045         QFAIL("Can't create temp files");
0046     }
0047 
0048     // pre-conditions
0049     QVERIFY(m_subject->openDocuments().empty());
0050     QVERIFY(m_subject->documentForUrl(QUrl()) == nullptr);
0051     QVERIFY(m_subject->activeDocument() == nullptr);
0052 }
0053 
0054 void TestDocumentController::cleanup()
0055 {
0056     // ensure there are not opened documents for next test
0057     Core::self()->documentControllerInternal()->cleanup();
0058 }
0059 
0060 void TestDocumentController::cleanupTestCase()
0061 {
0062     TestCore::shutdown();
0063     m_tempDir.remove();
0064 }
0065 
0066 void TestDocumentController::testOpeningNewDocumentFromText()
0067 {
0068     qRegisterMetaType<KDevelop::IDocument*>("KDevelop::IDocument*");
0069     QSignalSpy createdSpy(m_subject, SIGNAL(textDocumentCreated(KDevelop::IDocument*)));
0070     QVERIFY(createdSpy.isValid());
0071     QSignalSpy openedSpy(m_subject, SIGNAL(documentOpened(KDevelop::IDocument*)));
0072     QVERIFY(openedSpy.isValid());
0073 
0074     IDocument* document = m_subject->openDocumentFromText(QString());
0075     QVERIFY(document != nullptr);
0076 
0077     QCOMPARE(createdSpy.count(), 1);
0078     QCOMPARE(openedSpy.count(), 1);
0079 
0080     QVERIFY(!m_subject->openDocuments().empty());
0081     QVERIFY(m_subject->documentForUrl(document->url()) == document);
0082     QVERIFY(m_subject->activeDocument() == document);
0083 }
0084 
0085 void TestDocumentController::testOpeningDocumentFromUrl()
0086 {
0087     QUrl url = QUrl::fromLocalFile(m_file1.fileName());
0088     IDocument* document = m_subject->openDocument(url);
0089     QVERIFY(document != nullptr);
0090 }
0091 
0092 void TestDocumentController::testSaveSomeDocuments()
0093 {
0094     // create documents
0095     QTemporaryDir dir;
0096     IDocument *document1 = m_subject->openDocument(createFile(dir, QStringLiteral("foo")));
0097     IDocument *document2 = m_subject->openDocument(createFile(dir, QStringLiteral("bar")));
0098     QCOMPARE(document1->state(), IDocument::Clean);
0099     QCOMPARE(document2->state(), IDocument::Clean);
0100 
0101     // edit both documents
0102     document1->textDocument()->insertText(KTextEditor::Cursor(), QStringLiteral("some text"));
0103     document2->textDocument()->insertText(KTextEditor::Cursor(), QStringLiteral("some text"));
0104     QCOMPARE(document1->state(), IDocument::Modified);
0105     QCOMPARE(document2->state(), IDocument::Modified);
0106 
0107     // save one document (Silent == don't ask user)
0108     m_subject->saveSomeDocuments(QList<IDocument*>() << document1, IDocument::Silent);
0109     QCOMPARE(document1->state(), IDocument::Clean);
0110     QCOMPARE(document2->state(), IDocument::Modified);
0111 }
0112 
0113 void TestDocumentController::testSaveAllDocuments()
0114 {
0115     // create documents
0116     QTemporaryDir dir;
0117     IDocument *document1 = m_subject->openDocument(createFile(dir, QStringLiteral("foo")));
0118     IDocument *document2 = m_subject->openDocument(createFile(dir, QStringLiteral("bar")));
0119     QCOMPARE(document1->state(), IDocument::Clean);
0120     QCOMPARE(document2->state(), IDocument::Clean);
0121 
0122     // edit documents
0123     document1->textDocument()->insertText(KTextEditor::Cursor(), QStringLiteral("some text"));
0124     document2->textDocument()->insertText(KTextEditor::Cursor(), QStringLiteral("some text"));
0125     QCOMPARE(document1->state(), IDocument::Modified);
0126     QCOMPARE(document2->state(), IDocument::Modified);
0127 
0128     // save documents
0129     m_subject->saveAllDocuments(IDocument::Silent);
0130     QCOMPARE(document1->state(), IDocument::Clean);
0131     QCOMPARE(document2->state(), IDocument::Clean);
0132 }
0133 
0134 
0135 void TestDocumentController::testCloseAllDocuments()
0136 {
0137     // create documents
0138     m_subject->openDocumentFromText(QString());
0139     m_subject->openDocumentFromText(QString());
0140     QVERIFY(!m_subject->openDocuments().empty());
0141 
0142     m_subject->closeAllDocuments();
0143     QVERIFY(m_subject->openDocuments().empty());
0144 }
0145 
0146 QUrl TestDocumentController::createFile(const QTemporaryDir& dir, const QString& filename)
0147 {
0148     QFile file(dir.path() + filename);
0149     QVERIFY_RETURN(file.open(QIODevice::WriteOnly | QIODevice::Text), QUrl{});
0150     file.close();
0151     return QUrl::fromLocalFile(dir.path() + filename);
0152 }
0153 
0154 void TestDocumentController::testEmptyUrl()
0155 {
0156     const auto first = DocumentController::nextEmptyDocumentUrl();
0157     QVERIFY(DocumentController::isEmptyDocumentUrl(first));
0158     QCOMPARE(DocumentController::nextEmptyDocumentUrl(), first);
0159 
0160     auto doc = m_subject->openDocumentFromText(QString());
0161     QCOMPARE(doc->url(), first);
0162 
0163     const auto second = DocumentController::nextEmptyDocumentUrl();
0164     QVERIFY(first != second);
0165     QVERIFY(DocumentController::isEmptyDocumentUrl(second));
0166 
0167     QVERIFY(!DocumentController::isEmptyDocumentUrl(QUrl()));
0168     QVERIFY(!DocumentController::isEmptyDocumentUrl(QUrl(QStringLiteral("http://foo.org"))));
0169     QVERIFY(!DocumentController::isEmptyDocumentUrl(QUrl(QStringLiteral("http://foo.org/test"))));
0170     QVERIFY(!DocumentController::isEmptyDocumentUrl(QUrl::fromLocalFile(QStringLiteral("/"))));
0171     QVERIFY(!DocumentController::isEmptyDocumentUrl(QUrl::fromLocalFile(QStringLiteral("/test"))));
0172 }
0173 
0174 QTEST_MAIN(TestDocumentController)
0175 
0176 #include "moc_test_documentcontroller.cpp"