Revision control

++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ #include "qmockintegration.h"
++ #include "qmockmediacapturesession.h"
++ #include "qmockcamera.h"
++
++ #include <QtMultimediaTestLib/private/mediabackendutils_p.h>
++ #include <QtTest/qsignalspy.h>
++ #include <QtTest/qtest.h>
++ #include <QtMultimedia/qcamera.h>
++ #include <QtMultimedia/qcameradevice.h>
++ #include <QtMultimedia/qimagecapture.h>
++ #include <QtMultimedia/qmediacapturesession.h>
++ #include <QtMultimedia/qmediadevices.h>
++ #include <QtMultimedia/qvideosink.h>
++ #include <QtMultimedia/private/qplatformcamera_p.h>
++ #include <QtMultimedia/private/qplatformimagecapture_p.h>
++ #include <QtCore/qdebug.h>
++ #include <QtCore/qobject.h>
++
++ 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 (isCI())
++ 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();
++ QTEST_ASSERT(service);
++ QTEST_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"