Files
qtmultimedia/tests/auto/unit/qdeclarativevideo/tst_qdeclarativevideo.cpp
Michael Goddard e3a8c165ea Rearrange the automatic tests.
Split them into unit and integration tests.  Integration tests really
need to be run on the real platform (not in a VM etc) since they are
somewhat unstable or nonfunctional otherwise.

A few tests were previously broken by QUrl changes and they were repaired.
Removed one test since it was not providing a lot of value.

There are still a number of tests that rely on Q_AUTOTEST_EXPORT symbols.

Change-Id: Ic402abf0af946baa5945075d975b3f584f9ef280
Reviewed-by: Kalle Lehtonen <kalle.ju.lehtonen@nokia.com>
2011-11-04 08:19:17 +01:00

992 lines
34 KiB
C++

/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
//TESTED_COMPONENT=plugins/declarative/multimedia
#include <QtTest/QtTest>
#include "qdeclarativevideo_p.h"
#include <qabstractvideosurface.h>
#include <qgraphicsvideoitem.h>
#include <qmediaplayercontrol.h>
#include <qmediaservice.h>
#include <qmediaserviceprovider.h>
#include <qvideorenderercontrol.h>
#include <qvideowindowcontrol.h>
#include <qvideosurfaceformat.h>
#include <QtWidgets/qapplication.h>
#include <QtGui/qpainter.h>
class tst_QDeclarativeVideo : public QObject
{
Q_OBJECT
public slots:
void initTestCase();
private slots:
void nullPlayerControl();
void nullService();
void playing();
void paused();
void error();
void hasAudio();
void hasVideo();
void fillMode();
void geometry();
};
Q_DECLARE_METATYPE(QDeclarativeVideo::Error);
class QtTestMediaPlayerControl : public QMediaPlayerControl
{
Q_OBJECT
public:
QtTestMediaPlayerControl(QObject *parent = 0)
: QMediaPlayerControl(parent)
, m_state(QMediaPlayer::StoppedState)
, m_mediaStatus(QMediaPlayer::NoMedia)
, m_duration(0)
, m_position(0)
, m_playbackRate(1.0)
, m_volume(50)
, m_bufferStatus(0)
, m_muted(false)
, m_audioAvailable(false)
, m_videoAvailable(false)
, m_seekable(false)
{
}
QMediaPlayer::State state() const { return m_state; }
void updateState(QMediaPlayer::State state) { emit stateChanged(m_state = state); }
QMediaPlayer::MediaStatus mediaStatus() const { return m_mediaStatus; }
void updateMediaStatus(QMediaPlayer::MediaStatus status) {
emit mediaStatusChanged(m_mediaStatus = status); }
void updateMediaStatus(QMediaPlayer::MediaStatus status, QMediaPlayer::State state)
{
m_mediaStatus = status;
m_state = state;
emit mediaStatusChanged(m_mediaStatus);
emit stateChanged(m_state);
}
qint64 duration() const { return m_duration; }
void setDuration(qint64 duration) { emit durationChanged(m_duration = duration); }
qint64 position() const { return m_position; }
void setPosition(qint64 position) { emit positionChanged(m_position = position); }
int volume() const { return m_volume; }
void setVolume(int volume) { emit volumeChanged(m_volume = volume); }
bool isMuted() const { return m_muted; }
void setMuted(bool muted) { emit mutedChanged(m_muted = muted); }
int bufferStatus() const { return m_bufferStatus; }
void setBufferStatus(int status) { emit bufferStatusChanged(m_bufferStatus = status); }
bool isAudioAvailable() const { return m_audioAvailable; }
void setAudioAvailable(bool available) {
emit audioAvailableChanged(m_audioAvailable = available); }
bool isVideoAvailable() const { return m_videoAvailable; }
void setVideoAvailable(bool available) {
emit videoAvailableChanged(m_videoAvailable = available); }
bool isSeekable() const { return m_seekable; }
void setSeekable(bool seekable) { emit seekableChanged(m_seekable = seekable); }
QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); }
qreal playbackRate() const { return m_playbackRate; }
void setPlaybackRate(qreal rate) { emit playbackRateChanged(m_playbackRate = rate); }
QMediaContent media() const { return m_media; }
const QIODevice *mediaStream() const { return 0; }
void setMedia(const QMediaContent &media, QIODevice *)
{
m_media = media;
m_mediaStatus = m_media.isNull()
? QMediaPlayer::NoMedia
: QMediaPlayer::LoadingMedia;
emit mediaChanged(m_media);
emit mediaStatusChanged(m_mediaStatus);
}
void play() { emit stateChanged(m_state = QMediaPlayer::PlayingState); }
void pause() { emit stateChanged(m_state = QMediaPlayer::PausedState); }
void stop() { emit stateChanged(m_state = QMediaPlayer::StoppedState); }
void emitError(QMediaPlayer::Error err, const QString &errorString) {
emit error(err, errorString); }
private:
QMediaPlayer::State m_state;
QMediaPlayer::MediaStatus m_mediaStatus;
qint64 m_duration;
qint64 m_position;
qreal m_playbackRate;
int m_volume;
int m_bufferStatus;
bool m_muted;
bool m_audioAvailable;
bool m_videoAvailable;
bool m_seekable;
QMediaContent m_media;
};
class QtTestRendererControl : public QVideoRendererControl
{
public:
QtTestRendererControl(QObject *parent ) : QVideoRendererControl(parent), m_surface(0) {}
QAbstractVideoSurface *surface() const { return m_surface; }
void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; }
private:
QAbstractVideoSurface *m_surface;
};
class QtTestWindowControl : public QVideoWindowControl
{
public:
QtTestWindowControl(QObject *parent)
: QVideoWindowControl(parent)
, m_winId(0)
, m_repaintCount(0)
, m_brightness(0)
, m_contrast(0)
, m_saturation(0)
, m_aspectRatioMode(Qt::KeepAspectRatio)
, m_fullScreen(0)
{
}
WId winId() const { return m_winId; }
void setWinId(WId id) { m_winId = id; }
QRect displayRect() const { return m_displayRect; }
void setDisplayRect(const QRect &rect) { m_displayRect = rect; }
bool isFullScreen() const { return m_fullScreen; }
void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); }
int repaintCount() const { return m_repaintCount; }
void setRepaintCount(int count) { m_repaintCount = count; }
void repaint() { ++m_repaintCount; }
QSize nativeSize() const { return m_nativeSize; }
void setNativeSize(const QSize &size) { m_nativeSize = size; emit nativeSizeChanged(); }
Qt::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; }
void setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; }
int brightness() const { return m_brightness; }
void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); }
int contrast() const { return m_contrast; }
void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); }
int hue() const { return m_hue; }
void setHue(int hue) { emit hueChanged(m_hue = hue); }
int saturation() const { return m_saturation; }
void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); }
private:
WId m_winId;
int m_repaintCount;
int m_brightness;
int m_contrast;
int m_hue;
int m_saturation;
Qt::AspectRatioMode m_aspectRatioMode;
QRect m_displayRect;
QSize m_nativeSize;
bool m_fullScreen;
};
class QtTestMediaService : public QMediaService
{
Q_OBJECT
public:
QtTestMediaService(
QtTestMediaPlayerControl *playerControl,
QtTestRendererControl *rendererControl,
QtTestWindowControl *windowControl,
QObject *parent)
: QMediaService(parent)
, playerControl(playerControl)
, rendererControl(rendererControl)
, windowControl(windowControl)
{
}
QMediaControl *requestControl(const char *name)
{
if (qstrcmp(name, QMediaPlayerControl_iid) == 0)
return playerControl;
else if (qstrcmp(name, QVideoRendererControl_iid) == 0)
return rendererControl;
else if (qstrcmp(name, QVideoWindowControl_iid) == 0)
return windowControl;
else
return 0;
}
void releaseControl(QMediaControl *) {}
QtTestMediaPlayerControl *playerControl;
QtTestRendererControl *rendererControl;
QtTestWindowControl *windowControl;
};
class QtTestMediaServiceProvider : public QMediaServiceProvider
{
Q_OBJECT
public:
QtTestMediaServiceProvider()
: service(
new QtTestMediaService(
new QtTestMediaPlayerControl(this),
new QtTestRendererControl(this),
new QtTestWindowControl(this),
this))
{
setDefaultServiceProvider(this);
}
QtTestMediaServiceProvider(QtTestMediaService *service)
: service(service)
{
setDefaultServiceProvider(this);
}
QtTestMediaServiceProvider(
QtTestMediaPlayerControl *playerControl,
QtTestRendererControl *rendererControl,
QtTestWindowControl *windowControl)
: service(new QtTestMediaService(playerControl, rendererControl, windowControl, this))
{
setDefaultServiceProvider(this);
}
~QtTestMediaServiceProvider()
{
setDefaultServiceProvider(0);
}
QMediaService *requestService(
const QByteArray &type,
const QMediaServiceProviderHint & = QMediaServiceProviderHint())
{
requestedService = type;
return service;
}
void releaseService(QMediaService *) {}
inline QtTestMediaPlayerControl *playerControl() { return service->playerControl; }
inline QtTestRendererControl *rendererControl() { return service->rendererControl; }
QtTestMediaService *service;
QByteArray requestedService;
};
void tst_QDeclarativeVideo::initTestCase()
{
qRegisterMetaType<QDeclarativeVideo::Error>();
}
void tst_QDeclarativeVideo::nullPlayerControl()
{
QtTestMediaServiceProvider provider(0, 0, 0);
QDeclarativeVideo video;
video.classBegin();
QCOMPARE(video.source(), QUrl());
video.setSource(QUrl("http://example.com"));
QCOMPARE(video.source(), QUrl("http://example.com"));
QCOMPARE(video.isPlaying(), false);
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
video.setPlaying(false);
video.play();
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), false);
video.pause();
QCOMPARE(video.isPaused(), false);
video.setPaused(true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(video.duration(), 0);
QCOMPARE(video.position(), 0);
video.setPosition(10000);
QCOMPARE(video.position(), 10000);
QCOMPARE(video.volume(), qreal(1.0));
video.setVolume(0.5);
QCOMPARE(video.volume(), qreal(0.5));
QCOMPARE(video.isMuted(), false);
video.setMuted(true);
QCOMPARE(video.isMuted(), true);
QCOMPARE(video.bufferProgress(), qreal(0));
QCOMPARE(video.isSeekable(), false);
QCOMPARE(video.playbackRate(), qreal(1.0));
QCOMPARE(video.hasAudio(), false);
QCOMPARE(video.hasVideo(), false);
QCOMPARE(video.status(), QDeclarativeVideo::NoMedia);
QCOMPARE(video.error(), QDeclarativeVideo::ServiceMissing);
}
void tst_QDeclarativeVideo::nullService()
{
QtTestMediaServiceProvider provider(0);
QDeclarativeVideo video;
video.classBegin();
QCOMPARE(video.source(), QUrl());
video.setSource(QUrl("http://example.com"));
QCOMPARE(video.source(), QUrl("http://example.com"));
QCOMPARE(video.isPlaying(), false);
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
video.setPlaying(false);
video.play();
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), false);
video.pause();
QCOMPARE(video.isPaused(), false);
video.setPaused(true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(video.duration(), 0);
QCOMPARE(video.position(), 0);
video.setPosition(10000);
QCOMPARE(video.position(), 10000);
QCOMPARE(video.volume(), qreal(1.0));
video.setVolume(0.5);
QCOMPARE(video.volume(), qreal(0.5));
QCOMPARE(video.isMuted(), false);
video.setMuted(true);
QCOMPARE(video.isMuted(), true);
QCOMPARE(video.bufferProgress(), qreal(0));
QCOMPARE(video.isSeekable(), false);
QCOMPARE(video.playbackRate(), qreal(1.0));
QCOMPARE(video.hasAudio(), false);
QCOMPARE(video.hasVideo(), false);
QCOMPARE(video.status(), QDeclarativeVideo::NoMedia);
QCOMPARE(video.error(), QDeclarativeVideo::ServiceMissing);
QCOMPARE(video.metaObject()->indexOfProperty("title"), -1);
QCOMPARE(video.metaObject()->indexOfProperty("genre"), -1);
QCOMPARE(video.metaObject()->indexOfProperty("description"), -1);
}
void tst_QDeclarativeVideo::playing()
{
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
video.setSource(QUrl("http://example.com"));
QSignalSpy playingChangedSpy(&video, SIGNAL(playingChanged()));
QSignalSpy startedSpy(&video, SIGNAL(started()));
QSignalSpy stoppedSpy(&video, SIGNAL(stopped()));
int playingChanged = 0;
int started = 0;
int stopped = 0;
QCOMPARE(video.isPlaying(), false);
// setPlaying(true) when stopped.
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(false) when playing.
video.setPlaying(false);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(stoppedSpy.count(), ++stopped);
// play() when stopped.
video.play();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(stoppedSpy.count(), stopped);
// stop() when playing.
video.stop();
QCOMPARE(video.isPlaying(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(stoppedSpy.count(), ++stopped);
// stop() when stopped.
video.stop();
QCOMPARE(video.isPlaying(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(false) when stopped.
video.setPlaying(false);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(stoppedSpy.count(), stopped);
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(true) when playing.
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(stoppedSpy.count(), stopped);
// play() when playing.
video.play();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(stoppedSpy.count(), stopped);
}
void tst_QDeclarativeVideo::paused()
{
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
video.setSource(QUrl("http://example.com"));
QSignalSpy playingChangedSpy(&video, SIGNAL(playingChanged()));
QSignalSpy pausedChangedSpy(&video, SIGNAL(pausedChanged()));
QSignalSpy startedSpy(&video, SIGNAL(started()));
QSignalSpy pausedSpy(&video, SIGNAL(paused()));
QSignalSpy resumedSpy(&video, SIGNAL(resumed()));
QSignalSpy stoppedSpy(&video, SIGNAL(stopped()));
int playingChanged = 0;
int pausedChanged = 0;
int started = 0;
int paused = 0;
int resumed = 0;
int stopped = 0;
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), false);
// setPlaying(true) when stopped.
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(true) when playing.
video.setPaused(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), ++paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(true) when paused.
video.setPaused(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// pause() when paused.
video.pause();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(false) when paused.
video.setPaused(false);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), ++resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(false) when playing.
video.setPaused(false);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// pause() when playing.
video.pause();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), ++paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(false) when paused.
video.setPlaying(false);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), ++stopped);
// setPaused(true) when stopped and paused.
video.setPaused(true);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(false) when stopped and paused.
video.setPaused(false);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(true) when stopped.
video.setPaused(true);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(true) when stopped and paused.
video.setPlaying(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(pausedSpy.count(), ++paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// play() when paused.
video.play();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), ++resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPaused(true) when playing.
video.setPaused(true);
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), ++paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// stop() when paused.
video.stop();
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), ++stopped);
// setPaused(true) when stopped.
video.setPaused(true);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// stop() when stopped and paused.
video.stop();
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// pause() when stopped.
video.pause();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(pausedSpy.count(), ++paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(false) when paused.
video.setPlaying(false);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), ++stopped);
// pause() when stopped and paused.
video.pause();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(pausedSpy.count(), ++paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
// setPlaying(false) when paused.
video.setPlaying(false);
QCOMPARE(video.isPlaying(), false);
QCOMPARE(video.isPaused(), true);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), pausedChanged);
QCOMPARE(startedSpy.count(), started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), ++stopped);
// play() when stopped and paused.
video.play();
QCOMPARE(video.isPlaying(), true);
QCOMPARE(video.isPaused(), false);
QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState);
QCOMPARE(playingChangedSpy.count(), ++playingChanged);
QCOMPARE(pausedChangedSpy.count(), ++pausedChanged);
QCOMPARE(startedSpy.count(), ++started);
QCOMPARE(pausedSpy.count(), paused);
QCOMPARE(resumedSpy.count(), resumed);
QCOMPARE(stoppedSpy.count(), stopped);
}
void tst_QDeclarativeVideo::error()
{
const QString errorString = QLatin1String("Failed to open device.");
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
QSignalSpy errorSpy(&video, SIGNAL(error(QDeclarativeVideo::Error,QString)));
QSignalSpy errorChangedSpy(&video, SIGNAL(errorChanged()));
QCOMPARE(video.error(), QDeclarativeVideo::NoError);
QCOMPARE(video.errorString(), QString());
provider.playerControl()->emitError(QMediaPlayer::ResourceError, errorString);
QCOMPARE(video.error(), QDeclarativeVideo::ResourceError);
QCOMPARE(video.errorString(), errorString);
QCOMPARE(errorSpy.count(), 1);
QCOMPARE(errorChangedSpy.count(), 1);
// Changing the source resets the error properties.
video.setSource(QUrl("http://example.com"));
QCOMPARE(video.error(), QDeclarativeVideo::NoError);
QCOMPARE(video.errorString(), QString());
QCOMPARE(errorSpy.count(), 1);
QCOMPARE(errorChangedSpy.count(), 2);
// But isn't noisy.
video.setSource(QUrl("file:///file/path"));
QCOMPARE(video.error(), QDeclarativeVideo::NoError);
QCOMPARE(video.errorString(), QString());
QCOMPARE(errorSpy.count(), 1);
QCOMPARE(errorChangedSpy.count(), 2);
}
void tst_QDeclarativeVideo::hasAudio()
{
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
QSignalSpy spy(&video, SIGNAL(hasAudioChanged()));
QCOMPARE(video.hasAudio(), false);
provider.playerControl()->setAudioAvailable(true);
QCOMPARE(video.hasAudio(), true);
QCOMPARE(spy.count(), 1);
provider.playerControl()->setAudioAvailable(true);
QCOMPARE(video.hasAudio(), true);
QCOMPARE(spy.count(), 2);
provider.playerControl()->setAudioAvailable(false);
QCOMPARE(video.hasAudio(), false);
QCOMPARE(spy.count(), 3);
}
void tst_QDeclarativeVideo::hasVideo()
{
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
QSignalSpy spy(&video, SIGNAL(hasVideoChanged()));
QCOMPARE(video.hasVideo(), false);
provider.playerControl()->setVideoAvailable(true);
QCOMPARE(video.hasVideo(), true);
QCOMPARE(spy.count(), 1);
provider.playerControl()->setVideoAvailable(true);
QCOMPARE(video.hasVideo(), true);
QCOMPARE(spy.count(), 2);
provider.playerControl()->setVideoAvailable(false);
QCOMPARE(video.hasVideo(), false);
QCOMPARE(spy.count(), 3);
}
void tst_QDeclarativeVideo::fillMode()
{
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
QList<QGraphicsItem *> children = video.childItems();
QCOMPARE(children.count(), 1);
QGraphicsVideoItem *videoItem = qgraphicsitem_cast<QGraphicsVideoItem *>(children.first());
QVERIFY(videoItem != 0);
QCOMPARE(video.fillMode(), QDeclarativeVideo::PreserveAspectFit);
video.setFillMode(QDeclarativeVideo::PreserveAspectCrop);
QCOMPARE(video.fillMode(), QDeclarativeVideo::PreserveAspectCrop);
QCOMPARE(videoItem->aspectRatioMode(), Qt::KeepAspectRatioByExpanding);
video.setFillMode(QDeclarativeVideo::Stretch);
QCOMPARE(video.fillMode(), QDeclarativeVideo::Stretch);
QCOMPARE(videoItem->aspectRatioMode(), Qt::IgnoreAspectRatio);
video.setFillMode(QDeclarativeVideo::PreserveAspectFit);
QCOMPARE(video.fillMode(), QDeclarativeVideo::PreserveAspectFit);
QCOMPARE(videoItem->aspectRatioMode(), Qt::KeepAspectRatio);
}
void tst_QDeclarativeVideo::geometry()
{
QtTestMediaServiceProvider provider;
QDeclarativeVideo video;
video.classBegin();
video.componentComplete();
QList<QGraphicsItem *> children = video.childItems();
QCOMPARE(children.count(), 1);
QGraphicsVideoItem *videoItem = qgraphicsitem_cast<QGraphicsVideoItem *>(children.first());
QVERIFY(videoItem != 0);
{ // Surface setup is deferred until after the first paint.
QImage image(320, 240, QImage::Format_RGB32);
QPainter painter(&image);
videoItem->paint(&painter, 0);
}
QAbstractVideoSurface *surface = provider.rendererControl()->surface();
//video item can use overlay, QAbstractVideoSurface is not used than.
if (surface) {
QVideoSurfaceFormat format(QSize(640, 480), QVideoFrame::Format_RGB32);
QVERIFY(surface->start(format));
QCoreApplication::processEvents();
QCOMPARE(video.implicitWidth(), qreal(640));
QCOMPARE(video.implicitHeight(), qreal(480));
}
video.setWidth(560);
video.setHeight(328);
QCOMPARE(videoItem->size().width(), qreal(560));
QCOMPARE(videoItem->size().height(), qreal(328));
}
QTEST_MAIN(tst_QDeclarativeVideo)
#include "tst_qdeclarativevideo.moc"