File indexing completed on 2024-04-21 03:48:03
0001 /* 0002 File : WorksheetTest.cpp 0003 Project : LabPlot 0004 Description : Tests for Worksheets and positioning them on the plot 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2023 Martin Marmsoler <martin.marmsoler@gmail.com> 0007 0008 SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 0011 #include "WorksheetElementTest.h" 0012 #include "helperMacros.h" 0013 0014 #include "backend/core/AbstractColumn.h" 0015 #include "backend/core/Project.h" 0016 #include "backend/lib/trace.h" 0017 #include "backend/worksheet/Image.h" 0018 #include "backend/worksheet/TextLabel.h" 0019 #include "backend/worksheet/TextLabelPrivate.h" 0020 #include "backend/worksheet/plots/cartesian/CustomPoint.h" 0021 #include "backend/worksheet/plots/cartesian/ReferenceLine.h" 0022 #include "backend/worksheet/plots/cartesian/ReferenceLinePrivate.h" 0023 #include "backend/worksheet/plots/cartesian/ReferenceRange.h" 0024 #include "backend/worksheet/plots/cartesian/ReferenceRangePrivate.h" 0025 #include "kdefrontend/dockwidgets/CustomPointDock.h" 0026 #include "kdefrontend/dockwidgets/ImageDock.h" 0027 #include "kdefrontend/widgets/LabelWidget.h" 0028 0029 void WorksheetElementTest::initTestCase() { 0030 // needed in order to have the signals triggered by SignallingUndoCommand, see LabPlot.cpp 0031 qRegisterMetaType<const AbstractAspect*>("const AbstractAspect*"); 0032 qRegisterMetaType<const AbstractColumn*>("const AbstractColumn*"); 0033 } 0034 0035 #define ALL_WORKSHEETELEMENT_TESTS(WorksheetElementType, DockType, dockSetElementsMethodName) \ 0036 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_SETPOSITIONLOGICAL, DockType, dockSetElementsMethodName) \ 0037 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_MOUSE_MOVE, DockType, dockSetElementsMethodName) \ 0038 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_RIGHT_UNDO, DockType, dockSetElementsMethodName) \ 0039 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_UP_UNDO, DockType, dockSetElementsMethodName) \ 0040 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_RIGHT_NO_COORD_BINDING, DockType, dockSetElementsMethodName) \ 0041 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_DOWN_NO_COORD_BINDING, DockType, dockSetElementsMethodName) \ 0042 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_RIGHT, DockType, dockSetElementsMethodName) \ 0043 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEY_PRESSLEFT, DockType, dockSetElementsMethodName) \ 0044 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_UP, DockType, dockSetElementsMethodName) \ 0045 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_DOWN, DockType, dockSetElementsMethodName) \ 0046 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_ENABLE_DISABLE_COORDBINDING, DockType, dockSetElementsMethodName) \ 0047 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_SHIFTX_COORDBINDING, DockType, dockSetElementsMethodName) \ 0048 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_SHIFTY_COORDBINDING, DockType, dockSetElementsMethodName) \ 0049 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_SHIFTX_NO_COORDBINDING, DockType, dockSetElementsMethodName) \ 0050 WORKSHEETELEMENT_TEST(WorksheetElementType, WORKSHEETELEMENT_SHIFTY_NO_COORDBINDING, DockType, dockSetElementsMethodName) \ 0051 WORKSHEETELEMENT_TEST(WorksheetElementType, MOUSE_MOVE_DATETIME, DockType, dockSetElementsMethodName) \ 0052 WORKSHEETELEMENT_TEST(WorksheetElementType, DOCK_CHANGE_DATETIME, DockType, dockSetElementsMethodName) 0053 0054 #define ALL_WORKSHEETELEMENT_TESTS2(WorksheetElementType, DockType, dockSetElementsMethodName) \ 0055 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_SETPOSITIONLOGICAL, DockType, dockSetElementsMethodName) \ 0056 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_MOUSE_MOVE, DockType, dockSetElementsMethodName) \ 0057 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_RIGHT_UNDO, DockType, dockSetElementsMethodName) \ 0058 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_UP_UNDO, DockType, dockSetElementsMethodName) \ 0059 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_RIGHT_NO_COORD_BINDING, DockType, dockSetElementsMethodName) \ 0060 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_DOWN_NO_COORD_BINDING, DockType, dockSetElementsMethodName) \ 0061 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_RIGHT, DockType, dockSetElementsMethodName) \ 0062 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEY_PRESSLEFT, DockType, dockSetElementsMethodName) \ 0063 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_UP, DockType, dockSetElementsMethodName) \ 0064 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_KEYPRESS_DOWN, DockType, dockSetElementsMethodName) \ 0065 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_ENABLE_DISABLE_COORDBINDING, DockType, dockSetElementsMethodName) \ 0066 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_SHIFTX_COORDBINDING, DockType, dockSetElementsMethodName) \ 0067 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_SHIFTY_COORDBINDING, DockType, dockSetElementsMethodName) \ 0068 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_SHIFTX_NO_COORDBINDING, DockType, dockSetElementsMethodName) \ 0069 WORKSHEETELEMENT_TEST2(WorksheetElementType, WORKSHEETELEMENT_SHIFTY_NO_COORDBINDING, DockType, dockSetElementsMethodName) \ 0070 WORKSHEETELEMENT_TEST2(WorksheetElementType, MOUSE_MOVE_DATETIME, DockType, dockSetElementsMethodName) \ 0071 WORKSHEETELEMENT_TEST2(WorksheetElementType, DOCK_CHANGE_DATETIME, DockType, dockSetElementsMethodName) 0072 0073 #define CHECK_REFERENCERANGE_RECT(referenceRange, xLeftRef, yTopRef, xRightRef, yBottomRef) \ 0074 do { \ 0075 QVERIFY(referenceRange->cSystem); \ 0076 QPointF topLeftLogical = referenceRange->cSystem->mapSceneToLogical(referenceRange->d_func()->mapToParent(referenceRange->d_func()->rect.topLeft())); \ 0077 VALUES_EQUAL(topLeftLogical.x(), xLeftRef); \ 0078 VALUES_EQUAL(topLeftLogical.y(), yTopRef); \ 0079 QPointF bottomRightLogical = \ 0080 referenceRange->cSystem->mapSceneToLogical(referenceRange->d_func()->mapToParent(referenceRange->d_func()->rect.bottomRight())); \ 0081 VALUES_EQUAL(bottomRightLogical.x(), xRightRef); \ 0082 VALUES_EQUAL(bottomRightLogical.y(), yBottomRef); \ 0083 } while (false); 0084 0085 ALL_WORKSHEETELEMENT_TESTS(CustomPoint, CustomPointDock, setPoints) 0086 ALL_WORKSHEETELEMENT_TESTS2(TextLabel, LabelWidget, setLabels) 0087 ALL_WORKSHEETELEMENT_TESTS2(Image, ImageDock, setImages) 0088 0089 void WorksheetElementTest::referenceRangeXMouseMove() { 0090 SETUP_PROJECT 0091 0092 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0093 referenceRange->setOrientation(ReferenceRange::Orientation::Vertical); 0094 p->addChild(referenceRange); 0095 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0096 referenceRange->setPositionLogical(QPointF(0.5, 0.5)); 0097 0098 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0099 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0100 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.45); 0101 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.55); 0102 CHECK_REFERENCERANGE_RECT(referenceRange, 0.45, 1., 0.55, 0.); 0103 0104 // Simulate mouse move 0105 referenceRange->d_ptr->setPos(QPointF(25, -10)); // item change will be called (negative value is up) 0106 QCOMPARE(referenceRange->positionLogical().x(), 0.75); // 25/50 * 0.5 + 0.5 0107 QCOMPARE(referenceRange->positionLogical().y(), 0.5); // Only horizontal considered 0108 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.7); 0109 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.8); 0110 0111 CHECK_REFERENCERANGE_RECT(referenceRange, 0.7, 1., 0.8, 0.); 0112 0113 // Set Logical Start 0114 referenceRange->setPositionLogicalStart(QPointF(0.1, 0.5)); 0115 QCOMPARE(referenceRange->positionLogical().x(), 0.45); 0116 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0117 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.1); 0118 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.8); 0119 0120 CHECK_REFERENCERANGE_RECT(referenceRange, 0.1, 1., 0.8, 0.); 0121 0122 // Set Logical End 0123 referenceRange->setPositionLogicalEnd(QPointF(0.3, 0.5)); 0124 QCOMPARE(referenceRange->positionLogical().x(), 0.2); 0125 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0126 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.1); 0127 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.3); 0128 0129 CHECK_REFERENCERANGE_RECT(referenceRange, 0.1, 1., 0.3, 0.); 0130 } 0131 0132 void WorksheetElementTest::referenceRangeYMouseMove() { 0133 SETUP_PROJECT 0134 0135 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0136 referenceRange->setOrientation(ReferenceRange::Orientation::Horizontal); 0137 p->addChild(referenceRange); 0138 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0139 auto pp = referenceRange->position(); 0140 pp.point = QPointF(0, 0); 0141 referenceRange->setPosition(pp); 0142 referenceRange->setCoordinateBindingEnabled(true); 0143 0144 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0145 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0146 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.45); 0147 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.55); 0148 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.55, 1., 0.45); 0149 0150 // Simulate mouse move 0151 referenceRange->d_ptr->setPos(QPointF(-10, -25)); // item change will be called (negative value is up) 0152 QCOMPARE(referenceRange->positionLogical().y(), 0.75); // 25/50 * 0.5 + 0.5 0153 QCOMPARE(referenceRange->positionLogical().x(), 0.5); // Only vertical considered 0154 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.7); 0155 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.8); 0156 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.8, 1., 0.7); 0157 0158 // Set Logical Start 0159 referenceRange->setPositionLogicalStart(QPointF(0.5, 0.1)); 0160 QCOMPARE(referenceRange->positionLogical().y(), 0.45); // (0.8 + 0.1)/2 0161 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0162 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.1); 0163 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.8); 0164 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.8, 1., 0.1); 0165 // Set Logical End 0166 referenceRange->setPositionLogicalEnd(QPointF(0.5, 0.3)); 0167 QCOMPARE(referenceRange->positionLogical().y(), 0.2); // (0.3 + 0.1)/2 0168 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0169 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.1); 0170 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.3); 0171 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.3, 1., 0.1); 0172 } 0173 0174 void WorksheetElementTest::referenceRangeXClippingLeftMouse() { 0175 SETUP_PROJECT 0176 0177 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0178 referenceRange->setOrientation(ReferenceRange::Orientation::Vertical); 0179 p->addChild(referenceRange); 0180 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0181 auto pp = referenceRange->position(); 0182 pp.point = QPointF(0, 0); 0183 referenceRange->setPosition(pp); 0184 referenceRange->setCoordinateBindingEnabled(true); 0185 0186 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0187 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0188 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.45); 0189 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.55); 0190 CHECK_REFERENCERANGE_RECT(referenceRange, 0.45, 1., 0.55, 0.); 0191 0192 // Simulate mouse move 0193 referenceRange->d_ptr->setPos(QPointF(-50, -10)); // item change will be called (negative value is up) 0194 QCOMPARE(referenceRange->positionLogical().x(), 0.0); 0195 QCOMPARE(referenceRange->positionLogical().y(), 0.5); // Only horizontal considered 0196 QCOMPARE(referenceRange->positionLogicalStart().x(), -0.05); 0197 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.05); 0198 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 1., 0.05, 0.); 0199 } 0200 0201 void WorksheetElementTest::referenceRangeXClippingLeftSetStart() { 0202 SETUP_PROJECT 0203 0204 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0205 referenceRange->setOrientation(ReferenceRange::Orientation::Vertical); 0206 p->addChild(referenceRange); 0207 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0208 auto pp = referenceRange->position(); 0209 pp.point = QPointF(0, 0); 0210 referenceRange->setPosition(pp); 0211 referenceRange->setCoordinateBindingEnabled(true); 0212 0213 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0214 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0215 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.45); 0216 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.55); 0217 CHECK_REFERENCERANGE_RECT(referenceRange, 0.45, 1., 0.55, 0.); 0218 0219 referenceRange->setPositionLogicalStart(QPointF(-5, 0.5)); 0220 QCOMPARE(referenceRange->positionLogical().x(), -2.225); // (-5+0.55)/2 0221 QCOMPARE(referenceRange->positionLogical().y(), 0.5); // Only horizontal considered 0222 QCOMPARE(referenceRange->positionLogicalStart().x(), -5.); 0223 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.55); 0224 0225 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 1., 0.55, 0.); 0226 } 0227 0228 void WorksheetElementTest::referenceRangeXClippingRightSetEnd() { 0229 SETUP_PROJECT 0230 0231 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0232 referenceRange->setOrientation(ReferenceRange::Orientation::Vertical); 0233 p->addChild(referenceRange); 0234 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0235 auto pp = referenceRange->position(); 0236 pp.point = QPointF(0, 0); 0237 referenceRange->setPosition(pp); 0238 referenceRange->setCoordinateBindingEnabled(true); 0239 0240 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0241 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0242 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.45); 0243 QCOMPARE(referenceRange->positionLogicalEnd().x(), 0.55); 0244 0245 CHECK_REFERENCERANGE_RECT(referenceRange, 0.45, 1., 0.55, 0.); 0246 0247 // Simulate mouse move 0248 referenceRange->setPositionLogicalEnd(QPointF(+5, 0.5)); 0249 QCOMPARE(referenceRange->positionLogical().x(), 2.725); // (5+0.45)/2 0250 QCOMPARE(referenceRange->positionLogical().y(), 0.5); // Only horizontal considered 0251 QCOMPARE(referenceRange->positionLogicalStart().x(), 0.45); 0252 QCOMPARE(referenceRange->positionLogicalEnd().x(), 5.); 0253 0254 CHECK_REFERENCERANGE_RECT(referenceRange, 0.45, 1., 1., 0.); // Xend is clipped 0255 } 0256 0257 void WorksheetElementTest::referenceRangeYClippingBottomSetEnd() { 0258 SETUP_PROJECT 0259 0260 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0261 referenceRange->setOrientation(ReferenceRange::Orientation::Horizontal); 0262 p->addChild(referenceRange); 0263 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0264 auto pp = referenceRange->position(); 0265 pp.point = QPointF(0, 0); 0266 referenceRange->setPosition(pp); 0267 referenceRange->setCoordinateBindingEnabled(true); 0268 0269 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0270 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0271 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.45); 0272 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.55); 0273 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.55, 1., 0.45); 0274 0275 // Simulate mouse move 0276 referenceRange->setPositionLogicalStart(QPointF(0.5, -5.)); 0277 QCOMPARE(referenceRange->positionLogical().y(), -2.225); // (-5+0.45)/2 0278 QCOMPARE(referenceRange->positionLogical().x(), 0.5); // Only horizontal considered 0279 QCOMPARE(referenceRange->positionLogicalStart().y(), -5.); 0280 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.55); 0281 0282 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.55, 1., 0.); 0283 } 0284 0285 void WorksheetElementTest::referenceRangeYClippingTopSetEnd() { 0286 SETUP_PROJECT 0287 0288 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0289 referenceRange->setOrientation(ReferenceRange::Orientation::Horizontal); 0290 p->addChild(referenceRange); 0291 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0292 auto pp = referenceRange->position(); 0293 pp.point = QPointF(0, 0); 0294 referenceRange->setPosition(pp); 0295 referenceRange->setCoordinateBindingEnabled(true); 0296 0297 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0298 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0299 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.45); 0300 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.55); 0301 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.55, 1., 0.45); 0302 0303 // Simulate mouse move 0304 referenceRange->setPositionLogicalEnd(QPointF(0.5, 5.)); 0305 QCOMPARE(referenceRange->positionLogical().y(), 2.725); // (5+0.45)/2 0306 QCOMPARE(referenceRange->positionLogical().x(), 0.5); // Only horizontal considered 0307 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.45); 0308 QCOMPARE(referenceRange->positionLogicalEnd().y(), 5.); 0309 0310 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 1., 1., 0.45); 0311 } 0312 0313 void WorksheetElementTest::referenceRangeYKeyPressUp() { 0314 SETUP_PROJECT 0315 0316 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0317 referenceRange->setOrientation(ReferenceRange::Orientation::Horizontal); 0318 p->addChild(referenceRange); 0319 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0320 auto pp = referenceRange->position(); 0321 pp.point = QPointF(0, 0); 0322 referenceRange->setPosition(pp); 0323 referenceRange->setCoordinateBindingEnabled(true); 0324 0325 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0326 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0327 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.45); 0328 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.55); 0329 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.55, 1., 0.45); 0330 0331 // Simulate mouse move 0332 QKeyEvent event(QKeyEvent::Type::KeyPress, Qt::Key_Up, Qt::KeyboardModifier::NoModifier); 0333 referenceRange->d_ptr->keyPressEvent(&event); // go up 5 in scene coordinates 0334 QCOMPARE(referenceRange->positionLogical().y(), 0.55); // 5/50 * 0.5 + 0.5 0335 QCOMPARE(referenceRange->positionLogical().x(), 0.5); // Only vertical considered 0336 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.5); 0337 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.6); 0338 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.6, 1., 0.5); 0339 0340 referenceRange->d_ptr->keyPressEvent(&event); // go up 5 in scene coordinates 0341 QCOMPARE(referenceRange->positionLogical().y(), 0.6); // 5/50 * 0.5 + 0.5 0342 QCOMPARE(referenceRange->positionLogical().x(), 0.5); // Only vertical considered 0343 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.55); 0344 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.65); 0345 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.65, 1., 0.55); 0346 } 0347 0348 void WorksheetElementTest::referenceRangeSaveLoad() { 0349 QString savePath; 0350 { 0351 SETUP_PROJECT 0352 0353 auto* referenceRange = new ReferenceRange(p, QStringLiteral("range")); 0354 referenceRange->setOrientation(ReferenceRange::Orientation::Horizontal); 0355 p->addChild(referenceRange); 0356 referenceRange->setCoordinateSystemIndex(p->defaultCoordinateSystemIndex()); 0357 auto pp = referenceRange->position(); 0358 pp.point = QPointF(0, 0); 0359 referenceRange->setPosition(pp); 0360 referenceRange->setCoordinateBindingEnabled(true); 0361 SAVE_PROJECT("testReferenceRangeSaveLoad") 0362 } 0363 0364 { 0365 Project project; 0366 QCOMPARE(project.load(savePath), true); // shall not crash 0367 0368 const auto* ws = project.child<Worksheet>(0); 0369 QVERIFY(ws); 0370 const auto* p = ws->child<CartesianPlot>(0); 0371 QVERIFY(p); 0372 const auto* referenceRange = p->child<ReferenceRange>(0); 0373 QVERIFY(referenceRange); 0374 0375 QCOMPARE(referenceRange->positionLogical().x(), 0.5); 0376 QCOMPARE(referenceRange->positionLogical().y(), 0.5); 0377 QCOMPARE(referenceRange->positionLogicalStart().y(), 0.45); 0378 QCOMPARE(referenceRange->positionLogicalEnd().y(), 0.55); 0379 CHECK_REFERENCERANGE_RECT(referenceRange, 0., 0.55, 1., 0.45); 0380 } 0381 } 0382 0383 void WorksheetElementTest::referenceLineLinearScaling() { 0384 Project project; 0385 0386 auto* worksheet = new Worksheet(QStringLiteral("Worksheet")); 0387 project.addChild(worksheet); 0388 0389 auto* plot = new CartesianPlot(QStringLiteral("plot")); 0390 worksheet->addChild(plot); 0391 plot->setType(CartesianPlot::Type::TwoAxes); // Otherwise no axis are created 0392 plot->setNiceExtend(true); 0393 0394 const auto& axes = plot->children<Axis>(); 0395 QCOMPARE(axes.length(), 2); 0396 QCOMPARE(axes.at(0)->name(), QStringLiteral("x")); 0397 QCOMPARE(axes.at(1)->name(), QStringLiteral("y")); 0398 auto* xAxis = axes.at(0); 0399 0400 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0401 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0402 0403 plot->setRangeScale(Dimension::X, 0, RangeT::Scale::Linear); 0404 0405 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0406 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0407 0408 auto* referenceLine = new ReferenceLine(plot, QStringLiteral("TestLine")); 0409 referenceLine->setOrientation(ReferenceLine::Orientation::Horizontal); 0410 plot->addChild(referenceLine); 0411 referenceLine->retransform(); 0412 0413 const auto& rect = plot->dataRect(); 0414 0415 QCOMPARE(qAbs(referenceLine->d_func()->length), rect.width()); 0416 QCOMPARE(referenceLine->d_func()->pos().x(), rect.center().x()); 0417 } 0418 0419 void WorksheetElementTest::referenceLineLog10Scaling() { 0420 Project project; 0421 0422 auto* worksheet = new Worksheet(QStringLiteral("Worksheet")); 0423 project.addChild(worksheet); 0424 0425 auto* plot = new CartesianPlot(QStringLiteral("plot")); 0426 worksheet->addChild(plot); 0427 plot->setType(CartesianPlot::Type::TwoAxes); // Otherwise no axis are created 0428 plot->setNiceExtend(true); 0429 0430 const auto& axes = plot->children<Axis>(); 0431 QCOMPARE(axes.length(), 2); 0432 QCOMPARE(axes.at(0)->name(), QStringLiteral("x")); 0433 QCOMPARE(axes.at(1)->name(), QStringLiteral("y")); 0434 auto* xAxis = axes.at(0); 0435 0436 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0437 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0438 0439 plot->setRangeScale(Dimension::X, 0, RangeT::Scale::Log10); 0440 0441 CHECK_RANGE(plot, xAxis, Dimension::X, 0.01, 1.); 0442 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0443 0444 auto* referenceLine = new ReferenceLine(plot, QStringLiteral("TestLine")); 0445 referenceLine->setOrientation(ReferenceLine::Orientation::Horizontal); 0446 plot->addChild(referenceLine); 0447 referenceLine->retransform(); 0448 0449 const auto& rect = plot->dataRect(); 0450 0451 QCOMPARE(qAbs(referenceLine->d_func()->length), rect.width()); 0452 QCOMPARE(referenceLine->d_func()->pos().x(), rect.center().x()); 0453 } 0454 0455 void WorksheetElementTest::referenceLineSquareScaling() { 0456 Project project; 0457 0458 auto* worksheet = new Worksheet(QStringLiteral("Worksheet")); 0459 project.addChild(worksheet); 0460 0461 auto* plot = new CartesianPlot(QStringLiteral("plot")); 0462 worksheet->addChild(plot); 0463 plot->setType(CartesianPlot::Type::TwoAxes); // Otherwise no axis are created 0464 plot->setNiceExtend(true); 0465 0466 const auto& axes = plot->children<Axis>(); 0467 QCOMPARE(axes.length(), 2); 0468 QCOMPARE(axes.at(0)->name(), QStringLiteral("x")); 0469 QCOMPARE(axes.at(1)->name(), QStringLiteral("y")); 0470 auto* xAxis = axes.at(0); 0471 0472 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0473 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0474 0475 plot->setRangeScale(Dimension::X, 0, RangeT::Scale::Square); 0476 0477 CHECK_RANGE(plot, xAxis, Dimension::X, 0.01, 1.); 0478 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0479 0480 auto* referenceLine = new ReferenceLine(plot, QStringLiteral("TestLine")); 0481 referenceLine->setOrientation(ReferenceLine::Orientation::Horizontal); 0482 plot->addChild(referenceLine); 0483 referenceLine->retransform(); 0484 0485 const auto& rect = plot->dataRect(); 0486 0487 QCOMPARE(qAbs(referenceLine->d_func()->length), rect.width()); 0488 QCOMPARE(referenceLine->d_func()->pos().x(), rect.center().x()); 0489 } 0490 0491 void WorksheetElementTest::referenceLineSqrtScaling() { 0492 Project project; 0493 0494 auto* worksheet = new Worksheet(QStringLiteral("Worksheet")); 0495 project.addChild(worksheet); 0496 0497 auto* plot = new CartesianPlot(QStringLiteral("plot")); 0498 worksheet->addChild(plot); 0499 plot->setType(CartesianPlot::Type::TwoAxes); // Otherwise no axis are created 0500 plot->setNiceExtend(true); 0501 0502 const auto& axes = plot->children<Axis>(); 0503 QCOMPARE(axes.length(), 2); 0504 QCOMPARE(axes.at(0)->name(), QStringLiteral("x")); 0505 QCOMPARE(axes.at(1)->name(), QStringLiteral("y")); 0506 auto* xAxis = axes.at(0); 0507 0508 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0509 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0510 0511 plot->setRangeScale(Dimension::X, 0, RangeT::Scale::Sqrt); 0512 0513 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0514 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0515 0516 auto* referenceLine = new ReferenceLine(plot, QStringLiteral("TestLine")); 0517 referenceLine->setOrientation(ReferenceLine::Orientation::Horizontal); 0518 plot->addChild(referenceLine); 0519 referenceLine->retransform(); 0520 0521 const auto& rect = plot->dataRect(); 0522 0523 QCOMPARE(qAbs(referenceLine->d_func()->length), rect.width()); 0524 QCOMPARE(referenceLine->d_func()->pos().x(), rect.center().x()); 0525 } 0526 0527 void WorksheetElementTest::referenceLineInverseScaling() { 0528 Project project; 0529 0530 auto* worksheet = new Worksheet(QStringLiteral("Worksheet")); 0531 project.addChild(worksheet); 0532 0533 auto* plot = new CartesianPlot(QStringLiteral("plot")); 0534 worksheet->addChild(plot); 0535 plot->setType(CartesianPlot::Type::TwoAxes); // Otherwise no axis are created 0536 plot->setNiceExtend(true); 0537 0538 const auto& axes = plot->children<Axis>(); 0539 QCOMPARE(axes.length(), 2); 0540 QCOMPARE(axes.at(0)->name(), QStringLiteral("x")); 0541 QCOMPARE(axes.at(1)->name(), QStringLiteral("y")); 0542 auto* xAxis = axes.at(0); 0543 0544 CHECK_RANGE(plot, xAxis, Dimension::X, 0., 1.); 0545 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0546 0547 plot->setRangeScale(Dimension::X, 0, RangeT::Scale::Sqrt); 0548 0549 CHECK_RANGE(plot, xAxis, Dimension::X, 0.0, 1.); 0550 CHECK_RANGE(plot, xAxis, Dimension::Y, 0., 1.); 0551 0552 auto* referenceLine = new ReferenceLine(plot, QStringLiteral("TestLine")); 0553 referenceLine->setOrientation(ReferenceLine::Orientation::Horizontal); 0554 plot->addChild(referenceLine); 0555 referenceLine->retransform(); 0556 0557 const auto& rect = plot->dataRect(); 0558 0559 QCOMPARE(qAbs(referenceLine->d_func()->length), rect.width()); 0560 QCOMPARE(referenceLine->d_func()->pos().x(), rect.center().x()); 0561 } 0562 0563 // TODO: create test with reference range with nonlinear ranges! 0564 // Zooming in cartesianplot leads to move the worksheetelement 0565 // Testing without setCoordinateBindingEnabled 0566 // Undo redo of moving the position, keyboard, mousemove, manual setting 0567 0568 QTEST_MAIN(WorksheetElementTest)