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 "testpsd.h"
13
14 #include <QtTest>
15
16 #include <QDir>
17 #include <QFile>
18 #include <QTemporaryFile>
19 #include <QXmlStreamWriter>
20
21
22 #include "psd.h"
23 #include "ksttest.h"
24
25 #include "datacollection.h"
26 #include "objectstore.h"
27
28 static Kst::ObjectStore _store;
29
cleanupTestCase()30 void TestPSD::cleanupTestCase() {
31 _store.clear();
32 }
33
34
makeDOMElement(const QString & tag,const QString & val)35 QDomDocument TestPSD::makeDOMElement(const QString& tag, const QString& val) {
36 // Should be some boundary checking in the constructor.
37 QDomDocument psdDOM("psddocument");
38 QDomElement psdElement, child;
39 QDomText text;
40
41 psdElement = psdDOM.createElement("psdDOMTest");
42
43 child = psdDOM.createElement("tag");
44 text = psdDOM.createTextNode(tag);
45 child.appendChild(text);
46 psdElement.appendChild(child);
47
48 child = psdDOM.createElement("vector");
49 text = psdDOM.createTextNode(val);
50 child.appendChild(text);
51 psdElement.appendChild(child);
52
53 child = psdDOM.createElement("samplerate");
54 text = psdDOM.createTextNode("128");
55 child.appendChild(text);
56 psdElement.appendChild(child);
57
58 child = psdDOM.createElement("average");
59 text = psdDOM.createTextNode("1");
60 child.appendChild(text);
61 psdElement.appendChild(child);
62
63 child = psdDOM.createElement("fftlength");
64 text = psdDOM.createTextNode("5");
65 child.appendChild(text);
66 psdElement.appendChild(child);
67
68 child = psdDOM.createElement("apodize");
69 text = psdDOM.createTextNode("1");
70 child.appendChild(text);
71 psdElement.appendChild(child);
72
73 child = psdDOM.createElement("apodizefunction");
74 text = psdDOM.createTextNode("WindowOriginal");
75 child.appendChild(text);
76 psdElement.appendChild(child);
77
78 child = psdDOM.createElement("gaussiansigma");
79 text = psdDOM.createTextNode("0.01");
80 child.appendChild(text);
81 psdElement.appendChild(child);
82
83 child = psdDOM.createElement("removemean");
84 text = psdDOM.createTextNode("1");
85 child.appendChild(text);
86 psdElement.appendChild(child);
87
88 child = psdDOM.createElement("vectorunits");
89 text = psdDOM.createTextNode("vUnits");
90 child.appendChild(text);
91 psdElement.appendChild(child);
92
93 child = psdDOM.createElement("rateunits");
94 text = psdDOM.createTextNode("rUnits");
95 child.appendChild(text);
96 psdElement.appendChild(child);
97
98 child = psdDOM.createElement("outputtype");
99 text = psdDOM.createTextNode("PSDAmplitudeSpectralDensity");
100 child.appendChild(text);
101 psdElement.appendChild(child);
102
103 child = psdDOM.createElement("interpolateholes");
104 text = psdDOM.createTextNode("1");
105 child.appendChild(text);
106 psdElement.appendChild(child);
107
108 psdDOM.appendChild(psdElement);
109
110 return psdDOM;
111 }
112
testPSD()113 void TestPSD::testPSD() {
114
115 Kst::VectorPtr vp = Kst::kst_cast<Kst::Vector>(_store.createObject<Kst::Vector>());
116 Q_ASSERT(vp);
117 vp->resize(10);
118 vp->setDescriptiveName("tempVector");
119 for (int i = 0; i < 10; i++){
120 vp->value()[i] = i;
121 }
122
123 Kst::PSDPtr psd = Kst::kst_cast<Kst::PSD>(_store.createObject<Kst::PSD>());
124 psd->change(vp, 0.0, false, 10, false, false, QString("vUnits"), QString("rUnits"), WindowUndefined, 0.0, PSDUndefined);
125 QCOMPARE(psd->vector()->descriptiveName(), QLatin1String("tempVector"));
126 QCOMPARE(psd->output(), PSDUndefined);
127 QVERIFY(!psd->apodize());
128 QVERIFY(!psd->removeMean());
129 QVERIFY(!psd->average());
130 QCOMPARE(psd->frequency(), 0.0);
131 QCOMPARE(psd->apodizeFxn(), WindowUndefined);
132 QCOMPARE(psd->gaussianSigma(), 0.0);
133 Kst::VectorPtr vpVX = psd->vX();
134 Kst::VectorPtr vpVY = psd->vY();
135
136 QCOMPARE(vpVX->length(), 1);
137 QVERIFY(vpVX->value()[0] != vpVX->value()[0]);
138 QCOMPARE(vpVY->length(), 1);
139 QVERIFY(vpVY->value()[0] != vpVY->value()[0]);
140
141 for(int j = 0; j < vpVX->length(); j++){
142 QCOMPARE(vpVX->value()[j], &Kst::NOPOINT);
143 }
144
145 psd->setOutput(PSDAmplitudeSpectralDensity);
146 psd->setApodize(true);
147 psd->setRemoveMean(true);
148 psd->setAverage(true);
149 psd->setFrequency(0.1);
150 psd->setApodizeFxn(WindowOriginal);
151 psd->setGaussianSigma(0.2);
152
153 QCOMPARE(psd->vector()->descriptiveName(), QLatin1String("tempVector"));
154 QCOMPARE(psd->output(), PSDAmplitudeSpectralDensity);
155 QVERIFY(psd->apodize());
156 QVERIFY(psd->removeMean());
157 QVERIFY(psd->average());
158 QCOMPARE(psd->frequency(), 0.1);
159 QCOMPARE(psd->apodizeFxn(), WindowOriginal);
160 QCOMPARE(psd->gaussianSigma(), 0.2);
161
162 // doTest(psd->update(0) == Kst::Object::UPDATE);
163 // doTest(psd->propertyString() == ps);
164 // doTest(!psd->curveHints().curveName() == "");
165 // printf("Curve name [%s]", kstCHL[0].curveName());
166 // printf("X Vector name [%s]", kstCHL[0].xVectorName());
167 // printf("Y Vector name [%s]", kstCHL[0].yVectorName());
168
169 QTemporaryFile tf;
170 tf.open();
171 QXmlStreamWriter xml;
172 xml.setDevice(&tf);
173 xml.setAutoFormatting(true);
174 psd->save(xml);
175 QFile::remove(tf.fileName());
176
177 QDomNode n = makeDOMElement("psdDOMPsd", "psdDOMVector").firstChild();
178 QDomElement e = n.toElement();
179
180 //FIXME: should use factory, not this constructor. This constructor is no longer
181 // used anywhere in kst.
182 // Kst::PSDPtr psdDOM = new Kst::PSD(&_store, e);
183
184 // QCOMPARE(psdDOM->tag().tagString(), QLatin1String("psdDOMPsd"));
185 // QCOMPARE(psdDOM->output(), PSDAmplitudeSpectralDensity);
186 // QVERIFY(psdDOM->apodize());
187 // QVERIFY(psdDOM->removeMean());
188 // QVERIFY(psdDOM->average());
189 // QCOMPARE(psdDOM->frequency(), 128.0);
190 // QCOMPARE(psdDOM->apodizeFxn(), WindowOriginal);
191 // QCOMPARE(psdDOM->gaussianSigma(), 0.01);
192
193 // Kst::VectorPtr vpVX = psdDOM->vX();
194 // for(int j = 0; j < vpVX->length(); j++){
195 // printf("[%d][%lf]", j, vpVX->value()[j]);
196 // }
197 // Kst::VectorPtr vpVY = psdDOM->vY();
198 }
199
200 #ifdef KST_USE_QTEST_MAIN
201 QTEST_MAIN(TestPSD)
202 #endif
203
204 // vim: ts=2 sw=2 et
205