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)