This set of changes is to enable the capability of setting a fragment's visibility...
[qt:ganesh-qt.git] / tests / auto / qtextblock / tst_qtextblock.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the test suite of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42
43 #include <QtTest/QtTest>
44
45
46 #define private public
47 #include <qtextdocument.h>
48 #include <qdebug.h>
49 #ifndef Q_WS_WIN
50 #include <private/qtextdocument_p.h>
51 #endif
52
53
54
55 #include <qtextobject.h>
56 #include <qtextcursor.h>
57
58
59 //TESTED_FILES=
60
61 QT_FORWARD_DECLARE_CLASS(QTextDocument)
62
63 class tst_QTextBlock : public QObject
64 {
65     Q_OBJECT
66
67 public:
68     tst_QTextBlock();
69
70
71 public slots:
72     void init();
73     void cleanup();
74 private slots:
75     void fragmentOverBlockBoundaries();
76     void excludeParagraphSeparatorFragment();
77     void backwardsBlockIterator();
78     void fragmentVisibility();
79
80 private:
81     QTextDocument *doc;
82     QTextCursor cursor;
83 };
84
85 tst_QTextBlock::tst_QTextBlock()
86 {}
87
88 void tst_QTextBlock::init()
89 {
90     doc = new QTextDocument;
91     cursor = QTextCursor(doc);
92 }
93
94 void tst_QTextBlock::cleanup()
95 {
96     cursor = QTextCursor();
97     delete doc;
98     doc = 0;
99 }
100
101 void tst_QTextBlock::fragmentOverBlockBoundaries()
102 {
103     /* this creates two fragments in the piecetable:
104      * 1) 'hello<parag separator here>world'
105      * 2) '<parag separator>'
106      * (they are not united because the former was interested after the latter,
107      * hence their position in the pt buffer is the other way around)
108      */
109     cursor.insertText("Hello");
110     cursor.insertBlock();
111     cursor.insertText("World");
112
113     cursor.movePosition(QTextCursor::Start);
114
115     const QTextDocument *doc = cursor.block().document();
116     QVERIFY(doc);
117     // Block separators are always a fragment of their self. Thus:
118     // |Hello|\b|World|\b|
119 #if !defined(Q_WS_WIN) && !defined(Q_WS_S60)
120     QVERIFY(doc->d_func()->fragmentMap().numNodes() == 4);
121 #endif
122
123     QCOMPARE(cursor.block().text(), QString("Hello"));
124     cursor.movePosition(QTextCursor::NextBlock);
125     QCOMPARE(cursor.block().text(), QString("World"));
126 }
127
128 void tst_QTextBlock::excludeParagraphSeparatorFragment()
129 {
130     QTextCharFormat fmt;
131     fmt.setForeground(Qt::blue);
132     cursor.insertText("Hello", fmt);
133
134     QTextBlock block = doc->begin();
135     QVERIFY(block.isValid());
136
137     QTextBlock::Iterator it = block.begin();
138
139     QTextFragment fragment = it.fragment();
140     QVERIFY(fragment.isValid());
141     QCOMPARE(fragment.text(), QString("Hello"));
142
143     ++it;
144     QVERIFY(it.atEnd());
145     QVERIFY(it == block.end());
146 }
147
148 void tst_QTextBlock::backwardsBlockIterator()
149 {
150     QTextCharFormat fmt;
151
152     fmt.setForeground(Qt::magenta);
153     cursor.insertText("A", fmt);
154
155     fmt.setForeground(Qt::red);
156     cursor.insertText("A", fmt);
157
158     fmt.setForeground(Qt::magenta);
159     cursor.insertText("A", fmt);
160
161     QTextBlock block = doc->begin();
162     QVERIFY(block.isValid());
163
164     QTextBlock::Iterator it = block.begin();
165     QCOMPARE(it.fragment().position(), 0);
166     ++it;
167     QCOMPARE(it.fragment().position(), 1);
168     ++it;
169
170     QCOMPARE(it.fragment().position(), 2);
171
172     --it;
173     QCOMPARE(it.fragment().position(), 1);
174     --it;
175     QCOMPARE(it.fragment().position(), 0);
176 }
177
178 void tst_QTextBlock::fragmentVisibility()
179 {
180     QTextDocument *doc = new QTextDocument();
181     QTextCursor cursor(doc);
182     QTextCharFormat format;
183
184     cursor.insertText("First");
185
186     format.setFontWeight(QFont::Bold);
187     cursor.insertText("Second",format);
188
189     format.setFontItalic(true);
190     cursor.insertText("Third", format);
191
192     QTextBlock block = doc->firstBlock();
193     QTextBlock::iterator it = block.begin();
194
195     QCOMPARE(block.visibleText(), QString("FirstSecondThird"));
196     it++;
197     it.fragment().setVisible(false);
198     QCOMPARE(it.fragment().isVisible(), false);
199     QCOMPARE(block.visibleText(), QString("FirstThird"));
200
201     it.fragment().setVisible(true);
202     QCOMPARE(it.fragment().isVisible(), true);
203     QCOMPARE(block.visibleText(), QString("FirstSecondThird"));
204
205     delete doc;
206 }
207
208 QTEST_MAIN(tst_QTextBlock)
209 #include "tst_qtextblock.moc"