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