/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ****************************************************************************/ #include "cppeditor.h" #include #include #include #include #include #include #include #include #include #include #include #include /*! Tests for inserting doxygen comments. */ using namespace Core; using namespace CPlusPlus; using namespace CppEditor::Internal; namespace { typedef QByteArray _; /** * Encapsulates the whole process of setting up an editor, * pressing ENTER and checking the result. */ struct TestCase { QByteArray originalText; int pos; CPPEditor *editor; CPPEditorWidget *editorWidget; TestCase(const QByteArray &input); ~TestCase(); void run(const QByteArray &expected, int undoCount = 1); private: TestCase(const TestCase &); TestCase &operator=(const TestCase &); }; /// The '|' in the input denotes the cursor position. TestCase::TestCase(const QByteArray &input) : originalText(input) { pos = originalText.indexOf('|'); QVERIFY(pos != -1); originalText.remove(pos, 1); QString fileName(QDir::tempPath() + QLatin1String("/file.cpp")); Utils::FileSaver srcSaver(fileName); srcSaver.write(originalText); srcSaver.finalize(); CppTools::CppModelManagerInterface::instance()->updateSourceFiles(QStringList()<snapshot(); if (s.contains(fileName)) break; QCoreApplication::processEvents(); } editor = dynamic_cast(EditorManager::openEditor(fileName)); QVERIFY(editor); editorWidget = dynamic_cast(editor->editorWidget()); QVERIFY(editorWidget); // We want to test documents that start with a comment. By default, the // editor will fold the very first comment it encounters, assuming // it is a license header. Currently unfoldAll() does not work as // expected (some blocks are still hidden in some test cases, so the // cursor movements are not as expected). For the time being, we just // prepend a declaration before the initial test comment. // editorWidget->unfoldAll(); editor->setCursorPosition(pos); editorWidget->semanticRehighlight(true); // Wait for the semantic info from the future: while (editorWidget->semanticInfo().doc.isNull()) QCoreApplication::processEvents(); } TestCase::~TestCase() { EditorManager::closeEditor(editor, false); QCoreApplication::processEvents(); // process any pending events // Remove the test file from the code-model CppTools::CppModelManagerInterface *mmi = CppTools::CppModelManagerInterface::instance(); mmi->GC(); QCOMPARE(mmi->snapshot().size(), 0); } void TestCase::run(const QByteArray &expected, int undoCount) { // Send 'ENTER' key press QKeyEvent event(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier); QCoreApplication::sendEvent(editorWidget, &event); const QByteArray result = editorWidget->document()->toPlainText().toUtf8(); QCOMPARE(QLatin1String(result), QLatin1String(expected)); for (int i = 0; i < undoCount; ++i) editorWidget->undo(); const QByteArray contentsAfterUndo = editorWidget->document()->toPlainText().toUtf8(); QCOMPARE(contentsAfterUndo, originalText); } } // anonymous namespace void CppEditorPlugin::test_doxygen_comments_data() { QTest::addColumn("given"); QTest::addColumn("expected"); QTest::newRow("qt_style") << _( "bool preventFolding;\n" "/*!|\n" "int a;\n" ) << _( "bool preventFolding;\n" "/*!\n" " * \\brief a\n" " */\n" "int a;\n" ); QTest::newRow("qt_style_continuation") << _( "bool preventFolding;\n" "/*!\n" " * \\brief a|\n" " */\n" "int a;\n" ) << _( "bool preventFolding;\n" "/*!\n" " * \\brief a\n" " * \n" " */\n" "int a;\n" ); QTest::newRow("java_style") << _( "bool preventFolding;\n" "/**|\n" "int a;\n" ) << _( "bool preventFolding;\n" "/**\n" " * @brief a\n" " */\n" "int a;\n" ); QTest::newRow("java_style_continuation") << _( "bool preventFolding;\n" "/**\n" " * @brief a|\n" " */\n" "int a;\n" ) << _( "bool preventFolding;\n" "/**\n" " * @brief a\n" " * \n" " */\n" "int a;\n" ); QTest::newRow("cpp_styleA") << _( "bool preventFolding;\n" "///|\n" "int a;\n" ) << _( "bool preventFolding;\n" "///\n" "/// \\brief a\n" "///\n" "int a;\n" ); QTest::newRow("cpp_styleB") << _( "bool preventFolding;\n" "//!|\n" "int a;\n" ) << _( "bool preventFolding;\n" "//!\n" "//! \\brief a\n" "//!\n" "int a;\n" ); QTest::newRow("cpp_styleA_continuation") << _( "bool preventFolding;\n" "///\n" "/// \\brief a|\n" "///\n" "int a;\n" ) << _( "bool preventFolding;\n" "///\n" "/// \\brief a\n" "/// \n" "///\n" "int a;\n" ); /// test cpp style doxygen comment when inside a indented scope QTest::newRow("cpp_styleA_indented") << _( " bool preventFolding;\n" " ///|\n" " int a;\n" ) << _( " bool preventFolding;\n" " ///\n" " /// \\brief a\n" " ///\n" " int a;\n" ); /// test cpp style doxygen comment continuation when inside a indented scope QTest::newRow("cpp_styleA_indented_continuation") << _( " bool preventFolding;\n" " ///\n" " /// \\brief a|\n" " ///\n" " int a;\n" ) << _( " bool preventFolding;\n" " ///\n" " /// \\brief a\n" " /// \n" " ///\n" " int a;\n" ); QTest::newRow("cpp_styleA_corner_case") << _( "bool preventFolding;\n" "///\n" "void d(); ///|\n" ) << _( "bool preventFolding;\n" "///\n" "void d(); ///\n" "\n" ); } void CppEditorPlugin::test_doxygen_comments() { QFETCH(QByteArray, given); QFETCH(QByteArray, expected); TestCase data(given); data.run(expected); }