Change copyrights from Nokia to Digia
[qt:qtfeedback.git] / tests / auto / qfeedbackhapticseffect / tst_qfeedbackhapticseffect.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the Qt Mobility Components.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 //TESTED_COMPONENT=src/feedback
43
44 #include <QtTest/QtTest>
45
46 #include <qfeedbackeffect.h>
47 #include <qfeedbackactuator.h>
48
49 QT_USE_NAMESPACE
50
51 class tst_QFeedbackHapticsEffect : public QObject
52 {
53     Q_OBJECT
54 public:
55     tst_QFeedbackHapticsEffect();
56     ~tst_QFeedbackHapticsEffect();
57
58 public slots:
59     void initTestCase();
60     void cleanupTestCase();
61     void init();
62     void cleanup();
63
64 private slots:
65     void initialization();
66     void envelope_data();
67     void envelope();
68     void startStop_data();
69     void startStop();
70     void themeSupport();
71
72 };
73
74 tst_QFeedbackHapticsEffect::tst_QFeedbackHapticsEffect()
75 {
76 }
77
78 tst_QFeedbackHapticsEffect::~tst_QFeedbackHapticsEffect()
79 {
80 }
81
82 void tst_QFeedbackHapticsEffect::initTestCase()
83 {
84 }
85
86 void tst_QFeedbackHapticsEffect::cleanupTestCase()
87 {
88 }
89
90 void tst_QFeedbackHapticsEffect::init()
91 {
92 #ifdef Q_OS_SYMBIAN
93     //we need that head start for the eventloop to be responsive
94     QTest::qWait(1000);
95 #endif
96 }
97
98 void tst_QFeedbackHapticsEffect::cleanup()
99 {
100 }
101
102
103 void tst_QFeedbackHapticsEffect::initialization()
104 {
105     QFeedbackHapticsEffect effect;
106     if (QFeedbackActuator::actuators().isEmpty()) {
107         QVERIFY(!effect.actuator()->isValid());
108     } else {
109         QVERIFY(effect.actuator()->isValid());
110         QCOMPARE(effect.actuator(), QFeedbackActuator::actuators().first());
111     }
112
113     // actuators from other plugins need to be verified.
114     //test default values
115     QCOMPARE(effect.duration(), 250); //250ms is the default length for effects
116     QCOMPARE(effect.intensity(), qreal(1));
117     QCOMPARE(effect.attackTime(), 0);
118     QCOMPARE(effect.attackIntensity(), qreal(0));
119     QCOMPARE(effect.fadeTime(), 0);
120     QCOMPARE(effect.fadeIntensity(), qreal(0));
121     QCOMPARE(effect.period(), -1);
122     QCOMPARE(effect.state(), QFeedbackEffect::Stopped);
123
124 }
125
126 void tst_QFeedbackHapticsEffect::envelope_data()
127 {
128     QTest::addColumn<int>("duration");
129     QTest::addColumn<qreal>("intensity");
130     QTest::addColumn<int>("attackTime");
131     QTest::addColumn<qreal>("attackIntensity");
132     QTest::addColumn<int>("fadeTime");
133     QTest::addColumn<qreal>("fadeIntensity");
134     QTest::addColumn<int>("period");
135
136     QTest::newRow("TEST1")        <<  300 << qreal(.2) <<   1 << qreal(.2) <<   2 << qreal(1) <<  -1;
137     QTest::newRow("TEST2")        <<  500 <<  qreal(1) << 100 << qreal(.5) <<   0 << qreal(0) <<  -1;
138     QTest::newRow("TEST3")        <<  250 << qreal(.8) << 150 <<  qreal(1) << 150 << qreal(1) <<  -1;
139     QTest::newRow("TEST period")  << 1000 <<  qreal(1) << 150 <<  qreal(1) << 150 << qreal(1) << 150;
140 }
141
142 void tst_QFeedbackHapticsEffect::envelope()
143 {
144     QFETCH(int, duration);
145     QFETCH(qreal, intensity);
146     QFETCH(int, attackTime);
147     QFETCH(qreal, attackIntensity);
148     QFETCH(int, fadeTime);
149     QFETCH(qreal, fadeIntensity);
150     QFETCH(int, period);
151
152     QFeedbackHapticsEffect effect;
153
154     // actuators from other plugins need to be verified.
155     effect.setDuration(duration);
156     QCOMPARE(effect.duration(), duration);
157
158     effect.setIntensity(intensity);
159     QCOMPARE(effect.intensity(), intensity);
160
161     effect.setAttackTime(attackTime);
162     QCOMPARE(effect.attackTime(), attackTime);
163
164     effect.setAttackIntensity(attackIntensity);
165     QCOMPARE(effect.attackIntensity(), attackIntensity);
166
167     effect.setFadeTime(fadeTime);
168     QCOMPARE(effect.fadeTime(), fadeTime);
169
170     effect.setFadeIntensity(fadeIntensity);
171     QCOMPARE(effect.fadeIntensity(), fadeIntensity);
172
173     effect.setPeriod(period);
174     QCOMPARE(effect.period(), period);
175
176     //test all the values at once
177     QCOMPARE(effect.duration(), duration);
178     QCOMPARE(effect.intensity(), intensity);
179     QCOMPARE(effect.attackTime(), attackTime);
180     QCOMPARE(effect.attackIntensity(), attackIntensity);
181     QCOMPARE(effect.fadeTime(), fadeTime);
182     QCOMPARE(effect.fadeIntensity(), fadeIntensity);
183     QCOMPARE(effect.period(), period);
184 }
185
186
187 void tst_QFeedbackHapticsEffect::startStop_data()
188 {
189     envelope_data();
190 }
191
192 void tst_QFeedbackHapticsEffect::startStop()
193 {
194     qRegisterMetaType<QFeedbackEffect::ErrorType>("QFeedbackEffect::ErrorType");
195     if (QFeedbackActuator::actuators().isEmpty())
196         QSKIP("this test requires to have actuators");
197
198     QList<QFeedbackActuator*> actuators = QFeedbackActuator::actuators();
199
200     QFETCH(int, duration);
201     QFETCH(qreal, intensity);
202     QFETCH(int, attackTime);
203     QFETCH(qreal, attackIntensity);
204     QFETCH(int, fadeTime);
205     QFETCH(qreal, fadeIntensity);
206     QFETCH(int, period);
207
208     QFeedbackHapticsEffect effect;
209     QSignalSpy errorspy(&effect, SIGNAL(error(QFeedbackEffect::ErrorType)));
210     QSignalSpy stateSpy(&effect, SIGNAL(stateChanged()));
211
212     effect.setDuration(duration);
213     effect.setIntensity(intensity);
214     effect.setAttackTime(attackTime);
215     effect.setAttackIntensity(attackIntensity);
216     effect.setFadeTime(fadeTime);
217     effect.setFadeIntensity(fadeIntensity);
218     effect.setPeriod(period);
219
220     QCOMPARE(effect.state(), QFeedbackHapticsEffect::Stopped);
221     QCOMPARE(effect.actuator(), actuators.at(0));
222
223     // Double set a few properties (shouldn't call the backend)
224     effect.setAttackTime(attackTime);
225     QVERIFY(effect.attackTime() == attackTime);
226
227     effect.setFadeTime(fadeTime);
228     QVERIFY(effect.fadeTime() == fadeTime);
229
230     // Test setting to a non default actuator and then back again
231     if (actuators.count() > 1) {
232         effect.setActuator(actuators.at(1));
233         QCOMPARE(effect.actuator(), actuators.at(1));
234
235         effect.setActuator(0);
236         QCOMPARE(effect.actuator(), actuators.at(0));
237
238         // noop
239         effect.setActuator(actuators.at(0));
240         QCOMPARE(effect.actuator(), actuators.at(0));
241     }
242
243     // Now start
244     QVERIFY(stateSpy.isEmpty());
245     effect.start();
246     QVERIFY(errorspy.isEmpty());
247
248     // This seems a little risky
249     QTRY_COMPARE(effect.state(), QFeedbackHapticsEffect::Running);
250     QVERIFY(errorspy.isEmpty());
251     QCOMPARE(stateSpy.count(), 1); // stopped to start
252
253     effect.pause();
254     QCOMPARE(effect.state(), QFeedbackHapticsEffect::Paused);
255     QCOMPARE(stateSpy.count(), 2);
256
257     // Now try to change a few properties (should be refused because of !Stopped)
258     effect.setPeriod(period + 100);
259     QVERIFY(effect.period() == period);
260
261     QFeedbackActuator* actuator = effect.actuator();
262     effect.setActuator(0);
263     QVERIFY(effect.actuator() == actuator);
264
265     effect.start();
266     QCOMPARE(effect.state(), QFeedbackHapticsEffect::Running);
267     QCOMPARE(stateSpy.count(),  3);
268
269     QTRY_COMPARE(effect.state(), QFeedbackHapticsEffect::Stopped);
270     QVERIFY(errorspy.isEmpty());
271     QCOMPARE(stateSpy.count(), 4);
272 }
273
274
275 void tst_QFeedbackHapticsEffect::themeSupport()
276 {
277     const bool supportsTheme = QFeedbackEffect::supportsThemeEffect();
278
279     if (!supportsTheme)
280         QSKIP("No theme support");
281     int numberOfSupportedEffects = 0;
282     for (int i = 0; i < QFeedbackEffect::NumberOfEffects; ++i) {
283         if (QFeedbackEffect::playThemeEffect(QFeedbackEffect::Effect(i)))
284             numberOfSupportedEffects++;
285         QTest::qWait(250); //let's make sure the device is ready again
286     }
287
288     QVERIFY(numberOfSupportedEffects > 0);
289 }
290
291 QTEST_MAIN(tst_QFeedbackHapticsEffect)
292
293 #include "tst_qfeedbackhapticseffect.moc"