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

0001 #include <QObject>
0002 #include <QtCore/QCoreApplication>
0003 #include <QtTest/QtTest>
0004 
0005 #include "controller/item_controllers/visualitemcontroller.h"
0006 #include "controller/view_controller/vectorialmapcontroller.h"
0007 #include "rwidgets/customs/vmap.h"
0008 #include "model/vmapitemmodel.h"
0009 #include "rwidgets/graphicsItems/lineitem.h"
0010 #include "controller/item_controllers/linecontroller.h"
0011 #include "rwidgets/mediacontainers/vmapframe.h"
0012 #include "undoCmd/addvmapitem.h"
0013 #include "controller/item_controllers/vmapitemfactory.h"
0014 // #include "test_root_path.h"
0015 #include "helper.h"
0016 
0017 constexpr int shortTime{5};
0018 using ParamMap= QList<std::map<QString, QVariant>>;
0019 
0020 
0021 class FakeItem : public vmap::VisualItemController
0022 {
0023 public:
0024     FakeItem(VisualItemController::ItemType itemType,VectorialMapController* ctrl) : VisualItemController(itemType, {}, ctrl) {};
0025     void aboutToBeRemoved() {};
0026     void setCorner(const QPointF& move, int corner,
0027         Core::TransformType transformType= Core::TransformType::NoTransform)
0028         {};
0029     QRectF rect() const {return {};};
0030 };
0031 
0032 
0033 class VMapTest : public QObject
0034 {
0035     Q_OBJECT
0036 public:
0037     VMapTest();
0038 
0039 private slots:
0040     void init();
0041     void cleanup();
0042 
0043     void addItems();
0044     void addItems_data();
0045 
0046     void addNullItems();
0047 
0048 private:
0049     std::unique_ptr<VectorialMapController> m_ctrl;
0050     std::unique_ptr<VMapFrame> m_media;
0051     std::unique_ptr<QUndoStack> m_stack;
0052     QPointer<VectorialMapController> m_pctrl;
0053     QPointer<VMapFrame> m_pmedia;
0054 };
0055 
0056 VMapTest::VMapTest()
0057 {
0058     std::string duration("3600000"); // 3600 seconds -> 60 min
0059     QByteArray timeoutDuration(duration.c_str(), static_cast<int>(duration.length()));
0060     qputenv("QTEST_FUNCTION_TIMEOUT", timeoutDuration);
0061     { // just for checking ..
0062         auto result= qgetenv("QTEST_FUNCTION_TIMEOUT");
0063         qDebug() << "timeout set to:" << result << "ms";
0064     }
0065 }
0066 
0067 void VMapTest::init()
0068 {
0069     if(m_pmedia)
0070     {
0071         delete m_media.release();
0072     }
0073 
0074     if(m_pctrl)
0075     {
0076         delete m_ctrl.release();
0077     }
0078 
0079     m_ctrl.reset(new VectorialMapController());
0080     m_pctrl= m_ctrl.get();
0081     m_media.reset(new VMapFrame(m_ctrl.get()));
0082     m_pmedia= m_media.get();
0083     m_stack.reset(new QUndoStack);
0084 
0085     connect(m_ctrl.get(), &VectorialMapController::performCommand, this,
0086             [this](QUndoCommand* cmd) { m_stack->push(cmd); });
0087 
0088     connect(m_ctrl.get(), &VectorialMapController::destroyed, this, []() { qDebug() << "ctrl destroyed"; });
0089     connect(m_media.get(), &VMapFrame::destroyed, this, []() { qDebug() << "VMapFrame destroyed"; });
0090 }
0091 void VMapTest::cleanup() {}
0092 
0093 void VMapTest::addNullItems()
0094 {
0095     auto map= m_media->map();
0096     auto model = m_ctrl->model();
0097 
0098     model->appendItemController(nullptr);
0099 
0100     QList<vmap::VisualItemController::ItemType> types{vmap::VisualItemController::PATH,
0101                                                       vmap::VisualItemController::LINE,
0102                                                       vmap::VisualItemController::ELLIPSE,
0103                                                       vmap::VisualItemController::CHARACTER,
0104                                                       vmap::VisualItemController::TEXT,
0105                                                       vmap::VisualItemController::RECT,
0106                                                       vmap::VisualItemController::RULE,
0107                                                       vmap::VisualItemController::IMAGE,
0108                                                       vmap::VisualItemController::SIGHT,
0109                                                       vmap::VisualItemController::ANCHOR,
0110                                                       vmap::VisualItemController::GRID,
0111                                                       vmap::VisualItemController::HIGHLIGHTER};
0112 
0113     for(auto type : types)
0114         model->appendItemController(new FakeItem(type, m_ctrl.get()));
0115 
0116     auto line= vmap::VmapItemFactory::createVMapItem(m_ctrl.get(), Core::SelectableTool::LINE, Helper::buildLineController(Helper::randomPoint(), Helper::randomPoint(), Helper::randomPoint()));
0117     model->appendItemController(line);
0118 
0119     m_ctrl->showTransparentItems();
0120     line->setOpacity(0);
0121 }
0122 
0123 /*void VMapTest::gridTest()
0124 {
0125     m_ctrl->setVisibility(Core::ALL);
0126     m_ctrl->setLocalGM(true);
0127     m_ctrl->setPermission(Core::PermissionMode::GM_ONLY);
0128     m_media->setVisible(true);
0129 
0130     auto map= m_media->map();
0131     auto gridCtrl = m_ctrl->gridController();
0132     auto gridItem= map->gridItem();
0133 
0134     gridItem->setNewEnd(QPoint());
0135 
0136     QVERIFY(!gridItem->isVisible());
0137 
0138     QSignalSpy spyGrid(m_ctrl.get(), &VectorialMapController::gridVisibilityChanged);
0139 
0140     m_ctrl->setGridPattern(Core::GridPattern::SQUARE);
0141     m_ctrl->setGridAbove(true);
0142     m_ctrl->setGridVisibility(true);
0143     spyGrid.wait(10);
0144 
0145     QCOMPARE(spyGrid.count(), 1);
0146 
0147     QSignalSpy gridResize(gridItem, &GridItem::parentChanged);
0148     QSignalSpy spyGridResize(gridCtrl, &vmap::GridController::rectChanged);
0149 
0150     auto size= m_media->size();
0151     m_media->resize(size * 1.5);
0152 
0153     spyGridResize.wait(10);
0154     spyGridResize.clear();
0155     gridCtrl->setRect(m_media->geometry());
0156 
0157     spyGridResize.wait(10);
0158     QCOMPARE(spyGridResize.count(), 1);
0159 }
0160 
0161 void VMapTest::lineTest()
0162 {
0163     {
0164         LineItem item(nullptr);
0165     }
0166     vmap::LineController ctrl({}, m_ctrl.get());
0167     LineItem item(&ctrl);
0168 
0169     item.setNewEnd(QPointF{200., 300.});
0170 
0171     ctrl.setStartPoint(QPointF{20., 30.});
0172 }
0173 
0174 void VMapTest::ellispeTest()
0175 {
0176     {
0177         EllipsItem item(nullptr);
0178         item.shape();
0179     }
0180     {
0181         vmap::EllipseController ctrl({}, m_ctrl.get());
0182         EllipsItem item(&ctrl);
0183         item.shape();
0184     }
0185 }
0186 
0187 void VMapTest::toolBoxTest()
0188 {
0189     auto toolbox= m_media->toolBox();
0190 
0191     QSignalSpy spy(m_ctrl.get(), &VectorialMapController::permissionChanged);
0192     QSignalSpy spy2(m_ctrl.get(), &VectorialMapController::editionModeChanged);
0193     QSignalSpy spy3(m_ctrl.get(), &VectorialMapController::visibilityChanged);
0194 
0195     m_ctrl->setPermission(Core::PermissionMode::PC_ALL);
0196     spy.wait(shortTime);
0197     m_ctrl->setEditionMode(Core::EditionMode::Mask);
0198     spy2.wait(shortTime);
0199 
0200     QCOMPARE(spy.count(), 1);
0201     QCOMPARE(spy2.count(), 1);
0202 
0203     m_ctrl->setPermission(Core::PermissionMode::PC_ALL);
0204     spy.wait(shortTime);
0205     m_ctrl->setEditionMode(Core::EditionMode::Mask);
0206     spy2.wait(shortTime);
0207 
0208     QCOMPARE(spy.count(), 1);
0209     QCOMPARE(spy2.count(), 1);
0210 
0211     m_ctrl->setVisibility(Core::VisibilityMode::FOGOFWAR);
0212     spy3.wait(shortTime);
0213     m_ctrl->setVisibility(Core::VisibilityMode::NONE);
0214     spy3.wait(shortTime);
0215     m_ctrl->setVisibility(Core::VisibilityMode::ALL);
0216     spy3.wait(shortTime);
0217     m_ctrl->setVisibility(Core::VisibilityMode::ALL);
0218     spy3.wait(shortTime);
0219 
0220     QCOMPARE(spy3.count(), 3);
0221 
0222     auto acts= toolbox->actions();
0223 
0224     for(auto act : acts)
0225     {
0226         if(!act->objectName().isEmpty())
0227             continue;
0228 
0229         auto tool= act->data().value<Core::SelectableTool>();
0230         QSignalSpy toolSpy(m_ctrl.get(), &VectorialMapController::toolChanged);
0231         QSignalSpy actSpy(act, &QAction::triggered);
0232         act->trigger();
0233         toolSpy.wait(shortTime);
0234         if(m_ctrl->tool() != tool)
0235             qDebug() << tool << "action:" << act;
0236 
0237         QCOMPARE(toolSpy.count(), 1);
0238         QCOMPARE(actSpy.count(), 1);
0239         QCOMPARE(m_ctrl->tool(), tool);
0240 
0241         act->trigger();
0242         toolSpy.wait(10);
0243         QCOMPARE(toolSpy.count(), 1);
0244         QCOMPARE(actSpy.count(), 2);
0245         QCOMPARE(m_ctrl->tool(), tool);
0246     }
0247     QSignalSpy spy4(m_ctrl.get(), &VectorialMapController::zoomLevelChanged);
0248 
0249     m_ctrl->setZoomLevel(1.1);
0250     spy4.wait(shortTime);
0251     m_ctrl->setZoomLevel(1.1);
0252     spy4.wait(shortTime);
0253     m_ctrl->setZoomLevel(1.0);
0254     spy4.wait(shortTime);
0255 
0256     QCOMPARE(spy4.count(), 2);
0257 }
0258 void VMapTest::topBarTest()
0259 {
0260     auto topBar= m_media->topBar();
0261     QSignalSpy spyGM(m_ctrl.get(), &VectorialMapController::localGMChanged);
0262 
0263     m_ctrl->setLocalGM(!m_ctrl->localGM());
0264     spyGM.wait(shortTime);
0265     QCOMPARE(spyGM.count(), 1);
0266     m_ctrl->setLocalGM(m_ctrl->localGM());
0267     spyGM.wait(shortTime);
0268     QCOMPARE(spyGM.count(), 1);
0269 
0270     auto acts= topBar->actions();
0271 
0272     QSignalSpy spyPerm(m_ctrl.get(), &VectorialMapController::permissionChanged);
0273     QSignalSpy spyVisibility(m_ctrl.get(), &VectorialMapController::visibilityChanged);
0274     QSignalSpy spyLayer(m_ctrl.get(), &VectorialMapController::layerChanged);
0275 
0276     for(auto const& p : acts)
0277     {
0278         auto name= p->objectName();
0279 
0280         if(name.startsWith("permission_") || name.startsWith("Visibility_") || name.startsWith("layer_"))
0281             p->trigger();
0282     }
0283 
0284     spyPerm.wait(shortTime);
0285     spyVisibility.wait(shortTime);
0286     spyLayer.wait(shortTime);
0287     QVERIFY(spyPerm.count() > 0);
0288     QVERIFY(spyVisibility.count() > 0);
0289     QVERIFY(spyLayer.count() > 0);
0290 }
0291 
0292 void VMapTest::createEmptyTopBarTest()
0293 {
0294     auto topBar= std::make_unique<VmapTopBar>(nullptr);
0295 
0296     topBar->updateUI();
0297 }
0298 void VMapTest::createEmptyToolBoxTest()
0299 {
0300     auto toolBox= std::make_unique<ToolBox>(nullptr);
0301 }
0302 
0303 
0304 void VMapTest::rulerTest()
0305 {
0306     m_ctrl->setVisibility(Core::ALL);
0307     m_ctrl->setLocalGM(true);
0308     m_ctrl->setPermission(Core::PermissionMode::GM_ONLY);
0309     m_media->setVisible(true);
0310 
0311     QSignalSpy gridSizeChanged(m_ctrl.get(), &VectorialMapController::gridSizeChanged);
0312     QSignalSpy gridScaleChanged(m_ctrl.get(), &VectorialMapController::gridScaleChanged);
0313     QSignalSpy scaleUnitChanged(m_ctrl.get(), &VectorialMapController::scaleUnitChanged);
0314 
0315     auto rule= new RuleItem(m_ctrl.get());
0316     auto map= m_media->map();
0317     map->addItem(rule);
0318 
0319     rule->setNewEnd(QPointF(), true);
0320     rule->setNewEnd(QPointF(), false);
0321 
0322     rule->setPos(QPointF(100., 100.));
0323     rule->setNewEnd(QPointF(150., 250.), true);
0324 
0325     QCOMPARE(rule->boundingRect(), QRectF(0., 0., 0., 250.));
0326 
0327     rule->setNewEnd(QPointF(1500., 250.), false);
0328 
0329     QCOMPARE(rule->boundingRect(), QRect(0, 0, 1500, 500));
0330 
0331     // addAndInit(parentItemAnchor);
0332     auto items= map->items();
0333 
0334     QCOMPARE(items.count(), 3);
0335 
0336     QList<Core::ScaleUnit> units{Core::ScaleUnit::CM, Core::ScaleUnit::FEET, Core::ScaleUnit::INCH,
0337                                  Core::ScaleUnit::KM, Core::ScaleUnit::M,    Core::ScaleUnit::MILE,
0338                                  Core::ScaleUnit::PX, Core::ScaleUnit::YARD};
0339 
0340     //    Core::ScaleUnit::CM ,m_ctrl->scaleUnitChanged(Core::ScaleUnit::CM
0341     int i= 0;
0342     for(auto const& unit : units)
0343     {
0344         if(m_ctrl->scaleUnit() == unit)
0345             continue;
0346 
0347         m_ctrl->setScaleUnit(unit);
0348         i++;
0349         scaleUnitChanged.wait(10);
0350     }
0351     QCOMPARE(scaleUnitChanged.count(), i);
0352 }
0353 void VMapTest::anchorTest()
0354 {
0355     m_ctrl->setVisibility(Core::ALL);
0356     m_ctrl->setLocalGM(true);
0357     m_ctrl->setPermission(Core::PermissionMode::GM_ONLY);
0358     m_media->setVisible(true);
0359 
0360     auto anchor= new AnchorItem();
0361     anchor->setNewEnd(QPointF());
0362 
0363     anchor->setPos(QPointF(100., 100.));
0364     anchor->setNewEnd(QPointF(200., 250.));
0365 
0366     auto map= m_media->map();
0367     map->addItem(anchor);
0368     anchor->setVisible(true);
0369 
0370     // addAndInit(parentItemAnchor);
0371 
0372     anchor->boundingRect();
0373 
0374     QCOMPARE(anchor->getEnd(), QPointF(300., 350.));
0375     QCOMPARE(anchor->getStart(), QPointF(100., 100.));
0376 
0377     auto items= map->items();
0378 
0379     QCOMPARE(items.count(), 3);
0380 }*/
0381 
0382 void VMapTest::addItems()
0383 {
0384     QFETCH(ParamMap, params);
0385     QFETCH(int, expected);
0386 
0387     m_ctrl->setVisibility(Core::ALL);
0388     m_ctrl->setLocalGM(true);
0389     m_ctrl->setPermission(Core::PermissionMode::GM_ONLY);
0390     m_media->setVisible(true);
0391 
0392     QSignalSpy performAction(m_ctrl.get(), &VectorialMapController::performCommand);
0393     QSignalSpy itemCreated(m_ctrl.get(), &VectorialMapController::visualItemControllerCreated);
0394 
0395     auto map= m_media->map();
0396 
0397     for(auto const& p : params)
0398     {
0399         performAction.clear();
0400         itemCreated.clear();
0401         m_ctrl->insertItemAt(p);
0402         performAction.wait(shortTime);
0403         QCOMPARE(performAction.count(), 1);
0404 
0405         itemCreated.wait(shortTime);
0406         QCOMPARE(itemCreated.count(), 1);
0407 
0408         auto list= map->items();
0409         QList<VisualItem*> items;
0410         std::transform(std::begin(list), std::end(list), std::back_inserter(items),
0411                        [](QGraphicsItem* item) -> VisualItem*
0412                        {
0413                            auto vitem= dynamic_cast<VisualItem*>(item);
0414                            if(!vitem)
0415                                return nullptr;
0416                            else
0417                            {
0418                                auto ctrl= vitem->controller();
0419                                if(ctrl->itemType() == vmap::VisualItemController::GRID
0420                                   || ctrl->itemType() == vmap::VisualItemController::SIGHT)
0421                                {
0422                                    return nullptr;
0423                                }
0424                                else
0425                                    return vitem;
0426                            }
0427                        });
0428 
0429         items.removeAll(nullptr);
0430 
0431         if(items.empty())
0432             continue;
0433 
0434         auto vitem= items.first();
0435         if(!vitem)
0436             continue;
0437 
0438         // vitem->setPenWidth(Helper::generate<int>(1, 50));
0439 
0440         vitem->getType();
0441         {
0442             auto c= Helper::randomColor();
0443             vitem->setColor(c);
0444             QCOMPARE(vitem->color(), c);
0445         }
0446         {
0447             auto c= Helper::randomColor();
0448             vitem->setHighlightColor(c);
0449             QCOMPARE(vitem->getHighlightColor(), c);
0450         }
0451 
0452         {
0453             auto c= Helper::generate<int>(0, 50);
0454             vitem->setHighlightWidth(c);
0455             QCOMPARE(vitem->getHighlightWidth(), c);
0456         }
0457 
0458         vitem->shape();
0459 
0460         QVERIFY(vitem->isLocal());
0461 
0462         QCOMPARE(vitem->promoteTo(vmap::VisualItemController::GRID), nullptr);
0463 
0464         vitem->setNewEnd(Helper::randomPoint());
0465 
0466         vitem->shape();
0467 
0468         auto ctrl= vitem->controller();
0469         if(!ctrl)
0470             continue;
0471         QSignalSpy isSelected(ctrl, &vmap::VisualItemController::selectedChanged);
0472 
0473         isSelected.clear();
0474 
0475         ctrl->setSelected(!ctrl->selected());
0476         ctrl->setSelected(ctrl->selected());
0477 
0478         isSelected.wait(shortTime);
0479 
0480         QCOMPARE(isSelected.count(), 1);
0481 
0482         QSignalSpy canUndo(m_stack.get(), &QUndoStack::canUndoChanged);
0483         m_ctrl->dupplicateItem(QList<vmap::VisualItemController*>{ctrl});
0484 
0485         canUndo.wait(shortTime);
0486         QCOMPARE(canUndo.count(), 1);
0487         m_stack->undo();
0488     }
0489 
0490     if(!params.isEmpty())
0491         qDebug() << params[0]["tool"].value<Core::SelectableTool>();
0492 
0493     QCOMPARE(map->items().count(), expected);
0494 }
0495 
0496 void VMapTest::addItems_data()
0497 {
0498     QTest::addColumn<ParamMap>("params");
0499     QTest::addColumn<int>("expected");
0500 
0501     QTest::addRow("empty") << ParamMap{} << 2;
0502     std::vector<Core::SelectableTool> data({Core::SelectableTool::FILLRECT, Core::SelectableTool::LINE,
0503                                             Core::SelectableTool::EMPTYELLIPSE, Core::SelectableTool::EMPTYRECT,
0504                                             Core::SelectableTool::FILLEDELLIPSE, Core::SelectableTool::IMAGE,
0505                                             Core::SelectableTool::TEXT, Core::SelectableTool::TEXTBORDER,
0506                                             Core::SelectableTool::PEN, Core::SelectableTool::PATH, Core::SelectableTool::NonPlayableCharacter});
0507     ParamMap list;
0508     int index= 0;
0509     for(unsigned int i= 0; i < data.size(); ++i)
0510     {
0511         auto comb_size= i + 1;
0512         do
0513         {
0514             int count= 2;
0515             list.clear();
0516             for(auto it= data.begin(); it < data.begin() + comb_size; ++it)
0517             // for(auto val : data)
0518             {
0519                 std::map<QString, QVariant> map;
0520                 switch(*it) //
0521                 {
0522                 case Core::SelectableTool::FILLRECT:
0523                     map= Helper::buildRectController(true, {0, 0, 200, 200});
0524                     count+= 5;
0525                     break;
0526                 case Core::SelectableTool::LINE:
0527                     map= Helper::buildLineController({100, 100}, {500, 100}, {});
0528                     count+= 3;
0529                     break;
0530                 case Core::SelectableTool::EMPTYELLIPSE:
0531                     map= Helper::buildEllipseController(false, 200., 100., {500., 100.});
0532                     count+= 3;
0533                     break;
0534                 case Core::SelectableTool::EMPTYRECT:
0535                     map= Helper::buildRectController(false, {0, 0, 200, 200}, {300, 200});
0536                     count+= 5;
0537                     break;
0538                 case Core::SelectableTool::FILLEDELLIPSE:
0539                     map= Helper::buildEllipseController(true, 200., 100., {500., 100.});
0540                     count+= 3;
0541                     break;
0542                 case Core::SelectableTool::IMAGE:
0543                     map= Helper::buildImageController(":/img/girafe.jpg", {0, 0, 200, 200}, {150, 200});
0544                     count+= 5;
0545                     break;
0546                 case Core::SelectableTool::TEXT:
0547                     map= Helper::buildTextController(false, "Text without border", {0, 0, 200, 200});
0548                     count+= 6;
0549                     break;
0550                 case Core::SelectableTool::TEXTBORDER:
0551                     map= Helper::buildTextController(true, "Text with border", {0, 0, 200, 200});
0552                     count+= 6;
0553                     break;
0554                 case Core::SelectableTool::PATH:
0555                     map= Helper::buildPathController(true, {{0, 0}, {10, 10}, {20, 0}, {30, 10}}, {0, 0});
0556                     count+= 5;
0557                     break;
0558                 case Core::SelectableTool::PEN:
0559                     map= Helper::buildPenController(false, {{0, 0}, {10, 10}, {20, 0}, {30, 10}}, {0, 0});
0560                     count+= 1;
0561                     break;
0562                 case Core::SelectableTool::NonPlayableCharacter:
0563                     map= Helper::buildPenController(false, {{0, 0}, {10, 10}, {20, 0}, {30, 10}}, {0, 0});
0564                     count+= 1;
0565                     break;
0566                 default:
0567                     break;
0568                 }
0569                 map.insert({QString("color"), QVariant::fromValue(Helper::randomColor())});
0570                 map.insert({Core::vmapkeys::KEY_PENWIDTH, Helper::generate<int>(1, 50)});
0571 
0572                 list.append(map);
0573             }
0574             QTest::addRow("save %d", ++index) << list << count;
0575         } while(Helper::next_combination(data.begin(), data.begin() + comb_size, data.end()));
0576     }
0577 }
0578 
0579 /*void VMapTest::getAndSetTest()
0580 {
0581        ToolBox::EditionMode mode= Core::Painting;
0582        m_vmap->setEditionMode(mode);
0583        QVERIFY2(m_vmap->getEditionMode() == mode, "Normal edition mode");
0584 
0585        mode= ToolBox::Mask;
0586        m_vmap->setEditionMode(mode);
0587        QVERIFY2(m_vmap->getEditionMode() == mode, "Mask edition mode");
0588 
0589        int height= 800;
0590        m_vmap->setHeight(height);
0591        QVERIFY(m_vmap->mapHeight() == height);
0592 
0593        int width= 1200;
0594        m_vmap->setWidth(width);
0595        QVERIFY(m_vmap->mapWidth() == width);
0596 
0597        QColor color(Qt::red);
0598        m_vmap->setBackGroundColor(color);
0599        QVERIFY(m_vmap->getBackGroundColor() == color);
0600 
0601        QString title("Test");
0602        m_vmap->setTitle(title);
0603        QVERIFY(m_vmap->getMapTitle() == title);
0604 
0605        Map::PermissionMode permission= Map::PC_ALL;
0606        m_vmap->setPermissionMode(permission);
0607        QVERIFY(m_vmap->getPermissionMode() == permission);
0608        m_vmap->setPermissionMode(Map::GM_ONLY);
0609        QVERIFY(m_vmap->getPermissionModeText() == "No Right");
0610        m_vmap->setPermissionMode(Map::PC_MOVE);
0611        QVERIFY(m_vmap->getPermissionModeText() == "His character");
0612        m_vmap->setPermissionMode(Map::PC_ALL);
0613        QVERIFY(m_vmap->getPermissionModeText() == "All Permissions");
0614 
0615        VMap::VisibilityMode visiMode= VMap::HIDDEN;
0616        m_vmap->setVisibilityMode(visiMode);
0617        QVERIFY(m_vmap->getVisibilityModeText() == "Hidden");
0618        visiMode= VMap::FOGOFWAR;
0619        m_vmap->setVisibilityMode(visiMode);
0620        QVERIFY(m_vmap->getVisibilityModeText() == "Fog Of War");
0621        visiMode= VMap::ALL;
0622        m_vmap->setVisibilityMode(visiMode);
0623        QVERIFY(m_vmap->getVisibilityModeText() == "All visible");
0624 }
0625 
0626 void VMapTest::testOption()
0627 {
0628       QFETCH(VisualItem::Properties, key);
0629        QFETCH(QVariant, value);
0630 
0631        VisualItem::Properties pop= static_cast<VisualItem::Properties>(key);
0632 
0633        m_vmap->setOption(pop, value);
0634        QVERIFY(m_vmap->getOption(pop) == value);
0635 
0636        QFETCH(QVariant, value1);
0637        bool b= m_vmap->setOption(pop, value1);
0638        QVERIFY(b);
0639        QVERIFY(m_vmap->getOption(pop) == value1);
0640 }
0641 void VMapTest::testOption_data()
0642 {
0643       QTest::addColumn<VisualItem::Properties>("key");
0644       QTest::addColumn<QVariant>("value");
0645       QTest::addColumn<QVariant>("value1");
0646 
0647       QTest::newRow("ShowNpcName") << VisualItem::ShowNpcName << QVariant(true) << QVariant::fromValue(false);
0648       QTest::newRow("ShowPcName") << VisualItem::ShowPcName << QVariant::fromValue(true) << QVariant::fromValue(false);
0649       QTest::newRow("ShowNpcNumber") << VisualItem::ShowNpcNumber << QVariant::fromValue(true)
0650                                      << QVariant::fromValue(false);
0651       QTest::newRow("ShowHealthStatus") << VisualItem::ShowHealthStatus << QVariant::fromValue(true)
0652                                         << QVariant::fromValue(false);
0653       QTest::newRow("ShowInitScore") << VisualItem::ShowInitScore << QVariant::fromValue(true)
0654                                      << QVariant::fromValue(false);
0655       QTest::newRow("ShowGrid") << VisualItem::ShowGrid << QVariant::fromValue(true) << QVariant::fromValue(false);
0656       QTest::newRow("LocalIsGM") << VisualItem::LocalIsGM << QVariant::fromValue(true) << QVariant::fromValue(false);
0657       QTest::newRow("GridPattern") << VisualItem::GridPattern << QVariant::fromValue(VMap::SQUARE)
0658                                    << QVariant::fromValue(VMap::NONE);
0659       QTest::newRow("GridColor") << VisualItem::GridColor << QVariant::fromValue(QColor(Qt::blue))
0660                                  << QVariant::fromValue(QColor(Qt::yellow));
0661       QTest::newRow("GridSize") << VisualItem::GridSize << QVariant::fromValue(50) << QVariant::fromValue(100);
0662       QTest::newRow("Scale") << VisualItem::Scale << QVariant::fromValue(1.0) << QVariant::fromValue(0.5);
0663       QTest::newRow("Unit") << VisualItem::Unit << QVariant::fromValue(VMap::M) << QVariant::fromValue(VMap::KM);
0664       QTest::newRow("CharacterVision") << VisualItem::EnableCharacterVision << QVariant::fromValue(true)
0665                                        << QVariant::fromValue(false);
0666       QTest::newRow("PermissionMode") << VisualItem::PermissionMode << QVariant::fromValue(Map::PC_ALL)
0667                                       << QVariant::fromValue(Map::GM_ONLY);
0668       QTest::newRow("FogOfWarStatus") << VisualItem::FogOfWarStatus << QVariant::fromValue(true)
0669                                       << QVariant::fromValue(false);
0670       QTest::newRow("CollisionStatus") << VisualItem::CollisionStatus << QVariant::fromValue(true)
0671                                        << QVariant::fromValue(false);
0672       QTest::newRow("GridAbove") << VisualItem::GridAbove << QVariant::fromValue(true) << QVariant::fromValue(false);
0673       QTest::newRow("HideOtherLayers") << VisualItem::HideOtherLayers << QVariant::fromValue(true)
0674                                        << QVariant::fromValue(false);
0675       QTest::newRow("VisibilityMode") << VisualItem::VisibilityMode << QVariant::fromValue(VMap::HIDDEN)
0676                                       << QVariant::fromValue(VMap::ALL);
0677       QTest::newRow("ShowHealthBar") << VisualItem::ShowHealthBar << QVariant::fromValue(true)
0678                                      << QVariant::fromValue(false);
0679       QTest::newRow("MapLayer") << VisualItem::MapLayer << QVariant::fromValue(VisualItem::GROUND)
0680                                 << QVariant::fromValue(VisualItem::OBJECT);
0681 }
0682 
0683 void VMapTest::saveAndLoad()
0684 {
0685        auto itemCountAtStart= m_vmap->items().size();
0686 
0687         QFETCH(int, id);
0688         auto item= getItemFromId(id);
0689         if(item != nullptr)
0690         {
0691             AddVmapItemCommand cmd(item, true, m_vmap.get());
0692             cmd.setUndoable(true);
0693             cmd.redo();
0694             QVERIFY(itemCountAtStart != m_vmap->items().size());
0695             QCOMPARE(m_vmap->getItemCount(), 1);
0696             QCOMPARE(m_vmap->getSortedItemCount(), 1);
0697             QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0698         }
0699 
0700         auto itemCountAfterInsertion= m_vmap->items().size();
0701         auto origWidth= m_vmap->mapWidth();
0702 
0703         QByteArray array;
0704         QDataStream in(&array, QIODevice::WriteOnly);
0705         in.setVersion(QDataStream::Qt_5_7);
0706 
0707         m_vmap->saveFile(in);
0708 
0709         VMap map;
0710         QDataStream out(&array, QIODevice::ReadOnly);
0711         out.setVersion(QDataStream::Qt_5_7);
0712         map.openFile(out);
0713 
0714         QCOMPARE(map.items().size(), itemCountAfterInsertion);
0715 
0716         QByteArray array2;
0717         QDataStream in2(&array2, QIODevice::WriteOnly);
0718         in2.setVersion(QDataStream::Qt_5_7);
0719         map.saveFile(in2);
0720 
0721         QCOMPARE(origWidth, map.mapWidth());
0722 
0723         // if(array.size() != array2.size())
0724         // qDebug() << "arrays size" << array.size() << array2.size();
0725 
0726         QCOMPARE(array.size(), array2.size());
0727 
0728         delete item;
0729 }
0730 VisualItem* VMapTest::getItemFromId(int i)
0731 {
0732        VisualItem* item= nullptr;
0733        switch(i)
0734        {
0735        case 1:
0736            item= new RectItem(QPointF(100, 100), QPointF(200, 200), true, 18, QColor(Qt::red));
0737            break;
0738        case 2:
0739            item= new PathItem(QPointF(100, 100), QColor(Qt::red), true, 18);
0740            break;
0741        case 3:
0742            item= new LineItem(QPointF(100, 100), QColor(Qt::red), 18);
0743            break;
0744        case 4:
0745            item= new TextItem(QPointF(100, 100), 18, QColor(Qt::red));
0746            break;
0747        case 5:
0748            item= new EllipsItem(QPointF(100, 100), true, 18, QColor(Qt::red));
0749            break;
0750        case 6:
0751        {
0752            auto img= new ImageItem();
0753            img->setImageUri(":/assets/img/girafe.jpg");
0754            item= img;
0755        }
0756        break;
0757        case 7:
0758        {
0759            auto character= new Character("Obi", QColor(Qt::darkBlue), false);
0760            item= new CharacterItem(character, QPoint(100, 100));
0761        }
0762        break;
0763        }
0764        if(nullptr != item)
0765            item->setLayer(m_vmap->currentLayer());
0766        return item;
0767     return nullptr;
0768 }
0769 
0770 void VMapTest::saveAndLoad_data()
0771 {
0772     QTest::addColumn<int>("id");
0773 
0774     QTest::newRow("Empty") << 0;
0775     QTest::newRow("RectItem") << 1;
0776     QTest::newRow("PathItem") << 2;
0777     QTest::newRow("LineItem") << 3;
0778     QTest::newRow("TextItem") << 4;
0779     QTest::newRow("EllipsItem") << 5;
0780     QTest::newRow("ImageItem") << 6;
0781     QTest::newRow("characterItem") << 7;
0782 }
0783 
0784 
0785 void VMapTest::addEllipse()
0786 {
0787     /*    EllipsItem item;
0788         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0789         cmd.setUndoable(true);
0790         cmd.redo();
0791         QVERIFY(cmd.isUndoable());
0792         QCOMPARE(m_vmap->getItemCount(), 1);
0793         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0794         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0795 
0796         cmd.undo();
0797 
0798         QCOMPARE(m_vmap->getItemCount(), 0);
0799         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0800         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0801 }
0802 void VMapTest::addPath()
0803 {
0804         PathItem item;
0805         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0806         cmd.setUndoable(true);
0807         cmd.redo();
0808         QVERIFY(cmd.isUndoable());
0809         QCOMPARE(m_vmap->getItemCount(), 1);
0810         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0811         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0812 
0813         cmd.undo();
0814 
0815         QCOMPARE(m_vmap->getItemCount(), 0);
0816         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0817         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0818 }
0819 void VMapTest::addLine()
0820 {
0821         LineItem item;
0822         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0823         cmd.setUndoable(true);
0824         cmd.redo();
0825         QVERIFY(cmd.isUndoable());
0826         QCOMPARE(m_vmap->getItemCount(), 1);
0827         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0828         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0829 
0830         cmd.undo();
0831 
0832         QCOMPARE(m_vmap->getItemCount(), 0);
0833         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0834         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0835 }
0836 void VMapTest::addImage()
0837 {
0838     /*    ImageItem item;
0839         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0840         cmd.setUndoable(true);
0841         cmd.redo();
0842         QVERIFY(cmd.isUndoable());
0843         QCOMPARE(m_vmap->getItemCount(), 1);
0844         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0845         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0846 
0847         cmd.undo();
0848 
0849         QCOMPARE(m_vmap->getItemCount(), 0);
0850         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0851         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0852 }
0853 void VMapTest::addCharacter()
0854 {
0855         QSignalSpy spy(m_vmap.get(), &VMap::npcAdded);
0856         CharacterItem item;
0857         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0858         cmd.setUndoable(true);
0859         cmd.redo();
0860         QVERIFY(cmd.isUndoable());
0861         QCOMPARE(m_vmap->getItemCount(), 1);
0862         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0863         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0864         QCOMPARE(spy.count(), 0);
0865 
0866         cmd.undo();
0867 
0868         QCOMPARE(m_vmap->getItemCount(), 0);
0869         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0870         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0871 }
0872 void VMapTest::addText()
0873 {
0874         TextItem item;
0875         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0876         cmd.setUndoable(true);
0877         cmd.redo();
0878         QVERIFY(cmd.isUndoable());
0879         QCOMPARE(m_vmap->getItemCount(), 1);
0880         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0881         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0882 
0883         cmd.undo();
0884 
0885         QCOMPARE(m_vmap->getItemCount(), 0);
0886         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0887         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0888 }
0889 void VMapTest::addHighLighter()
0890 {
0891         HighlighterItem item;
0892         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0893         cmd.setUndoable(false);
0894         cmd.redo();
0895         QVERIFY(!cmd.isUndoable());
0896         QCOMPARE(m_vmap->getItemCount(), 0);
0897         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0898         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0899 }
0900 void VMapTest::addRule()
0901 {
0902         RuleItem item;
0903         AddVmapItemCommand cmd(&item, true, m_vmap.get());
0904         cmd.setUndoable(false);
0905         cmd.redo();
0906         QVERIFY(!cmd.isUndoable());
0907         QCOMPARE(m_vmap->getItemCount(), 0);
0908         QCOMPARE(m_vmap->getSortedItemCount(), 0);
0909         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0910 }
0911 
0912 void VMapTest::zOrderTest()
0913 {
0914         auto item= new RectItem(QPointF(100, 100), QPointF(200, 200), true, 18, QColor(Qt::red));
0915         auto item1= new RectItem(QPointF(100, 100), QPointF(200, 200), true, 18, QColor(Qt::blue));
0916         auto item2= new RectItem(QPointF(100, 100), QPointF(200, 200), true, 18, QColor(Qt::green));
0917         item->setVisible(true);
0918         item1->setVisible(true);
0919         item2->setVisible(true);
0920 
0921         m_vmap->setVisibilityMode(VMap::ALL);
0922 
0923         AddVmapItemCommand cmd(item, true, m_vmap.get());
0924         cmd.redo();
0925 
0926         QCOMPARE(m_vmap->getItemCount(), 1);
0927         QCOMPARE(m_vmap->getSortedItemCount(), 1);
0928         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0929 
0930         AddVmapItemCommand cmd1(item1, true, m_vmap.get());
0931         cmd1.redo();
0932 
0933         QCOMPARE(m_vmap->getItemCount(), 2);
0934         QCOMPARE(m_vmap->getSortedItemCount(), 2);
0935         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0936 
0937         AddVmapItemCommand cmd2(item2, true, m_vmap.get());
0938         cmd2.redo();
0939 
0940         QCOMPARE(m_vmap->getItemCount(), 3);
0941         QCOMPARE(m_vmap->getSortedItemCount(), 3);
0942         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
0943 
0944         m_vmap->changeStackOrder(item, VisualItem::FRONT);
0945 
0946         // item is in the front
0947         QVERIFY(item->zValue() > item1->zValue());
0948         QVERIFY(item->zValue() > item2->zValue());
0949         QVERIFY(item1->zValue() < item2->zValue());
0950 
0951         m_vmap->changeStackOrder(item, VisualItem::BACK);
0952 
0953         QVERIFY(item->zValue() < item1->zValue());
0954         QVERIFY(item->zValue() < item2->zValue());
0955         QVERIFY(item1->zValue() < item2->zValue());
0956 
0957         item2->setPos(800, 800); // move away the item
0958         m_vmap->changeStackOrder(item, VisualItem::RAISE);
0959 
0960         QVERIFY(item->isVisible());
0961         QVERIFY(item1->isVisible());
0962         QVERIFY(item2->isVisible());
0963 
0964         QVERIFY(item->zValue() > item1->zValue());
0965         QVERIFY(item->zValue() < item2->zValue());
0966         QVERIFY(item1->zValue() < item2->zValue());
0967 
0968         m_vmap->changeStackOrder(item, VisualItem::LOWER);
0969 
0970         QVERIFY(item->zValue() < item1->zValue());
0971         QVERIFY(item->zValue() < item2->zValue());
0972         QVERIFY(item1->zValue() < item2->zValue());
0973 
0974         delete item;
0975         delete item1;
0976         delete item2;
0977 }
0978 
0979 void VMapTest::fogTest()
0980 {
0981         auto sightItem= m_vmap->getFogItem();
0982 
0983         QFETCH(VMap::VisibilityMode, mode);
0984         QFETCH(bool, visibility);
0985 
0986         m_vmap->setVisibilityMode(mode);
0987         QCOMPARE(sightItem->isVisible(), visibility);
0988 }
0989 void VMapTest::fogTest_data()
0990 {
0991         QTest::addColumn<VMap::VisibilityMode>("mode");
0992         QTest::addColumn<bool>("visibility");
0993 
0994         QTest::addRow("Hidden") << VMap::HIDDEN << false;
0995         QTest::addRow("FogOfWar") << VMap::FOGOFWAR << true;
0996         QTest::addRow("All") << VMap::ALL << false;
0997 }
0998 
0999 void VMapTest::testMovableItems()
1000 {
1001         QFETCH(Map::PermissionMode, mode);
1002         QFETCH(bool, movable);
1003         QFETCH(bool, isGM);
1004         QFETCH(VisualItem*, item);
1005 
1006         m_vmap->setPermissionMode(mode);
1007         m_vmap->setOption(VisualItem::LocalIsGM, isGM);
1008 
1009         AddVmapItemCommand cmd(item, true, m_vmap.get());
1010         cmd.redo();
1011 
1012         QCOMPARE(m_vmap->getItemCount(), 1);
1013         QCOMPARE(m_vmap->getSortedItemCount(), 1);
1014         QCOMPARE(m_vmap->getOrderedItemCount(), 0);
1015 
1016         QCOMPARE(item->flags() & QGraphicsItem::ItemIsMovable, movable);
1017 }
1018 
1019 void VMapTest::testMovableItems_data()
1020 {
1021         QTest::addColumn<Map::PermissionMode>("mode");
1022         QTest::addColumn<bool>("movable");
1023         QTest::addColumn<bool>("isGM");
1024         QTest::addColumn<VisualItem*>("item");
1025 
1026         // rectangle for player
1027         QTest::addRow("Player wants to move GM item") << Map::GM_ONLY << false << false << getItemFromId(1);
1028         QTest::addRow("Player thinks item is his character") << Map::PC_MOVE << false << false << getItemFromId(1);
1029         QTest::addRow("Player move items") << Map::PC_ALL << true << false << getItemFromId(1);
1030 
1031         // rectangle for GM
1032         QTest::addRow("GM moves GM item") << Map::GM_ONLY << true << true << getItemFromId(1);
1033         QTest::addRow("GM moves even when player can move") << Map::PC_MOVE << true << true << getItemFromId(1);
1034         QTest::addRow("GM moves even when all permission") << Map::PC_ALL << true << true << getItemFromId(1);
1035 
1036         // PlayersList* model = PlayersList::instance();
1037 
1038         /*auto localPlayer = new Player(QStringLiteral("Obi"),QColor(Qt::darkBlue),false);
1039         auto localCharacter = new Character("Lynn Gray-Rike",QColor(Qt::darkBlue),false);
1040         auto item = new CharacterItem(localCharacter,QPoint(100,100));
1041         localPlayer->addCharacter(localCharacter);
1042         model->setLocalPlayer(localPlayer);
1043 
1044         VisualItem* itemVisual = item;
1045         //CharacterItem for GM
1046         QTest::addRow("PC can't move his character") << Map::GM_ONLY << false << false << itemVisual;
1047         QTest::addRow("PC can move his character") << Map::PC_MOVE << true << false << itemVisual;
1048         QTest::addRow("PC can move his character as all items") << Map::PC_ALL << true << false << itemVisual;
1049 }*/
1050 
1051 QTEST_MAIN(VMapTest);
1052 
1053 #include "tst_vmap.moc"