1 /* This file is part of the KDE project
2    Copyright (C) 2007 Thorsten Zachmann <zachmann@kde.org>
3 
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public
6    License as published by the Free Software Foundation; either
7    version 2 of the License, or (at your option) any later version.
8 
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13 
14    You should have received a copy of the GNU Library General Public License
15    along with this library; see the file COPYING.LIB.  If not, write to
16    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18 */
19 #include "TestPointTypeCommand.h"
20 
21 #include <QPainterPath>
22 #include "KoPathShape.h"
23 #include "KoPathPointTypeCommand.h"
24 
25 #include <QTest>
26 
redoUndoSymmetric()27 void TestPointTypeCommand::redoUndoSymmetric()
28 {
29     KoPathShape path1;
30     path1.moveTo(QPointF(0, 0));
31     path1.lineTo(QPointF(0, 100));
32     KoPathPoint *point1 = path1.curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100));
33     KoPathPoint *point2 = path1.curveTo(QPointF(100, 200), QPointF(200, 200), QPointF(200, 100));
34     path1.curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100));
35     // test with normalize
36     KoPathShape path2;
37     KoPathPoint *point3 = path2.moveTo(QPointF(0, 0));
38     path2.curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100));
39     path2.curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0));
40     path2.closeMerge();
41 
42     QList<KoPathPointData> pd;
43     pd.append(KoPathPointData(&path1, path1.pathPointIndex(point1)));
44     pd.append(KoPathPointData(&path1, path1.pathPointIndex(point2)));
45     pd.append(KoPathPointData(&path2, path2.pathPointIndex(point3)));
46 
47     QPainterPath ppath1Org = path1.outline();
48     QPainterPath ppath2Org = path2.outline();
49 
50     KoPathPointTypeCommand cmd(pd, KoPathPointTypeCommand::Symmetric);
51     cmd.redo();
52 
53     QPainterPath ppath(QPointF(0, 0));
54     ppath.lineTo(0, 100);
55     ppath.cubicTo(0, 50, 100, 25, 100, 100);
56     ppath.cubicTo(100, 175, 200, 175, 200, 100);
57     ppath.cubicTo(200, 25, 300, 50, 300, 100);
58 
59     QVERIFY((point1->properties() & KoPathPoint::IsSymmetric) == KoPathPoint::IsSymmetric);
60     QVERIFY((point1->properties() & KoPathPoint::IsSmooth) == KoPathPoint::Normal);
61 
62     QVERIFY(ppath == path1.outline());
63 
64     cmd.undo();
65 
66     QVERIFY(ppath1Org == path1.outline());
67     QVERIFY(ppath2Org == path2.outline());
68 }
69 
redoUndoSmooth()70 void TestPointTypeCommand::redoUndoSmooth()
71 {
72     KoPathShape path1;
73     path1.moveTo(QPointF(0, 0));
74     path1.lineTo(QPointF(0, 100));
75     KoPathPoint *point1 = path1.curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100));
76     KoPathPoint *point2 = path1.curveTo(QPointF(100, 200), QPointF(200, 200), QPointF(200, 100));
77     path1.curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100));
78     // test with normalize
79     KoPathShape path2;
80     KoPathPoint *point3 = path2.moveTo(QPointF(0, 0));
81     path2.curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100));
82     path2.curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0));
83     path2.closeMerge();
84 
85     QList<KoPathPointData> pd;
86     pd.append(KoPathPointData(&path1, path1.pathPointIndex(point1)));
87     pd.append(KoPathPointData(&path1, path1.pathPointIndex(point2)));
88     pd.append(KoPathPointData(&path2, path2.pathPointIndex(point3)));
89 
90     QPainterPath ppath1Org = path1.outline();
91     QPainterPath ppath2Org = path2.outline();
92 
93     KoPathPointTypeCommand cmd(pd, KoPathPointTypeCommand::Smooth);
94     cmd.redo();
95 
96     QPainterPath ppath(QPointF(0, 0));
97     ppath.lineTo(0, 100);
98     ppath.cubicTo(0, 50, 100, 50, 100, 100);
99     ppath.cubicTo(100, 200, 200, 200, 200, 100);
100     ppath.cubicTo(200, 50, 300, 50, 300, 100);
101 
102     QVERIFY((point1->properties() & KoPathPoint::IsSmooth) == KoPathPoint::IsSmooth);
103     QVERIFY((point1->properties() & KoPathPoint::IsSymmetric) == KoPathPoint::Normal);
104 
105     QVERIFY(ppath == path1.outline());
106 
107     cmd.undo();
108 
109     QVERIFY(ppath1Org == path1.outline());
110     QVERIFY(ppath2Org == path2.outline());
111 }
112 
redoUndoCorner()113 void TestPointTypeCommand::redoUndoCorner()
114 {
115     KoPathShape path1;
116     path1.moveTo(QPointF(0, 0));
117     path1.lineTo(QPointF(0, 100));
118     KoPathPoint *point1 = path1.curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100));
119     KoPathPoint *point2 = path1.curveTo(QPointF(100, 150), QPointF(200, 150), QPointF(200, 100));
120     path1.curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100));
121     // test with normalize
122     KoPathShape path2;
123     KoPathPoint *point3 = path2.moveTo(QPointF(0, 0));
124     path2.curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100));
125     path2.curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0));
126     path2.closeMerge();
127 
128     QList<KoPathPointData> pd;
129     pd.append(KoPathPointData(&path1, path1.pathPointIndex(point1)));
130     pd.append(KoPathPointData(&path1, path1.pathPointIndex(point2)));
131     pd.append(KoPathPointData(&path2, path2.pathPointIndex(point3)));
132 
133     QPainterPath ppath1Org = path1.outline();
134     QPainterPath ppath2Org = path2.outline();
135 
136     KoPathPointTypeCommand cmd1(pd, KoPathPointTypeCommand::Symmetric);
137     cmd1.redo();
138 
139     KoPathPointTypeCommand cmd2(pd, KoPathPointTypeCommand::Corner);
140     cmd2.redo();
141 
142     QPainterPath ppath(QPointF(0, 0));
143     ppath.lineTo(0, 100);
144     ppath.cubicTo(0, 50, 100, 50, 100, 100);
145     ppath.cubicTo(100, 150, 200, 150, 200, 100);
146     ppath.cubicTo(200, 50, 300, 50, 300, 100);
147 
148     QVERIFY((point1->properties() & KoPathPoint::IsSmooth) == KoPathPoint::Normal);
149     QVERIFY((point1->properties() & KoPathPoint::IsSymmetric) == KoPathPoint::Normal);
150 
151     QVERIFY(ppath == path1.outline());
152 
153     cmd2.undo();
154     cmd1.undo();
155 
156     QVERIFY(ppath1Org == path1.outline());
157     QVERIFY(ppath2Org == path2.outline());
158 }
159 
160 QTEST_MAIN(TestPointTypeCommand)
161