File indexing completed on 2024-05-12 05:40:52

0001 /***************************************************************************
0002  *   Copyright (C) 2011 by Renaud Guezennec                                *
0003  *   http://renaudguezennec.homelinux.org/accueil,3.html                   *
0004  *                                                                         *
0005  *   Rolisteam is free software; you can redistribute it and/or modify     *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 #include "controller/view_controller/imageselectorcontroller.h"
0021 #include "test_root_path.h"
0022 #include "utils/iohelper.h"
0023 #include "worker/iohelper.h"
0024 #include <QClipboard>>
0025 #include <QGuiApplication>
0026 #include <QtTest/QtTest>
0027 #include <helper.h>
0028 #include <memory>
0029 
0030 class PictureTest : public QObject
0031 {
0032     Q_OBJECT
0033 
0034 public:
0035     PictureTest();
0036 
0037 private slots:
0038     void init();
0039     void create();
0040     void finalImage();
0041     void readImageFromFile();
0042     void readImageFromUrl();
0043     void respectShape();
0044     void respectShape_data();
0045     void setImageFromClipboard();
0046 
0047     void readAllImageSize();
0048     void readAllImageSize_data();
0049 
0050 private:
0051     std::unique_ptr<ImageSelectorController> m_ctrl;
0052 };
0053 
0054 PictureTest::PictureTest() {}
0055 
0056 void PictureTest::init()
0057 {
0058     m_ctrl.reset(new ImageSelectorController());
0059 }
0060 void PictureTest::create()
0061 {
0062     QVERIFY(m_ctrl->address().isEmpty());
0063     QVERIFY(m_ctrl->title().isEmpty());
0064     QCOMPARE(m_ctrl->currentDir(), QDir::homePath());
0065     QVERIFY(!m_ctrl->dataInShape());
0066 
0067     QCOMPARE(m_ctrl->shape(), ImageSelectorController::AnyShape);
0068     QCOMPARE(m_ctrl->sources(), ImageSelectorController::All);
0069     QVERIFY(!m_ctrl->askPath());
0070     QVERIFY(m_ctrl->canDrop());
0071     QVERIFY(m_ctrl->canDownload());
0072     QVERIFY(m_ctrl->canPaste());
0073     auto movie= m_ctrl->movie();
0074     QVERIFY(!movie->isValid());
0075 
0076     QCOMPARE(m_ctrl->validData(), false);
0077 
0078     auto clip= qGuiApp->clipboard();
0079     clip->clear();
0080     QVERIFY(!m_ctrl->hasContentToPaste());
0081     clip->setPixmap(IOHelper::dataToPixmap(utils::IOHelper::loadFile(":/img/girafe3.jpg")));
0082     QVERIFY(m_ctrl->hasContentToPaste());
0083 
0084     QSignalSpy spy(m_ctrl.get(), &ImageSelectorController::addressChanged);
0085     m_ctrl->setAddress(tests::root_path);
0086 
0087     spy.wait(10);
0088     QCOMPARE(spy.count(), 1);
0089     m_ctrl->setAddress(tests::root_path);
0090     spy.wait(10);
0091     QCOMPARE(spy.count(), 1);
0092 
0093     QSignalSpy spyRect(m_ctrl.get(), &ImageSelectorController::rectChanged);
0094     QRect r{0, 0, 200, 300};
0095     m_ctrl->setRect(r);
0096     spyRect.wait(10);
0097     QCOMPARE(spyRect.count(), 1);
0098     QCOMPARE(m_ctrl->rect(), r);
0099     m_ctrl->setRect(r);
0100     spyRect.wait(10);
0101     QCOMPARE(spyRect.count(), 1);
0102 
0103     QSignalSpy spytitle(m_ctrl.get(), &ImageSelectorController::titleChanged);
0104     QString title{"foobar"};
0105     m_ctrl->setTitle(title);
0106     spytitle.wait(10);
0107     QCOMPARE(spytitle.count(), 1);
0108     QCOMPARE(m_ctrl->title(), title);
0109     m_ctrl->setTitle(title);
0110     spytitle.wait(10);
0111     QCOMPARE(spytitle.count(), 1);
0112 
0113     m_ctrl.reset(new ImageSelectorController(true, ImageSelectorController::Clipboard, ImageSelectorController::Square,
0114                                              QString()));
0115     QCOMPARE(m_ctrl->shape(), ImageSelectorController::Square);
0116     QCOMPARE(m_ctrl->sources(), ImageSelectorController::Clipboard);
0117     QVERIFY(m_ctrl->askPath());
0118     QVERIFY(!m_ctrl->canDrop());
0119     QVERIFY(!m_ctrl->canDownload());
0120     QVERIFY(m_ctrl->canPaste());
0121     QSignalSpy waitPixmapChanged(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0122 
0123     m_ctrl->setImageData(utils::IOHelper::loadFile(":/img/girafe3.jpg"));
0124     QVERIFY(!m_ctrl->dataInShape());
0125 
0126     waitPixmapChanged.wait();
0127     QCOMPARE(waitPixmapChanged.count(), 1);
0128 
0129     m_ctrl->setVisualSize({300, 300});
0130 
0131     waitPixmapChanged.wait();
0132     QCOMPARE(waitPixmapChanged.count(), 2);
0133     m_ctrl->setRect(r);
0134     auto final= IOHelper::dataToPixmap(m_ctrl->finalImageData());
0135     QVERIFY(!final.isNull());
0136 
0137     m_ctrl.reset(new ImageSelectorController(true, ImageSelectorController::DragAndDrop,
0138                                              ImageSelectorController::Square, QString()));
0139     QCOMPARE(m_ctrl->shape(), ImageSelectorController::Square);
0140     QCOMPARE(m_ctrl->sources(), ImageSelectorController::DragAndDrop);
0141     QVERIFY(m_ctrl->askPath());
0142     QVERIFY(m_ctrl->canDrop());
0143     QVERIFY(!m_ctrl->canDownload());
0144     QVERIFY(!m_ctrl->canPaste());
0145 
0146     m_ctrl.reset(
0147         new ImageSelectorController(true, ImageSelectorController::Web, ImageSelectorController::Square, QString()));
0148     QCOMPARE(m_ctrl->shape(), ImageSelectorController::Square);
0149     QCOMPARE(m_ctrl->sources(), ImageSelectorController::Web);
0150     QVERIFY(m_ctrl->askPath());
0151     QVERIFY(!m_ctrl->canDrop());
0152     QVERIFY(m_ctrl->canDownload());
0153     QVERIFY(!m_ctrl->canPaste());
0154 
0155     m_ctrl.reset(new ImageSelectorController(true, ImageSelectorController::DiskFile, ImageSelectorController::Square,
0156                                              QString()));
0157     QCOMPARE(m_ctrl->shape(), ImageSelectorController::Square);
0158     QCOMPARE(m_ctrl->sources(), ImageSelectorController::DiskFile);
0159     QVERIFY(m_ctrl->askPath());
0160     QVERIFY(!m_ctrl->canDrop());
0161     QVERIFY(!m_ctrl->canDownload());
0162     QVERIFY(!m_ctrl->canPaste());
0163 }
0164 
0165 void PictureTest::respectShape()
0166 {
0167     QFETCH(int, shape);
0168     QFETCH(QRect, geometry);
0169     QFETCH(QString, path);
0170     QFETCH(bool, expected);
0171     QFETCH(int, count);
0172 
0173     QString dir("path/to/root");
0174     m_ctrl.reset(new ImageSelectorController(true, ImageSelectorController::All,
0175                                              static_cast<ImageSelectorController::Shape>(shape), dir));
0176     m_ctrl->setVisualSize(QSize{547,333});
0177     m_ctrl->setRect(geometry);
0178     m_ctrl->setImageData(utils::IOHelper::loadFile(path));
0179 
0180     QSignalSpy waitPixmapChanged(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0181 
0182     waitPixmapChanged.wait();
0183     QCOMPARE(waitPixmapChanged.count(), count);
0184     QCOMPARE(m_ctrl->rectInShape(), expected);
0185 }
0186 
0187 void PictureTest::respectShape_data()
0188 {
0189     QTest::addColumn<int>("shape");
0190     QTest::addColumn<QRect>("geometry");
0191     QTest::addColumn<QString>("path");
0192     QTest::addColumn<bool>("expected");
0193     QTest::addColumn<int>("count");
0194 
0195     QTest::addRow("any with any with img")
0196         << static_cast<int>(ImageSelectorController::AnyShape) << QRect(20, 20, 300, 23) << ":/img/girafe3.jpg" << true << 1;
0197     QTest::addRow("any with any with no img")
0198         << static_cast<int>(ImageSelectorController::AnyShape) << QRect(20, 20, 300, 23) << QString{} << false << 0;
0199 
0200     QTest::addRow("any with square with img") << static_cast<int>(ImageSelectorController::AnyShape)
0201                                               << QRect(20, 20, 300, 300) << ":/img/girafe3.jpg" << true << 1;
0202     QTest::addRow("any with square with no img")
0203         << static_cast<int>(ImageSelectorController::AnyShape) << QRect(20, 20, 300, 300) << QString{} << false << 0;
0204 
0205     QTest::addRow("square with square with img")
0206         << static_cast<int>(ImageSelectorController::Square) << QRect(20, 20, 300, 300) << ":/img/girafe3.jpg" << true  << 1;
0207     QTest::addRow("square with square with no img")
0208         << static_cast<int>(ImageSelectorController::Square) << QRect(20, 20, 300, 300) << QString{} << false  << 0;
0209 
0210     QTest::addRow("square with any with img")
0211         << static_cast<int>(ImageSelectorController::Square) << QRect(20, 20, 200, 300) << ":/img/girafe3.jpg" << false  << 1;
0212     QTest::addRow("square with any with no img")
0213         << static_cast<int>(ImageSelectorController::Square) << QRect(20, 20, 200, 300) << QString{} << false  << 0;
0214 }
0215 
0216 void PictureTest::finalImage() {}
0217 
0218 void PictureTest::setImageFromClipboard()
0219 {
0220     auto server= Helper::initWebServer();
0221     QSignalSpy spy(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0222 
0223     auto clip= qGuiApp->clipboard();
0224     clip->clear();
0225     QVERIFY(m_ctrl->imageData().isEmpty());
0226     m_ctrl->imageFromClipboard();
0227     spy.wait();
0228     QCOMPARE(spy.count(), 0);
0229     QVERIFY(m_ctrl->imageData().isEmpty());
0230 
0231     clip->setPixmap(IOHelper::dataToPixmap(utils::IOHelper::loadFile(":/img/girafe3.jpg")));
0232 
0233     m_ctrl->imageFromClipboard();
0234     spy.wait();
0235     QCOMPARE(spy.count(), 1);
0236     QVERIFY(!m_ctrl->imageData().isEmpty());
0237 
0238     m_ctrl.reset(new ImageSelectorController());
0239     QSignalSpy spy2(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0240     clip->clear();
0241 
0242     QVERIFY(m_ctrl->imageData().isEmpty());
0243     m_ctrl->imageFromClipboard();
0244     spy2.wait();
0245     QCOMPARE(spy2.count(), 0);
0246     QVERIFY(m_ctrl->imageData().isEmpty());
0247 
0248     clip->setImage(utils::IOHelper::dataToImage(utils::IOHelper::loadFile(":/img/girafe3.jpg")));
0249 
0250     m_ctrl->imageFromClipboard();
0251     spy2.wait();
0252     QCOMPARE(spy2.count(), 1);
0253     QVERIFY(!m_ctrl->imageData().isEmpty());
0254 
0255     clip->clear();
0256     m_ctrl.reset(new ImageSelectorController());
0257     QVERIFY(m_ctrl->imageData().isEmpty());
0258 
0259     QMimeData* mimedata= new QMimeData();
0260     mimedata->setUrls({QUrl::fromUserInput("http://127.0.0.1:9090/image/Seppun_tashime.jpg")});
0261 
0262     clip->setMimeData(mimedata);
0263     m_ctrl->imageFromClipboard();
0264 
0265     spy2.wait();
0266     QCOMPARE(spy2.count(), 1);
0267     QVERIFY(!m_ctrl->imageData().isEmpty());
0268     // clip->clear();
0269     // clip->setMimeData(nullptr);
0270 
0271     delete server;
0272 }
0273 
0274 void PictureTest::readImageFromFile()
0275 {
0276     QFile file(":/img/girafe3.jpg");
0277     QByteArray dataArray;
0278     if(file.open(QIODevice::ReadOnly))
0279     {
0280         dataArray= file.readAll();
0281     }
0282     QTemporaryFile tfile;
0283     QString path;
0284     if(tfile.open())
0285     {
0286         tfile.write(dataArray);
0287         path= tfile.fileName();
0288     }
0289 
0290     QSignalSpy spy(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0291 
0292     m_ctrl->downloadImageFrom(QUrl::fromUserInput(path));
0293 
0294     spy.wait();
0295 
0296     QCOMPARE(spy.count(), 1);
0297     auto data= m_ctrl->finalImageData();
0298 
0299     auto pix= IOHelper::dataToPixmap(data);
0300 
0301     QVERIFY(!pix.isNull());
0302 }
0303 
0304 void PictureTest::readImageFromUrl()
0305 {
0306     auto server= Helper::initWebServer();
0307     QSignalSpy spy(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0308 
0309     m_ctrl->downloadImageFrom(QUrl::fromUserInput("http://127.0.0.1:9090/image/Seppun_tashime.jpg"));
0310 
0311     spy.wait();
0312 
0313     QCOMPARE(spy.count(), 1);
0314     auto data= m_ctrl->finalImageData();
0315 
0316     auto pix= IOHelper::dataToPixmap(data);
0317 
0318     QVERIFY(!pix.isNull());
0319 
0320     delete server;
0321 }
0322 
0323 void PictureTest::readAllImageSize()
0324 {
0325     QFETCH(QSize, imageSize);
0326     QFETCH(QSize, visualsize);
0327     QFETCH(QRect, selectedRect);
0328     QFETCH(bool, expected);
0329 
0330     QSignalSpy spy(m_ctrl.get(), &ImageSelectorController::pixmapChanged);
0331 
0332     auto img = utils::IOHelper::dataToImage(utils::IOHelper::loadFile(":/img/girafe3.jpg"));
0333 
0334     auto imgW = img.copy(0,0, imageSize.width(), imageSize.height());
0335 
0336 
0337     m_ctrl->setVisualSize(visualsize);
0338     m_ctrl->setRect(selectedRect);
0339 
0340     m_ctrl->setImageData(IOHelper::imageToData(imgW));
0341 
0342     spy.wait();
0343 
0344     QCOMPARE(spy.count(), 1);
0345 
0346     QCOMPARE(m_ctrl->rectInShape(), expected);
0347 }
0348 
0349 void PictureTest::readAllImageSize_data()
0350 {
0351     QTest::addColumn<QSize>("imageSize");
0352     QTest::addColumn<QSize>("visualsize");
0353     QTest::addColumn<QRect>("selectedRect");
0354     QTest::addColumn<bool>("expected");
0355 
0356     QTest::addRow("ImageBigSelectionIn") << QSize(3264,2448) << QSize(547,333) << QRect{100,100,50,50} << true;
0357     QTest::addRow("ImageBigSelectionOut") << QSize(3264,2448) << QSize(547,333) << QRect{-100,-100,50,50} << false;
0358 
0359     //QTest::addRow("ImageLargeSelectionDefault") << QSize(600,333) << QSize(547,333) << QRect{} << true;
0360     QTest::addRow("ImageLargeSelectionIn") << QSize(600,333) << QSize(547,333) << QRect{100,100,50,50} << true;
0361     QTest::addRow("ImageLargeSelectionOut") << QSize(600,333) << QSize(547,333) << QRect{-100,-100,50,50} << false;
0362 
0363     //QTest::addRow("ImageHighSelectionDefault") << QSize(547,400) << QSize(547,333) << QRect{} << true;
0364     QTest::addRow("ImageHighSelectionIn") << QSize(547,400) << QSize(547,333) << QRect{100,100,50,50} << true;
0365     QTest::addRow("ImageHighSelectionOut") << QSize(547,400) << QSize(547,333) << QRect{-100,-100,50,50} << false;
0366 
0367 
0368     //QTest::addRow("ImageSmallSelectionDefault") << QSize(123,111) << QSize(547,333) << QRect{} << true;
0369     QTest::addRow("ImageSmallSelectionIn") << QSize(123,111) << QSize(547,333) << QRect{100,100,50,50} << true;
0370     QTest::addRow("ImageSmallSelectionOut") << QSize(123,111) << QSize(547,333) << QRect{-100,-100,50,50} << false;
0371 
0372 }
0373 QTEST_MAIN(PictureTest);
0374 
0375 #include "tst_picturetest.moc"