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

0001 /***************************************************************************
0002  *   Copyright (C) 2018 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 <QtTest/QtTest>
0021 
0022 #include "controller/item_controllers/imageitemcontroller.h"
0023 #include "controller/view_controller/vectorialmapcontroller.h"
0024 #include "data/campaignmanager.h"
0025 #include "data/cleveruri.h"
0026 #include <QMouseEvent>
0027 #include <controller/contentcontroller.h>
0028 #include <controller/playercontroller.h>
0029 #include <data/character.h>
0030 #include <helper.h>
0031 #include <map>
0032 #include <model/contentmodel.h>
0033 
0034 #include "media/mediatype.h"
0035 
0036 class ContentControllerTest : public QObject
0037 {
0038     Q_OBJECT
0039 
0040 public:
0041     ContentControllerTest();
0042 
0043 private slots:
0044     void init();
0045     void serializeTest();
0046     void serializeTest_data();
0047 
0048     void completeSerializationTest();
0049     void completeSerializationTest_data();
0050 
0051     void saveLoadImage();
0052 
0053 private:
0054     std::unique_ptr<ContentController> m_ctrl;
0055     std::unique_ptr<PlayerController> m_playerCtrl;
0056     QUndoStack m_stack;
0057 };
0058 
0059 Q_DECLARE_METATYPE(std::vector<Core::ContentType>)
0060 
0061 ContentControllerTest::ContentControllerTest() {}
0062 
0063 void ContentControllerTest::init()
0064 {
0065     m_playerCtrl.reset(new PlayerController(nullptr));
0066     m_ctrl.reset(new ContentController(nullptr, m_playerCtrl->model(), m_playerCtrl->characterModel(), nullptr));
0067     connect(m_ctrl.get(), &ContentController::performCommand, this, [this](QUndoCommand* cmd) { m_stack.push(cmd); });
0068 
0069     m_ctrl->setLocalId("localid");
0070 }
0071 
0072 void ContentControllerTest::saveLoadImage()
0073 {
0074     m_ctrl.reset(new ContentController(new campaign::CampaignManager(nullptr), m_playerCtrl->model(),
0075                                        m_playerCtrl->characterModel(), nullptr));
0076     m_ctrl->setLocalId("localid");
0077     /*connect(m_ctrl.get(), &ContentController::performCommand, this, [this](QUndoCommand* cmd) { m_stack.push(cmd); });
0078     {
0079         auto imgParams
0080             = std::map<QString, QVariant>({{Core::keys::KEY_UUID, "test_unit_vmap"},
0081                                            {Core::keys::KEY_PATH, ":/img/girafe3.jpg"},
0082                                            {Core::keys::KEY_RECT, QRectF(0, 0, 326, 244)},
0083                                            {Core::keys::KEY_TYPE, QVariant::fromValue(Core::ContentType::VECTORIALMAP)},
0084                                            {Core::keys::KEY_POSITION, QPointF(500, 200)},
0085                                            {Core::keys::KEY_TOOL, Core::SelectableTool::IMAGE}});
0086         auto mapParams= std::map<QString, QVariant>({{"name", QString("Unit Test Map")}});
0087 
0088         m_ctrl->newMedia(nullptr, mapParams);
0089 
0090         auto ctrls= m_ctrl->contentModel()->controllers();
0091 
0092         QCOMPARE(ctrls.size(), 1);
0093 
0094         auto ctrl= ctrls.front();
0095 
0096         auto mapCtrl= dynamic_cast<VectorialMapController*>(ctrl);
0097 
0098         QVERIFY(nullptr != mapCtrl);
0099         QSignalSpy spy(mapCtrl, &VectorialMapController::visualItemControllerCreated);
0100         mapCtrl->addItemController(imgParams);
0101 
0102         QCOMPARE(spy.count(), 1);
0103         auto itemCtrl= mapCtrl->itemController("test_unit_vmap");
0104         QVERIFY(nullptr != itemCtrl);
0105 
0106         auto rectCtrl= dynamic_cast<vmap::ImageController*>(itemCtrl);
0107         QCOMPARE(rectCtrl->rect(), QRectF(0, 0, 326, 244));
0108         QCOMPARE(rectCtrl->pos(), QPointF(500, 200));
0109     }
0110     auto path= QStringLiteral("%1/%2").arg(QDir::tempPath()).arg("scenario.sce");
0111 
0112     m_ctrl.reset(new ContentController(m_playerCtrl->model(), m_playerCtrl->characterModel(), nullptr));
0113     m_ctrl->setLocalId("localid");
0114     connect(m_ctrl.get(), &ContentController::performCommand, this, [this](QUndoCommand* cmd) { m_stack.push(cmd); });
0115     m_ctrl->setSessionPath(path);
0116     m_ctrl->loadSession();
0117 
0118     {
0119         auto ctrls= m_ctrl->contentModel()->controllers();
0120         QCOMPARE(ctrls.size(), 1);
0121 
0122         auto ctrl= ctrls.front();
0123         auto mapCtrl= dynamic_cast<VectorialMapController*>(ctrl);
0124         QVERIFY(nullptr != mapCtrl);
0125         auto itemCtrl= mapCtrl->itemController("test_unit_vmap");
0126         auto rectCtrl= dynamic_cast<vmap::ImageController*>(itemCtrl);
0127         QCOMPARE(rectCtrl->rect(), QRectF(0, 0, 326, 244));
0128         QCOMPARE(rectCtrl->pos(), QPointF(500, 200));
0129     }
0130 
0131     QCOMPARE(m_ctrl->contentCount(), 1);*/
0132 }
0133 
0134 void ContentControllerTest::serializeTest()
0135 {
0136     /*QFETCH(QVector<Core::ContentType>, contentType);
0137     using DataVec= QVector<std::map<QString, QVariant>>;
0138     QFETCH(DataVec, map);
0139     QFETCH(int, count);
0140 
0141     QCOMPARE(contentType.size(), map.size());
0142 
0143     for(int i= 0; i < contentType.size(); ++i)
0144     {
0145         auto mapItem= map[i];
0146         mapItem.insert({Core::keys::KEY_TYPE, QVariant::fromValue(contentType[i])});
0147         m_ctrl->newMedia(nullptr, mapItem);
0148     }
0149     QVERIFY2(m_ctrl->contentCount() == count, "After manual insertion");
0150 
0151     auto path= QStringLiteral("%1/%2").arg(QDir::tempPath()).arg("scenario.sce");
0152 
0153     m_ctrl->setSessionPath(path);
0154     m_ctrl->saveSession();
0155 
0156     m_ctrl.reset(new ContentController(m_playerCtrl->model(), m_playerCtrl->characterModel(), nullptr));
0157     connect(m_ctrl.get(), &ContentController::performCommand, this, [this](QUndoCommand* cmd) { m_stack.push(cmd); });
0158     m_ctrl->setSessionPath(path);
0159     m_ctrl->loadSession();
0160 
0161     QCOMPARE(m_ctrl->contentCount(), count);*/
0162 }
0163 
0164 void ContentControllerTest::serializeTest_data()
0165 {
0166     /*QTest::addColumn<QVector<Core::ContentType>>("contentType");
0167     QTest::addColumn<QVector<std::map<QString, QVariant>>>("map");
0168     QTest::addColumn<int>("count");
0169 
0170     auto func= [] {
0171         static int counter= 0;
0172         return counter++;
0173     };
0174     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>() << QVector<std::map<QString, QVariant>>() << 0;
0175     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::PICTURE})
0176                                     << QVector<std::map<QString, QVariant>>(
0177                                            {{{"path", ":/img/girafe3.jpg"}, {"name", "girafe"}}})
0178                                     << 1;
0179     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::CHARACTERSHEET})
0180                                     << QVector<std::map<QString, QVariant>>(
0181                                            {{{"path", ":/charactersheet/bitume_fixed.rcs"}, {"name", "bitume"}}})
0182                                     << 1;
0183     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::PDF})
0184                                     << QVector<std::map<QString, QVariant>>(
0185                                            {{{"path", ":/pdf/01_personnages.pdf"}, {"name", "personnages"}}})
0186                                     << 1;
0187     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::SHAREDNOTE})
0188                                     << QVector<std::map<QString, QVariant>>(
0189                                            {{{"path", ":/sharednotes/test.rsn"}, {"name", "RSN file"}}})
0190                                     << 1;
0191     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::SHAREDNOTE})
0192                                     << QVector<std::map<QString, QVariant>>(
0193                                            {{{"path", ":/sharednotes/scenario.md"}, {"name", "Markdown file"}}})
0194                                     << 1;
0195     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::VECTORIALMAP})
0196                                     << QVector<std::map<QString, QVariant>>({{{"path", ""}, {"name", ""}}}) << 1;
0197 
0198     QTest::addRow("cmd %d", func()) << QVector<Core::ContentType>({Core::ContentType::WEBVIEW})
0199                                     << QVector<std::map<QString, QVariant>>(
0200                                            {{{"path", "https://rolisteam.org"}, {"name", "rolisteam"}}})
0201                                     << 1;*/
0202 }
0203 
0204 void ContentControllerTest::completeSerializationTest()
0205 {
0206     /*  QFETCH(std::vector<Core::ContentType>, list);
0207 
0208       for(auto content : list)
0209       {
0210           std::map<QString, QVariant> mapItem;
0211           switch(content)
0212           {
0213           case Core::ContentType::PICTURE:
0214               mapItem.insert({{Core::keys::KEY_PATH, ":/img/girafe3.jpg"}, {Core::keys::KEY_NAME, "girafe"}});
0215               break;
0216           case Core::ContentType::CHARACTERSHEET:
0217               mapItem.insert(
0218                   {{Core::keys::KEY_PATH, ":/charactersheet/bitume_fixed.rcs"}, {Core::keys::KEY_NAME, "bitume"}});
0219               break;
0220           case Core::ContentType::PDF:
0221               mapItem.insert({{Core::keys::KEY_PATH, ":/pdf/01_personnages.pdf"}, {Core::keys::KEY_NAME,
0222       "personnages"}}); break; case Core::ContentType::VECTORIALMAP: mapItem.insert({{Core::keys::KEY_PATH,
0223       ":/sharednotes/test.vmap"}, {Core::keys::KEY_NAME, "Test VMap"}}); break; case Core::ContentType::SHAREDNOTE:
0224               mapItem.insert(
0225                   {{Core::keys::KEY_PATH, ":/sharednotes/scenario.md"}, {Core::keys::KEY_NAME, "Markdown file"}});
0226               break;
0227           case Core::ContentType::NOTES:
0228               mapItem.insert(
0229                   {{Core::keys::KEY_PATH, ":/sharednotes/scenario.md"}, {Core::keys::KEY_NAME, "Markdown file"}});
0230               break;
0231           case Core::ContentType::WEBVIEW:
0232               mapItem.insert({{Core::keys::KEY_PATH, "https://rolisteam.org"}, {Core::keys::KEY_NAME, "rolisteam"}});
0233               break;
0234           default:
0235               break;
0236           }
0237           mapItem.insert({{Core::keys::KEY_TYPE, QVariant::fromValue(content)}});
0238           m_ctrl->newMedia(nullptr, mapItem);
0239       }
0240 
0241       QVERIFY2(m_ctrl->contentCount() == static_cast<int>(list.size()), "After manual insertion");
0242 
0243       auto path= QStringLiteral("%1/%2").arg(QDir::tempPath()).arg("scenario.sce");
0244 
0245       m_ctrl->setSessionPath(path);
0246       m_ctrl->saveSession();
0247 
0248       m_ctrl.reset(new ContentController(m_playerCtrl->model(), m_playerCtrl->characterModel(), nullptr));
0249       connect(m_ctrl.get(), &ContentController::performCommand, this, [this](QUndoCommand* cmd) { m_stack.push(cmd); });
0250       m_ctrl->setSessionPath(path);
0251       m_ctrl->loadSession();
0252 
0253       QCOMPARE(m_ctrl->contentCount(), static_cast<int>(list.size()));*/
0254 }
0255 
0256 void ContentControllerTest::completeSerializationTest_data()
0257 {
0258     QTest::addColumn<std::vector<Core::ContentType>>("list");
0259 
0260     std::vector<Core::ContentType> data({Core::ContentType::VECTORIALMAP, Core::ContentType::SHAREDNOTE,
0261                                          Core::ContentType::CHARACTERSHEET, Core::ContentType::NOTES,
0262                                          Core::ContentType::PICTURE, Core::ContentType::WEBVIEW});
0263 
0264     // auto list = new std::vector<CleverURI*>();
0265     std::vector<Core::ContentType> list;
0266 
0267     int index= 0;
0268     for(unsigned int i= 0; i < data.size(); ++i)
0269     {
0270         auto comb_size= i + 1;
0271         do
0272         {
0273             list.clear();
0274             for(auto it= data.begin(); it < data.begin() + comb_size; ++it)
0275             {
0276                 list.push_back(*it);
0277             }
0278             QTest::addRow("save %d", ++index) << list;
0279         } while(Helper::next_combination(data.begin(), data.begin() + comb_size, data.end()));
0280     }
0281 }
0282 QTEST_MAIN(ContentControllerTest)
0283 
0284 #include "tst_serialization.moc"