diff options
author | Jo Asplin <jo.asplin@nokia.com> | 2011-08-31 17:11:06 +0200 |
---|---|---|
committer | Jo Asplin <jo.asplin@nokia.com> | 2011-09-01 10:59:49 +0200 |
commit | a90f50942e5304e6bf1c8a3e32f1f65c7a38f60b (patch) | |
tree | 6ed9a3d0a0a3dd09a78593d89c000f29d3494b89 /tests/auto/gui/text/qtexttable/tst_qtexttable.cpp | |
parent | a863eb1c7bbd5d40a741151f811bd7c62cf51e2d (diff) |
Moved gui autotests into new directory structure
Task-number: QTBUG-21133
Change-Id: I83b8f652935cf92151265ca2530a3cf81c31fdef
Reviewed-on: http://codereview.qt.nokia.com/3996
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Jo Asplin <jo.asplin@nokia.com>
Diffstat (limited to 'tests/auto/gui/text/qtexttable/tst_qtexttable.cpp')
-rw-r--r-- | tests/auto/gui/text/qtexttable/tst_qtexttable.cpp | 1004 |
1 files changed, 1004 insertions, 0 deletions
diff --git a/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp b/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp new file mode 100644 index 0000000000..83343811d8 --- /dev/null +++ b/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp @@ -0,0 +1,1004 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtTest/QtTest> + + +#include <qtextdocument.h> +#include <qtextdocumentfragment.h> +#include <qtexttable.h> +#include <qdebug.h> +#include <qtextcursor.h> +#include <qtextdocument.h> +#include <qtextedit.h> + +//TESTED_FILES= + +typedef QList<int> IntList; +Q_DECLARE_METATYPE(IntList) + +QT_FORWARD_DECLARE_CLASS(QTextDocument) + +class tst_QTextTable : public QObject +{ + Q_OBJECT + +public: + tst_QTextTable(); + + +public slots: + void init(); + void cleanup(); +private slots: + void cursorPositioning(); + void variousTableModifications(); + void tableShrinking(); + void spans(); + void variousModifications2(); + void tableManager_undo(); + void tableManager_removeCell(); + void rowAt(); + void rowAtWithSpans(); + void multiBlockCells(); + void insertRows(); + void deleteInTable(); + void mergeCells(); + void mergeAndInsert(); + void splitCells(); + void blocksForTableShouldHaveEmptyFormat(); + void removeTableByRemoveRows(); + void removeTableByRemoveColumns(); + void setCellFormat(); + void removeRows1(); + void removeRows2(); + void removeRows3(); + void removeRows4(); + void removeRows5(); + void removeColumns1(); + void removeColumns2(); + void removeColumns3(); + void removeColumns4(); + void removeColumns5(); + void removeColumnsInTableWithMergedRows(); + void QTBUG11282_insertBeforeMergedEnding_data(); + void QTBUG11282_insertBeforeMergedEnding(); + +private: + QTextTable *create2x2Table(); + QTextTable *create4x4Table(); + + QTextTable *createTable(int rows, int cols); + + QTextDocument *doc; + QTextCursor cursor; +}; + +tst_QTextTable::tst_QTextTable() +{} + +void tst_QTextTable::init() +{ + doc = new QTextDocument; + cursor = QTextCursor(doc); +} + +void tst_QTextTable::cleanup() +{ + cursor = QTextCursor(); + delete doc; + doc = 0; +} + +void tst_QTextTable::cursorPositioning() +{ + // ensure the cursor is placed at the beginning of the first cell upon + // table creation + QTextTable *table = cursor.insertTable(2, 2); + + QVERIFY(cursor == table->cellAt(0, 0).firstCursorPosition()); + QVERIFY(table->cellAt(0, 0).firstPosition() == table->firstPosition()); +} + +void tst_QTextTable::variousTableModifications() +{ + QTextTableFormat tableFmt; + + QTextTable *tab = cursor.insertTable(2, 2, tableFmt); + QVERIFY(doc->toPlainText().length() == 5); + QVERIFY(tab == cursor.currentTable()); + QVERIFY(tab->columns() == 2); + QVERIFY(tab->rows() == 2); + + QVERIFY(cursor.position() == 1); + QTextCharFormat fmt = cursor.charFormat(); + QVERIFY(fmt.objectIndex() == -1); + QTextTableCell cell = tab->cellAt(cursor); + QVERIFY(cell.isValid()); + QVERIFY(cell.row() == 0); + QVERIFY(cell.column() == 0); + + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 2); + fmt = cursor.charFormat(); + QVERIFY(fmt.objectIndex() == -1); + cell = tab->cellAt(cursor); + QVERIFY(cell.isValid()); + QVERIFY(cell.row() == 0); + QVERIFY(cell.column() == 1); + + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 3); + fmt = cursor.charFormat(); + QVERIFY(fmt.objectIndex() == -1); + cell = tab->cellAt(cursor); + QVERIFY(cell.isValid()); + QVERIFY(cell.row() == 1); + QVERIFY(cell.column() == 0); + + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 4); + fmt = cursor.charFormat(); + QVERIFY(fmt.objectIndex() == -1); + cell = tab->cellAt(cursor); + QVERIFY(cell.isValid()); + QVERIFY(cell.row() == 1); + QVERIFY(cell.column() == 1); + + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 5); + fmt = cursor.charFormat(); + QVERIFY(fmt.objectIndex() == -1); + cell = tab->cellAt(cursor); + QVERIFY(!cell.isValid()); + + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 5); + + // check we can't delete the cells with the cursor + cursor.movePosition(QTextCursor::Start); + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 1); + cursor.deleteChar(); + QVERIFY(doc->toPlainText().length() == 5); + cursor.movePosition(QTextCursor::NextBlock); + QVERIFY(cursor.position() == 2); + cursor.deleteChar(); + QVERIFY(doc->toPlainText().length() == 5); + cursor.deletePreviousChar(); + QVERIFY(cursor.position() == 2); + QVERIFY(doc->toPlainText().length() == 5); + + QTextTable *table = cursor.currentTable(); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 2); + + table->insertRows(2, 1); + QVERIFY(table->rows() == 3); + QVERIFY(table->columns() == 2); + QVERIFY(doc->toPlainText().length() == 7); + table->insertColumns(2, 2); + QVERIFY(table->rows() == 3); + QVERIFY(table->columns() == 4); + QVERIFY(doc->toPlainText().length() == 13); + + table->resize(4, 5); + QVERIFY(table->rows() == 4); + QVERIFY(table->columns() == 5); + QVERIFY(doc->toPlainText().length() == 21); +} + +void tst_QTextTable::tableShrinking() +{ + QTextTableFormat tableFmt; + + cursor.insertTable(3, 4, tableFmt); + QVERIFY(doc->toPlainText().length() == 13); + + QTextTable *table = cursor.currentTable(); + QVERIFY(table->rows() == 3); + QVERIFY(table->columns() == 4); + + table->removeRows(1, 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 4); + QVERIFY(doc->toPlainText().length() == 9); + table->removeColumns(1, 2); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 2); + QVERIFY(doc->toPlainText().length() == 5); + + table->resize(1, 1); + QVERIFY(table->rows() == 1); + QVERIFY(table->columns() == 1); + QVERIFY(doc->toPlainText().length() == 2); +} + +void tst_QTextTable::spans() +{ + QTextTableFormat tableFmt; + + cursor.insertTable(2, 2, tableFmt); + + QTextTable *table = cursor.currentTable(); + QVERIFY(table->cellAt(0, 0) != table->cellAt(0, 1)); + table->mergeCells(0, 0, 1, 2); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 2); + QVERIFY(table->cellAt(0, 0) == table->cellAt(0, 1)); + table->mergeCells(0, 0, 2, 2); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 2); +} + +void tst_QTextTable::variousModifications2() +{ + QTextTableFormat tableFmt; + + cursor.insertTable(2, 5, tableFmt); + QVERIFY(doc->toPlainText().length() == 11); + QTextTable *table = cursor.currentTable(); + QVERIFY(cursor.position() == 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 5); + + table->insertColumns(0, 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 6); + table->insertColumns(6, 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 7); + + table->insertRows(0, 1); + QVERIFY(table->rows() == 3); + QVERIFY(table->columns() == 7); + table->insertRows(3, 1); + QVERIFY(table->rows() == 4); + QVERIFY(table->columns() == 7); + + table->removeRows(0, 1); + QVERIFY(table->rows() == 3); + QVERIFY(table->columns() == 7); + table->removeRows(2, 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 7); + + table->removeColumns(0, 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 6); + table->removeColumns(5, 1); + QVERIFY(table->rows() == 2); + QVERIFY(table->columns() == 5); + + tableFmt = table->format(); + table->insertColumns(2, 1); + table->setFormat(tableFmt); + table->insertColumns(2, 1); + QVERIFY(table->columns() == 7); +} + +void tst_QTextTable::tableManager_undo() +{ + QTextTableFormat fmt; + fmt.setBorder(10); + QTextTable *table = cursor.insertTable(2, 2, fmt); + QVERIFY(table); + + QVERIFY(table->format().border() == 10); + + fmt.setBorder(20); + table->setFormat(fmt); + + QVERIFY(table->format().border() == 20); + + doc->undo(); + + QVERIFY(table->format().border() == 10); +} + +void tst_QTextTable::tableManager_removeCell() +{ + // essentially a test for TableManager::removeCell, in particular to remove empty items from the rowlist. + // If it fails it'll triger assertions inside TableManager. Yeah, not pretty, should VERIFY here ;( + cursor.insertTable(2, 2, QTextTableFormat()); + doc->undo(); + // ### + QVERIFY(true); +} + +void tst_QTextTable::rowAt() +{ + // test TablePrivate::rowAt + QTextTable *table = cursor.insertTable(4, 2); + + QCOMPARE(table->rows(), 4); + QCOMPARE(table->columns(), 2); + + QTextCursor cell00Cursor = table->cellAt(0, 0).firstCursorPosition(); + QTextCursor cell10Cursor = table->cellAt(1, 0).firstCursorPosition(); + QTextCursor cell20Cursor = table->cellAt(2, 0).firstCursorPosition(); + QTextCursor cell21Cursor = table->cellAt(2, 1).firstCursorPosition(); + QTextCursor cell30Cursor = table->cellAt(3, 0).firstCursorPosition(); + QVERIFY(table->cellAt(cell00Cursor).firstCursorPosition() == cell00Cursor); + QVERIFY(table->cellAt(cell10Cursor).firstCursorPosition() == cell10Cursor); + QVERIFY(table->cellAt(cell20Cursor).firstCursorPosition() == cell20Cursor); + QVERIFY(table->cellAt(cell30Cursor).firstCursorPosition() == cell30Cursor); + + table->mergeCells(1, 0, 2, 1); + + QCOMPARE(table->rows(), 4); + QCOMPARE(table->columns(), 2); + + QVERIFY(cell00Cursor == table->cellAt(0, 0).firstCursorPosition()); + QVERIFY(cell10Cursor == table->cellAt(1, 0).firstCursorPosition()); + QVERIFY(cell10Cursor == table->cellAt(2, 0).firstCursorPosition()); + QVERIFY(cell21Cursor == table->cellAt(2, 1).firstCursorPosition()); + QVERIFY(cell30Cursor == table->cellAt(3, 0).firstCursorPosition()); + + table->mergeCells(1, 0, 2, 2); + + QCOMPARE(table->rows(), 4); + QCOMPARE(table->columns(), 2); + + QVERIFY(cell00Cursor == table->cellAt(0, 0).firstCursorPosition()); + QVERIFY(cell00Cursor == table->cellAt(0, 0).firstCursorPosition()); + QVERIFY(cell10Cursor == table->cellAt(1, 0).firstCursorPosition()); + QVERIFY(cell10Cursor == table->cellAt(1, 1).firstCursorPosition()); + QVERIFY(cell10Cursor == table->cellAt(2, 0).firstCursorPosition()); + QVERIFY(cell10Cursor == table->cellAt(2, 1).firstCursorPosition()); + QVERIFY(cell30Cursor == table->cellAt(3, 0).firstCursorPosition()); +} + +void tst_QTextTable::rowAtWithSpans() +{ + QTextTable *table = cursor.insertTable(2, 2); + + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + + table->mergeCells(0, 0, 2, 1); + QVERIFY(table->cellAt(0, 0).rowSpan() == 2); + + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + + table->mergeCells(0, 0, 2, 2); + QVERIFY(table->cellAt(0, 0).columnSpan() == 2); + + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); +} + +void tst_QTextTable::multiBlockCells() +{ + // little testcase for multi-block cells + QTextTable *table = cursor.insertTable(2, 2); + + QVERIFY(cursor == table->cellAt(0, 0).firstCursorPosition()); + + cursor.insertText("Hello"); + cursor.insertBlock(QTextBlockFormat()); + cursor.insertText("World"); + + cursor.movePosition(QTextCursor::Left); + QVERIFY(table->cellAt(0, 0) == table->cellAt(cursor)); +} + +void tst_QTextTable::insertRows() +{ + // little testcase for multi-block cells + QTextTable *table = cursor.insertTable(2, 2); + + QVERIFY(cursor == table->cellAt(0, 0).firstCursorPosition()); + + table->insertRows(0, 1); + QVERIFY(table->rows() == 3); + + table->insertRows(1, 1); + QVERIFY(table->rows() == 4); + + table->insertRows(-1, 1); + QVERIFY(table->rows() == 5); + + table->insertRows(5, 2); + QVERIFY(table->rows() == 7); + +} + +void tst_QTextTable::deleteInTable() +{ + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("Blah"); + table->cellAt(0, 1).firstCursorPosition().insertText("Foo"); + table->cellAt(1, 0).firstCursorPosition().insertText("Bar"); + table->cellAt(1, 1).firstCursorPosition().insertText("Hah"); + + cursor = table->cellAt(1, 1).firstCursorPosition(); + cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::KeepAnchor); + + QCOMPARE(table->cellAt(cursor.position()).row(), 1); + QCOMPARE(table->cellAt(cursor.position()).column(), 0); + + cursor.removeSelectedText(); + + QCOMPARE(table->columns(), 2); + QCOMPARE(table->rows(), 2); + + // verify table is still all in shape. Only the text inside should get deleted + for (int row = 0; row < table->rows(); ++row) + for (int col = 0; col < table->columns(); ++col) { + const QTextTableCell cell = table->cellAt(row, col); + QVERIFY(cell.isValid()); + QCOMPARE(cell.rowSpan(), 1); + QCOMPARE(cell.columnSpan(), 1); + } +} + +QTextTable *tst_QTextTable::create2x2Table() +{ + cleanup(); + init(); + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("Blah"); + table->cellAt(0, 1).firstCursorPosition().insertText("Foo"); + table->cellAt(1, 0).firstCursorPosition().insertText("Bar"); + table->cellAt(1, 1).firstCursorPosition().insertText("Hah"); + return table; +} + +QTextTable *tst_QTextTable::create4x4Table() +{ + cleanup(); + init(); + QTextTable *table = cursor.insertTable(4, 4); + table->cellAt(0, 0).firstCursorPosition().insertText("Blah"); + table->cellAt(0, 1).firstCursorPosition().insertText("Foo"); + table->cellAt(1, 0).firstCursorPosition().insertText("Bar"); + table->cellAt(1, 1).firstCursorPosition().insertText("Hah"); + return table; +} + +QTextTable *tst_QTextTable::createTable(int rows, int cols) +{ + cleanup(); + init(); + QTextTable *table = cursor.insertTable(rows, cols); + return table; +} + +void tst_QTextTable::mergeCells() +{ + QTextTable *table = create4x4Table(); + + table->mergeCells(1, 1, 1, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + + table->mergeCells(1, 1, 2, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + table = create4x4Table(); + + table->mergeCells(1, 1, 2, 1); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + + table->mergeCells(1, 1, 2, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + table = create4x4Table(); + + table->mergeCells(1, 1, 2, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + // should do nothing + table->mergeCells(1, 1, 1, 1); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + table = create2x2Table(); + + table->mergeCells(0, 1, 2, 1); + table->mergeCells(0, 0, 2, 2); + QVERIFY(table->cellAt(0, 0) == table->cellAt(0, 1)); + QVERIFY(table->cellAt(0, 0) == table->cellAt(1, 0)); + QVERIFY(table->cellAt(0, 0) == table->cellAt(1, 1)); + + QTextBlock block = table->cellAt(0, 0).firstCursorPosition().block(); + + QVERIFY(block.text() == "Blah Foo"); + QVERIFY(block.next().text() == "Hah"); + QVERIFY(block.next().next().text() == "Bar"); + + table = create4x4Table(); + + QTextCursor cursor = table->cellAt(3, 3).firstCursorPosition(); + QTextTable *t2 = cursor.insertTable(2, 2); + t2->cellAt(0, 0).firstCursorPosition().insertText("Test"); + + table->mergeCells(2, 2, 2, 2); + cursor = table->cellAt(2, 2).firstCursorPosition(); + + QTextFrame *frame = cursor.currentFrame(); + + QTextFrame::iterator it = frame->begin(); + + // find the embedded table + while (it != frame->end() && !it.currentFrame()) + ++it; + + table = qobject_cast<QTextTable *>(it.currentFrame()); + + QVERIFY(table); + + if (table) { + cursor = table->cellAt(0, 0).firstCursorPosition(); + + QVERIFY(cursor.block().text() == "Test"); + } + + table = create2x2Table(); + + table->mergeCells(0, 1, 2, 1); + + QVERIFY(table->cellAt(0, 0) != table->cellAt(0, 1)); + QVERIFY(table->cellAt(0, 1) == table->cellAt(1, 1)); + + // should do nothing + table->mergeCells(0, 0, 1, 2); + + QVERIFY(table->cellAt(0, 0) != table->cellAt(0, 1)); + QVERIFY(table->cellAt(0, 1) == table->cellAt(1, 1)); +} + +void tst_QTextTable::mergeAndInsert() +{ + QTextTable *table = cursor.insertTable(4,3); + table->mergeCells(0,1,3,2); + table->mergeCells(3,0,1,3); + //Don't crash ! + table->insertColumns(1,2); + QCOMPARE(table->columns(), 5); +} + +void tst_QTextTable::splitCells() +{ + QTextTable *table = create4x4Table(); + table->mergeCells(1, 1, 2, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + table->splitCell(1, 1, 1, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 2)); + + table->splitCell(1, 1, 1, 1); + QVERIFY(table->cellAt(1, 1) != table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 2)); + + + table = create4x4Table(); + table->mergeCells(1, 1, 2, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + table->splitCell(1, 1, 2, 1); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 2)); + + table->splitCell(1, 1, 1, 1); + QVERIFY(table->cellAt(1, 1) != table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 2)); + + + table = create4x4Table(); + table->mergeCells(1, 1, 2, 2); + QVERIFY(table->cellAt(1, 1) == table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) == table->cellAt(2, 2)); + + table->splitCell(1, 1, 1, 1); + QVERIFY(table->cellAt(1, 1) != table->cellAt(1, 2)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 1)); + QVERIFY(table->cellAt(1, 1) != table->cellAt(2, 2)); + + table = createTable(2, 5); + table->mergeCells(0, 0, 2, 1); + table->mergeCells(0, 1, 2, 1); + QVERIFY(table->cellAt(0, 0) == table->cellAt(1, 0)); + QVERIFY(table->cellAt(0, 1) == table->cellAt(1, 1)); + table->splitCell(0, 0, 1, 1); + QVERIFY(table->cellAt(0, 0) != table->cellAt(1, 0)); + QVERIFY(table->cellAt(0, 1) == table->cellAt(1, 1)); + + table = createTable(2, 5); + table->mergeCells(0, 4, 2, 1); + QVERIFY(table->cellAt(0, 4) == table->cellAt(1, 4)); + + table->splitCell(0, 4, 1, 1); + QVERIFY(table->cellAt(0, 4) != table->cellAt(1, 4)); +} + +void tst_QTextTable::blocksForTableShouldHaveEmptyFormat() +{ + QTextBlockFormat fmt; + fmt.setProperty(QTextFormat::UserProperty, true); + cursor.insertBlock(fmt); + QVERIFY(cursor.blockFormat().hasProperty(QTextFormat::UserProperty)); + + QTextTable *table = cursor.insertTable(1, 1); + QVERIFY(!table->cellAt(0, 0).firstCursorPosition().blockFormat().hasProperty(QTextFormat::UserProperty)); + + int userPropCount = 0; + for (QTextBlock block = doc->begin(); + block.isValid(); block = block.next()) { + if (block.blockFormat().hasProperty(QTextFormat::UserProperty)) + userPropCount++; + } + QCOMPARE(userPropCount, 1); +} + +void tst_QTextTable::removeTableByRemoveRows() +{ + QPointer<QTextTable> table1 = QTextCursor(cursor).insertTable(4, 4); + QPointer<QTextTable> table2 = QTextCursor(cursor).insertTable(4, 4); + QPointer<QTextTable> table3 = QTextCursor(cursor).insertTable(4, 4); + + QVERIFY(table1); + QVERIFY(table2); + QVERIFY(table3); + + table2->removeRows(1, 1); + + QVERIFY(table1); + QVERIFY(table2); + QVERIFY(table3); + + table2->removeRows(0, table2->rows()); + + QVERIFY(table1); + QVERIFY(!table2); + QVERIFY(table3); +} + +void tst_QTextTable::removeTableByRemoveColumns() +{ + QPointer<QTextTable> table1 = QTextCursor(cursor).insertTable(4, 4); + QPointer<QTextTable> table2 = QTextCursor(cursor).insertTable(4, 4); + QPointer<QTextTable> table3 = QTextCursor(cursor).insertTable(4, 4); + + QVERIFY(table1); + QVERIFY(table2); + QVERIFY(table3); + + table2->removeColumns(1, 1); + + QVERIFY(table1); + QVERIFY(table2); + QVERIFY(table3); + + table2->removeColumns(0, table2->columns()); + + QVERIFY(table1); + QVERIFY(!table2); + QVERIFY(table3); +} + +void tst_QTextTable::setCellFormat() +{ + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + QTextTableCell cell = table->cellAt(0, 0); + QTextCharFormat fmt; + fmt.setObjectIndex(23); + fmt.setBackground(Qt::blue); + fmt.setTableCellColumnSpan(25); + fmt.setTableCellRowSpan(42); + cell.setFormat(fmt); + QVERIFY(cell.format().background().color() == QColor(Qt::blue)); + QCOMPARE(cell.format().tableCellColumnSpan(), 1); + QCOMPARE(cell.format().tableCellRowSpan(), 1); +} + +void tst_QTextTable::removeRows1() +{ + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->removeRows(0, 1); + QCOMPARE(table->rows(), 1); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("Third")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Fourth")); +} + +void tst_QTextTable::removeRows2() +{ + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->removeRows(1, 1); + QCOMPARE(table->rows(), 1); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Second")); +} + +void tst_QTextTable::removeRows3() +{ + QTextTable *table = cursor.insertTable(3, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->cellAt(2, 0).firstCursorPosition().insertText("Fifth"); + table->cellAt(2, 1).firstCursorPosition().insertText("Sixth"); + table->removeRows(1, 1); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Second")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Fifth")); + QCOMPARE(table->cellAt(1, 1).firstCursorPosition().block().text(), QString("Sixth")); +} + +void tst_QTextTable::removeRows4() +{ + QTextTable *table = cursor.insertTable(4, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->cellAt(2, 0).firstCursorPosition().insertText("Fifth"); + table->cellAt(2, 1).firstCursorPosition().insertText("Sixth"); + table->cellAt(3, 0).firstCursorPosition().insertText("Seventh"); + table->cellAt(3, 1).firstCursorPosition().insertText("Eighth"); + table->removeRows(1, 2); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Second")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Seventh")); + QCOMPARE(table->cellAt(1, 1).firstCursorPosition().block().text(), QString("Eighth")); +} + +void tst_QTextTable::removeRows5() +{ + QTextTable *table = cursor.insertTable(2,2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->insertRows(1,1); + table->mergeCells(1,0,1,2); + table->removeRows(1,1); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Second")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Third")); + QCOMPARE(table->cellAt(1, 1).firstCursorPosition().block().text(), QString("Fourth")); +} + +void tst_QTextTable::removeColumns1() +{ + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->removeColumns(0, 1); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 1); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("Second")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Fourth")); +} + +void tst_QTextTable::removeColumns2() +{ + QTextTable *table = cursor.insertTable(2, 2); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(1, 0).firstCursorPosition().insertText("Third"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fourth"); + table->removeColumns(1, 1); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 1); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Third")); +} + +void tst_QTextTable::removeColumns3() +{ + QTextTable *table = cursor.insertTable(2, 3); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(0, 2).firstCursorPosition().insertText("Third"); + table->cellAt(1, 0).firstCursorPosition().insertText("Fourth"); + table->cellAt(1, 1).firstCursorPosition().insertText("Fifth"); + table->cellAt(1, 2).firstCursorPosition().insertText("Sixth"); + table->removeColumns(1, 1); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Third")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Fourth")); + QCOMPARE(table->cellAt(1, 1).firstCursorPosition().block().text(), QString("Sixth")); +} + +void tst_QTextTable::removeColumns4() +{ + QTextTable *table = cursor.insertTable(2, 4); + table->cellAt(0, 0).firstCursorPosition().insertText("First"); + table->cellAt(0, 1).firstCursorPosition().insertText("Second"); + table->cellAt(0, 2).firstCursorPosition().insertText("Third"); + table->cellAt(0, 3).firstCursorPosition().insertText("Fourth"); + table->cellAt(1, 0).firstCursorPosition().insertText("Fifth"); + table->cellAt(1, 1).firstCursorPosition().insertText("Sixth"); + table->cellAt(1, 2).firstCursorPosition().insertText("Seventh"); + table->cellAt(1, 3).firstCursorPosition().insertText("Eighth"); + table->removeColumns(1, 2); + QCOMPARE(table->rows(), 2); + QCOMPARE(table->columns(), 2); + QCOMPARE(table->cellAt(0, 0).firstCursorPosition().block().text(), QString("First")); + QCOMPARE(table->cellAt(0, 1).firstCursorPosition().block().text(), QString("Fourth")); + QCOMPARE(table->cellAt(1, 0).firstCursorPosition().block().text(), QString("Fifth")); + QCOMPARE(table->cellAt(1, 1).firstCursorPosition().block().text(), QString("Eighth")); +} + +void tst_QTextTable::removeColumns5() +{ + QTextTable *table = cursor.insertTable(4, 4); + QTextCursor tc (doc); + tc.setPosition(table->cellAt(2,0).firstPosition()); + tc.setPosition(table->cellAt(3,1).firstPosition(), QTextCursor::KeepAnchor); + table->mergeCells(tc); + QCOMPARE(table->rows(), 4); + QCOMPARE(table->columns(), 4); + QCOMPARE(table->cellAt(0, 0).firstPosition(), 1); + QCOMPARE(table->cellAt(0, 1).firstPosition(), 2); + QCOMPARE(table->cellAt(0, 2).firstPosition(), 3); + QCOMPARE(table->cellAt(0, 3).firstPosition(), 4); + QCOMPARE(table->cellAt(1, 0).firstPosition(), 5); + QCOMPARE(table->cellAt(1, 1).firstPosition(), 6); + QCOMPARE(table->cellAt(1, 2).firstPosition(), 7); + QCOMPARE(table->cellAt(1, 3).firstPosition(), 8); + QCOMPARE(table->cellAt(2, 0).firstPosition(), 9); + QCOMPARE(table->cellAt(2, 0).rowSpan(), 2); + QCOMPARE(table->cellAt(2, 0).columnSpan(), 2); + QCOMPARE(table->cellAt(2, 1).firstPosition(), 9); + QCOMPARE(table->cellAt(2, 2).firstPosition(), 10); + QCOMPARE(table->cellAt(2, 3).firstPosition(), 11); + QCOMPARE(table->cellAt(3, 0).firstPosition(), 9); + QCOMPARE(table->cellAt(3, 1).firstPosition(), 9); + QCOMPARE(table->cellAt(3, 2).firstPosition(), 12); + QCOMPARE(table->cellAt(3, 3).firstPosition(), 13); + + table->removeColumns(1, 1); + QCOMPARE(table->rows(), 4); + QCOMPARE(table->columns(), 3); + QCOMPARE(table->cellAt(0, 0).firstPosition(), 1); + QCOMPARE(table->cellAt(0, 1).firstPosition(), 2); + QCOMPARE(table->cellAt(0, 2).firstPosition(), 3); + QCOMPARE(table->cellAt(1, 0).firstPosition(), 4); + QCOMPARE(table->cellAt(1, 1).firstPosition(), 5); + QCOMPARE(table->cellAt(1, 2).firstPosition(), 6); + QCOMPARE(table->cellAt(2, 0).firstPosition(), 7); + QCOMPARE(table->cellAt(2, 0).rowSpan(), 2); + QCOMPARE(table->cellAt(2, 0).columnSpan(), 1); + QCOMPARE(table->cellAt(2, 1).firstPosition(), 8); + QCOMPARE(table->cellAt(2, 2).firstPosition(), 9); + QCOMPARE(table->cellAt(3, 0).firstPosition(), 7); + QCOMPARE(table->cellAt(3, 1).firstPosition(), 10); + QCOMPARE(table->cellAt(3, 2).firstPosition(), 11); +} + +void tst_QTextTable::removeColumnsInTableWithMergedRows() +{ + QTextTable *table = cursor.insertTable(3, 4); + table->mergeCells(0, 0, 1, 4); + QCOMPARE(table->rows(), 3); + QCOMPARE(table->columns(), 4); + + table->removeColumns(0, table->columns() - 1); + + QCOMPARE(table->rows(), 3); + QCOMPARE(table->columns(), 1); +} + +void tst_QTextTable::QTBUG11282_insertBeforeMergedEnding_data() +{ + QTest::addColumn<int>("rows"); + QTest::addColumn<int>("columns"); + QTest::addColumn<QList<int> >("merge"); + QTest::addColumn<QList<int> >("insert"); + + QTest::newRow("2x3, merge two, insert one") << 2 << 3 << (QList<int>() << 1 << 2 << 2) + << (QList<int>() << 1 << 1) ; + QTest::newRow("3x4, merge three, insert one") << 3 << 4 << (QList<int>() << 1 << 3 << 3) + << (QList<int>() << 1 << 1) ; + QTest::newRow("4x3, merge two, insert two") << 4 << 3 << (QList<int>() << 1 << 4 << 2) + << (QList<int>() << 1 << 2) ; + QTest::newRow("4x4, merge middle two, insert one") << 4 << 4 << (QList<int>() << 1 << 4 << 2) + << (QList<int>() << 1 << 1) ; +} + +void tst_QTextTable::QTBUG11282_insertBeforeMergedEnding() +{ + QFETCH(int, rows); + QFETCH(int, columns); + QFETCH(QList<int>, merge); + QFETCH(QList<int>, insert); + QTextTable *table = cursor.insertTable(rows, columns); + QTextEdit *textEdit = new QTextEdit; + textEdit->setDocument(doc); + textEdit->show(); + QTest::qWaitForWindowShown(textEdit); + table->mergeCells(0,merge.at(0), merge.at(1), merge.at(2)); + //Don't crash ! + table->insertColumns(insert.at(0), insert.at(1)); + //Check that the final size is what we expected + QCOMPARE(table->rows(), rows); + QCOMPARE(table->columns(), columns + insert.at(1)); + delete textEdit; +} + +QTEST_MAIN(tst_QTextTable) +#include "tst_qtexttable.moc" |