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