1
/****************************************************************************
3
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the test suite of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL21$
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.
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 or version 3 as published by the Free
20
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22
** following information to ensure the GNU Lesser General Public License
23
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
26
** In addition, as a special exception, Digia gives you certain additional
27
** rights. These rights are described in the Digia Qt LGPL Exception
28
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
32
****************************************************************************/
34
//TESTED_COMPONENT=src/multimedia
36
#include <QtTest/QtTest>
38
#include <QtCore/qtimer.h>
40
#include <QtMultimedia/qmediametadata.h>
41
#include <qmediaobject.h>
42
#include <qmediaservice.h>
43
#include <qmetadatareadercontrol.h>
44
#include <qaudioinputselectorcontrol.h>
46
#include "mockmediarecorderservice.h"
47
#include "mockmediaserviceprovider.h"
48
#include "mockmetadatareadercontrol.h"
49
#include "mockavailabilitycontrol.h"
51
class QtTestMediaObjectService : public QMediaService
55
QtTestMediaObjectService(QObject *parent = 0, MockAvailabilityControl *availability = 0)
56
: QMediaService(parent)
57
, availabilityControl(availability)
63
QMediaControl *requestControl(const char *iid)
65
if (hasMetaData && qstrcmp(iid, QMetaDataReaderControl_iid) == 0)
67
else if (qstrcmp(iid, QMediaAvailabilityControl_iid) == 0)
68
return availabilityControl;
73
void releaseControl(QMediaControl *)
77
MockMetaDataReaderControl metaData;
78
MockAvailabilityControl *availabilityControl;
85
class tst_QMediaObject : public QObject
91
void notifySignals_data();
93
void notifyInterval_data();
94
void notifyInterval();
96
void nullMetaDataControl();
97
void isMetaDataAvailable();
98
void metaDataChanged();
106
void setupNotifyTests();
109
class QtTestMediaObject : public QMediaObject
112
Q_PROPERTY(int a READ a WRITE setA NOTIFY aChanged)
113
Q_PROPERTY(int b READ b WRITE setB NOTIFY bChanged)
114
Q_PROPERTY(int c READ c WRITE setC NOTIFY cChanged)
115
Q_PROPERTY(int d READ d WRITE setD)
117
QtTestMediaObject(QMediaService *service = 0): QMediaObject(0, service), m_a(0), m_b(0), m_c(0), m_d(0) {}
119
using QMediaObject::addPropertyWatch;
120
using QMediaObject::removePropertyWatch;
122
int a() const { return m_a; }
123
void setA(int a) { m_a = a; }
125
int b() const { return m_b; }
126
void setB(int b) { m_b = b; }
128
int c() const { return m_c; }
129
void setC(int c) { m_c = c; }
131
int d() const { return m_d; }
132
void setD(int d) { m_d = d; }
135
void aChanged(int a);
136
void bChanged(int b);
137
void cChanged(int c);
146
void tst_QMediaObject::propertyWatch()
148
QtTestMediaObject object;
149
object.setNotifyInterval(0);
152
connect(&object, SIGNAL(aChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
153
connect(&object, SIGNAL(bChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
154
connect(&object, SIGNAL(cChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop()));
156
QSignalSpy aSpy(&object, SIGNAL(aChanged(int)));
157
QSignalSpy bSpy(&object, SIGNAL(bChanged(int)));
158
QSignalSpy cSpy(&object, SIGNAL(cChanged(int)));
160
QTestEventLoop::instance().enterLoop(1);
162
QCOMPARE(aSpy.count(), 0);
163
QCOMPARE(bSpy.count(), 0);
164
QCOMPARE(cSpy.count(), 0);
170
object.addPropertyWatch("a");
172
QTestEventLoop::instance().enterLoop(1);
174
QVERIFY(aSpy.count() > aCount);
175
QCOMPARE(bSpy.count(), 0);
176
QCOMPARE(cSpy.count(), 0);
177
QCOMPARE(aSpy.last().value(0).toInt(), 0);
179
aCount = aSpy.count();
185
QTestEventLoop::instance().enterLoop(1);
187
QVERIFY(aSpy.count() > aCount);
188
QCOMPARE(bSpy.count(), 0);
189
QCOMPARE(cSpy.count(), 0);
190
QCOMPARE(aSpy.last().value(0).toInt(), 54);
192
aCount = aSpy.count();
194
object.addPropertyWatch("b");
195
object.addPropertyWatch("d");
196
object.removePropertyWatch("e");
201
QTestEventLoop::instance().enterLoop(1);
203
QVERIFY(aSpy.count() > aCount);
204
QVERIFY(bSpy.count() > bCount);
205
QCOMPARE(cSpy.count(), 0);
206
QCOMPARE(aSpy.last().value(0).toInt(), 43);
207
QCOMPARE(bSpy.last().value(0).toInt(), 235);
209
aCount = aSpy.count();
210
bCount = bSpy.count();
212
object.removePropertyWatch("a");
213
object.addPropertyWatch("c");
214
object.addPropertyWatch("e");
216
QTestEventLoop::instance().enterLoop(1);
218
QCOMPARE(aSpy.count(), aCount);
219
QVERIFY(bSpy.count() > bCount);
220
QVERIFY(cSpy.count() > cCount);
221
QCOMPARE(bSpy.last().value(0).toInt(), 235);
222
QCOMPARE(cSpy.last().value(0).toInt(), 90);
224
bCount = bSpy.count();
225
cCount = cSpy.count();
230
QTestEventLoop::instance().enterLoop(1);
232
QCOMPARE(aSpy.count(), aCount);
233
QVERIFY(bSpy.count() > bCount);
234
QVERIFY(cSpy.count() > cCount);
235
QCOMPARE(bSpy.last().value(0).toInt(), 235);
236
QCOMPARE(cSpy.last().value(0).toInt(), 9845);
238
bCount = bSpy.count();
239
cCount = cSpy.count();
244
object.removePropertyWatch("c");
245
object.removePropertyWatch("d");
247
QTestEventLoop::instance().enterLoop(1);
249
QCOMPARE(aSpy.count(), aCount);
250
QVERIFY(bSpy.count() > bCount);
251
QCOMPARE(cSpy.count(), cCount);
252
QCOMPARE(bSpy.last().value(0).toInt(), 324);
253
QCOMPARE(cSpy.last().value(0).toInt(), 9845);
255
bCount = bSpy.count();
257
object.removePropertyWatch("b");
259
QTestEventLoop::instance().enterLoop(1);
261
QCOMPARE(aSpy.count(), aCount);
262
QCOMPARE(bSpy.count(), bCount);
263
QCOMPARE(cSpy.count(), cCount);
266
void tst_QMediaObject::setupNotifyTests()
268
QTest::addColumn<int>("interval");
269
QTest::addColumn<int>("count");
271
QTest::newRow("single 750ms")
274
QTest::newRow("single 600ms")
277
QTest::newRow("x3 300ms")
280
QTest::newRow("x5 180ms")
285
void tst_QMediaObject::notifySignals_data()
290
void tst_QMediaObject::notifySignals()
292
QFETCH(int, interval);
295
QtTestMediaObject object;
296
object.setNotifyInterval(interval);
297
object.addPropertyWatch("a");
299
QSignalSpy spy(&object, SIGNAL(aChanged(int)));
301
QTestEventLoop::instance().enterLoop(1);
303
QCOMPARE(spy.count(), count);
306
void tst_QMediaObject::notifyInterval_data()
311
void tst_QMediaObject::notifyInterval()
313
QFETCH(int, interval);
315
QtTestMediaObject object;
316
QSignalSpy spy(&object, SIGNAL(notifyIntervalChanged(int)));
318
object.setNotifyInterval(interval);
319
QCOMPARE(object.notifyInterval(), interval);
320
QCOMPARE(spy.count(), 1);
321
QCOMPARE(spy.last().value(0).toInt(), interval);
323
object.setNotifyInterval(interval);
324
QCOMPARE(object.notifyInterval(), interval);
325
QCOMPARE(spy.count(), 1);
328
void tst_QMediaObject::nullMetaDataControl()
330
const QString titleKey(QLatin1String("Title"));
331
const QString title(QLatin1String("Host of Seraphim"));
333
QtTestMediaObjectService service;
334
service.hasMetaData = false;
336
QtTestMediaObject object(&service);
338
QSignalSpy spy(&object, SIGNAL(metaDataChanged()));
340
QCOMPARE(object.isMetaDataAvailable(), false);
342
QCOMPARE(object.metaData(QMediaMetaData::Title).toString(), QString());
343
QCOMPARE(object.availableMetaData(), QStringList());
344
QCOMPARE(spy.count(), 0);
347
void tst_QMediaObject::isMetaDataAvailable()
349
QtTestMediaObjectService service;
350
service.metaData.setMetaDataAvailable(false);
352
QtTestMediaObject object(&service);
353
QCOMPARE(object.isMetaDataAvailable(), false);
355
QSignalSpy spy(&object, SIGNAL(metaDataAvailableChanged(bool)));
356
service.metaData.setMetaDataAvailable(true);
358
QCOMPARE(object.isMetaDataAvailable(), true);
359
QCOMPARE(spy.count(), 1);
360
QCOMPARE(spy.at(0).at(0).toBool(), true);
362
service.metaData.setMetaDataAvailable(false);
364
QCOMPARE(object.isMetaDataAvailable(), false);
365
QCOMPARE(spy.count(), 2);
366
QCOMPARE(spy.at(1).at(0).toBool(), false);
369
void tst_QMediaObject::metaDataChanged()
371
QtTestMediaObjectService service;
372
QtTestMediaObject object(&service);
374
QSignalSpy changedSpy(&object, SIGNAL(metaDataChanged()));
375
QSignalSpy changedWithValueSpy(&object, SIGNAL(metaDataChanged(QString,QVariant)));
377
service.metaData.setMetaData("key", "Value");
378
QCOMPARE(changedSpy.count(), 1);
379
QCOMPARE(changedWithValueSpy.count(), 1);
380
QCOMPARE(changedWithValueSpy.last()[0], QVariant("key"));
381
QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value"));
383
service.metaData.setMetaData("key", "Value");
384
QCOMPARE(changedSpy.count(), 1);
385
QCOMPARE(changedWithValueSpy.count(), 1);
387
service.metaData.setMetaData("key2", "Value");
388
QCOMPARE(changedSpy.count(), 2);
389
QCOMPARE(changedWithValueSpy.count(), 2);
390
QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2"));
391
QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value"));
394
void tst_QMediaObject::metaData_data()
396
QTest::addColumn<QString>("artist");
397
QTest::addColumn<QString>("title");
398
QTest::addColumn<QString>("genre");
401
<< QString::fromLatin1("Dead Can Dance")
402
<< QString::fromLatin1("Host of Seraphim")
403
<< QString::fromLatin1("Awesome");
406
void tst_QMediaObject::metaData()
408
QFETCH(QString, artist);
409
QFETCH(QString, title);
410
QFETCH(QString, genre);
412
QtTestMediaObjectService service;
413
service.metaData.populateMetaData();
415
QtTestMediaObject object(&service);
416
QVERIFY(object.availableMetaData().isEmpty());
418
service.metaData.m_data.insert(QMediaMetaData::AlbumArtist, artist);
419
service.metaData.m_data.insert(QMediaMetaData::Title, title);
420
service.metaData.m_data.insert(QMediaMetaData::Genre, genre);
422
QCOMPARE(object.metaData(QMediaMetaData::AlbumArtist).toString(), artist);
423
QCOMPARE(object.metaData(QMediaMetaData::Title).toString(), title);
425
QStringList metaDataKeys = object.availableMetaData();
426
QCOMPARE(metaDataKeys.size(), 3);
427
QVERIFY(metaDataKeys.contains(QMediaMetaData::AlbumArtist));
428
QVERIFY(metaDataKeys.contains(QMediaMetaData::Title));
429
QVERIFY(metaDataKeys.contains(QMediaMetaData::Genre));
432
void tst_QMediaObject::availability()
435
QtTestMediaObject nullObject(0);
436
QCOMPARE(nullObject.isAvailable(), false);
437
QCOMPARE(nullObject.availability(), QMultimedia::ServiceMissing);
441
QtTestMediaObjectService service;
442
QtTestMediaObject object(&service);
443
QCOMPARE(object.isAvailable(), true);
444
QCOMPARE(object.availability(), QMultimedia::Available);
448
MockAvailabilityControl available(QMultimedia::Available);
449
QtTestMediaObjectService service(0, &available);
450
QtTestMediaObject object(&service);
451
QSignalSpy availabilitySpy(&object, SIGNAL(availabilityChanged(bool)));
452
QSignalSpy availabilityStatusSpy(&object, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)));
454
QCOMPARE(object.isAvailable(), true);
455
QCOMPARE(object.availability(), QMultimedia::Available);
457
available.setAvailability(QMultimedia::Busy);
458
QCOMPARE(object.isAvailable(), false);
459
QCOMPARE(object.availability(), QMultimedia::Busy);
460
QCOMPARE(availabilitySpy.count(), 1);
461
QCOMPARE(availabilityStatusSpy.count(), 1);
463
available.setAvailability(QMultimedia::Available);
464
QCOMPARE(object.isAvailable(), true);
465
QCOMPARE(object.availability(), QMultimedia::Available);
466
QCOMPARE(availabilitySpy.count(), 2);
467
QCOMPARE(availabilityStatusSpy.count(), 2);
471
MockAvailabilityControl available(QMultimedia::Busy);
472
QtTestMediaObjectService service(0, &available);
473
QtTestMediaObject object(&service);
474
QSignalSpy availabilitySpy(&object, SIGNAL(availabilityChanged(bool)));
475
QSignalSpy availabilityStatusSpy(&object, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)));
477
QCOMPARE(object.isAvailable(), false);
478
QCOMPARE(object.availability(), QMultimedia::Busy);
480
available.setAvailability(QMultimedia::Available);
481
QCOMPARE(object.isAvailable(), true);
482
QCOMPARE(object.availability(), QMultimedia::Available);
483
QCOMPARE(availabilitySpy.count(), 1);
484
QCOMPARE(availabilityStatusSpy.count(), 1);
488
void tst_QMediaObject::service()
490
// Create the mediaobject with service.
491
QtTestMediaObjectService service;
492
QtTestMediaObject mediaObject1(&service);
494
// Get service and Compare if it equal to the service passed as an argument in mediaObject1.
495
QMediaService *service1 = mediaObject1.service();
496
QVERIFY(service1 != NULL);
497
QCOMPARE(service1,&service);
499
// Create the mediaobject with empty service and verify that service() returns NULL.
500
QtTestMediaObject mediaObject2;
501
QMediaService *service2 = mediaObject2.service();
502
QVERIFY(service2 == NULL);
505
QTEST_GUILESS_MAIN(tst_QMediaObject)
506
#include "tst_qmediaobject.moc"