Change copyrights from Nokia to Digia
[qt:qtfeedback.git] / tests / auto / qfeedbackmmk / tst_qfeedbackmmk.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 #include <QSignalSpy>
49 #include <QFeedbackFileEffect>
50
51 class tst_QFeedbackMMK : public QObject
52 {
53     Q_OBJECT
54 public:
55     tst_QFeedbackMMK();
56     ~tst_QFeedbackMMK();
57
58 public slots:
59     void initTestCase();
60     void cleanupTestCase();
61     void init();
62     void cleanup();
63
64 private slots:
65     void goodFile();
66     void badFile();
67
68 private:
69     QUrl url;
70 };
71
72 tst_QFeedbackMMK::tst_QFeedbackMMK()
73 {
74 }
75
76 tst_QFeedbackMMK::~tst_QFeedbackMMK()
77 {
78 }
79
80 void tst_QFeedbackMMK::initTestCase()
81 {
82     // Only perform tests if audio device exists
83     // have to check specific formats supported as test plugin maybe installed
84     QStringList mimeTypes = QFeedbackFileEffect::supportedMimeTypes();
85     if (!(mimeTypes.contains("audio/x-wav") || mimeTypes.contains("audio/wav")
86         || mimeTypes.contains("audio/wave") || mimeTypes.contains("audio/x-pn-wav")))
87         QSKIP("No audio devices available");
88
89     // Some of this comes from the qsoundeffect testcase . .. ...
90 #ifdef QT_QFEEDBACKMMK_USEAPPLICATIONPATH
91     url = QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + QString("/test.wav"));
92 #else
93     url = QUrl::fromLocalFile(QString(SRCDIR "test.wav"));
94 #endif
95 }
96
97 void tst_QFeedbackMMK::cleanupTestCase()
98 {
99 }
100
101 void tst_QFeedbackMMK::init()
102 {
103 #ifdef Q_OS_SYMBIAN
104     //we need that head start for the eventloop to be responsive
105     QTest::qWait(1000);
106 #endif
107 }
108
109 void tst_QFeedbackMMK::cleanup()
110 {
111 }
112
113 Q_DECLARE_METATYPE(QFeedbackEffect::ErrorType);
114
115 void tst_QFeedbackMMK::goodFile()
116 {
117     QFeedbackFileEffect fe;
118     qRegisterMetaType<QFeedbackEffect::ErrorType>();
119     QSignalSpy errorSpy(&fe, SIGNAL(error(QFeedbackEffect::ErrorType)));
120     QSignalSpy stateSpy(&fe, SIGNAL(stateChanged()));
121
122     QFileInfo fi(url.toLocalFile());
123     qDebug() << "URL for test data:" << url << url.toLocalFile() << fi.exists();
124
125     fe.setSource(url);
126
127     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Loading);
128     QCOMPARE(errorSpy.count(), 0);
129     QCOMPARE(stateSpy.count(), 1); // Stopped to Loading
130
131     // Wait for it to be loaded
132     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Stopped);
133     QCOMPARE(errorSpy.count(), 0);
134     QCOMPARE(stateSpy.count(), 2); // Stopped to Loading to Stopped
135
136     // Now play!
137     fe.start();
138
139     // Now wait for it to be playing
140     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Running);
141     QCOMPARE(errorSpy.count(), 0);
142     QCOMPARE(stateSpy.count(), 3); // Stopped to Loading to Stopped to Running
143     QVERIFY(fe.isLoaded());
144     QVERIFY(fe.duration() == 0); // unsupported :/
145
146     // Try pausing - not supported
147     fe.pause(); // XXX this emits stateChanged even when it fails
148     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Running);
149     QCOMPARE(errorSpy.count(), 1);
150     QCOMPARE(stateSpy.count(), 4); // Stopped to Loading to Stopped to Running
151
152     // It should run out, eventually
153     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Stopped);
154     QCOMPARE(errorSpy.count(), 1);
155     QCOMPARE(stateSpy.count(), 5); // Stopped to Loading to Stopped to Running to Stopped
156
157     // Play it again..
158     fe.start();
159     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Running);
160     QCOMPARE(errorSpy.count(), 1);
161     QCOMPARE(stateSpy.count(), 6); // Stopped to Loading to Stopped to Running to Stopped to Running
162
163     fe.stop();
164     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Stopped);
165     QCOMPARE(errorSpy.count(), 1);
166     QCOMPARE(stateSpy.count(), 7); // Stopped to Loading to Stopped to Running to Stopped to Running to Stopped
167
168     fe.unload();
169     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Stopped);
170     QCOMPARE(stateSpy.count(), 7); // no change
171     QCOMPARE(fe.isLoaded(), false);
172     QCOMPARE(fe.duration(), 0);
173
174     // now load again
175     fe.load();
176 #ifdef Q_OS_MAC
177     QEXPECT_FAIL("", "QTBUG-25448", Abort);
178 #endif
179     QTRY_COMPARE((int)fe.state(),  (int)QFeedbackFileEffect::Loading);
180     QCOMPARE(errorSpy.count(), 1);
181     QCOMPARE(stateSpy.count(), 8); // Stopped to Loading
182
183     // Now wait for it to be loaded and playing
184     QTRY_COMPARE((int)fe.state(), (int) QFeedbackFileEffect::Stopped);
185     QCOMPARE(errorSpy.count(), 1);
186     QCOMPARE(stateSpy.count(), 9); // Stopped to Loading to Stopped
187     QVERIFY(fe.isLoaded());
188
189     // destroy it while playing
190 }
191
192 void tst_QFeedbackMMK::badFile()
193 {
194     QFeedbackFileEffect fe;
195     qRegisterMetaType<QFeedbackEffect::ErrorType>();
196     QSignalSpy errorSpy(&fe, SIGNAL(error(QFeedbackEffect::ErrorType)));
197     QSignalSpy stateSpy(&fe, SIGNAL(stateChanged()));
198
199     fe.setSource(QUrl("file:///does/not/exist/ever.wav"));
200
201     // Depending on event loops we might miss the Loading state.
202     QTRY_VERIFY(stateSpy.count() >  0);    // Loading & Stopped
203     QTRY_COMPARE(fe.state(), QFeedbackEffect::Stopped);
204
205     QVERIFY(errorSpy.count() > 0);
206     QVERIFY(fe.isLoaded() == false);
207     stateSpy.clear();
208     errorSpy.clear();
209
210     fe.start(); // this actually causes a load, so it goes into LOADING, then fails, should go to STOPPED
211     QTRY_VERIFY(stateSpy.count() > 0);    // Loading & Stopped
212     QTRY_COMPARE(fe.state(), QFeedbackEffect::Stopped);
213     QVERIFY(errorSpy.count() > 0);
214     QVERIFY(fe.isLoaded() == false);
215 }
216
217 QTEST_MAIN(tst_QFeedbackMMK)
218
219 #include "tst_qfeedbackmmk.moc"