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