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)