1 /*
2     KWin - the KDE window manager
3     This file is part of the KDE project.
4 
5     SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 
10 #include <kwineffects.h>
11 
12 #include <QMatrix4x4>
13 #include <QVector2D>
14 #include <QVector3D>
15 
16 #include <QtTest>
17 
18 using namespace KWin;
19 
20 class TestScreenPaintData : public QObject
21 {
22     Q_OBJECT
23 private Q_SLOTS:
24 
25     void testCtor();
26     void testCopyCtor();
27     void testAssignmentOperator();
28     void testSetScale();
29     void testOperatorMultiplyAssign();
30     void testSetTranslate();
31     void testOperatorPlus();
32     void testSetAngle();
33     void testSetRotationOrigin();
34     void testSetRotationAxis();
35 };
36 
testCtor()37 void TestScreenPaintData::testCtor()
38 {
39     ScreenPaintData data;
40     QCOMPARE(data.xScale(), 1.0);
41     QCOMPARE(data.yScale(), 1.0);
42     QCOMPARE(data.zScale(), 1.0);
43     QCOMPARE(data.xTranslation(), 0.0);
44     QCOMPARE(data.yTranslation(), 0.0);
45     QCOMPARE(data.zTranslation(), 0.0);
46     QCOMPARE(data.translation(), QVector3D());
47     QCOMPARE(data.rotationAngle(), 0.0);
48     QCOMPARE(data.rotationOrigin(), QVector3D());
49     QCOMPARE(data.rotationAxis(), QVector3D(0.0, 0.0, 1.0));
50     QCOMPARE(data.screen(), nullptr);
51 }
52 
testCopyCtor()53 void TestScreenPaintData::testCopyCtor()
54 {
55     ScreenPaintData data;
56     ScreenPaintData data2(data);
57     // no value had been changed
58     QCOMPARE(data2.xScale(), 1.0);
59     QCOMPARE(data2.yScale(), 1.0);
60     QCOMPARE(data2.zScale(), 1.0);
61     QCOMPARE(data2.xTranslation(), 0.0);
62     QCOMPARE(data2.yTranslation(), 0.0);
63     QCOMPARE(data2.zTranslation(), 0.0);
64     QCOMPARE(data2.translation(), QVector3D());
65     QCOMPARE(data2.rotationAngle(), 0.0);
66     QCOMPARE(data2.rotationOrigin(), QVector3D());
67     QCOMPARE(data2.rotationAxis(), QVector3D(0.0, 0.0, 1.0));
68 
69     data2.setScale(QVector3D(0.5, 2.0, 3.0));
70     data2.translate(0.5, 2.0, 3.0);
71     data2.setRotationAngle(45.0);
72     data2.setRotationOrigin(QVector3D(1.0, 2.0, 3.0));
73     data2.setRotationAxis(QVector3D(1.0, 1.0, 0.0));
74 
75     ScreenPaintData data3(data2);
76     QCOMPARE(data3.xScale(), 0.5);
77     QCOMPARE(data3.yScale(), 2.0);
78     QCOMPARE(data3.zScale(), 3.0);
79     QCOMPARE(data3.xTranslation(), 0.5);
80     QCOMPARE(data3.yTranslation(), 2.0);
81     QCOMPARE(data3.zTranslation(), 3.0);
82     QCOMPARE(data3.translation(), QVector3D(0.5, 2.0, 3.0));
83     QCOMPARE(data3.rotationAngle(), 45.0);
84     QCOMPARE(data3.rotationOrigin(), QVector3D(1.0, 2.0, 3.0));
85     QCOMPARE(data3.rotationAxis(), QVector3D(1.0, 1.0, 0.0));
86 }
87 
testAssignmentOperator()88 void TestScreenPaintData::testAssignmentOperator()
89 {
90     ScreenPaintData data;
91     ScreenPaintData data2;
92 
93     data2.setScale(QVector3D(0.5, 2.0, 3.0));
94     data2.translate(0.5, 2.0, 3.0);
95     data2.setRotationAngle(45.0);
96     data2.setRotationOrigin(QVector3D(1.0, 2.0, 3.0));
97     data2.setRotationAxis(QVector3D(1.0, 1.0, 0.0));
98 
99     data = data2;
100     // data and data2 should be the same
101     QCOMPARE(data.xScale(), 0.5);
102     QCOMPARE(data.yScale(), 2.0);
103     QCOMPARE(data.zScale(), 3.0);
104     QCOMPARE(data.xTranslation(), 0.5);
105     QCOMPARE(data.yTranslation(), 2.0);
106     QCOMPARE(data.zTranslation(), 3.0);
107     QCOMPARE(data.translation(), QVector3D(0.5, 2.0, 3.0));
108     QCOMPARE(data.rotationAngle(), 45.0);
109     QCOMPARE(data.rotationOrigin(), QVector3D(1.0, 2.0, 3.0));
110     QCOMPARE(data.rotationAxis(), QVector3D(1.0, 1.0, 0.0));
111     // data 2
112     QCOMPARE(data2.xScale(), 0.5);
113     QCOMPARE(data2.yScale(), 2.0);
114     QCOMPARE(data2.zScale(), 3.0);
115     QCOMPARE(data2.xTranslation(), 0.5);
116     QCOMPARE(data2.yTranslation(), 2.0);
117     QCOMPARE(data2.zTranslation(), 3.0);
118     QCOMPARE(data2.translation(), QVector3D(0.5, 2.0, 3.0));
119     QCOMPARE(data2.rotationAngle(), 45.0);
120     QCOMPARE(data2.rotationOrigin(), QVector3D(1.0, 2.0, 3.0));
121     QCOMPARE(data2.rotationAxis(), QVector3D(1.0, 1.0, 0.0));
122 }
123 
testSetScale()124 void TestScreenPaintData::testSetScale()
125 {
126     ScreenPaintData data;
127     // without anything set, it's 1.0 on all axis
128     QCOMPARE(data.xScale(), 1.0);
129     QCOMPARE(data.yScale(), 1.0);
130     QCOMPARE(data.zScale(), 1.0);
131     // changing xScale should not affect y and z
132     data.setXScale(2.0);
133     QCOMPARE(data.xScale(), 2.0);
134     QCOMPARE(data.yScale(), 1.0);
135     QCOMPARE(data.zScale(), 1.0);
136     // changing yScale should not affect x and z
137     data.setYScale(3.0);
138     QCOMPARE(data.xScale(), 2.0);
139     QCOMPARE(data.yScale(), 3.0);
140     QCOMPARE(data.zScale(), 1.0);
141     // changing zScale should not affect x and y
142     data.setZScale(4.0);
143     QCOMPARE(data.xScale(), 2.0);
144     QCOMPARE(data.yScale(), 3.0);
145     QCOMPARE(data.zScale(), 4.0);
146     // setting a vector2d should affect x and y components
147     data.setScale(QVector2D(0.5, 2.0));
148     QCOMPARE(data.xScale(), 0.5);
149     QCOMPARE(data.yScale(), 2.0);
150     QCOMPARE(data.zScale(), 4.0);
151     // setting a vector3d should affect all components
152     data.setScale(QVector3D(1.5, 2.5, 3.5));
153     QCOMPARE(data.xScale(), 1.5);
154     QCOMPARE(data.yScale(), 2.5);
155     QCOMPARE(data.zScale(), 3.5);
156 }
157 
testOperatorMultiplyAssign()158 void TestScreenPaintData::testOperatorMultiplyAssign()
159 {
160     ScreenPaintData data;
161     // without anything set, it's 1.0 on all axis
162     QCOMPARE(data.xScale(), 1.0);
163     QCOMPARE(data.yScale(), 1.0);
164     QCOMPARE(data.zScale(), 1.0);
165     // multiplying by a factor should set all components
166     data *= 2.0;
167     QCOMPARE(data.xScale(), 2.0);
168     QCOMPARE(data.yScale(), 2.0);
169     QCOMPARE(data.zScale(), 2.0);
170     // multiplying by a vector2D should set x and y components
171     data *= QVector2D(2.0, 3.0);
172     QCOMPARE(data.xScale(), 4.0);
173     QCOMPARE(data.yScale(), 6.0);
174     QCOMPARE(data.zScale(), 2.0);
175     // multiplying by a vector3d should set all components
176     data *= QVector3D(0.5, 1.5, 2.0);
177     QCOMPARE(data.xScale(), 2.0);
178     QCOMPARE(data.yScale(), 9.0);
179     QCOMPARE(data.zScale(), 4.0);
180 }
181 
testSetTranslate()182 void TestScreenPaintData::testSetTranslate()
183 {
184     ScreenPaintData data;
185     QCOMPARE(data.xTranslation(), 0.0);
186     QCOMPARE(data.yTranslation(), 0.0);
187     QCOMPARE(data.zTranslation(), 0.0);
188     QCOMPARE(data.translation(), QVector3D());
189     // set x translate, should not affect y and z
190     data.setXTranslation(1.0);
191     QCOMPARE(data.xTranslation(), 1.0);
192     QCOMPARE(data.yTranslation(), 0.0);
193     QCOMPARE(data.zTranslation(), 0.0);
194     QCOMPARE(data.translation(), QVector3D(1.0, 0.0, 0.0));
195     // set y translate, should not affect x and z
196     data.setYTranslation(2.0);
197     QCOMPARE(data.xTranslation(), 1.0);
198     QCOMPARE(data.yTranslation(), 2.0);
199     QCOMPARE(data.zTranslation(), 0.0);
200     QCOMPARE(data.translation(), QVector3D(1.0, 2.0, 0.0));
201     // set z translate, should not affect x and y
202     data.setZTranslation(3.0);
203     QCOMPARE(data.xTranslation(), 1.0);
204     QCOMPARE(data.yTranslation(), 2.0);
205     QCOMPARE(data.zTranslation(), 3.0);
206     QCOMPARE(data.translation(), QVector3D(1.0, 2.0, 3.0));
207     // translate in x
208     data.translate(0.5);
209     QCOMPARE(data.translation(), QVector3D(1.5, 2.0, 3.0));
210     // translate in x and y
211     data.translate(0.5, 0.75);
212     QCOMPARE(data.translation(), QVector3D(2.0, 2.75, 3.0));
213     // translate in x, y and z
214     data.translate(1.0, 2.0, 3.0);
215     QCOMPARE(data.translation(), QVector3D(3.0, 4.75, 6.0));
216     // translate using vector
217     data.translate(QVector3D(2.0, 1.0, 0.5));
218     QCOMPARE(data.translation(), QVector3D(5.0, 5.75, 6.5));
219 }
220 
testOperatorPlus()221 void TestScreenPaintData::testOperatorPlus()
222 {
223     ScreenPaintData data;
224     QCOMPARE(data.xTranslation(), 0.0);
225     QCOMPARE(data.yTranslation(), 0.0);
226     QCOMPARE(data.zTranslation(), 0.0);
227     QCOMPARE(data.translation(), QVector3D());
228     // test with point
229     data += QPoint(1, 2);
230     QCOMPARE(data.translation(), QVector3D(1.0, 2.0, 0.0));
231     // test with pointf
232     data += QPointF(0.5, 0.75);
233     QCOMPARE(data.translation(), QVector3D(1.5, 2.75, 0.0));
234     // test with QVector2D
235     data += QVector2D(0.25, 1.5);
236     QCOMPARE(data.translation(), QVector3D(1.75, 4.25, 0.0));
237     // test with QVector3D
238     data += QVector3D(1.0, 2.0, 3.5);
239     QCOMPARE(data.translation(), QVector3D(2.75, 6.25, 3.5));
240 }
241 
testSetAngle()242 void TestScreenPaintData::testSetAngle()
243 {
244     ScreenPaintData data;
245     QCOMPARE(data.rotationAngle(), 0.0);
246     data.setRotationAngle(20.0);
247     QCOMPARE(data.rotationAngle(), 20.0);
248 }
249 
testSetRotationOrigin()250 void TestScreenPaintData::testSetRotationOrigin()
251 {
252     ScreenPaintData data;
253     QCOMPARE(data.rotationOrigin(), QVector3D());
254     data.setRotationOrigin(QVector3D(1.0, 2.0, 3.0));
255     QCOMPARE(data.rotationOrigin(), QVector3D(1.0, 2.0, 3.0));
256 }
257 
testSetRotationAxis()258 void TestScreenPaintData::testSetRotationAxis()
259 {
260     ScreenPaintData data;
261     QCOMPARE(data.rotationAxis(), QVector3D(0.0, 0.0, 1.0));
262     data.setRotationAxis(Qt::XAxis);
263     QCOMPARE(data.rotationAxis(), QVector3D(1.0, 0.0, 0.0));
264     data.setRotationAxis(Qt::YAxis);
265     QCOMPARE(data.rotationAxis(), QVector3D(0.0, 1.0, 0.0));
266     data.setRotationAxis(Qt::ZAxis);
267     QCOMPARE(data.rotationAxis(), QVector3D(0.0, 0.0, 1.0));
268     data.setRotationAxis(QVector3D(1.0, 1.0, 0.0));
269     QCOMPARE(data.rotationAxis(), QVector3D(1.0, 1.0, 0.0));
270 }
271 
272 QTEST_MAIN(TestScreenPaintData)
273 #include "test_screen_paint_data.moc"
274