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"