1 /*
2  *  Copyright (c) 2015 Dmitry Kazakov <dimula73@gmail.com>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program 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
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include "kis_node_juggler_compressed_test.h"
20 
21 #include <QTest>
22 #include "kis_node_juggler_compressed.h"
23 
24 #include <KoColor.h>
25 #include <KoColorSpace.h>
26 
init()27 void KisNodeJugglerCompressedTest::init()
28 {
29     p.reset(new TestUtil::MaskParent);
30 
31     QRect rect1(100, 100, 100, 100);
32     QRect rect2(150, 150, 150, 150);
33 
34     layer1 = p->layer;
35     layer1->paintDevice()->fill(rect1, KoColor(Qt::red, layer1->colorSpace()));
36 
37     layer2 = new KisPaintLayer(p->image, "paint2", OPACITY_OPAQUE_U8);
38     layer2->paintDevice()->fill(rect2, KoColor(Qt::blue, layer2->colorSpace()));
39 
40     layer3 = new KisPaintLayer(p->image, "paint3", OPACITY_OPAQUE_U8);
41     group4 = new KisGroupLayer(p->image, "group4", OPACITY_OPAQUE_U8);
42     layer5 = new KisPaintLayer(p->image, "paint5", OPACITY_OPAQUE_U8);
43     layer6 = new KisPaintLayer(p->image, "paint6", OPACITY_OPAQUE_U8);
44 
45     p->image->addNode(layer2);
46     p->image->addNode(layer3);
47     p->image->addNode(group4);
48     p->image->addNode(layer5, group4);
49     p->image->addNode(layer6);
50 
51     p->image->initialRefreshGraph();
52 }
53 
cleanup()54 void KisNodeJugglerCompressedTest::cleanup()
55 {
56     p.reset();
57     layer1.clear();
58     layer2.clear();
59 }
60 
testMove(int delayBeforeEnd)61 void KisNodeJugglerCompressedTest::testMove(int delayBeforeEnd)
62 {
63     TestUtil::ReferenceImageChecker chk("node_juggler", "move_test");
64     chk.setMaxFailingPixels(0);
65 
66     KisNodeJugglerCompressed juggler(kundo2_i18n("Move Layer"), p->image, 0, 600);
67     QVERIFY(chk.checkImage(p->image, "initial"));
68 
69     juggler.moveNode(layer1, p->image->root(), layer2);
70     QTest::qWait(100);
71     QVERIFY(chk.checkImage(p->image, "initial"));
72 
73     if (delayBeforeEnd) {
74         QTest::qWait(delayBeforeEnd);
75         QVERIFY(chk.checkImage(p->image, "moved"));
76     }
77 
78     juggler.end();
79     p->image->waitForDone();
80     QVERIFY(chk.checkImage(p->image, "moved"));
81 
82     p->undoStore->undo();
83     p->image->waitForDone();
84 
85     QVERIFY(chk.checkImage(p->image, "initial"));
86 }
87 
testApplyUndo()88 void KisNodeJugglerCompressedTest::testApplyUndo()
89 {
90     testMove(1000);
91 }
92 
testEndBeforeUpdate()93 void KisNodeJugglerCompressedTest::testEndBeforeUpdate()
94 {
95     testMove(0);
96 }
97 
testDuplicateImpl(bool externalParent,bool useMove)98 void KisNodeJugglerCompressedTest::testDuplicateImpl(bool externalParent, bool useMove)
99 {
100     TestUtil::ReferenceImageChecker chk("node_juggler", "move_test");
101     chk.setMaxFailingPixels(0);
102 
103     QStringList initialRef;
104     initialRef << "paint1";
105     initialRef << "paint2";
106     initialRef << "paint3";
107     initialRef << "group4";
108     initialRef << "+paint5";
109     initialRef << "paint6";
110 
111     QVERIFY(TestUtil::checkHierarchy(p->image->root(), initialRef));
112 
113     KisNodeList selectedNodes;
114     selectedNodes << layer2;
115     selectedNodes << layer3;
116     selectedNodes << layer5;
117 
118     KisNodeJugglerCompressed juggler(kundo2_i18n("Duplicate Layers"), p->image, 0, 600);
119 
120     if (!externalParent) {
121         juggler.duplicateNode(selectedNodes);
122     } else {
123         if (useMove) {
124             juggler.moveNode(selectedNodes, p->image->root(), layer6);
125         } else {
126             juggler.copyNode(selectedNodes, p->image->root(), layer6);
127         }
128     }
129 
130     QTest::qWait(1000);
131 
132     juggler.end();
133     p->image->waitForDone();
134 
135     QStringList ref;
136 
137     if (!externalParent) {
138         ref << "paint1";
139         ref << "paint2";
140         ref << "paint3";
141         ref << "group4";
142         ref << "+paint5";
143         ref << "+Copy of paint2";
144         ref << "+Copy of paint3";
145         ref << "+Copy of paint5";
146         ref << "paint6";
147     } else if (!useMove) {
148         ref << "paint1";
149         ref << "paint2";
150         ref << "paint3";
151         ref << "group4";
152         ref << "+paint5";
153         ref << "paint6";
154         ref << "Copy of paint2";
155         ref << "Copy of paint3";
156         ref << "Copy of paint5";
157     } else {
158         ref << "paint1";
159         ref << "group4";
160         ref << "paint6";
161         ref << "paint2";
162         ref << "paint3";
163         ref << "paint5";
164     }
165 
166     QVERIFY(TestUtil::checkHierarchy(p->image->root(), ref));
167 
168     p->undoStore->undo();
169     p->image->waitForDone();
170 
171     QVERIFY(TestUtil::checkHierarchy(p->image->root(), initialRef));
172 }
173 
testDuplicate()174 void KisNodeJugglerCompressedTest::testDuplicate()
175 {
176     testDuplicateImpl(false, false);
177 }
178 
testCopyLayers()179 void KisNodeJugglerCompressedTest::testCopyLayers()
180 {
181     testDuplicateImpl(true, false);
182 }
183 
testMoveLayers()184 void KisNodeJugglerCompressedTest::testMoveLayers()
185 {
186     testDuplicateImpl(true, true);
187 }
188 
189 QTEST_MAIN(KisNodeJugglerCompressedTest)
190