1 /***************************************************************************
2 * *
3 * copyright : (C) 2007 The University of Toronto *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 ***************************************************************************/
11
12 #include "testeditablematrix.h"
13
14 #include <QtTest>
15
16 #include <math_kst.h>
17 #include <datacollection.h>
18 #include <objectstore.h>
19 #include <editablematrix.h>
20
21 static Kst::ObjectStore _store;
22
cleanupTestCase()23 void TestEditableMatrix::cleanupTestCase() {
24 _store.clear();
25 }
26
27
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)28 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) {
29 // Should be some boundary checking in the constructor.
30 QDomDocument amDOM("amdocument");
31 QDomElement amElement, child, dataset;
32 QDomText text;
33
34 amElement = amDOM.createElement("amDOMTest");
35
36 child = amDOM.createElement("tag");
37 text = amDOM.createTextNode(tag);
38 child.appendChild(text);
39 amElement.appendChild(child);
40
41 child = amDOM.createElement("nx");
42 text = amDOM.createTextNode(QString::number(nx));
43 child.appendChild(text);
44 amElement.appendChild(child);
45
46 child = amDOM.createElement("ny");
47 text = amDOM.createTextNode(QString::number(ny));
48 child.appendChild(text);
49 amElement.appendChild(child);
50
51 child = amDOM.createElement("xmin");
52 text = amDOM.createTextNode(QString::number(xmin));
53 child.appendChild(text);
54 amElement.appendChild(child);
55
56 child = amDOM.createElement("ymin");
57 text = amDOM.createTextNode(QString::number(ymin));
58 child.appendChild(text);
59 amElement.appendChild(child);
60
61 child = amDOM.createElement("xstep");
62 text = amDOM.createTextNode(QString::number(xstep));
63 child.appendChild(text);
64 amElement.appendChild(child);
65
66 child = amDOM.createElement("ystep");
67 text = amDOM.createTextNode(QString::number(ystep));
68 child.appendChild(text);
69 amElement.appendChild(child);
70
71
72 child = amDOM.createElement("data");
73 QByteArray qba;
74 qba.reserve(dataSize*sizeof(double));
75 QDataStream qds(&qba, QIODevice::WriteOnly);
76
77 for (int i = 0; i < dataSize; i++) {
78 qds << 1.1;
79 }
80
81 text = amDOM.createTextNode(QString(qCompress(qba).toBase64()));
82
83 child.appendChild(text);
84 amElement.appendChild(child);
85
86 amDOM.appendChild(amElement);
87
88 return amDOM;
89 }
90
testEditableMatrix()91 void TestEditableMatrix::testEditableMatrix() {
92
93 bool ok = true;
94
95 //FIXME: dom based constructor no longer used in kst. Use a factory instead
96 // QDomNode n = makeDOMElement("amDOM", 0, 0, 0, 0, 1, 1, 9).firstChild();
97 // QDomElement e = n.toElement();
98 //
99 // //basic default constructor values
100 // Kst::EditableMatrixPtr am1 = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>(e));
101 // QVERIFY(am1->tag().tagString().startsWith("amDOM"));
102 // QCOMPARE(am1->sampleCount(), 0);
103 // QCOMPARE(am1->minValue(), 0.0);
104 // QCOMPARE(am1->maxValue(), 0.0);
105 // QCOMPARE(am1->value(0, 0, &ok), 0.0);
106 // QVERIFY(!ok);
107 // QCOMPARE(am1->value(10, 10, &ok), 0.0); //should be outside the boundaries.
108 // QVERIFY(!ok);
109 // QCOMPARE(am1->sampleCount(), 0);
110 // QCOMPARE(am1->meanValue(), 0.0);
111
112 //basic symmetrical matrix
113 // n = makeDOMElement("Symmetrical", 3, 3, 0, 0, 1, 1, 9).firstChild();
114 // e = n.toElement();
115 //
116 // //basic default constructor values
117 // Kst::EditableMatrixPtr am2 = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>(e));
118 //
119 // QCOMPARE(am2->tag().tagString(), QLatin1String("Symmetrical"));
120 // QVERIFY(am2->resize(3, 3, true));
121 //
122 // for(int i =0 ; i < 3; i++){
123 // for(int j = 0; j < 3; j++){
124 // QCOMPARE(am2->value(i, j, &ok), 1.1);
125 // QVERIFY(ok);
126 // }
127 // }
128 //
129 // QVERIFY(am2->editable());
130 // QCOMPARE(am2->xNumSteps(), 3);
131 // QCOMPARE(am2->yNumSteps(), 3);
132 // QCOMPARE(am2->minX(), 0.0);
133 // QCOMPARE(am2->minY(), 0.0);
134 // QCOMPARE(am2->xStepSize(), 1.0);
135 // QCOMPARE(am2->yStepSize(), 1.0);
136 // QCOMPARE(am2->sampleCount(), 9);
137 //
138 // QVERIFY(am2->setValueRaw(1, 1, 5));
139 // ok = true;
140 // QCOMPARE(am2->value(1, 1, &ok), 5.0);
141 // QVERIFY(ok);
142 //
143 // am2->blank();
144 //
145 // am2->change(3, 3, 0, 0, 0, 0); //should not be legal
146 // QCOMPARE(am2->xNumSteps(), 3);
147 // QCOMPARE(am2->yNumSteps(), 3);
148 // QCOMPARE(am2->minX(), 0.0);
149 // QCOMPARE(am2->minY(), 0.0);
150 // QCOMPARE(am2->xStepSize(), 0.0);
151 // QCOMPARE(am2->yStepSize(), 0.0);
152 // QCOMPARE(am2->sampleCount(), 9);
153 //
154 // QVERIFY(!am2->setValue(0, 0, 1));
155 // ok = true;
156 // QCOMPARE(am2->value(0, 0, &ok), 0.0);
157 // QVERIFY(!ok);
158 //
159 // QVERIFY(!am2->setValue(1, 1, 5.0));
160 // QVERIFY(am2->value(1, 1) != 5.0);
161 // QVERIFY(am2->setValueRaw(2, 2, 6.0)); //fails
162
163 Kst::EditableMatrixPtr um1 = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>());
164 Q_ASSERT(um1);
165 um1->resize(3, 3, true);
166 um1->setEditable(true);
167 QVERIFY(um1->setValue(0, 0, 1));
168 QVERIFY(um1->setValue(1, 1, 1));
169 QVERIFY(um1->setValue(2, 2, 1));
170
171 QCOMPARE(um1->value(0, 0, &ok), 1.0);
172 QVERIFY(ok);
173 QCOMPARE(um1->value(0, 1, &ok), 0.0);
174 QVERIFY(ok);
175 QCOMPARE(um1->value(0, 2, &ok), 0.0);
176 QVERIFY(ok);
177 QCOMPARE(um1->value(1, 0, &ok), 0.0);
178 QVERIFY(ok);
179 QCOMPARE(um1->value(1, 1, &ok), 1.0);
180 QVERIFY(ok);
181 QCOMPARE(um1->value(1, 2, &ok), 0.0);
182 QVERIFY(ok);
183 QCOMPARE(um1->value(2, 0, &ok), 0.0);
184 QVERIFY(ok);
185 QCOMPARE(um1->value(2, 1, &ok), 0.0);
186 QVERIFY(ok);
187 QCOMPARE(um1->value(2, 2, &ok), 1.0);
188 QVERIFY(ok);
189
190 QVERIFY(um1->resize(3, 3, false));
191 um1->zero();
192 QCOMPARE(um1->value(0, 0, &ok), 0.0);
193 QVERIFY(ok);
194 QCOMPARE(um1->value(0, 1, &ok), 0.0);
195 QVERIFY(ok);
196 QCOMPARE(um1->value(0, 2, &ok), 0.0);
197 QVERIFY(ok);
198 QCOMPARE(um1->value(1, 0, &ok), 0.0);
199 QVERIFY(ok);
200 QCOMPARE(um1->value(1, 1, &ok), 0.0);
201 QVERIFY(ok);
202 QCOMPARE(um1->value(1, 2, &ok), 0.0);
203 QVERIFY(ok);
204 QCOMPARE(um1->value(2, 0, &ok), 0.0);
205 QVERIFY(ok);
206 QCOMPARE(um1->value(2, 1, &ok), 0.0);
207 QVERIFY(ok);
208 QCOMPARE(um1->value(2, 2, &ok), 0.0);
209 QVERIFY(ok);
210
211 QVERIFY(um1->setValue(0, 0, 1));
212 QVERIFY(um1->setValue(1, 1, 1));
213 QVERIFY(um1->setValue(2, 2, 1));
214
215 QVERIFY(um1->resize(2, 2, false));
216 QCOMPARE(um1->sampleCount(), 4);
217
218 QCOMPARE(um1->value(0, 0, &ok), 1.0);
219 QVERIFY(ok);
220 QCOMPARE(um1->value(0, 1, &ok), 0.0);
221 QVERIFY(ok);
222 QCOMPARE(um1->value(0, 2, &ok), 0.0);
223 QVERIFY(!ok);
224 QCOMPARE(um1->value(1, 0, &ok), 0.0);
225 QVERIFY(ok);
226 QCOMPARE(um1->value(1, 1, &ok), 1.0);
227 QVERIFY(ok);
228 QCOMPARE(um1->value(1, 2, &ok), 0.0);
229 QVERIFY(!ok);
230
231 QVERIFY(um1->resize(4, 4, true));
232 QCOMPARE(um1->value(0, 0, &ok), 1.0);
233 QVERIFY(ok);
234 QCOMPARE(um1->value(0, 1, &ok), 0.0);
235 QVERIFY(ok);
236 QCOMPARE(um1->value(0, 2, &ok), 0.0);
237 QVERIFY(ok);
238 QCOMPARE(um1->value(0, 3, &ok), 0.0);
239 QVERIFY(ok);
240 QCOMPARE(um1->value(1, 0, &ok), 0.0);
241 QVERIFY(ok);
242 QCOMPARE(um1->value(1, 1, &ok), 1.0);
243 QVERIFY(ok);
244 QCOMPARE(um1->value(1, 2, &ok), 0.0);
245 QVERIFY(ok);
246 QCOMPARE(um1->value(1, 3, &ok), 0.0);
247 QVERIFY(ok);
248 QCOMPARE(um1->value(2, 0, &ok), 0.0);
249 QVERIFY(ok);
250 QCOMPARE(um1->value(2, 1, &ok), 0.0);
251 QVERIFY(ok);
252 QCOMPARE(um1->value(2, 2, &ok), 0.0);
253 QVERIFY(ok);
254 QCOMPARE(um1->value(2, 3, &ok), 0.0);
255 QVERIFY(ok);
256 QCOMPARE(um1->value(3, 0, &ok), 0.0);
257 QVERIFY(ok);
258 QCOMPARE(um1->value(3, 1, &ok), 0.0);
259 QVERIFY(ok);
260 QCOMPARE(um1->value(3, 2, &ok), 0.0);
261 QVERIFY(ok);
262 QCOMPARE(um1->value(3, 3, &ok), 0.0);
263 QVERIFY(ok);
264
265
266
267 QVERIFY(um1->resize(3, 3, false));
268 QVERIFY(um1->setValue(0, 0, 1.716299));
269 QVERIFY(um1->setValue(0, 1, -0.485527));
270 QVERIFY(um1->setValue(0, 2, -0.288690));
271 QVERIFY(um1->setValue(1, 0, 1.716299));
272 QVERIFY(um1->setValue(1, 1, NAN));
273 QVERIFY(um1->setValue(1, 2, -0.274957));
274 QVERIFY(um1->setValue(2, 0, 1.711721));
275 QVERIFY(um1->setValue(2, 1, -0.485527));
276 QVERIFY(um1->setValue(2, 2, -0.293267));
277
278 QCOMPARE(um1->value(0, 0), 1.716299);
279 QCOMPARE(um1->value(0, 1), -0.485527);
280 QCOMPARE(um1->value(0, 2), -0.288690);
281 QCOMPARE(um1->value(1, 0), 1.716299);
282 QCOMPARE(um1->value(1, 1), 0.0);
283 QCOMPARE(um1->value(1, 2), -0.274957);
284 QCOMPARE(um1->value(2, 0), 1.711721);
285 QCOMPARE(um1->value(2, 1), -0.485527);
286 QCOMPARE(um1->value(2, 2), -0.293267);
287
288 QCOMPARE(um1->minValue(), 0.0);
289 QCOMPARE(um1->maxValue(), 0.0);
290
291 Kst::EditableMatrixPtr sm = Kst::kst_cast<Kst::EditableMatrix>(_store.createObject<Kst::EditableMatrix>());
292 Q_ASSERT(sm);
293 sm->change(2, 2, 0.0, 0.0, 1.0, 1.0);
294 sm->setEditable(true);
295 QVERIFY(sm->resize(2, 2, false));
296 QCOMPARE(sm->xNumSteps(), 2);
297 QCOMPARE(sm->yNumSteps(), 2);
298
299 QVERIFY(sm->setValueRaw(0, 0, 0.0));
300 QVERIFY(sm->setValueRaw(0, 1, 0.1));
301 QVERIFY(sm->setValueRaw(1, 0, 1.0));
302 QVERIFY(sm->setValueRaw(1, 1, 1.1));
303
304 sm->calcNoSpikeRange(0);
305 QCOMPARE(sm->minValueNoSpike(), 0.0);
306 QCOMPARE(sm->maxValueNoSpike(), 0.0);
307
308 sm->calcNoSpikeRange(-100);
309 QCOMPARE(sm->minValueNoSpike(), 0.0);
310 QCOMPARE(sm->maxValueNoSpike(), 0.0);
311
312 sm->calcNoSpikeRange(0.9);
313 QVERIFY(sm->minValueNoSpike() >= 1E+300 );
314 QVERIFY(sm->maxValueNoSpike() <= -1E+300);
315 }
316
317 #ifdef KST_USE_QTEST_MAIN
318 QTEST_MAIN(TestEditableMatrix)
319 #endif
320