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"