1 #include "TestTextFrameSorting.h"
2 #include "../KWPageManager.h"
3 #include "../KWPage.h"
4 #include "../frames/KWTextFrameSet.h"
5 #include "../frames/KWTextFrame.h"
6 #include "../KWDocument.h"
7 #include "../frames/KWCopyShape.h"
8 
9 #include <KoTextShapeData.h>
10 #include <MockShapes.h>
11 
12 #include <algorithm>
13 
TestTextFrameSorting()14 TestTextFrameSorting::TestTextFrameSorting()
15 {
16 }
17 
testSimpleSorting()18 void TestTextFrameSorting::testSimpleSorting()
19 {
20     KWTextFrameSet tfs(0);
21     KWFrame *frame1 = createFrame(QPointF(10, 10), tfs);
22     KWFrame *frame2 = createFrame(QPointF(120, 10), tfs);
23     frame2->shape()->setSize(QSizeF(100, 100));
24     KWFrame *frame3 = createFrame(QPointF(10, 110), tfs);
25 
26     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
27 
28     QCOMPARE(tfs.m_frames[0], frame1);
29     QCOMPARE(tfs.m_frames[1], frame2);
30     QCOMPARE(tfs.m_frames[2], frame3);
31 
32     KWPageManager pm;
33     tfs.setPageManager(&pm);
34     pm.appendPage();
35     pm.appendPage();
36     KWFrame *frame4 = createFrame(QPointF(10, 1000), tfs); // page 2
37     KWFrame *frame5 = createFrame(QPointF(120, 1000), tfs);
38 
39     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
40 
41     QCOMPARE(tfs.m_frames[0], frame1);
42     QCOMPARE(tfs.m_frames[1], frame2);
43     QCOMPARE(tfs.m_frames[2], frame3);
44     QCOMPARE(tfs.m_frames[3], frame4);
45     QCOMPARE(tfs.m_frames[4], frame5);
46 }
47 
testSimpleSorting2()48 void TestTextFrameSorting::testSimpleSorting2() // cascading usecase
49 {
50     KWTextFrameSet tfs(0);
51     KWFrame *frame4 = createFrame(QPointF(120, 300), tfs); // note that each frame is 50 x 50 per default.
52     KWFrame *frame2 = createFrame(QPointF(120, 120), tfs);
53     KWFrame *frame3 = createFrame(QPointF(10, 240), tfs);
54     KWFrame *frame1 = createFrame(QPointF(10, 10), tfs);
55 
56     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
57 
58     QCOMPARE(tfs.m_frames[0], frame1);
59     QCOMPARE(tfs.m_frames[1], frame2);
60     QCOMPARE(tfs.m_frames[2], frame3);
61     QCOMPARE(tfs.m_frames[3], frame4);
62 
63     KWPageManager pm;
64     tfs.setPageManager(&pm);
65     pm.appendPage();
66     pm.appendPage();
67     KWFrame *frame21 = createFrame(QPointF(120, 1000), tfs);
68     KWFrame *frame20 = createFrame(QPointF(10, 1000), tfs);
69     KWFrame *frame23 = createFrame(QPointF(120, 1200), tfs);
70     KWFrame *frame22 = createFrame(QPointF(10, 1110), tfs);
71 
72     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
73 
74     QCOMPARE(tfs.m_frames[0], frame1);
75     QCOMPARE(tfs.m_frames[1], frame2);
76     QCOMPARE(tfs.m_frames[2], frame3);
77     QCOMPARE(tfs.m_frames[3], frame4);
78     QCOMPARE(tfs.m_frames[4], frame20);
79     QCOMPARE(tfs.m_frames[5], frame21);
80     QCOMPARE(tfs.m_frames[6], frame22);
81     QCOMPARE(tfs.m_frames[7], frame23);
82 }
83 
testSortingOnPagespread()84 void TestTextFrameSorting::testSortingOnPagespread()
85 {
86     KWTextFrameSet tfs(0);
87     KWFrame * frame1 = createFrame(QPointF(10, 200), tfs);
88     KWFrame * frame2 = createFrame(QPointF(120, 10), tfs);
89     KWFrame * frame3 = createFrame(QPointF(10, 10), tfs);
90     KWFrame * frame4 = createFrame(QPointF(340, 10), tfs);
91     KWFrame * frame5 = createFrame(QPointF(230, 10), tfs);
92 
93     KWPageManager pm;
94     KWPage page = pm.appendPage();
95     page.setPageNumber(2);
96     KoPageLayout layout = page.pageStyle().pageLayout();
97     layout.width = 450;
98     layout.height = 150;
99     page.setDirectionHint(KoText::LeftRightTopBottom);
100     page.setPageSide(KWPage::PageSpread);
101     page.pageStyle().setPageLayout(layout);
102     page = pm.appendPage();
103     page.setDirectionHint(KoText::LeftRightTopBottom);
104     layout.width = 200;
105     page.pageStyle().setPageLayout(layout);
106     tfs.setPageManager(&pm);
107 
108     QCOMPARE(page.offsetInDocument(), 150.);
109 
110     // test KWPageManager::pageNumber first
111     QCOMPARE(pm.begin().pageNumber(), 2);
112     QCOMPARE(pm.pageNumber(frame2->shape()), 2);
113     QCOMPARE(pm.pageNumber(frame1->shape()), 4);
114 
115     QCOMPARE(KWTextFrameSet::sortTextFrames(frame4, frame5), false);
116     QCOMPARE(KWTextFrameSet::sortTextFrames(frame5, frame4), true);
117     QCOMPARE(KWTextFrameSet::sortTextFrames(frame2, frame4), true);
118     QCOMPARE(KWTextFrameSet::sortTextFrames(frame1, frame4), false);
119 
120     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
121 
122     QCOMPARE(tfs.m_frames[0], frame3);
123     QCOMPARE(tfs.m_frames[1], frame2);
124     QCOMPARE(tfs.m_frames[2], frame5);
125     QCOMPARE(tfs.m_frames[3], frame4);
126     QCOMPARE(tfs.m_frames[4], frame1);
127 }
128 
testRtlSorting()129 void TestTextFrameSorting::testRtlSorting()
130 {
131     KWTextFrameSet tfs(0);
132     KWFrame * frame1 = createFrame(QPointF(10, 10), tfs);
133     KWFrame * frame2 = createFrame(QPointF(120, 10), tfs);
134 
135     KWPageManager pm;
136     KWPage page = pm.appendPage();
137     page.setDirectionHint(KoText::RightLeftTopBottom);
138     QCOMPARE(page.directionHint(), KoText::RightLeftTopBottom);
139     KoPageLayout layout = page.pageStyle().pageLayout();
140     layout.width = 200;
141     page.pageStyle().setPageLayout(layout);
142     tfs.setPageManager(&pm);
143 
144     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
145 
146     // in RTL columns also sort right-to-left
147     QCOMPARE(tfs.m_frames[0], frame2);
148     QCOMPARE(tfs.m_frames[1], frame1);
149 }
150 
testSortingById()151 void TestTextFrameSorting::testSortingById()
152 {
153     KWTextFrameSet tfs(0);
154     KWTextFrame * frame1 = createFrame(QPointF(10, 200), tfs);
155     KWTextFrame * frame2 = createFrame(QPointF(120, 10), tfs);
156     KWTextFrame * frame3 = createFrame(QPointF(10, 10), tfs);
157 
158     frame1->setSortingId(1);
159     frame2->setSortingId(2);
160     frame3->setSortingId(3);
161 
162     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
163 
164     QCOMPARE(tfs.m_frames[0], frame1);
165     QCOMPARE(tfs.m_frames[1], frame2);
166     QCOMPARE(tfs.m_frames[2], frame3);
167 }
168 
testCopyAfterTextSorting()169 void TestTextFrameSorting::testCopyAfterTextSorting()
170 {
171     KWTextFrameSet tfs(0);
172     KWTextFrame * frame1 = createFrame(QPointF(70, 1300), tfs);
173     KWFrame * frame2 = createCopyFrame(QPointF(70, 100), frame1->shape(), tfs);
174     KWTextFrame * frame3 = createFrame(QPointF(70, 2000), tfs);
175 
176     tfs.removeFrame(frame1);
177 
178     QCOMPARE(tfs.m_frames[0], frame2);
179     QCOMPARE(tfs.m_frames[1], frame3);
180 
181     std::sort(tfs.m_frames.begin(), tfs.m_frames.end(), KWTextFrameSet::sortTextFrames);
182 
183     QCOMPARE(tfs.m_frames[0], frame3);
184     QCOMPARE(tfs.m_frames[1], frame2);
185 }
186 
187 
createFrame(const QPointF & position,KWTextFrameSet & fs)188 KWTextFrame * TestTextFrameSorting::createFrame(const QPointF &position, KWTextFrameSet &fs)
189 {
190     MockShape *shape = new MockShape();
191     shape->setUserData(new KoTextShapeData());
192     KWTextFrame *frame = new KWTextFrame(shape, &fs);
193     shape->setPosition(position);
194     return frame;
195 }
196 
createCopyFrame(const QPointF & position,KoShape * orig,KWTextFrameSet & fs)197 KWFrame * TestTextFrameSorting::createCopyFrame(const QPointF &position, KoShape *orig, KWTextFrameSet &fs)
198 {
199     KoShape *shape = new KWCopyShape(orig);
200     KWFrame *frame = new KWFrame(shape, &fs);
201     shape->setPosition(position);
202     return frame;
203 }
204 
205 
206 QTEST_KDEMAIN(TestTextFrameSorting, GUI)
207