File indexing completed on 2025-02-02 04:14:59
0001 /* This file is part of the KDE project 0002 SPDX-FileCopyrightText: 2007 Thorsten Zachmann <zachmann@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 #include "TestPointRemoveCommand.h" 0007 0008 #include "KoPathPointRemoveCommand.h" 0009 #include "KoPathShape.h" 0010 #include "KoShapeController.h" 0011 #include <MockShapes.h> 0012 #include <QPainterPath> 0013 #include <simpletest.h> 0014 #include <testflake.h> 0015 0016 0017 void TestPointRemoveCommand::redoUndoPointRemove() 0018 { 0019 KoPathShape path1; 0020 path1.moveTo(QPointF(0, 0)); 0021 path1.lineTo(QPointF(0, 100)); 0022 KoPathPoint *point1 = path1.curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100)); 0023 KoPathPoint *point2 = path1.lineTo(QPointF(200, 100)); 0024 path1.curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100)); 0025 0026 QPainterPath orig1(QPointF(0, 0)); 0027 orig1.lineTo(0, 100); 0028 orig1.cubicTo(0, 50, 100, 50, 100, 100); 0029 orig1.lineTo(200, 100); 0030 orig1.cubicTo(200, 50, 300, 50, 300, 100); 0031 0032 QVERIFY(orig1 == path1.outline()); 0033 0034 KoPathShape path2; 0035 path2.moveTo(QPointF(0, 0)); 0036 KoPathPoint *point3 = path2.curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100)); 0037 path2.curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0)); 0038 path2.closeMerge(); 0039 0040 QList<KoPathPointData> pd; 0041 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point1))); 0042 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point2))); 0043 pd.append(KoPathPointData(&path2, path2.pathPointIndex(point3))); 0044 0045 QPainterPath ppath1Org = path1.outline(); 0046 QPainterPath ppath2Org = path2.outline(); 0047 0048 MockShapeController mockController; 0049 KoShapeController shapeController(0, &mockController); 0050 0051 KUndo2Command *cmd = KoPathPointRemoveCommand::createCommand(pd, &shapeController); 0052 cmd->redo(); 0053 0054 QPainterPath ppath1(QPointF(0, 0)); 0055 ppath1.lineTo(0, 100); 0056 ppath1.cubicTo(0, 50, 300, 50, 300, 100); 0057 0058 QPainterPath ppath2(QPointF(0, 0)); 0059 ppath2.cubicTo(50, 0, 0, 50, 0, 0); 0060 ppath2.closeSubpath(); 0061 0062 QVERIFY(ppath1 == path1.outline()); 0063 QVERIFY(ppath2 == path2.outline()); 0064 0065 cmd->undo(); 0066 0067 QVERIFY(ppath1Org == path1.outline()); 0068 QVERIFY(ppath2Org == path2.outline()); 0069 0070 delete cmd; 0071 } 0072 0073 void TestPointRemoveCommand::redoUndoSubpathRemove() 0074 { 0075 KoPathShape path1; 0076 KoPathPoint *point11 = path1.moveTo(QPointF(0, 0)); 0077 KoPathPoint *point12 = path1.lineTo(QPointF(0, 100)); 0078 KoPathPoint *point13 = path1.curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100)); 0079 KoPathPoint *point14 = path1.lineTo(QPointF(200, 100)); 0080 KoPathPoint *point15 = path1.curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100)); 0081 KoPathPoint *point21 = path1.moveTo(QPointF(0, 0)); 0082 KoPathPoint *point22 = path1.curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100)); 0083 path1.curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0)); 0084 path1.closeMerge(); 0085 path1.moveTo(QPointF(100, 0)); 0086 path1.lineTo(QPointF(100, 100)); 0087 0088 QList<KoPathPointData> pd; 0089 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point11))); 0090 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point12))); 0091 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point13))); 0092 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point14))); 0093 pd.append(KoPathPointData(&path1, path1.pathPointIndex(point15))); 0094 0095 QPainterPath ppath1Org = path1.outline(); 0096 0097 MockShapeController mockController; 0098 KoShapeController shapeController(0, &mockController); 0099 0100 KUndo2Command *cmd1 = KoPathPointRemoveCommand::createCommand(pd, &shapeController); 0101 cmd1->redo(); 0102 0103 QPainterPath ppath1(QPointF(0, 0)); 0104 ppath1.cubicTo(50, 0, 100, 50, 100, 100); 0105 ppath1.cubicTo(50, 100, 0, 50, 0, 0); 0106 ppath1.closeSubpath(); 0107 ppath1.moveTo(100, 0); 0108 ppath1.lineTo(100, 100); 0109 0110 QPainterPath ppath1mod = path1.outline(); 0111 QVERIFY(ppath1 == ppath1mod); 0112 0113 QList<KoPathPointData> pd2; 0114 pd2.append(KoPathPointData(&path1, path1.pathPointIndex(point21))); 0115 pd2.append(KoPathPointData(&path1, path1.pathPointIndex(point22))); 0116 0117 KUndo2Command *cmd2 = KoPathPointRemoveCommand::createCommand(pd2, &shapeController); 0118 cmd2->redo(); 0119 0120 QPainterPath ppath2(QPointF(0, 0)); 0121 ppath2.lineTo(0, 100); 0122 0123 QVERIFY(ppath2 == path1.outline()); 0124 0125 cmd2->undo(); 0126 0127 QVERIFY(ppath1mod == path1.outline()); 0128 0129 cmd1->undo(); 0130 0131 QVERIFY(ppath1Org == path1.outline()); 0132 0133 delete cmd2; 0134 delete cmd1; 0135 } 0136 0137 void TestPointRemoveCommand::redoUndoShapeRemove() 0138 { 0139 KoPathShape *path1 = new KoPathShape(); 0140 KoPathPoint *point11 = path1->moveTo(QPointF(0, 0)); 0141 KoPathPoint *point12 = path1->lineTo(QPointF(0, 100)); 0142 KoPathPoint *point13 = path1->curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100)); 0143 KoPathPoint *point14 = path1->lineTo(QPointF(200, 100)); 0144 KoPathPoint *point15 = path1->curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100)); 0145 KoPathShape *path2 = new KoPathShape(); 0146 KoPathPoint *point21 = path2->moveTo(QPointF(0, 0)); 0147 KoPathPoint *point22 = path2->curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100)); 0148 path2->curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0)); 0149 path2->closeMerge(); 0150 0151 QList<KoPathPointData> pd; 0152 pd.append(KoPathPointData(path1, path1->pathPointIndex(point12))); 0153 pd.append(KoPathPointData(path1, path1->pathPointIndex(point11))); 0154 pd.append(KoPathPointData(path1, path1->pathPointIndex(point13))); 0155 pd.append(KoPathPointData(path1, path1->pathPointIndex(point15))); 0156 pd.append(KoPathPointData(path1, path1->pathPointIndex(point14))); 0157 pd.append(KoPathPointData(path2, path2->pathPointIndex(point22))); 0158 pd.append(KoPathPointData(path2, path2->pathPointIndex(point21))); 0159 0160 QPainterPath ppath1Org = path1->outline(); 0161 QPainterPath ppath2Org = path2->outline(); 0162 0163 MockShapeController mockController; 0164 KoShapeController shapeController(0, &mockController); 0165 QScopedPointer<MockContainer> rootContainer(new MockContainer()); 0166 rootContainer->addShape(path1); 0167 rootContainer->addShape(path2); 0168 0169 KUndo2Command *cmd = KoPathPointRemoveCommand::createCommand(pd, &shapeController); 0170 cmd->redo(); 0171 QVERIFY(!rootContainer->contains(path1)); 0172 QVERIFY(!rootContainer->contains(path2)); 0173 cmd->undo(); 0174 0175 QVERIFY(rootContainer->contains(path1)); 0176 QVERIFY(rootContainer->contains(path2)); 0177 0178 QVERIFY(ppath1Org == path1->outline()); 0179 QVERIFY(ppath2Org == path2->outline()); 0180 0181 delete cmd; 0182 rootContainer.reset(); 0183 } 0184 0185 void TestPointRemoveCommand::redoUndo() 0186 { 0187 KoPathShape *path1 = new KoPathShape(); 0188 KoPathPoint *point11 = path1->moveTo(QPointF(0, 0)); 0189 KoPathPoint *point12 = path1->lineTo(QPointF(0, 100)); 0190 KoPathPoint *point13 = path1->curveTo(QPointF(0, 50), QPointF(100, 50), QPointF(100, 100)); 0191 KoPathPoint *point14 = path1->lineTo(QPointF(200, 100)); 0192 KoPathPoint *point15 = path1->curveTo(QPointF(200, 50), QPointF(300, 50), QPointF(300, 100)); 0193 KoPathPoint *point16 = path1->moveTo(QPointF(100, 0)); 0194 KoPathPoint *point17 = path1->curveTo(QPointF(150, 0), QPointF(200, 50), QPointF(200, 100)); 0195 path1->curveTo(QPointF(150, 100), QPointF(100, 50), QPointF(100, 0)); 0196 path1->closeMerge(); 0197 KoPathPoint *point18 = path1->moveTo(QPointF(200, 0)); 0198 KoPathPoint *point19 = path1->lineTo(QPointF(200, 100)); 0199 0200 KoPathShape *path2 = new KoPathShape(); 0201 KoPathPoint *point21 = path2->moveTo(QPointF(0, 0)); 0202 KoPathPoint *point22 = path2->curveTo(QPointF(50, 0), QPointF(100, 50), QPointF(100, 100)); 0203 path2->curveTo(QPointF(50, 100), QPointF(0, 50), QPointF(0, 0)); 0204 path2->closeMerge(); 0205 0206 KoPathShape *path3 = new KoPathShape(); 0207 KoPathPoint *point31 = path3->moveTo(QPointF(0, 0)); 0208 KoPathPoint *point32 = path3->lineTo(QPointF(100, 100)); 0209 KoPathPoint *point33 = path3->lineTo(QPointF(200, 150)); 0210 0211 MockShapeController mockController; 0212 QScopedPointer<MockContainer> rootContainer(new MockContainer()); 0213 rootContainer->addShape(path1); 0214 rootContainer->addShape(path2); 0215 rootContainer->addShape(path3); 0216 0217 QList<KoPathPointData> pd; 0218 pd.append(KoPathPointData(path2, path2->pathPointIndex(point21))); 0219 pd.append(KoPathPointData(path1, path1->pathPointIndex(point13))); 0220 pd.append(KoPathPointData(path1, path1->pathPointIndex(point11))); 0221 pd.append(KoPathPointData(path3, path3->pathPointIndex(point31))); 0222 pd.append(KoPathPointData(path1, path1->pathPointIndex(point12))); 0223 pd.append(KoPathPointData(path1, path1->pathPointIndex(point15))); 0224 pd.append(KoPathPointData(path2, path2->pathPointIndex(point22))); 0225 pd.append(KoPathPointData(path1, path1->pathPointIndex(point14))); 0226 0227 KoShapeController shapeController(0, &mockController); 0228 0229 QPainterPath ppath1Org = path1->outline(); 0230 QPainterPath ppath2Org = path2->outline(); 0231 QPainterPath ppath3Org = path3->outline(); 0232 0233 KUndo2Command *cmd1 = KoPathPointRemoveCommand::createCommand(pd, &shapeController); 0234 cmd1->redo(); 0235 0236 QVERIFY(rootContainer->contains(path1)); 0237 QVERIFY(!rootContainer->contains(path2)); 0238 QVERIFY(rootContainer->contains(path3)); 0239 0240 QPainterPath ppath1(QPointF(0, 0)); 0241 ppath1.cubicTo(50, 0, 100, 50, 100, 100); 0242 ppath1.cubicTo(50, 100, 0, 50, 0, 0); 0243 ppath1.closeSubpath(); 0244 ppath1.moveTo(100, 0); 0245 ppath1.lineTo(100, 100); 0246 0247 QPainterPath ppath1mod = path1->outline(); 0248 QVERIFY(ppath1 == ppath1mod); 0249 0250 QPainterPath ppath3(QPointF(0, 0)); 0251 ppath3.lineTo(100, 50); 0252 0253 QPainterPath ppath3mod = path3->outline(); 0254 QVERIFY(ppath3 == ppath3mod); 0255 0256 QList<KoPathPointData> pd2; 0257 pd2.append(KoPathPointData(path1, path1->pathPointIndex(point16))); 0258 pd2.append(KoPathPointData(path1, path1->pathPointIndex(point17))); 0259 pd2.append(KoPathPointData(path1, path1->pathPointIndex(point18))); 0260 pd2.append(KoPathPointData(path1, path1->pathPointIndex(point19))); 0261 pd2.append(KoPathPointData(path3, path3->pathPointIndex(point32))); 0262 pd2.append(KoPathPointData(path3, path3->pathPointIndex(point33))); 0263 0264 KUndo2Command *cmd2 = KoPathPointRemoveCommand::createCommand(pd2, &shapeController); 0265 cmd2->redo(); 0266 0267 QVERIFY(!rootContainer->contains(path1)); 0268 QVERIFY(!rootContainer->contains(path2)); 0269 QVERIFY(!rootContainer->contains(path3)); 0270 0271 cmd2->undo(); 0272 0273 QVERIFY(rootContainer->contains(path1)); 0274 QVERIFY(!rootContainer->contains(path2)); 0275 QVERIFY(rootContainer->contains(path3)); 0276 QVERIFY(ppath1 == ppath1mod); 0277 QVERIFY(ppath3 == ppath3mod); 0278 0279 cmd1->undo(); 0280 0281 QVERIFY(ppath1Org == path1->outline()); 0282 QVERIFY(ppath2Org == path2->outline()); 0283 QVERIFY(ppath3Org == path3->outline()); 0284 0285 cmd1->redo(); 0286 cmd2->redo(); 0287 0288 delete cmd2; 0289 delete cmd1; 0290 } 0291 0292 KISTEST_MAIN(TestPointRemoveCommand)