KWin
Loading...
Searching...
No Matches
timelinetest.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "effect/timeline.h"
11
12#include <QTest>
13
14using namespace std::chrono_literals;
15
16// FIXME: Delete it in the future.
17Q_DECLARE_METATYPE(std::chrono::milliseconds)
18
19class TimeLineTest : public QObject
20{
21 Q_OBJECT
22
23private Q_SLOTS:
24 void testUpdateForward();
25 void testUpdateBackward();
26 void testUpdateFinished();
27 void testToggleDirection();
28 void testReset();
29 void testSetElapsed_data();
30 void testSetElapsed();
31 void testSetDuration();
32 void testSetDurationRetargeting();
33 void testSetDurationRetargetingSmallDuration();
34 void testRunning();
35 void testStrictRedirectSourceMode_data();
36 void testStrictRedirectSourceMode();
37 void testRelaxedRedirectSourceMode_data();
38 void testRelaxedRedirectSourceMode();
39 void testStrictRedirectTargetMode_data();
40 void testStrictRedirectTargetMode();
41 void testRelaxedRedirectTargetMode_data();
42 void testRelaxedRedirectTargetMode();
43};
44
45void TimeLineTest::testUpdateForward()
46{
48 timeLine.setEasingCurve(QEasingCurve::Linear);
49
50 // 0/1000
51 timeLine.advance(0ms);
52 QCOMPARE(timeLine.value(), 0.0);
53 QVERIFY(!timeLine.done());
54
55 // 100/1000
56 timeLine.advance(100ms);
57 QCOMPARE(timeLine.value(), 0.1);
58 QVERIFY(!timeLine.done());
59
60 // 400/1000
61 timeLine.advance(400ms);
62 QCOMPARE(timeLine.value(), 0.4);
63 QVERIFY(!timeLine.done());
64
65 // 900/1000
66 timeLine.advance(900ms);
67 QCOMPARE(timeLine.value(), 0.9);
68 QVERIFY(!timeLine.done());
69
70 // 1000/1000
71 timeLine.advance(3000ms);
72 QCOMPARE(timeLine.value(), 1.0);
73 QVERIFY(timeLine.done());
74}
75
76void TimeLineTest::testUpdateBackward()
77{
79 timeLine.setEasingCurve(QEasingCurve::Linear);
80
81 // 0/1000
82 timeLine.advance(0ms);
83 QCOMPARE(timeLine.value(), 1.0);
84 QVERIFY(!timeLine.done());
85
86 // 100/1000
87 timeLine.advance(100ms);
88 QCOMPARE(timeLine.value(), 0.9);
89 QVERIFY(!timeLine.done());
90
91 // 400/1000
92 timeLine.advance(400ms);
93 QCOMPARE(timeLine.value(), 0.6);
94 QVERIFY(!timeLine.done());
95
96 // 900/1000
97 timeLine.advance(900ms);
98 QCOMPARE(timeLine.value(), 0.1);
99 QVERIFY(!timeLine.done());
100
101 // 1000/1000
102 timeLine.advance(3000ms);
103 QCOMPARE(timeLine.value(), 0.0);
104 QVERIFY(timeLine.done());
105}
106
107void TimeLineTest::testUpdateFinished()
108{
109 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
110 timeLine.advance(0ms);
111 timeLine.setEasingCurve(QEasingCurve::Linear);
112
113 timeLine.advance(1000ms);
114 QCOMPARE(timeLine.value(), 1.0);
115 QVERIFY(timeLine.done());
116
117 timeLine.advance(1042ms);
118 QCOMPARE(timeLine.value(), 1.0);
119 QVERIFY(timeLine.done());
120}
121
122void TimeLineTest::testToggleDirection()
123{
124 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
125 timeLine.setEasingCurve(QEasingCurve::Linear);
126
127 timeLine.advance(0ms);
128 QCOMPARE(timeLine.value(), 0.0);
129 QVERIFY(!timeLine.done());
130
131 timeLine.advance(600ms);
132 QCOMPARE(timeLine.value(), 0.6);
133 QVERIFY(!timeLine.done());
134
135 timeLine.toggleDirection();
136 QCOMPARE(timeLine.value(), 0.6);
137 QVERIFY(!timeLine.done());
138
139 timeLine.advance(800ms);
140 QCOMPARE(timeLine.value(), 0.4);
141 QVERIFY(!timeLine.done());
142
143 timeLine.advance(3000ms);
144 QCOMPARE(timeLine.value(), 0.0);
145 QVERIFY(timeLine.done());
146}
147
148void TimeLineTest::testReset()
149{
150 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
151 timeLine.setEasingCurve(QEasingCurve::Linear);
152 timeLine.advance(0ms);
153
154 timeLine.advance(1000ms);
155 QCOMPARE(timeLine.value(), 1.0);
156 QVERIFY(timeLine.done());
157
158 timeLine.reset();
159 QCOMPARE(timeLine.value(), 0.0);
160 QVERIFY(!timeLine.done());
161}
162
163void TimeLineTest::testSetElapsed_data()
164{
165 QTest::addColumn<std::chrono::milliseconds>("duration");
166 QTest::addColumn<std::chrono::milliseconds>("elapsed");
167 QTest::addColumn<std::chrono::milliseconds>("expectedElapsed");
168 QTest::addColumn<bool>("expectedDone");
169 QTest::addColumn<bool>("initiallyDone");
170
171 QTest::newRow("Less than duration, not finished") << 1000ms << 300ms << 300ms << false << false;
172 QTest::newRow("Less than duration, finished") << 1000ms << 300ms << 300ms << false << true;
173 QTest::newRow("Greater than duration, not finished") << 1000ms << 3000ms << 1000ms << true << false;
174 QTest::newRow("Greater than duration, finished") << 1000ms << 3000ms << 1000ms << true << true;
175 QTest::newRow("Equal to duration, not finished") << 1000ms << 1000ms << 1000ms << true << false;
176 QTest::newRow("Equal to duration, finished") << 1000ms << 1000ms << 1000ms << true << true;
177}
178
179void TimeLineTest::testSetElapsed()
180{
181 QFETCH(std::chrono::milliseconds, duration);
182 QFETCH(std::chrono::milliseconds, elapsed);
183 QFETCH(std::chrono::milliseconds, expectedElapsed);
184 QFETCH(bool, expectedDone);
185 QFETCH(bool, initiallyDone);
186
187 KWin::TimeLine timeLine(duration, KWin::TimeLine::Forward);
188 timeLine.setEasingCurve(QEasingCurve::Linear);
189 timeLine.advance(0ms);
190
191 if (initiallyDone) {
192 timeLine.advance(duration);
193 QVERIFY(timeLine.done());
194 }
195
196 timeLine.setElapsed(elapsed);
197 QCOMPARE(timeLine.elapsed(), expectedElapsed);
198 QCOMPARE(timeLine.done(), expectedDone);
199}
200
201void TimeLineTest::testSetDuration()
202{
203 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
204 timeLine.setEasingCurve(QEasingCurve::Linear);
205
206 QCOMPARE(timeLine.duration(), 1000ms);
207
208 timeLine.setDuration(3000ms);
209 QCOMPARE(timeLine.duration(), 3000ms);
210}
211
212void TimeLineTest::testSetDurationRetargeting()
213{
214 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
215 timeLine.setEasingCurve(QEasingCurve::Linear);
216 timeLine.advance(0ms);
217
218 timeLine.advance(500ms);
219 QCOMPARE(timeLine.value(), 0.5);
220 QVERIFY(!timeLine.done());
221
222 timeLine.setDuration(3000ms);
223 QCOMPARE(timeLine.value(), 0.5);
224 QVERIFY(!timeLine.done());
225}
226
227void TimeLineTest::testSetDurationRetargetingSmallDuration()
228{
229 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
230 timeLine.setEasingCurve(QEasingCurve::Linear);
231 timeLine.advance(0ms);
232
233 timeLine.advance(999ms);
234 QCOMPARE(timeLine.value(), 0.999);
235 QVERIFY(!timeLine.done());
236
237 timeLine.setDuration(3ms);
238 QCOMPARE(timeLine.value(), 1.0);
239 QVERIFY(timeLine.done());
240}
241
242void TimeLineTest::testRunning()
243{
244 KWin::TimeLine timeLine(1000ms, KWin::TimeLine::Forward);
245 timeLine.setEasingCurve(QEasingCurve::Linear);
246 timeLine.advance(0ms);
247
248 QVERIFY(!timeLine.running());
249 QVERIFY(!timeLine.done());
250
251 timeLine.advance(100ms);
252 QVERIFY(timeLine.running());
253 QVERIFY(!timeLine.done());
254
255 timeLine.advance(1000ms);
256 QVERIFY(!timeLine.running());
257 QVERIFY(timeLine.done());
258}
259
260void TimeLineTest::testStrictRedirectSourceMode_data()
261{
262 QTest::addColumn<KWin::TimeLine::Direction>("initialDirection");
263 QTest::addColumn<qreal>("initialValue");
264 QTest::addColumn<KWin::TimeLine::Direction>("finalDirection");
265 QTest::addColumn<qreal>("finalValue");
266
267 QTest::newRow("forward -> backward") << KWin::TimeLine::Forward << 0.0 << KWin::TimeLine::Backward << 0.0;
268 QTest::newRow("backward -> forward") << KWin::TimeLine::Backward << 1.0 << KWin::TimeLine::Forward << 1.0;
269}
270
271void TimeLineTest::testStrictRedirectSourceMode()
272{
273 QFETCH(KWin::TimeLine::Direction, initialDirection);
274 KWin::TimeLine timeLine(1000ms, initialDirection);
275 timeLine.setEasingCurve(QEasingCurve::Linear);
276 timeLine.setSourceRedirectMode(KWin::TimeLine::RedirectMode::Strict);
277
278 QTEST(timeLine.direction(), "initialDirection");
279 QTEST(timeLine.value(), "initialValue");
280 QCOMPARE(timeLine.sourceRedirectMode(), KWin::TimeLine::RedirectMode::Strict);
281 QVERIFY(!timeLine.running());
282 QVERIFY(!timeLine.done());
283
284 QFETCH(KWin::TimeLine::Direction, finalDirection);
285 timeLine.setDirection(finalDirection);
286
287 QTEST(timeLine.direction(), "finalDirection");
288 QTEST(timeLine.value(), "finalValue");
289 QCOMPARE(timeLine.sourceRedirectMode(), KWin::TimeLine::RedirectMode::Strict);
290 QVERIFY(!timeLine.running());
291 QVERIFY(timeLine.done());
292}
293
294void TimeLineTest::testRelaxedRedirectSourceMode_data()
295{
296 QTest::addColumn<KWin::TimeLine::Direction>("initialDirection");
297 QTest::addColumn<qreal>("initialValue");
298 QTest::addColumn<KWin::TimeLine::Direction>("finalDirection");
299 QTest::addColumn<qreal>("finalValue");
300
301 QTest::newRow("forward -> backward") << KWin::TimeLine::Forward << 0.0 << KWin::TimeLine::Backward << 1.0;
302 QTest::newRow("backward -> forward") << KWin::TimeLine::Backward << 1.0 << KWin::TimeLine::Forward << 0.0;
303}
304
305void TimeLineTest::testRelaxedRedirectSourceMode()
306{
307 QFETCH(KWin::TimeLine::Direction, initialDirection);
308 KWin::TimeLine timeLine(1000ms, initialDirection);
309 timeLine.setEasingCurve(QEasingCurve::Linear);
310 timeLine.setSourceRedirectMode(KWin::TimeLine::RedirectMode::Relaxed);
311
312 QTEST(timeLine.direction(), "initialDirection");
313 QTEST(timeLine.value(), "initialValue");
314 QCOMPARE(timeLine.sourceRedirectMode(), KWin::TimeLine::RedirectMode::Relaxed);
315 QVERIFY(!timeLine.running());
316 QVERIFY(!timeLine.done());
317
318 QFETCH(KWin::TimeLine::Direction, finalDirection);
319 timeLine.setDirection(finalDirection);
320
321 QTEST(timeLine.direction(), "finalDirection");
322 QTEST(timeLine.value(), "finalValue");
323 QCOMPARE(timeLine.sourceRedirectMode(), KWin::TimeLine::RedirectMode::Relaxed);
324 QVERIFY(!timeLine.running());
325 QVERIFY(!timeLine.done());
326}
327
328void TimeLineTest::testStrictRedirectTargetMode_data()
329{
330 QTest::addColumn<KWin::TimeLine::Direction>("initialDirection");
331 QTest::addColumn<qreal>("initialValue");
332 QTest::addColumn<KWin::TimeLine::Direction>("finalDirection");
333 QTest::addColumn<qreal>("finalValue");
334
335 QTest::newRow("forward -> backward") << KWin::TimeLine::Forward << 0.0 << KWin::TimeLine::Backward << 1.0;
336 QTest::newRow("backward -> forward") << KWin::TimeLine::Backward << 1.0 << KWin::TimeLine::Forward << 0.0;
337}
338
339void TimeLineTest::testStrictRedirectTargetMode()
340{
341 QFETCH(KWin::TimeLine::Direction, initialDirection);
342 KWin::TimeLine timeLine(1000ms, initialDirection);
343 timeLine.setEasingCurve(QEasingCurve::Linear);
344 timeLine.setTargetRedirectMode(KWin::TimeLine::RedirectMode::Strict);
345 timeLine.advance(0ms);
346
347 QTEST(timeLine.direction(), "initialDirection");
348 QTEST(timeLine.value(), "initialValue");
349 QCOMPARE(timeLine.targetRedirectMode(), KWin::TimeLine::RedirectMode::Strict);
350 QVERIFY(!timeLine.running());
351 QVERIFY(!timeLine.done());
352
353 timeLine.advance(1000ms);
354 QTEST(timeLine.value(), "finalValue");
355 QVERIFY(!timeLine.running());
356 QVERIFY(timeLine.done());
357
358 QFETCH(KWin::TimeLine::Direction, finalDirection);
359 timeLine.setDirection(finalDirection);
360
361 QTEST(timeLine.direction(), "finalDirection");
362 QTEST(timeLine.value(), "finalValue");
363 QVERIFY(!timeLine.running());
364 QVERIFY(timeLine.done());
365}
366
367void TimeLineTest::testRelaxedRedirectTargetMode_data()
368{
369 QTest::addColumn<KWin::TimeLine::Direction>("initialDirection");
370 QTest::addColumn<qreal>("initialValue");
371 QTest::addColumn<KWin::TimeLine::Direction>("finalDirection");
372 QTest::addColumn<qreal>("finalValue");
373
374 QTest::newRow("forward -> backward") << KWin::TimeLine::Forward << 0.0 << KWin::TimeLine::Backward << 1.0;
375 QTest::newRow("backward -> forward") << KWin::TimeLine::Backward << 1.0 << KWin::TimeLine::Forward << 0.0;
376}
377
378void TimeLineTest::testRelaxedRedirectTargetMode()
379{
380 QFETCH(KWin::TimeLine::Direction, initialDirection);
381 KWin::TimeLine timeLine(1000ms, initialDirection);
382 timeLine.setEasingCurve(QEasingCurve::Linear);
383 timeLine.setTargetRedirectMode(KWin::TimeLine::RedirectMode::Relaxed);
384 timeLine.advance(0ms);
385
386 QTEST(timeLine.direction(), "initialDirection");
387 QTEST(timeLine.value(), "initialValue");
388 QCOMPARE(timeLine.targetRedirectMode(), KWin::TimeLine::RedirectMode::Relaxed);
389 QVERIFY(!timeLine.running());
390 QVERIFY(!timeLine.done());
391
392 timeLine.advance(1000ms);
393 QTEST(timeLine.value(), "finalValue");
394 QVERIFY(!timeLine.running());
395 QVERIFY(timeLine.done());
396
397 QFETCH(KWin::TimeLine::Direction, finalDirection);
398 timeLine.setDirection(finalDirection);
399 timeLine.advance(1000ms);
400
401 QTEST(timeLine.direction(), "finalDirection");
402 QTEST(timeLine.value(), "finalValue");
403 QVERIFY(!timeLine.running());
404 QVERIFY(!timeLine.done());
405
406 timeLine.advance(2000ms);
407 QTEST(timeLine.direction(), "finalDirection");
408 QTEST(timeLine.value(), "initialValue");
409 QVERIFY(!timeLine.running());
410 QVERIFY(timeLine.done());
411}
412
414
415#include "timelinetest.moc"
Q_DECLARE_METATYPE(KWin::SwitchEvent::State)
QTEST_MAIN(OnScreenNotificationTest)