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