summaryrefslogtreecommitdiffstats
path: root/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp')
-rw-r--r--tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp845
1 files changed, 845 insertions, 0 deletions
diff --git a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
new file mode 100644
index 000000000..bd1972550
--- /dev/null
+++ b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
@@ -0,0 +1,845 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtTest/QtTest>
+#include <QDebug>
+
+#include <qvideosink.h>
+#include <private/qplatformcamera_p.h>
+#include <private/qplatformimagecapture_p.h>
+#include <qcamera.h>
+#include <qcameradevice.h>
+#include <qimagecapture.h>
+#include <qmediacapturesession.h>
+#include <qobject.h>
+#include <qmediadevices.h>
+
+#include "qmockintegration.h"
+#include "qmockmediacapturesession.h"
+#include "qmockcamera.h"
+
+QT_USE_NAMESPACE
+
+Q_ENABLE_MOCK_MULTIMEDIA_PLUGIN
+
+class tst_QCamera: public QObject
+{
+ Q_OBJECT
+
+public slots:
+ void initTestCase();
+ void init();
+ void cleanup();
+
+private slots:
+ void testSimpleCamera();
+ void testSimpleCameraWhiteBalance();
+ void testSimpleCameraExposure();
+ void testSimpleCameraFocus();
+ void testSimpleCameraCapture();
+
+ void testCameraWhiteBalance();
+ void testCameraExposure();
+ void testCameraFocus();
+ void testCameraCapture();
+ void testCameraCaptureMetadata();
+ void testCameraEncodingProperyChange();
+
+ void testConstructor();
+ void testQCameraIsAvailable();
+ void testErrorSignal();
+ void testError();
+ void testErrorString();
+
+ void testSetCameraFormat();
+
+ // Test cases to for focus handling
+ void testFocusMode();
+ void testZoomChanged();
+ void testMaxZoomChangedSignal();
+
+ // Test cases for QPlatformCamera class.
+ void testCameraControl();
+
+ void testSetVideoOutput();
+ void testSetVideoOutputDestruction();
+
+ void testEnumDebug();
+
+ // Signals test cases for exposure related properties
+ void testSignalExposureCompensationChanged();
+ void testSignalIsoSensitivityChanged();
+ void testSignalShutterSpeedChanged();
+ void testSignalFlashReady();
+};
+
+void tst_QCamera::initTestCase()
+{
+#ifdef Q_OS_MACOS
+ if (qEnvironmentVariable("QTEST_ENVIRONMENT").toLower() == "ci")
+ QSKIP("Flakiness on macOS CI, to be investigated, QTBUG-111812");
+#endif
+}
+
+void tst_QCamera::init()
+{
+}
+
+void tst_QCamera::cleanup()
+{
+}
+
+void tst_QCamera::testSimpleCamera()
+{
+ QMockCamera::Simple simple;
+ QCamera camera;
+
+ QCOMPARE(camera.isActive(), false);
+ camera.start();
+ QCOMPARE(camera.isActive(), true);
+ camera.stop();
+ QCOMPARE(camera.isActive(), false);
+}
+
+void tst_QCamera::testSimpleCameraWhiteBalance()
+{
+ QMockCamera::Simple simple;
+ QCamera camera;
+
+ //only WhiteBalanceAuto is supported
+ QVERIFY(camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceAuto));
+ QVERIFY(!camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceManual));
+ QVERIFY(!camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceCloudy));
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceAuto);
+ camera.setWhiteBalanceMode(QCamera::WhiteBalanceCloudy);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceAuto);
+ QCOMPARE(camera.colorTemperature(), 0);
+ camera.setColorTemperature(5000);
+ QCOMPARE(camera.colorTemperature(), 0);
+}
+
+void tst_QCamera::testSimpleCameraExposure()
+{
+ QMockCamera::Simple simple;
+
+ QCamera camera;
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureAuto));
+ QVERIFY(!camera.isExposureModeSupported(QCamera::ExposureManual));
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureAuto);
+ camera.setExposureMode(QCamera::ExposureManual);//should be ignored
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureAuto);
+
+ QVERIFY(!camera.isFlashModeSupported(QCamera::FlashOn));
+ QCOMPARE(camera.flashMode(), QCamera::FlashOff);
+ QCOMPARE(camera.isFlashReady(), false);
+ camera.setFlashMode(QCamera::FlashOn);
+ QCOMPARE(camera.flashMode(), QCamera::FlashOff);
+
+ QCOMPARE(camera.exposureCompensation(), 0.0);
+ camera.setExposureCompensation(2.0);
+ QCOMPARE(camera.exposureCompensation(), 0.0);
+
+ QCOMPARE(camera.isoSensitivity(), -1);
+ QCOMPARE(camera.minimumIsoSensitivity(), -1);
+ QCOMPARE(camera.maximumIsoSensitivity(), -1);
+ camera.setManualIsoSensitivity(100);
+ QCOMPARE(camera.isoSensitivity(), -1);
+ camera.setAutoIsoSensitivity();
+ QCOMPARE(camera.isoSensitivity(), -1);
+
+ QVERIFY(camera.exposureTime() < 0);
+ QCOMPARE(camera.minimumExposureTime(), -1.);
+ QCOMPARE(camera.maximumExposureTime(), -1.);
+ camera.setAutoExposureTime();
+ QVERIFY(camera.exposureTime() < 0);
+ camera.setManualExposureTime(1/128.0);
+ QVERIFY(camera.exposureTime() < 0);
+}
+
+void tst_QCamera::testSimpleCameraFocus()
+{
+ QMockCamera::Simple simple;
+
+ QCamera camera;
+
+ QVERIFY(camera.isFocusModeSupported(QCamera::FocusModeAuto));
+ QVERIFY(!camera.isFocusModeSupported(QCamera::FocusModeInfinity));
+
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeAuto);
+ camera.setFocusMode(QCamera::FocusModeInfinity);
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeAuto);
+
+ QCOMPARE(camera.maximumZoomFactor(), 1.0);
+ QCOMPARE(camera.minimumZoomFactor(), 1.0);
+ QCOMPARE(camera.zoomFactor(), 1.0);
+
+ camera.zoomTo(100.0, 100.0);
+ QCOMPARE(camera.zoomFactor(), 1.0);
+
+ QCOMPARE(camera.customFocusPoint(), QPointF(-1., -1.));
+ camera.setCustomFocusPoint(QPointF(1.0, 1.0));
+ QCOMPARE(camera.customFocusPoint(), QPointF(-1., -1.));
+}
+
+void tst_QCamera::testSimpleCameraCapture()
+{
+ QMockCamera::Simple simple;
+
+ QMediaCaptureSession session;
+ QCamera camera;
+ QImageCapture imageCapture;
+ session.setCamera(&camera);
+ session.setImageCapture(&imageCapture);
+
+ QVERIFY(!imageCapture.isReadyForCapture());
+ QVERIFY(imageCapture.isAvailable());
+
+ QCOMPARE(imageCapture.error(), QImageCapture::NoError);
+ QVERIFY(imageCapture.errorString().isEmpty());
+
+ QSignalSpy errorSignal(&imageCapture, &QImageCapture::errorOccurred);
+ imageCapture.captureToFile(QStringLiteral("/dev/null"));
+ QCOMPARE(errorSignal.size(), 1);
+ QCOMPARE(imageCapture.error(), QImageCapture::NotReadyError);
+ QVERIFY(!imageCapture.errorString().isEmpty());
+
+ camera.start();
+ imageCapture.captureToFile(QStringLiteral("/dev/null"));
+ QCOMPARE(errorSignal.size(), 1);
+ QCOMPARE(imageCapture.error(), QImageCapture::NoError);
+ QVERIFY(imageCapture.errorString().isEmpty());
+}
+
+void tst_QCamera::testCameraCapture()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QImageCapture imageCapture;
+ session.setCamera(&camera);
+ session.setImageCapture(&imageCapture);
+
+ QVERIFY(!imageCapture.isReadyForCapture());
+
+ QSignalSpy capturedSignal(&imageCapture, &QImageCapture::imageCaptured);
+ QSignalSpy errorSignal(&imageCapture, &QImageCapture::errorOccurred);
+
+ imageCapture.captureToFile(QStringLiteral("/dev/null"));
+ QCOMPARE(capturedSignal.size(), 0);
+ QCOMPARE(errorSignal.size(), 1);
+ QCOMPARE(imageCapture.error(), QImageCapture::NotReadyError);
+
+ errorSignal.clear();
+
+ camera.start();
+ QVERIFY(imageCapture.isReadyForCapture());
+ QCOMPARE(errorSignal.size(), 0);
+
+ imageCapture.captureToFile(QStringLiteral("/dev/null"));
+
+ QTRY_COMPARE(capturedSignal.size(), 1);
+ QCOMPARE(errorSignal.size(), 0);
+ QCOMPARE(imageCapture.error(), QImageCapture::NoError);
+}
+
+void tst_QCamera::testCameraCaptureMetadata()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QImageCapture imageCapture;
+ session.setCamera(&camera);
+ session.setImageCapture(&imageCapture);
+
+ QSignalSpy metadataSignal(&imageCapture, &QImageCapture::imageMetadataAvailable);
+ QSignalSpy savedSignal(&imageCapture, &QImageCapture::imageSaved);
+
+ camera.start();
+ int id = imageCapture.captureToFile(QStringLiteral("/dev/null"));
+
+ QTRY_COMPARE(savedSignal.size(), 1);
+
+ QCOMPARE(metadataSignal.size(), 1);
+
+ QVariantList metadata = metadataSignal[0];
+ QCOMPARE(metadata[0].toInt(), id);
+ QMediaMetaData data = metadata[1].value<QMediaMetaData>();
+ QCOMPARE(data.keys().size(), 2);
+ QCOMPARE(data[QMediaMetaData::Author].toString(), "Author");
+ QCOMPARE(data[QMediaMetaData::Date].toDateTime().date().year(), 2021);
+}
+
+void tst_QCamera::testCameraWhiteBalance()
+{
+ QCamera camera;
+
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceAuto);
+ camera.setWhiteBalanceMode(QCamera::WhiteBalanceFlash);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceAuto);
+ QVERIFY(camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceAuto));
+ QVERIFY(camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceManual));
+ QVERIFY(camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceSunlight));
+ QVERIFY(!camera.isWhiteBalanceModeSupported(QCamera::WhiteBalanceCloudy));
+
+ camera.setWhiteBalanceMode(QCamera::WhiteBalanceSunlight);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceSunlight);
+
+ camera.setWhiteBalanceMode(QCamera::WhiteBalanceManual);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceManual);
+ camera.setColorTemperature(4000);
+ QCOMPARE(camera.colorTemperature(), 4000);
+
+ camera.setColorTemperature(8000);
+ QCOMPARE(camera.colorTemperature(), 8000);
+
+ camera.setWhiteBalanceMode(QCamera::WhiteBalanceAuto);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceAuto);
+ camera.setColorTemperature(4000);
+ QCOMPARE(camera.colorTemperature(), 4000);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceManual);
+
+ camera.setColorTemperature(0);
+ QCOMPARE(camera.colorTemperature(), 0);
+ QCOMPARE(camera.whiteBalanceMode(), QCamera::WhiteBalanceAuto);
+}
+
+void tst_QCamera::testCameraExposure()
+{
+ QCamera camera;
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureAuto));
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureAuto);
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureManual));
+ camera.setExposureMode(QCamera::ExposureManual);
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureManual);
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureNight));
+ camera.setExposureMode(QCamera::ExposureNight);
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureNight);
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureSports ));
+ camera.setExposureMode(QCamera::ExposureSports);
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureSports);
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureSnow ));
+ camera.setExposureMode(QCamera::ExposureSnow);
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureSnow);
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposureBeach ));
+ camera.setExposureMode(QCamera::ExposureBeach);
+ QCOMPARE(camera.exposureMode(), QCamera::ExposureBeach);
+
+ QVERIFY(camera.isExposureModeSupported(QCamera::ExposurePortrait ));
+ camera.setExposureMode(QCamera::ExposurePortrait);
+ QCOMPARE(camera.exposureMode(), QCamera::ExposurePortrait);
+
+
+ camera.setFlashMode(QCamera::FlashAuto);
+ QCOMPARE(camera.flashMode(), QCamera::FlashAuto);
+ QCOMPARE(camera.isFlashReady(), true);
+ camera.setFlashMode(QCamera::FlashOn);
+ QCOMPARE(camera.flashMode(), QCamera::FlashOn);
+
+ QCOMPARE(camera.exposureCompensation(), 0.0);
+ camera.setExposureCompensation(2.0);
+ QCOMPARE(camera.exposureCompensation(), 2.0);
+
+ int minIso = camera.minimumIsoSensitivity();
+ int maxIso = camera.maximumIsoSensitivity();
+ QCOMPARE(camera.isoSensitivity(), 100);
+ QVERIFY(minIso > 0);
+ QVERIFY(maxIso > 0);
+ camera.setManualIsoSensitivity(minIso);
+ QCOMPARE(camera.isoSensitivity(), minIso);
+ camera.setManualIsoSensitivity(maxIso*10);
+ QCOMPARE(camera.isoSensitivity(), maxIso);
+
+ camera.setManualIsoSensitivity(-10);
+ QCOMPARE(camera.isoSensitivity(), minIso);
+ camera.setAutoIsoSensitivity();
+ QCOMPARE(camera.isoSensitivity(), 100);
+
+ qreal minExposureTime = camera.minimumExposureTime();
+ qreal maxExposureTime = camera.maximumExposureTime();
+ QVERIFY(minExposureTime > 0);
+ QVERIFY(maxExposureTime > 0);
+ QVERIFY(camera.exposureTime() >= minExposureTime);
+ QVERIFY(camera.exposureTime() <= maxExposureTime);
+
+ camera.setAutoExposureTime();
+ QVERIFY(camera.exposureTime() >= minExposureTime);
+ QVERIFY(camera.exposureTime() <= maxExposureTime);
+
+ camera.setManualExposureTime(0);
+ QCOMPARE(camera.exposureTime(), minExposureTime);
+
+ camera.setManualExposureTime(10000);
+ QCOMPARE(camera.exposureTime(), maxExposureTime);
+
+ camera.setAutoExposureTime();
+}
+
+void tst_QCamera::testCameraFocus()
+{
+ QCamera camera;
+
+ QVERIFY(camera.isFocusModeSupported(QCamera::FocusModeAuto));
+ QVERIFY(camera.isFocusModeSupported(QCamera::FocusModeAuto));
+ QVERIFY(!camera.isFocusModeSupported(QCamera::FocusModeInfinity));
+
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeAuto);
+ camera.setFocusMode(QCamera::FocusModeManual);
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeManual);
+ camera.setFocusMode(QCamera::FocusModeInfinity);
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeManual);
+ camera.setFocusMode(QCamera::FocusModeAuto);
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeAuto);
+
+ QVERIFY(camera.maximumZoomFactor() == 4.0);
+ QVERIFY(camera.minimumZoomFactor() == 1.0);
+ QCOMPARE(camera.zoomFactor(), 1.0);
+ camera.zoomTo(0.5, 1.0);
+ QCOMPARE(camera.zoomFactor(), 1.0);
+ camera.zoomTo(2.0, 0.5);
+ QCOMPARE(camera.zoomFactor(), 2.0);
+ camera.zoomTo(2.5, 1);
+ QCOMPARE(camera.zoomFactor(), 2.5);
+ camera.zoomTo(2000000.0, 0);
+ QCOMPARE(camera.zoomFactor(), camera.maximumZoomFactor());
+
+ QCOMPARE(camera.customFocusPoint(), QPointF(-1, -1));
+ camera.setCustomFocusPoint(QPointF(1.0, 1.0));
+ QCOMPARE(camera.customFocusPoint(), QPointF(1.0, 1.0));
+}
+
+void tst_QCamera::testCameraEncodingProperyChange()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QImageCapture imageCapture;
+ session.setCamera(&camera);
+ session.setImageCapture(&imageCapture);
+
+ QSignalSpy activeChangedSignal(&camera, &QCamera::activeChanged);
+
+ camera.start();
+ QCOMPARE(camera.isActive(), true);
+ QCOMPARE(activeChangedSignal.size(), 1);
+}
+
+void tst_QCamera::testSetVideoOutput()
+{
+ QMediaCaptureSession session;
+ QVideoSink surface;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QVERIFY(!session.videoOutput());
+
+ session.setVideoOutput(&surface);
+ QVERIFY(session.videoOutput() == &surface);
+ QVERIFY(session.videoSink() == &surface);
+
+ session.setVideoOutput(static_cast<QVideoSink *>(nullptr));
+ QVERIFY(session.videoOutput() == nullptr);
+ QVERIFY(session.videoSink() == nullptr);
+
+ session.setVideoOutput(&surface);
+ QVERIFY(session.videoOutput() == &surface);
+ QVERIFY(session.videoSink() == &surface);
+
+ session.setVideoSink(&surface);
+ QVERIFY(session.videoOutput() == nullptr);
+ QVERIFY(session.videoSink() == &surface);
+
+ session.setVideoOutput(&surface);
+ QVERIFY(session.videoOutput() == &surface);
+ QVERIFY(session.videoSink() == &surface);
+
+ session.setVideoSink(nullptr);
+ QVERIFY(session.videoOutput() == nullptr);
+ QVERIFY(session.videoSink() == nullptr);
+}
+
+
+
+void tst_QCamera::testSetVideoOutputDestruction()
+{
+ {
+ QVideoSink surface;
+ {
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QVERIFY(session.videoOutput() == nullptr);
+ session.setVideoOutput(&surface);
+ }
+ }
+
+ {
+ QMediaCaptureSession session;
+ {
+ QVideoSink surface;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QVERIFY(session.videoOutput() == nullptr);
+ session.setVideoOutput(&surface);
+ }
+ }
+
+ {
+ QCamera camera;
+ {
+ QMediaCaptureSession session;
+ QVideoSink surface;
+ session.setCamera(&camera);
+
+ QVERIFY(session.videoOutput() == nullptr);
+ session.setVideoOutput(&surface);
+ }
+ }
+ {
+ QMediaCaptureSession session;
+ {
+ QVideoSink surface;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QVERIFY(session.videoOutput() == nullptr);
+ session.setVideoOutput(&surface);
+ }
+ }
+}
+
+void tst_QCamera::testEnumDebug()
+{
+ QTest::ignoreMessage(QtDebugMsg, "QCamera::CameraError");
+ qDebug() << QCamera::CameraError;
+// QTest::ignoreMessage(QtDebugMsg, "QCameraDevice::FrontFace");
+// qDebug() << QCameraDevice::FrontFace;
+}
+
+void tst_QCamera::testCameraControl()
+{
+ QCamera camera;
+ QMockCamera *m_cameraControl = new QMockCamera(&camera);
+ QVERIFY(m_cameraControl != nullptr);
+}
+
+void tst_QCamera::testConstructor()
+{
+ auto cameras = QMediaDevices::videoInputs();
+ QCameraDevice defaultCamera = QMediaDevices::defaultVideoInput();
+ QCameraDevice frontCamera, backCamera;
+ for (const auto &c : cameras) {
+ if (frontCamera.isNull() && c.position() == QCameraDevice::FrontFace)
+ frontCamera = c;
+ if (backCamera.isNull() && c.position() == QCameraDevice::BackFace)
+ backCamera = c;
+ }
+ QVERIFY(!defaultCamera.isNull());
+ QVERIFY(!frontCamera.isNull());
+ QVERIFY(!backCamera.isNull());
+
+ {
+ QCamera camera;
+ QCOMPARE(camera.isAvailable(), true);
+ QCOMPARE(camera.error(), QCamera::NoError);
+ QCOMPARE(camera.cameraDevice(), defaultCamera);
+ }
+
+ {
+ QCamera camera(QCameraDevice::FrontFace);
+ QCOMPARE(camera.isAvailable(), true);
+ QCOMPARE(camera.error(), QCamera::NoError);
+ QCOMPARE(camera.cameraDevice(), frontCamera);
+ }
+
+ {
+ QCamera camera(QMediaDevices::defaultVideoInput());
+ QCOMPARE(camera.isAvailable(), true);
+ QCOMPARE(camera.error(), QCamera::NoError);
+ QCOMPARE(camera.cameraDevice(), defaultCamera);
+ }
+
+ {
+ QCameraDevice cameraDevice = QMediaDevices::videoInputs().at(0);
+ QCamera camera(cameraDevice);
+ QCOMPARE(camera.isAvailable(), true);
+ QCOMPARE(camera.error(), QCamera::NoError);
+ QCOMPARE(camera.cameraDevice(), cameraDevice);
+ }
+
+ {
+ QCamera camera(QCameraDevice::BackFace);
+ QCOMPARE(camera.isAvailable(), true);
+ QCOMPARE(camera.error(), QCamera::NoError);
+ QCOMPARE(camera.cameraDevice(), backCamera);
+ }
+
+ {
+ // Should load the default camera when UnspecifiedPosition is requested
+ QCamera camera(QCameraDevice::UnspecifiedPosition);
+ QCOMPARE(camera.isAvailable(), true);
+ QCOMPARE(camera.error(), QCamera::NoError);
+ QCOMPARE(camera.cameraDevice(), defaultCamera);
+ }
+}
+
+/* Test case for isAvailable */
+void tst_QCamera::testQCameraIsAvailable()
+{
+ QCamera camera;
+ QVERIFY(camera.isAvailable());
+}
+
+/* Test case for verifying if error signal generated correctly */
+void tst_QCamera::testErrorSignal()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+ auto *service = QMockIntegration::instance()->lastCaptureService();
+ Q_ASSERT(service);
+ Q_ASSERT(service->mockCameraControl);
+
+ QSignalSpy spyError(&camera, &QCamera::errorOccurred);
+
+ /* Set the QPlatformCamera error and verify if the signal is emitted correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError, QStringLiteral("Camera Error"));
+
+ QVERIFY(spyError.size() == 1);
+ QCamera::Error err = qvariant_cast<QCamera::Error >(spyError.at(0).at(0));
+ QVERIFY(err == QCamera::CameraError);
+
+ spyError.clear();
+
+ /* Set the QPlatformCamera error and verify if the signal is emitted correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError,
+ QStringLiteral("InvalidRequestError Error"));
+ QVERIFY(spyError.size() == 1);
+ err = qvariant_cast<QCamera::Error >(spyError.at(0).at(0));
+ QVERIFY(err == QCamera::CameraError);
+
+ spyError.clear();
+
+ /* Set the QPlatformCamera error and verify if the signal is emitted correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError,
+ QStringLiteral("NotSupportedFeatureError Error"));
+ QVERIFY(spyError.size() == 1);
+ err = qvariant_cast<QCamera::Error >(spyError.at(0).at(0));
+ QVERIFY(err == QCamera::CameraError);
+
+}
+
+/* Test case for verifying the QCamera error */
+void tst_QCamera::testError()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+ auto *service = QMockIntegration::instance()->lastCaptureService();
+
+ /* Set the QPlatformCamera error and verify if it is set correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError, QStringLiteral("Camera Error"));
+ QVERIFY(camera.error() == QCamera::CameraError);
+
+ /* Set the QPlatformCamera error and verify if it is set correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError,
+ QStringLiteral("InvalidRequestError Error"));
+ QVERIFY(camera.error() == QCamera::CameraError);
+
+ /* Set the QPlatformCamera error and verify if it is set correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError,
+ QStringLiteral("CameraError Error"));
+ QVERIFY(camera.error() == QCamera::CameraError);
+
+}
+
+/* Test the error strings for QCamera class */
+void tst_QCamera::testErrorString()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+ auto *service = QMockIntegration::instance()->lastCaptureService();
+
+ /* Set the QPlatformCamera error and verify if it is set correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError, QStringLiteral("Camera Error"));
+ QVERIFY(camera.errorString() == QStringLiteral("Camera Error"));
+
+ /* Set the QPlatformCamera error and verify if it is set correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError,
+ QStringLiteral("InvalidRequestError Error"));
+ QVERIFY(camera.errorString() == QStringLiteral("InvalidRequestError Error"));
+
+ /* Set the QPlatformCamera error and verify if it is set correctly in QCamera */
+ service->mockCameraControl->updateError(QCamera::CameraError,
+ QStringLiteral("CameraError Error"));
+ QVERIFY(camera.errorString() == QStringLiteral("CameraError Error"));
+}
+
+void tst_QCamera::testSetCameraFormat()
+{
+ QCamera camera;
+ QCameraDevice device = camera.cameraDevice();
+ auto videoFormats = device.videoFormats();
+ QVERIFY(videoFormats.size());
+ QCameraFormat cameraFormat = videoFormats.first();
+ QSignalSpy spy(&camera, &QCamera::cameraFormatChanged);
+ QVERIFY(spy.size() == 0);
+ camera.setCameraFormat(cameraFormat);
+ QCOMPARE(spy.size(), 1);
+ QCOMPARE(camera.cameraFormat(), cameraFormat);
+ QCOMPARE(camera.cameraFormat().pixelFormat(), QVideoFrameFormat::Format_ARGB8888);
+ QCOMPARE(camera.cameraFormat().resolution(), QSize(640, 480));
+ QCOMPARE(camera.cameraFormat().minFrameRate(), 0);
+ QCOMPARE(camera.cameraFormat().maxFrameRate(), 30);
+ QCOMPARE(spy.size(), 1);
+
+ spy.clear();
+ camera.setCameraFormat({});
+ QCOMPARE(spy.size(), 1);
+ QCOMPARE(camera.cameraFormat(), QCameraFormat());
+
+ spy.clear();
+ camera.setCameraDevice(QMediaDevices::videoInputs().at(1));
+ QCOMPARE(spy.size(), 1);
+ QCOMPARE(camera.cameraFormat(), QCameraFormat());
+ camera.setCameraFormat(camera.cameraDevice().videoFormats().first());
+ QCOMPARE(camera.cameraFormat().pixelFormat(), QVideoFrameFormat::Format_XRGB8888);
+ QCOMPARE(camera.cameraFormat().resolution(), QSize(1280, 720));
+ QCOMPARE(camera.cameraFormat().minFrameRate(), 0);
+ QCOMPARE(camera.cameraFormat().maxFrameRate(), 30);
+ QCOMPARE(spy.size(), 2);
+}
+
+//Added this code to cover QCamera::FocusModeHyperfocal and QCamera::FocusModeAutoNear
+//As the FocusModeHyperfocal and FocusModeAutoNear are not supported we can not set the focus mode to these Focus Modes
+void tst_QCamera::testFocusMode()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QVERIFY(!camera.isFocusModeSupported(QCamera::FocusModeInfinity));
+ QVERIFY(camera.isFocusModeSupported(QCamera::FocusModeAutoNear));
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeAuto);
+ camera.setFocusMode(QCamera::FocusModeInfinity);
+ QVERIFY(camera.focusMode() != QCamera::FocusModeInfinity);
+ QCOMPARE(camera.focusMode(), QCamera::FocusModeAuto);
+ camera.setFocusMode(QCamera::FocusModeAutoNear);
+ QVERIFY(camera.focusMode() == QCamera::FocusModeAutoNear);
+}
+
+void tst_QCamera::testZoomChanged()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QSignalSpy spy(&camera, &QCamera::zoomFactorChanged);
+ QVERIFY(spy.size() == 0);
+ camera.setZoomFactor(2.0);
+ QVERIFY(spy.size() == 1);
+ camera.zoomTo(3.0, 1);
+ QVERIFY(spy.size() == 2);
+ camera.zoomTo(1.0, 0);
+ QVERIFY(spy.size() == 3);
+}
+
+void tst_QCamera::testMaxZoomChangedSignal()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+ QMockCamera *mock = QMockIntegration::instance()->lastCamera();
+
+ // ### change max zoom factor on backend, e.g. by changing camera
+ QSignalSpy spy(&camera, &QCamera::maximumZoomFactorChanged);
+ mock->maximumZoomFactorChanged(55);
+ QVERIFY(spy.size() == 1);
+ QCOMPARE(camera.maximumZoomFactor(), 55);
+}
+
+void tst_QCamera::testSignalExposureCompensationChanged()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QSignalSpy spyExposureCompensationChanged(&camera, &QCamera::exposureCompensationChanged);
+
+ QVERIFY(spyExposureCompensationChanged.size() == 0);
+
+ QVERIFY(camera.exposureCompensation() != 800);
+ camera.setExposureCompensation(2.0);
+
+ QTest::qWait(100);
+
+ QVERIFY(camera.exposureCompensation() == 2.0);
+
+ QCOMPARE(spyExposureCompensationChanged.size(),1);
+
+ // Setting the same should not result in a signal
+ camera.setExposureCompensation(2.0);
+ QTest::qWait(100);
+
+ QVERIFY(camera.exposureCompensation() == 2.0);
+ QCOMPARE(spyExposureCompensationChanged.size(),1);
+}
+
+void tst_QCamera::testSignalIsoSensitivityChanged()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QSignalSpy spyisoSensitivityChanged(&camera, &QCamera::isoSensitivityChanged);
+
+ QVERIFY(spyisoSensitivityChanged.size() ==0);
+
+ camera.setManualIsoSensitivity(800); //set the manualiso sentivity to 800
+ QTest::qWait(100);
+ QVERIFY(spyisoSensitivityChanged.size() ==1);
+
+}
+void tst_QCamera::testSignalShutterSpeedChanged()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QSignalSpy spySignalExposureTimeChanged(&camera, &QCamera::exposureTimeChanged);
+
+ QVERIFY(spySignalExposureTimeChanged.size() == 0);
+
+ camera.setManualExposureTime(2.0);//set the ManualShutterSpeed to 2.0
+ QTest::qWait(100);
+
+ QVERIFY(spySignalExposureTimeChanged.size() ==1);
+}
+
+void tst_QCamera::testSignalFlashReady()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ session.setCamera(&camera);
+
+ QSignalSpy spyflashReady(&camera, &QCamera::flashReady);
+
+ QVERIFY(spyflashReady.size() == 0);
+
+ QVERIFY(camera.flashMode() == QCamera::FlashAuto);
+
+ camera.setFlashMode(QCamera::FlashOff);//set theFlashMode to QCamera::FlashOff
+
+ QVERIFY(camera.flashMode() == QCamera::FlashOff);
+
+ QCOMPARE(spyflashReady.size(), 1);
+}
+
+QTEST_MAIN(tst_QCamera)
+
+#include "tst_qcamera.moc"