1 /*
2  *  Copyright (c) 2016 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_multinode_property_test.h"
20 
21 #include <QTest>
22 #include "testutil.h"
23 
24 #include <KoCompositeOpRegistry.h>
25 
26 #include "kis_multinode_property.h"
27 
28 
test()29 void KisMultinodePropertyTest::test()
30 {
31     TestUtil::MaskParent p;
32 
33     KisPaintLayerSP layer1 = p.layer;
34     KisPaintLayerSP layer2 = new KisPaintLayer(p.image, "paint2", OPACITY_OPAQUE_U8);
35     KisPaintLayerSP layer3 = new KisPaintLayer(p.image, "paint3", OPACITY_OPAQUE_U8);
36 
37     KisNodeList nodes;
38     nodes << layer1;
39     nodes << layer2;
40     nodes << layer3;
41 
42     // Test uniform initial state
43     {
44         QScopedPointer<QCheckBox> box(new QCheckBox("test ignore"));
45         KisMultinodeCompositeOpProperty prop(nodes);
46 
47         prop.connectIgnoreCheckBox(box.data());
48 
49         QCOMPARE(prop.isIgnored(), false);
50         QCOMPARE(prop.value(), COMPOSITE_OVER);
51         QCOMPARE(box->isEnabled(), false);
52         QCOMPARE(box->isChecked(), true);
53 
54         prop.setValue(COMPOSITE_ALPHA_DARKEN);
55         QCOMPARE(prop.value(), COMPOSITE_ALPHA_DARKEN);
56         QCOMPARE(box->isEnabled(), false);
57         QCOMPARE(box->isChecked(), true);
58 
59         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
60         QCOMPARE(layer2->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
61         QCOMPARE(layer3->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
62 
63         prop.setIgnored(true);
64 
65         QCOMPARE(layer1->compositeOpId(), COMPOSITE_OVER);
66         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
67         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
68         QCOMPARE(prop.value(), COMPOSITE_OVER);
69         QCOMPARE(box->isEnabled(), false);
70         QCOMPARE(box->isChecked(), false);
71 
72         prop.setIgnored(false);
73 
74         QCOMPARE(layer1->compositeOpId(), COMPOSITE_OVER);
75         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
76         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
77         QCOMPARE(prop.value(), COMPOSITE_OVER);
78         QCOMPARE(box->isEnabled(), false);
79         QCOMPARE(box->isChecked(), true);
80     }
81 
82 
83     // Test non-uniform initial state
84     layer1->setCompositeOpId(COMPOSITE_ALPHA_DARKEN);
85     layer2->setCompositeOpId(COMPOSITE_OVER);
86     layer3->setCompositeOpId(COMPOSITE_OVER);
87 
88     {
89         QScopedPointer<QCheckBox> box(new QCheckBox("test ignore"));
90         KisMultinodeCompositeOpProperty prop(nodes);
91 
92         prop.connectIgnoreCheckBox(box.data());
93 
94         QCOMPARE(prop.isIgnored(), true);
95 
96         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
97         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
98         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
99         QCOMPARE(prop.value(), COMPOSITE_ALPHA_DARKEN);
100         QCOMPARE(box->isEnabled(), true);
101         QCOMPARE(box->isChecked(), false);
102 
103         prop.setIgnored(false);
104 
105         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
106         QCOMPARE(layer2->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
107         QCOMPARE(layer3->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
108         QCOMPARE(prop.value(), COMPOSITE_ALPHA_DARKEN);
109         QCOMPARE(box->isEnabled(), true);
110         QCOMPARE(box->isChecked(), true);
111 
112         prop.setValue(COMPOSITE_OVER);
113 
114         QCOMPARE(layer1->compositeOpId(), COMPOSITE_OVER);
115         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
116         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
117         QCOMPARE(prop.value(), COMPOSITE_OVER);
118         QCOMPARE(box->isEnabled(), true);
119         QCOMPARE(box->isChecked(), true);
120 
121         prop.setIgnored(true);
122 
123         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
124         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
125         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
126         QCOMPARE(prop.value(), COMPOSITE_ALPHA_DARKEN);
127         QCOMPARE(box->isEnabled(), true);
128         QCOMPARE(box->isChecked(), false);
129     }
130 
131     // Test undo-redo
132     {
133         QScopedPointer<QCheckBox> box(new QCheckBox("test ignore"));
134         KisMultinodeCompositeOpProperty prop(nodes);
135 
136         prop.connectIgnoreCheckBox(box.data());
137 
138         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
139         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
140         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
141 
142         prop.setIgnored(false);
143 
144         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
145         QCOMPARE(layer2->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
146         QCOMPARE(layer3->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
147 
148         QScopedPointer<KUndo2Command> cmd(prop.createPostExecutionUndoCommand());
149 
150         cmd->undo();
151 
152         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
153         QCOMPARE(layer2->compositeOpId(), COMPOSITE_OVER);
154         QCOMPARE(layer3->compositeOpId(), COMPOSITE_OVER);
155 
156         cmd->redo();
157 
158         QCOMPARE(layer1->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
159         QCOMPARE(layer2->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
160         QCOMPARE(layer3->compositeOpId(), COMPOSITE_ALPHA_DARKEN);
161     }
162 }
163 
164 QTEST_MAIN(KisMultinodePropertyTest)
165