File indexing completed on 2024-05-19 04:34:07

0001 /***************************************************************************
0002  *                                                                         *
0003  *   copyright : (C) 2007 The University of Toronto                        *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  ***************************************************************************/
0011 
0012 #include "testeditablematrix.h"
0013 
0014 #include <QtTest>
0015 
0016 #include <math_kst.h>
0017 #include <datacollection.h>
0018 #include <objectstore.h>
0019 #include <editablematrix.h>
0020 
0021 static Kst::ObjectStore _store;
0022 
0023 void TestEditableMatrix::cleanupTestCase() {
0024     _store.clear();
0025 }
0026 
0027 
0028 QDomDocument TestEditableMatrix::makeDOMElement(const QString& tag, const int nx, const int ny, const double xmin, const double ymin, const double xstep, const double ystep, const int dataSize) {
0029   // Should be some boundary checking in the constructor.
0030   QDomDocument amDOM("amdocument");
0031   QDomElement amElement, child, dataset;
0032   QDomText text;
0033 
0034   amElement = amDOM.createElement("amDOMTest");
0035 
0036   child = amDOM.createElement("tag");
0037   text = amDOM.createTextNode(tag);
0038   child.appendChild(text);
0039   amElement.appendChild(child);
0040 
0041   child = amDOM.createElement("nx");
0042   text = amDOM.createTextNode(QString::number(nx));
0043   child.appendChild(text);
0044   amElement.appendChild(child);
0045 
0046   child = amDOM.createElement("ny");
0047   text = amDOM.createTextNode(QString::number(ny));
0048   child.appendChild(text);
0049   amElement.appendChild(child);
0050 
0051   child = amDOM.createElement("xmin");
0052   text = amDOM.createTextNode(QString::number(xmin));
0053   child.appendChild(text);
0054   amElement.appendChild(child);
0055 
0056   child = amDOM.createElement("ymin");
0057   text = amDOM.createTextNode(QString::number(ymin));
0058   child.appendChild(text);
0059   amElement.appendChild(child);
0060 
0061   child = amDOM.createElement("xstep");
0062   text = amDOM.createTextNode(QString::number(xstep));
0063   child.appendChild(text);
0064   amElement.appendChild(child);
0065 
0066   child = amDOM.createElement("ystep");
0067   text = amDOM.createTextNode(QString::number(ystep));
0068   child.appendChild(text);
0069   amElement.appendChild(child);
0070 
0071 
0072   child = amDOM.createElement("data");
0073   QByteArray qba;
0074   qba.reserve(dataSize*sizeof(double));
0075   QDataStream qds(&qba, QIODevice::WriteOnly);
0076 
0077   for (int i = 0; i < dataSize; i++) {
0078     qds << 1.1;
0079   }
0080 
0081   text = amDOM.createTextNode(QString(qCompress(qba).toBase64()));
0082 
0083   child.appendChild(text);
0084   amElement.appendChild(child);
0085 
0086   amDOM.appendChild(amElement);
0087 
0088   return amDOM;
0089 }
0090 
0091 void TestEditableMatrix::testEditableMatrix() {
0092 
0093   bool ok = true;
0094 
0095   //FIXME: dom based constructor no longer used in kst.  Use a factory instead
0096 //   QDomNode n = makeDOMElement("amDOM", 0, 0, 0, 0, 1, 1, 9).firstChild();
0097 //   QDomElement e = n.toElement();
0098 // 
0099 //   //basic default constructor values
0100 //   Kst::EditableMatrixPtr am1 = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>(e));
0101 //   QVERIFY(am1->tag().tagString().startsWith("amDOM"));
0102 //   QCOMPARE(am1->sampleCount(), 0);
0103 //   QCOMPARE(am1->minValue(), 0.0);
0104 //   QCOMPARE(am1->maxValue(), 0.0);
0105 //   QCOMPARE(am1->value(0, 0, &ok), 0.0);
0106 //   QVERIFY(!ok);
0107 //   QCOMPARE(am1->value(10, 10, &ok), 0.0); //should be outside the boundaries.
0108 //   QVERIFY(!ok);
0109 //   QCOMPARE(am1->sampleCount(), 0);
0110 //   QCOMPARE(am1->meanValue(), 0.0);
0111 
0112   //basic symmetrical matrix
0113 //   n = makeDOMElement("Symmetrical", 3, 3, 0, 0, 1, 1, 9).firstChild();
0114 //   e = n.toElement();
0115 // 
0116 //   //basic default constructor values
0117 //   Kst::EditableMatrixPtr am2 = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>(e));
0118 // 
0119 //   QCOMPARE(am2->tag().tagString(), QLatin1String("Symmetrical"));
0120 //   QVERIFY(am2->resize(3, 3, true));
0121 // 
0122 //   for(int i =0 ; i < 3; i++){
0123 //     for(int j = 0; j < 3; j++){
0124 //       QCOMPARE(am2->value(i, j, &ok), 1.1);
0125 //       QVERIFY(ok);
0126 //     }
0127 //   }
0128 // 
0129 //   QVERIFY(am2->editable());
0130 //   QCOMPARE(am2->xNumSteps(), 3);
0131 //   QCOMPARE(am2->yNumSteps(), 3);
0132 //   QCOMPARE(am2->minX(), 0.0);
0133 //   QCOMPARE(am2->minY(), 0.0);
0134 //   QCOMPARE(am2->xStepSize(), 1.0);
0135 //   QCOMPARE(am2->yStepSize(), 1.0);
0136 //   QCOMPARE(am2->sampleCount(), 9);
0137 // 
0138 //   QVERIFY(am2->setValueRaw(1, 1, 5));
0139 //   ok = true;
0140 //   QCOMPARE(am2->value(1, 1, &ok), 5.0);
0141 //   QVERIFY(ok);
0142 // 
0143 //   am2->blank();
0144 // 
0145 //   am2->change(3, 3, 0, 0, 0, 0); //should not be legal
0146 //   QCOMPARE(am2->xNumSteps(), 3);
0147 //   QCOMPARE(am2->yNumSteps(), 3);
0148 //   QCOMPARE(am2->minX(), 0.0);
0149 //   QCOMPARE(am2->minY(), 0.0);
0150 //   QCOMPARE(am2->xStepSize(), 0.0);
0151 //   QCOMPARE(am2->yStepSize(), 0.0);
0152 //   QCOMPARE(am2->sampleCount(), 9);
0153 // 
0154 //   QVERIFY(!am2->setValue(0, 0, 1));
0155 //   ok = true;
0156 //   QCOMPARE(am2->value(0, 0, &ok), 0.0);
0157 //   QVERIFY(!ok);
0158 // 
0159 //   QVERIFY(!am2->setValue(1, 1, 5.0));
0160 //   QVERIFY(am2->value(1, 1) != 5.0);
0161 //   QVERIFY(am2->setValueRaw(2, 2, 6.0)); //fails
0162 
0163   Kst::EditableMatrixPtr um1 = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>());
0164   Q_ASSERT(um1);
0165   um1->resize(3, 3, true);
0166   um1->setEditable(true);
0167   QVERIFY(um1->setValue(0, 0, 1));
0168   QVERIFY(um1->setValue(1, 1, 1));
0169   QVERIFY(um1->setValue(2, 2, 1));
0170 
0171   QCOMPARE(um1->value(0, 0, &ok), 1.0);
0172   QVERIFY(ok);
0173   QCOMPARE(um1->value(0, 1, &ok), 0.0);
0174   QVERIFY(ok);
0175   QCOMPARE(um1->value(0, 2, &ok), 0.0);
0176   QVERIFY(ok);
0177   QCOMPARE(um1->value(1, 0, &ok), 0.0);
0178   QVERIFY(ok);
0179   QCOMPARE(um1->value(1, 1, &ok), 1.0);
0180   QVERIFY(ok);
0181   QCOMPARE(um1->value(1, 2, &ok), 0.0);
0182   QVERIFY(ok);
0183   QCOMPARE(um1->value(2, 0, &ok), 0.0);
0184   QVERIFY(ok);
0185   QCOMPARE(um1->value(2, 1, &ok), 0.0);
0186   QVERIFY(ok);
0187   QCOMPARE(um1->value(2, 2, &ok), 1.0);
0188   QVERIFY(ok);
0189 
0190   QVERIFY(um1->resize(3, 3, false));
0191   um1->zero();
0192   QCOMPARE(um1->value(0, 0, &ok), 0.0);
0193   QVERIFY(ok);
0194   QCOMPARE(um1->value(0, 1, &ok), 0.0);
0195   QVERIFY(ok);
0196   QCOMPARE(um1->value(0, 2, &ok), 0.0);
0197   QVERIFY(ok);
0198   QCOMPARE(um1->value(1, 0, &ok), 0.0);
0199   QVERIFY(ok);
0200   QCOMPARE(um1->value(1, 1, &ok), 0.0);
0201   QVERIFY(ok);
0202   QCOMPARE(um1->value(1, 2, &ok), 0.0);
0203   QVERIFY(ok);
0204   QCOMPARE(um1->value(2, 0, &ok), 0.0);
0205   QVERIFY(ok);
0206   QCOMPARE(um1->value(2, 1, &ok), 0.0);
0207   QVERIFY(ok);
0208   QCOMPARE(um1->value(2, 2, &ok), 0.0);
0209   QVERIFY(ok);
0210 
0211   QVERIFY(um1->setValue(0, 0, 1));
0212   QVERIFY(um1->setValue(1, 1, 1));
0213   QVERIFY(um1->setValue(2, 2, 1));
0214 
0215   QVERIFY(um1->resize(2, 2, false));
0216   QCOMPARE(um1->sampleCount(), 4);
0217 
0218   QCOMPARE(um1->value(0, 0, &ok), 1.0);
0219   QVERIFY(ok);
0220   QCOMPARE(um1->value(0, 1, &ok), 0.0);
0221   QVERIFY(ok);
0222   QCOMPARE(um1->value(0, 2, &ok), 0.0);
0223   QVERIFY(!ok);
0224   QCOMPARE(um1->value(1, 0, &ok), 0.0);
0225   QVERIFY(ok);
0226   QCOMPARE(um1->value(1, 1, &ok), 1.0);
0227   QVERIFY(ok);
0228   QCOMPARE(um1->value(1, 2, &ok), 0.0);
0229   QVERIFY(!ok);
0230 
0231   QVERIFY(um1->resize(4, 4, true));
0232   QCOMPARE(um1->value(0, 0, &ok), 1.0);
0233   QVERIFY(ok);
0234   QCOMPARE(um1->value(0, 1, &ok), 0.0);
0235   QVERIFY(ok);
0236   QCOMPARE(um1->value(0, 2, &ok), 0.0);
0237   QVERIFY(ok);
0238   QCOMPARE(um1->value(0, 3, &ok), 0.0);
0239   QVERIFY(ok);
0240   QCOMPARE(um1->value(1, 0, &ok), 0.0);
0241   QVERIFY(ok);
0242   QCOMPARE(um1->value(1, 1, &ok), 1.0);
0243   QVERIFY(ok);
0244   QCOMPARE(um1->value(1, 2, &ok), 0.0);
0245   QVERIFY(ok);
0246   QCOMPARE(um1->value(1, 3, &ok), 0.0);
0247   QVERIFY(ok);
0248   QCOMPARE(um1->value(2, 0, &ok), 0.0);
0249   QVERIFY(ok);
0250   QCOMPARE(um1->value(2, 1, &ok), 0.0);
0251   QVERIFY(ok);
0252   QCOMPARE(um1->value(2, 2, &ok), 0.0);
0253   QVERIFY(ok);
0254   QCOMPARE(um1->value(2, 3, &ok), 0.0);
0255   QVERIFY(ok);
0256   QCOMPARE(um1->value(3, 0, &ok), 0.0);
0257   QVERIFY(ok);
0258   QCOMPARE(um1->value(3, 1, &ok), 0.0);
0259   QVERIFY(ok);
0260   QCOMPARE(um1->value(3, 2, &ok), 0.0);
0261   QVERIFY(ok);
0262   QCOMPARE(um1->value(3, 3, &ok), 0.0);
0263   QVERIFY(ok);
0264 
0265 
0266 
0267   QVERIFY(um1->resize(3, 3, false));
0268   QVERIFY(um1->setValue(0, 0, 1.716299));
0269   QVERIFY(um1->setValue(0, 1, -0.485527));
0270   QVERIFY(um1->setValue(0, 2, -0.288690));
0271   QVERIFY(um1->setValue(1, 0, 1.716299));
0272   QVERIFY(um1->setValue(1, 1, NAN));
0273   QVERIFY(um1->setValue(1, 2, -0.274957));
0274   QVERIFY(um1->setValue(2, 0, 1.711721));
0275   QVERIFY(um1->setValue(2, 1, -0.485527));
0276   QVERIFY(um1->setValue(2, 2, -0.293267));
0277 
0278   QCOMPARE(um1->value(0, 0), 1.716299);
0279   QCOMPARE(um1->value(0, 1),  -0.485527);
0280   QCOMPARE(um1->value(0, 2), -0.288690);
0281   QCOMPARE(um1->value(1, 0), 1.716299);
0282   QCOMPARE(um1->value(1, 1), 0.0);
0283   QCOMPARE(um1->value(1, 2), -0.274957);
0284   QCOMPARE(um1->value(2, 0), 1.711721);
0285   QCOMPARE(um1->value(2, 1), -0.485527);
0286   QCOMPARE(um1->value(2, 2), -0.293267);
0287 
0288   QCOMPARE(um1->minValue(), 0.0);
0289   QCOMPARE(um1->maxValue(), 0.0);
0290 
0291   Kst::EditableMatrixPtr sm = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>());
0292   Q_ASSERT(sm);
0293   sm->change(2, 2, 0.0, 0.0, 1.0, 1.0);
0294   sm->setEditable(true);
0295   QVERIFY(sm->resize(2, 2, false));
0296   QCOMPARE(sm->xNumSteps(), 2);
0297   QCOMPARE(sm->yNumSteps(), 2);
0298 
0299   QVERIFY(sm->setValueRaw(0, 0, 0.0));
0300   QVERIFY(sm->setValueRaw(0, 1, 0.1));
0301   QVERIFY(sm->setValueRaw(1, 0, 1.0));
0302   QVERIFY(sm->setValueRaw(1, 1, 1.1));
0303 
0304   sm->calcNoSpikeRange(0);
0305   QCOMPARE(sm->minValueNoSpike(), 0.0);
0306   QCOMPARE(sm->maxValueNoSpike(), 0.0);
0307 
0308   sm->calcNoSpikeRange(-100);
0309   QCOMPARE(sm->minValueNoSpike(), 0.0);
0310   QCOMPARE(sm->maxValueNoSpike(), 0.0);
0311 
0312   sm->calcNoSpikeRange(0.9);
0313   QVERIFY(sm->minValueNoSpike() >= 1E+300 );
0314   QVERIFY(sm->maxValueNoSpike() <= -1E+300);
0315 }
0316 
0317 #ifdef KST_USE_QTEST_MAIN
0318 QTEST_MAIN(TestEditableMatrix)
0319 #endif