File indexing completed on 2024-04-28 16:49:47

0001 #include "signalplottertest.h"
0002 #include "signalplotter/ksignalplotter.h"
0003 
0004 #include <QtGui>
0005 #include <QtTestGui>
0006 #include <limits>
0007 
0008 void TestSignalPlotter::init()
0009 {
0010     s = new KSignalPlotter;
0011 }
0012 void TestSignalPlotter::cleanup()
0013 {
0014     delete s;
0015 }
0016 
0017 void TestSignalPlotter::testAddRemoveBeams()
0018 {
0019     // Just try various variations of adding and removing beams
0020     QCOMPARE(s->numBeams(), 0);
0021 
0022     s->addBeam(Qt::blue);
0023     s->addBeam(Qt::red);
0024     QCOMPARE(s->numBeams(), 2);
0025     QVERIFY(s->beamColor(0) == Qt::blue);
0026     QVERIFY(s->beamColor(1) == Qt::red);
0027 
0028     s->removeBeam(0);
0029     QCOMPARE(s->numBeams(), 1);
0030     QVERIFY(s->beamColor(0) == Qt::red);
0031 
0032     s->removeBeam(0);
0033     QCOMPARE(s->numBeams(), 0);
0034 
0035     s->addBeam(Qt::blue);
0036     s->addBeam(Qt::red);
0037     QCOMPARE(s->numBeams(), 2);
0038     QVERIFY(s->beamColor(0) == Qt::blue);
0039     QVERIFY(s->beamColor(1) == Qt::red);
0040 
0041     s->removeBeam(1);
0042     QCOMPARE(s->numBeams(), 1);
0043     QVERIFY(s->beamColor(0) == Qt::blue);
0044 
0045     s->addBeam(Qt::red);
0046     QCOMPARE(s->numBeams(), 2);
0047     QVERIFY(s->beamColor(0) == Qt::blue);
0048     QVERIFY(s->beamColor(1) == Qt::red);
0049 }
0050 void TestSignalPlotter::testAddRemoveBeamsWithData()
0051 {
0052     // Just try various variations of adding and removing beams,
0053     // this time with data as well
0054     QCOMPARE(s->numBeams(), 0);
0055 
0056     s->addBeam(Qt::blue);
0057     s->addBeam(Qt::red);
0058 
0059     QVERIFY(std::isnan(s->lastValue(0))); // unset, so should default to NaN
0060     QVERIFY(std::isnan(s->lastValue(1))); // unset, so should default to NaN
0061     QCOMPARE(s->numBeams(), 2);
0062     QVERIFY(s->beamColor(0) == Qt::blue);
0063     QVERIFY(s->beamColor(1) == Qt::red);
0064     s->addSample(QList<qreal>() << 1.0 << 2.0);
0065     QCOMPARE(s->lastValue(0), 1.0);
0066     QCOMPARE(s->lastValue(1), 2.0);
0067 
0068     s->removeBeam(0);
0069     QCOMPARE(s->numBeams(), 1);
0070     QVERIFY(s->beamColor(0) == Qt::red);
0071     QCOMPARE(s->lastValue(0), 2.0);
0072 
0073     s->removeBeam(0);
0074     QCOMPARE(s->numBeams(), 0);
0075 
0076     s->addBeam(Qt::blue);
0077     s->addBeam(Qt::red);
0078     s->addSample(QList<qreal>() << 1.0 << 2.0);
0079     QCOMPARE(s->numBeams(), 2);
0080     QVERIFY(s->beamColor(0) == Qt::blue);
0081     QVERIFY(s->beamColor(1) == Qt::red);
0082     QCOMPARE(s->lastValue(0), 1.0);
0083     QCOMPARE(s->lastValue(1), 2.0);
0084 
0085     s->removeBeam(1);
0086     QCOMPARE(s->numBeams(), 1);
0087     QVERIFY(s->beamColor(0) == Qt::blue);
0088     QCOMPARE(s->lastValue(0), 1.0);
0089 
0090     s->addBeam(Qt::red);
0091     QCOMPARE(s->numBeams(), 2);
0092     QVERIFY(s->beamColor(0) == Qt::blue);
0093     QVERIFY(s->beamColor(1) == Qt::red);
0094     QCOMPARE(s->lastValue(0), 1.0);
0095     QVERIFY(std::isnan(s->lastValue(1))); // unset, so should default to NaN
0096 }
0097 
0098 void TestSignalPlotter::testReorderBeams()
0099 {
0100     QCOMPARE(s->numBeams(), 0);
0101     QList<int> newOrder;
0102     s->reorderBeams(newOrder); // do nothing
0103     QCOMPARE(s->numBeams(), 0);
0104 
0105     s->addBeam(Qt::blue);
0106     s->addBeam(Qt::red);
0107     QCOMPARE(s->numBeams(), 2);
0108     QVERIFY(s->beamColor(0) == Qt::blue);
0109     QVERIFY(s->beamColor(1) == Qt::red);
0110 
0111     newOrder << 0 << 1; // nothing changed
0112     s->reorderBeams(newOrder);
0113     QCOMPARE(s->numBeams(), 2);
0114     QVERIFY(s->beamColor(0) == Qt::blue);
0115     QVERIFY(s->beamColor(1) == Qt::red);
0116 
0117     newOrder.clear();
0118     newOrder << 1 << 0; // reverse them
0119     s->reorderBeams(newOrder);
0120     QCOMPARE(s->numBeams(), 2);
0121     QVERIFY(s->beamColor(0) == Qt::red);
0122     QVERIFY(s->beamColor(1) == Qt::blue);
0123 
0124     // reverse them back again
0125     s->reorderBeams(newOrder);
0126     QCOMPARE(s->numBeams(), 2);
0127     QVERIFY(s->beamColor(0) == Qt::blue);
0128     QVERIFY(s->beamColor(1) == Qt::red);
0129 
0130     // switch them yet again
0131     s->reorderBeams(newOrder);
0132 
0133     // Add a third beam
0134     s->addBeam(Qt::green);
0135     QCOMPARE(s->numBeams(), 3);
0136     QVERIFY(s->beamColor(0) == Qt::red);
0137     QVERIFY(s->beamColor(1) == Qt::blue);
0138     QVERIFY(s->beamColor(2) == Qt::green);
0139 
0140     newOrder.clear();
0141     newOrder << 2 << 0 << 1;
0142     s->reorderBeams(newOrder);
0143     QCOMPARE(s->numBeams(), 3);
0144     QVERIFY(s->beamColor(0) == Qt::green);
0145     QVERIFY(s->beamColor(1) == Qt::red);
0146     QVERIFY(s->beamColor(2) == Qt::blue);
0147 }
0148 void TestSignalPlotter::testReorderBeamsWithData()
0149 {
0150     QCOMPARE(s->numBeams(), 0);
0151     QList<int> newOrder;
0152 
0153     s->addBeam(Qt::blue);
0154     s->addBeam(Qt::red);
0155     QCOMPARE(s->numBeams(), 2);
0156     QVERIFY(std::isnan(s->lastValue(0))); // unset, so should default to NaN
0157     QVERIFY(std::isnan(s->lastValue(1))); // unset, so should default to NaN
0158     // Add some data
0159     QList<qreal> data;
0160     data << 1.0 << 2.0;
0161     s->addSample(data);
0162     QCOMPARE(s->lastValue(0), 1.0);
0163     QCOMPARE(s->lastValue(1), 2.0);
0164 
0165     newOrder << 0 << 1; // nothing changed
0166     s->reorderBeams(newOrder);
0167     QCOMPARE(s->numBeams(), 2);
0168     QCOMPARE(s->lastValue(0), 1.0);
0169     QCOMPARE(s->lastValue(1), 2.0);
0170 
0171     newOrder.clear();
0172     newOrder << 1 << 0; // reverse them
0173     s->reorderBeams(newOrder);
0174     QCOMPARE(s->numBeams(), 2);
0175     QCOMPARE(s->lastValue(0), 2.0);
0176     QCOMPARE(s->lastValue(1), 1.0);
0177 
0178     // reverse them back again
0179     s->reorderBeams(newOrder);
0180     QCOMPARE(s->numBeams(), 2);
0181     QCOMPARE(s->lastValue(0), 1.0);
0182     QCOMPARE(s->lastValue(1), 2.0);
0183 
0184     // switch them yet again
0185     s->reorderBeams(newOrder);
0186 
0187     // Add a third beam
0188     s->addBeam(Qt::green);
0189     QCOMPARE(s->numBeams(), 3);
0190     QCOMPARE(s->lastValue(0), 2.0);
0191     QCOMPARE(s->lastValue(1), 1.0);
0192     QVERIFY(std::isnan(s->lastValue(2))); // unset, so should default to NaN
0193 
0194     newOrder.clear();
0195     newOrder << 2 << 0 << 1;
0196     s->reorderBeams(newOrder);
0197     QCOMPARE(s->numBeams(), 3);
0198     QVERIFY(std::isnan(s->lastValue(0))); // unset, so should default to NaN
0199     QCOMPARE(s->lastValue(1), 2.0);
0200     QCOMPARE(s->lastValue(2), 1.0);
0201 }
0202 void TestSignalPlotter::testMaximumRange()
0203 {
0204     QCOMPARE(s->maximumValue(), 0.0);
0205     QCOMPARE(s->minimumValue(), 0.0);
0206     QCOMPARE(s->currentMaximumRangeValue(), 0.0);
0207     QCOMPARE(s->currentMinimumRangeValue(), 0.0);
0208     QCOMPARE(s->useAutoRange(), true);
0209 
0210     s->addBeam(Qt::blue);
0211     // Nothing should have changed yet
0212     QCOMPARE(s->maximumValue(), 0.0);
0213     QCOMPARE(s->minimumValue(), 0.0);
0214     QCOMPARE(s->currentMaximumRangeValue(), 0.0);
0215     QCOMPARE(s->currentMinimumRangeValue(), 0.0);
0216 
0217     QList<qreal> data;
0218     data << 1.1;
0219     s->addSample(data);
0220 
0221     QCOMPARE(s->maximumValue(), 0.0);
0222     QCOMPARE(s->minimumValue(), 0.0);
0223 
0224     QCOMPARE(s->currentMaximumRangeValue(), 1.1); // It gets rounded up.
0225     QCOMPARE(s->currentMinimumRangeValue(), 0.0);
0226     QCOMPARE(s->currentAxisPrecision(), 2); // step is 0.22
0227 
0228     s->setMaximumValue(1.0);
0229     QCOMPARE(s->maximumValue(), 1.0);
0230     QCOMPARE(s->minimumValue(), 0.0);
0231     QCOMPARE(s->currentMaximumRangeValue(), 1.1); // Current value is still larger
0232     QCOMPARE(s->currentMinimumRangeValue(), 0.0);
0233     QCOMPARE(s->currentAxisPrecision(), 2);
0234 
0235     s->setMaximumValue(1.4);
0236     QCOMPARE(s->maximumValue(), 1.4);
0237     QCOMPARE(s->minimumValue(), 0.0);
0238     QCOMPARE(s->currentMaximumRangeValue(), 1.4); // given maximum range is now the larger value
0239     QCOMPARE(s->currentMinimumRangeValue(), 0.0);
0240     QCOMPARE(s->currentAxisPrecision(), 2);
0241 
0242     s->addBeam(Qt::red);
0243     // nothing changed by adding a beam
0244     QCOMPARE(s->maximumValue(), 1.4);
0245     QCOMPARE(s->minimumValue(), 0.0);
0246     QCOMPARE(s->currentMaximumRangeValue(), 1.4); // given maximum range hasn't changed
0247     QCOMPARE(s->currentMinimumRangeValue(), 0.0);
0248     QCOMPARE(s->currentAxisPrecision(), 2);
0249 }
0250 
0251 void TestSignalPlotter::testNonZeroRange()
0252 {
0253     s->addBeam(Qt::blue);
0254     s->setMinimumValue(10);
0255     s->setMaximumValue(20);
0256 
0257     QCOMPARE(s->currentMinimumRangeValue(), 10.0); // Current range should be 10, 12, 14, 16, 18, 20
0258     QCOMPARE(s->currentMaximumRangeValue(), 20.0);
0259     QCOMPARE(s->currentAxisPrecision(), 0);
0260 
0261     s->addSample(QList<qreal>() << 15);
0262     s->addSample(QList<qreal>() << 25);
0263     s->addSample(QList<qreal>() << 5);
0264 
0265     QCOMPARE(s->currentMinimumRangeValue(), 5.0);
0266     QCOMPARE(s->currentMaximumRangeValue(), 25.0); // Current range should be 5, 9, 13, 17, 21, 25
0267     QCOMPARE(s->currentAxisPrecision(), 0);
0268 
0269     s->addBeam(Qt::red);
0270     s->addSample(QList<qreal>() << 7 << 9);
0271     s->addSample(QList<qreal>() << 29.8 << 2);
0272 
0273     QCOMPARE(s->currentMinimumRangeValue(), 2.0);
0274     QCOMPARE(s->currentMaximumRangeValue(), 30.0); // Current range should be  2, 7.6, 13.2, 18.8, 24.4, 30
0275     QCOMPARE(s->currentAxisPrecision(), 1);
0276 
0277     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN()); // These should appear as gaps in the data
0278 
0279     QCOMPARE(s->currentMinimumRangeValue(), 2.0);
0280     QCOMPARE(s->currentMaximumRangeValue(), 30.0);
0281     QCOMPARE(s->currentAxisPrecision(), 1);
0282 
0283     s->addSample(QList<qreal>() << 1.0 / 0.0 << -1.0 / 0.0);
0284 
0285     QCOMPARE(s->currentMinimumRangeValue(), 2.0);
0286     QCOMPARE(s->currentMaximumRangeValue(), 30.0);
0287     QCOMPARE(s->currentAxisPrecision(), 1);
0288 }
0289 
0290 void TestSignalPlotter::testNonZeroRange2()
0291 {
0292     s->addBeam(Qt::blue);
0293     s->setMinimumValue(22);
0294     s->setMaximumValue(23);
0295 
0296     QCOMPARE(s->currentMinimumRangeValue(), 22.0);
0297     QCOMPARE(s->currentMaximumRangeValue(), 23.0);
0298 
0299     s->addSample(QList<qreal>() << 25);
0300     QCOMPARE(s->currentMinimumRangeValue(), 22.0);
0301     QCOMPARE(s->currentMaximumRangeValue(), 25.0);
0302 }
0303 
0304 void TestSignalPlotter::testNiceRangeCalculation_data()
0305 {
0306     QTest::addColumn<qreal>("min");
0307     QTest::addColumn<qreal>("max");
0308     QTest::addColumn<qreal>("niceMin");
0309     QTest::addColumn<qreal>("niceMax");
0310     QTest::addColumn<int>("precision");
0311 
0312 #define STRINGIZE(number) #number
0313 #define testRange(min, max, niceMin, niceMax, precision)                                                                                                       \
0314     QTest::newRow(STRINGIZE(min) " to " STRINGIZE(max)) << qreal(min) << qreal(max) << qreal(niceMin) << qreal(niceMax) << int(precision)
0315     /*    testRange(-49,  199, -50, 200, 0);      // Scale should read -50,   0,   50,  100, 150,  200
0316         testRange(-50,  199, -50, 200, 0);      // Scale should read -50,   0,   50,  100, 150,  200
0317         testRange(-49,  200, -50, 200, 0);      // Scale should read -50,   0,   50,  100, 150,  200
0318         testRange(-50,  200, -50, 200, 0);      // Scale should read -50,   0,   50,  100, 150,  200
0319         testRange(-1,   199, -50, 200, 0);      // Scale should read -50,   0,   50,  100, 150,  200
0320         testRange(-99,  149, -100, 150, 0);     // Scale should read -100,  50,  0,   50,  100,  150
0321         testRange(-100, 150, -100, 150, 0);     // Scale should read -100,  50,  0,   50,  100,  150
0322         testRange(-1000, 1000, -1000, 1500, 0); // Scale should read -1000, 500, 0,   500, 1000, 1500 */
0323     testRange(0, 7, 0, 7, 1); // Scale should read 0,     1.4, 2.8, 4.2, 5.6,  7
0324 }
0325 void TestSignalPlotter::testNiceRangeCalculation()
0326 {
0327     QFETCH(qreal, min);
0328     QFETCH(qreal, max);
0329     QFETCH(qreal, niceMin);
0330     QFETCH(qreal, niceMax);
0331     QFETCH(int, precision);
0332 
0333     s->addBeam(Qt::blue);
0334     s->changeRange(min, max);
0335 
0336     QCOMPARE(s->currentMinimumRangeValue(), niceMin);
0337     QCOMPARE(s->currentMaximumRangeValue(), niceMax);
0338     QCOMPARE(s->currentAxisPrecision(), precision);
0339 }
0340 
0341 void TestSignalPlotter::testNegativeMinimumRange()
0342 {
0343     QLocale().setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
0344 
0345     s->setMinimumValue(-1000);
0346     s->setMaximumValue(4000);
0347     QCOMPARE(s->minimumValue(), -1000.0);
0348     QCOMPARE(s->maximumValue(), 4000.0);
0349     QCOMPARE(s->currentMinimumRangeValue(), -1000.0);
0350     QCOMPARE(s->currentMaximumRangeValue(), 4000.0);
0351 
0352     s->setScaleDownBy(1024);
0353     QCOMPARE(s->minimumValue(), -1000.0);
0354     QCOMPARE(s->maximumValue(), 4000.0);
0355     QCOMPARE(s->currentMaximumRangeValue(), 4014.08); // The given range was -0.976KB to 3.906KB.  This was rounded as: -0.98KB to  3.92KB
0356     QCOMPARE(s->currentMinimumRangeValue(), -1003.52);
0357 
0358     QCOMPARE(s->valueAsString(4096, 1), QStringLiteral("4.0"));
0359     QCOMPARE(s->valueAsString(-4096, 1), QStringLiteral("-4.0"));
0360 
0361     s->addBeam(Qt::red);
0362     s->addSample(QList<qreal>() << -1024.0);
0363     QCOMPARE(s->currentMaximumRangeValue(), 4096.0);
0364     QCOMPARE(s->currentMinimumRangeValue(), -1024.0);
0365     s->addSample(QList<qreal>() << -1025.0); // Scale now becomes  -3, -1.5, 0, 1.5, 3, 4.5 in KB
0366     QCOMPARE(s->currentMinimumRangeValue(), -1126.4); //-1.1KB
0367     QCOMPARE(s->currentMaximumRangeValue(), 4505.6); // 4.4KB
0368 }
0369 void TestSignalPlotter::testSetBeamColor()
0370 {
0371     s->addBeam(Qt::red);
0372     s->setBeamColor(0, Qt::blue);
0373     QVERIFY(s->beamColor(0) == Qt::blue);
0374     QCOMPARE(s->numBeams(), 1);
0375 
0376     s->addBeam(Qt::red);
0377     QVERIFY(s->beamColor(0) == Qt::blue);
0378     QVERIFY(s->beamColor(1) == Qt::red);
0379     QCOMPARE(s->numBeams(), 2);
0380 
0381     s->setBeamColor(0, Qt::green);
0382     QVERIFY(s->beamColor(0) == Qt::green);
0383     QVERIFY(s->beamColor(1) == Qt::red);
0384     QCOMPARE(s->numBeams(), 2);
0385 
0386     s->setBeamColor(1, Qt::blue);
0387     QVERIFY(s->beamColor(0) == Qt::green);
0388     QVERIFY(s->beamColor(1) == Qt::blue);
0389 
0390     s->removeBeam(0);
0391     QVERIFY(s->beamColor(0) == Qt::blue);
0392     s->setBeamColor(0, Qt::red);
0393     QVERIFY(s->beamColor(0) == Qt::red);
0394 }
0395 
0396 void TestSignalPlotter::testSetUnit()
0397 {
0398     // Test default
0399     QCOMPARE(s->valueAsString(3e20, 1), QStringLiteral("3e+20"));
0400     QCOMPARE(s->valueAsString(-3e20, 1), QStringLiteral("-3e+20"));
0401 
0402     s->setUnit(ki18ncp("Units", "%1 second", "%1 seconds"));
0403 
0404     QSKIP("I18n problems");
0405     QCOMPARE(s->valueAsString(3e20, 1), QStringLiteral("3e+20 seconds"));
0406     QCOMPARE(s->valueAsString(-3e20, 1), QStringLiteral("-3e+20 seconds"));
0407     QCOMPARE(s->valueAsString(3.4, 1), QStringLiteral("3.4 seconds"));
0408     QCOMPARE(s->valueAsString(-3.4, 1), QStringLiteral("-3.4 seconds"));
0409     QCOMPARE(s->valueAsString(1), QStringLiteral("1.0 seconds"));
0410     QCOMPARE(s->valueAsString(-1), QStringLiteral("-1.0 seconds"));
0411     QCOMPARE(s->valueAsString(1, 0), QStringLiteral("1 second"));
0412     QCOMPARE(s->valueAsString(-1, 0), QStringLiteral("-1 second"));
0413 
0414     // now switch to minutes
0415     s->setScaleDownBy(60);
0416     s->setUnit(ki18ncp("Units", "%1 minute", "%1 minutes"));
0417     QCOMPARE(s->valueAsString(3.4), QStringLiteral("0.06 minutes"));
0418     QCOMPARE(s->valueAsString(-3.4), QStringLiteral("-0.06 minutes"));
0419     QCOMPARE(s->valueAsString(60), QStringLiteral("1.0 minutes"));
0420     QCOMPARE(s->valueAsString(-60), QStringLiteral("-1.0 minutes"));
0421     QCOMPARE(s->valueAsString(60, 0), QStringLiteral("1 minute"));
0422     QCOMPARE(s->valueAsString(-60, 0), QStringLiteral("-1 minute"));
0423 }
0424 
0425 void TestSignalPlotter::testGettersSetters()
0426 {
0427     // basic test of all the getters and setters and default values
0428     KLocalizedString string = ki18ncp("Units", "%1 second", "%1 seconds");
0429     s->setUnit(string);
0430     QVERIFY(s->unit().toString() == string.toString());
0431     s->setMaximumValue(3);
0432     s->setMinimumValue(-3);
0433     QCOMPARE(s->maximumValue(), 3.0);
0434     QCOMPARE(s->minimumValue(), -3.0);
0435 
0436     s->changeRange(-2, 2);
0437     QCOMPARE(s->maximumValue(), 2.0);
0438     QCOMPARE(s->minimumValue(), -2.0);
0439 
0440     s->setMinimumValue(-3);
0441     QCOMPARE(s->useAutoRange(), true); // default
0442     s->setUseAutoRange(false);
0443     QCOMPARE(s->useAutoRange(), false);
0444 
0445     QCOMPARE(s->scaleDownBy(), 1.0); // default
0446     s->setScaleDownBy(1.2);
0447     QCOMPARE(s->scaleDownBy(), 1.2);
0448     s->setScaleDownBy(0.5);
0449     QCOMPARE(s->scaleDownBy(), 0.5);
0450 
0451     QCOMPARE(s->horizontalScale(), 6); // default
0452     s->setHorizontalScale(2);
0453     QCOMPARE(s->horizontalScale(), 2);
0454     s->setHorizontalScale(1);
0455     QCOMPARE(s->horizontalScale(), 1);
0456     s->setHorizontalScale(0); // Ignored - invalid value
0457     QCOMPARE(s->horizontalScale(), 1);
0458 
0459     QCOMPARE(s->showHorizontalLines(), true); // default
0460     s->setShowHorizontalLines(false);
0461     QCOMPARE(s->showHorizontalLines(), false);
0462 
0463     QCOMPARE(s->showVerticalLines(), false); // default
0464     s->setShowVerticalLines(true);
0465     QCOMPARE(s->showVerticalLines(), true);
0466 
0467     QCOMPARE(s->verticalLinesScroll(), true); // default
0468     s->setVerticalLinesScroll(false);
0469     QCOMPARE(s->verticalLinesScroll(), false);
0470 
0471     QCOMPARE(s->verticalLinesDistance(), (uint)30); // default
0472     s->setVerticalLinesDistance(1);
0473     QCOMPARE(s->verticalLinesDistance(), (uint)1);
0474 
0475     QCOMPARE(s->showAxis(), true); // default
0476     s->setShowAxis(false);
0477     QCOMPARE(s->showAxis(), false);
0478 
0479     QCOMPARE(s->maxAxisTextWidth(), 0); // default
0480     s->setMaxAxisTextWidth(30);
0481     QCOMPARE(s->maxAxisTextWidth(), 30);
0482     s->setMaxAxisTextWidth(0);
0483     QCOMPARE(s->maxAxisTextWidth(), 0);
0484 
0485     QCOMPARE(s->smoothGraph(), true); // default
0486     s->setSmoothGraph(false);
0487     QCOMPARE(s->smoothGraph(), false);
0488 
0489     QCOMPARE(s->stackGraph(), false); // default
0490     s->setStackGraph(true);
0491     QCOMPARE(s->stackGraph(), true);
0492 
0493     QCOMPARE(s->fillOpacity(), 20); // default
0494     s->setFillOpacity(255);
0495     QCOMPARE(s->fillOpacity(), 255);
0496     s->setFillOpacity(0);
0497     QCOMPARE(s->fillOpacity(), 0);
0498 }
0499 void TestSignalPlotter::testAddingData()
0500 {
0501     QCOMPARE(s->useAutoRange(), true);
0502     s->setGeometry(0, 0, 500, 500);
0503     // Test adding sample without any beams.  It should just ignore this
0504     s->addSample(QList<qreal>() << 1.0 << 2.0);
0505     // Test setting the beam color of a non-existent beam.  It should just ignore this too.
0506     //    s->setBeamColor(0, Qt::blue);
0507 
0508     // Add an empty sample.  This should just be ignored?
0509     s->addSample(QList<qreal>());
0510 
0511     // Okay let's be serious now
0512     s->addBeam(Qt::red);
0513     s->addSample(QList<qreal>() << 0.0);
0514     s->addSample(QList<qreal>() << -0.0);
0515     s->addSample(QList<qreal>() << -1.0);
0516     s->addSample(QList<qreal>() << -1000.0);
0517     s->addSample(QList<qreal>() << 1000.0);
0518     s->addSample(QList<qreal>() << 300.0);
0519     s->addSample(QList<qreal>() << 300.0);
0520     s->addSample(QList<qreal>() << 300.0);
0521     s->addSample(QList<qreal>() << 300.0);
0522     s->addSample(QList<qreal>() << 300.0);
0523     s->addSample(QList<qreal>() << 300.0);
0524     s->addSample(QList<qreal>() << 1.0 / 0.0); // Positive infinity.  Should be ignore for range values, not crash, and draw something reasonable
0525     s->addSample(QList<qreal>() << 1.0 / 0.0); // Positive infinity.  Should be ignore for range values, not crash, and draw something reasonable
0526     s->addSample(QList<qreal>() << 1.0 / 0.0); // Positive infinity.  Should be ignore for range values, not crash, and draw something reasonable
0527     s->addSample(QList<qreal>() << 1.0 / 0.0); // Positive infinity.  Should be ignore for range values, not crash, and draw something reasonable
0528     s->addSample(QList<qreal>() << 1.0 / 0.0); // Positive infinity.  Should be ignore for range values, not crash, and draw something reasonable
0529     s->addSample(QList<qreal>() << -1.0 / 0.0); // Positive infinity.  Likewise.
0530     s->addSample(QList<qreal>() << -1.0 / 0.0); // Negative infinity.  Likewise.
0531     s->addSample(QList<qreal>() << -1.0 / 0.0); // Negative infinity.  Likewise.
0532     s->addSample(QList<qreal>() << -1.0 / 0.0); // Negative infinity.  Likewise.
0533     s->addSample(QList<qreal>() << -1.0 / 0.0); // Negative infinity.  Likewise.
0534     s->addSample(QList<qreal>() << -1.0 / 0.0); // Negative infinity.  Likewise.
0535     s->addSample(QList<qreal>() << 300.0);
0536     s->addSample(QList<qreal>() << 300.0);
0537     s->addSample(QList<qreal>() << 300.0);
0538     s->addSample(QList<qreal>() << 300.0);
0539     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN()); // These should appear as gaps in the data
0540     s->addSample(QList<qreal>() << 300.0);
0541     s->addSample(QList<qreal>() << 300.0);
0542     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN());
0543     s->addSample(QList<qreal>() << 400.0);
0544     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN());
0545     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN());
0546     s->addBeam(Qt::green);
0547     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN() << 100.0);
0548     s->addSample(QList<qreal>() << std::numeric_limits<qreal>::quiet_NaN() << 100.0);
0549     s->addSample(QList<qreal>() << 200.0 << 100.0);
0550     s->addSample(QList<qreal>() << 300.0 << 100.0);
0551     s->addBeam(Qt::blue);
0552     s->addSample(QList<qreal>() << 400.0 << 100.0 << 200.0);
0553     s->addSample(QList<qreal>() << 500.0 << 100.0 << 200.0);
0554     s->addSample(QList<qreal>() << 600.0 << 100.0 << 200.0);
0555 
0556     QCOMPARE(s->currentMinimumRangeValue(), -1000.0);
0557     QCOMPARE(s->currentMaximumRangeValue(), 1500.0);
0558 
0559     // Paint to a device, to check that the painter does not crash etc
0560     QPixmap pixmap(s->size());
0561     s->render(&pixmap);
0562 
0563     // For debugging, show the widget so that we can check it visually
0564     //    s->show();
0565     //    QTest::qWait(10000);
0566 
0567     // Test that it does not crash at small sizes
0568     for (int x = 0; x < 4; x++)
0569         for (int y = 0; y < 4; y++) {
0570             s->setGeometry(0, 0, x, y);
0571             s->render(&pixmap);
0572         }
0573 }
0574 QTEST_MAIN(TestSignalPlotter)