File indexing completed on 2024-05-19 04:32:47

0001 /*
0002  *  Copyright 2005, The University of Toronto
0003  *  Licensed under GPL.
0004  */
0005 
0006 #include "ksttestcase.h"
0007 #include "kstcsd.h"
0008 
0009 #include <kstdataobjectcollection.h>
0010 #include <kstandarddirs.h>
0011 #include <kstobject.h>
0012 #include <qdir.h>
0013 #include <qfile.h>
0014 
0015 
0016 static void exitHelper() {
0017   KST::dataSourceList.clear();
0018   KST::scalarList.clear();
0019   KST::dataObjectList.clear();
0020 }
0021 
0022 
0023 int rc = KstTestSuccess;
0024 
0025 #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__))
0026 #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y))
0027 
0028 void testAssert(bool result, const QString& text = "Unknown") {
0029   if (!result) {
0030     KstTestFailed();
0031     printf("Test [%s] failed.\n", text.toLatin1().data());
0032   }
0033 }
0034 
0035 QDomDocument makeDOMElement(const QString& tag, const QString& val) {
0036 // Should be some boundary checking in the constructor.
0037   QDomDocument csdDOM("csddocument");
0038   QDomElement csdElement, child;
0039   QDomText text;
0040 
0041   csdElement = csdDOM.createElement("csdDOMTest");
0042 
0043   child = csdDOM.createElement("tag");
0044   text = csdDOM.createTextNode(tag);
0045   child.appendChild(text);
0046   csdElement.appendChild(child);
0047 
0048   child = csdDOM.createElement("vectag");
0049   text = csdDOM.createTextNode(val);
0050   child.appendChild(text);
0051   csdElement.appendChild(child);
0052 
0053   child = csdDOM.createElement("sampRate");
0054   text = csdDOM.createTextNode("1");
0055   child.appendChild(text);
0056   csdElement.appendChild(child);
0057 
0058   child = csdDOM.createElement("average");
0059   text = csdDOM.createTextNode("1");
0060   child.appendChild(text);
0061   csdElement.appendChild(child);
0062 
0063   child = csdDOM.createElement("fiftLen");
0064   text = csdDOM.createTextNode("5");
0065   child.appendChild(text);
0066   csdElement.appendChild(child);
0067 
0068   child = csdDOM.createElement("adopize");
0069   text = csdDOM.createTextNode("0");
0070   child.appendChild(text);
0071   csdElement.appendChild(child);
0072 
0073   child = csdDOM.createElement("apodizefxn");
0074   text = csdDOM.createTextNode("WindowOriginal");
0075   child.appendChild(text);
0076   csdElement.appendChild(child);
0077 
0078   child = csdDOM.createElement("gaussiansigma");
0079   text = csdDOM.createTextNode("0.01");
0080   child.appendChild(text);
0081   csdElement.appendChild(child);
0082 
0083   child = csdDOM.createElement("removeMean");
0084   text = csdDOM.createTextNode("1");
0085   child.appendChild(text);
0086   csdElement.appendChild(child);
0087 
0088   child = csdDOM.createElement("windowsize");
0089   text = csdDOM.createTextNode("5000");
0090   child.appendChild(text);
0091   csdElement.appendChild(child);
0092 
0093   child = csdDOM.createElement("vectorunits");
0094   text = csdDOM.createTextNode("1");
0095   child.appendChild(text);
0096   csdElement.appendChild(child);
0097 
0098   child = csdDOM.createElement("rateunits");
0099   text = csdDOM.createTextNode("1");
0100   child.appendChild(text);
0101   csdElement.appendChild(child);
0102 
0103   child = csdDOM.createElement("output");
0104   text = csdDOM.createTextNode("1");
0105   child.appendChild(text);
0106   csdElement.appendChild(child);
0107 
0108   csdDOM.appendChild(csdElement);
0109 
0110   return csdDOM;
0111 }
0112 
0113 void doTests() {
0114 
0115   KstVectorPtr vp = new KstVector(KstObjectTag::fromString("tempVector"), 10);
0116   for (int i = 0; i < 10; i++){
0117     vp->value()[i] = i;
0118   }
0119 
0120   KstCSDPtr csd = new KstCSD("csdTest", vp, 0.0, false, false, false, WindowUndefined, 0, 0, 0.0, PSDUndefined, QString::null, QString::null);
0121   doTest(csd->tagName() == "csdTest");
0122   doTest(csd->vTag() == "tempVector");
0123   doTest(csd->output() == PSDUndefined);
0124   doTest(!csd->apodize());
0125   doTest(!csd->removeMean());
0126   doTest(!csd->average());
0127   doTest(csd->freq() == 1.0);
0128   doTest(csd->apodizeFxn() == WindowUndefined);
0129   doTest(csd->length() == 0);
0130   doTest(csd->windowSize() == 0);
0131   doTest(csd->gaussianSigma() == 0);
0132   doTest(csd->vectorUnits().isEmpty());
0133   doTest(csd->rateUnits().isEmpty());
0134 
0135   csd->setOutput(PSDAmplitudeSpectralDensity);
0136   csd->setApodize(true);
0137   csd->setRemoveMean(true);
0138   csd->setAverage(true);
0139   csd->setFreq(0.1);
0140   csd->setApodizeFxn(WindowOriginal);
0141   csd->setLength(3);
0142   csd->setWindowSize(50);
0143   csd->setGaussianSigma(0.2);
0144 
0145   doTest(csd->tagName() == "csdTest");
0146   doTest(csd->vTag() == "tempVector");
0147   doTest(csd->output() == PSDAmplitudeSpectralDensity);
0148   doTest(csd->apodize());
0149   doTest(csd->removeMean());
0150   doTest(csd->average());
0151   doTest(csd->freq() == 0.1);
0152   doTest(csd->windowSize() == 50);
0153   doTest(csd->apodizeFxn() == WindowOriginal);
0154   doTest(csd->gaussianSigma() == 0.2);
0155 
0156 //   KTempFile tf(locateLocal("tmp", "kst-csd"), "txt");
0157 //   QFile *qf = tf.file();
0158 //   QTextStream ts(qf);
0159 //   csd->save(ts, "");
0160 
0161   QDomNode n = makeDOMElement("csdDOMCsd", "csdDOMVector").firstChild();
0162   QDomElement e = n.toElement();
0163   KstCSDPtr csdDOM = new KstCSD(e);
0164 
0165   doTest(csdDOM->tagName() == "csdDOMCsd");
0166   doTest(csdDOM->output() == PSDPowerSpectralDensity);
0167   doTest(csdDOM->apodize());
0168   doTest(csdDOM->removeMean());
0169   doTest(csdDOM->average());
0170   doTest(csdDOM->freq() == 1);
0171   doTest(csdDOM->apodizeFxn() == WindowOriginal);
0172   doTest(csdDOM->gaussianSigma() == 0.01);
0173   doTest(csdDOM->windowSize() == 5000);
0174 
0175   KstVectorPtr vp2 = new KstVector(KstObjectTag::fromString("tempVector2"), 10);
0176   for (int i = 0; i < 10; i++){
0177     vp2->value()[i] = i;
0178   }
0179   csdDOM->setVector(vp2);
0180   doTest(csdDOM->vTag() == "tempVector2");
0181   csdDOM->setWindowSize(9);
0182   KstMatrixPtr outMatrix = csdDOM->outputMatrix();
0183   
0184   doTest(outMatrix->resize(3, 3, false)); // very odd thing to do?
0185   doTest(outMatrix->setValue(0, 0, 1.716299));
0186   doTest(outMatrix->setValue(0, 1, -0.485527));
0187   doTest(outMatrix->setValue(0, 2, -0.288690));
0188   doTest(outMatrix->setValue(1, 0, 1.716299));
0189   doTest(outMatrix->setValue(1, 1, NAN));
0190   doTest(outMatrix->setValue(1, 2, -0.274957));
0191   doTest(outMatrix->setValue(2, 0, 1.711721));
0192   doTest(outMatrix->setValue(2, 1, -0.485527));
0193   doTest(outMatrix->setValue(2, 2, -0.293267));
0194 
0195   doTest(outMatrix->sampleCount() == 9);
0196   doTest(outMatrix->value(0, 0) == 1.716299);
0197   doTest(outMatrix->value(0, 1) ==  -0.485527);
0198   doTest(outMatrix->value(0, 2) == -0.288690);
0199   doTest(outMatrix->value(1, 0) == 1.716299);
0200   doTest(outMatrix->value(1, 1) == 0);
0201   doTest(outMatrix->value(1, 2) == -0.274957);
0202   doTest(outMatrix->value(2, 0) == 1.711721);
0203   doTest(outMatrix->value(2, 1) == -0.485527);
0204   doTest(outMatrix->value(2, 2) == -0.293267);
0205 
0206   doTest(csdDOM->update(0) == KstObject::UPDATE);
0207   outMatrix = csdDOM->outputMatrix();
0208   doTest(outMatrix->sampleCount() == 128);
0209 
0210   csdDOM->setWindowSize(11);
0211   doTest(outMatrix->sampleCount() == 128);
0212 
0213   doTest(outMatrix->value(0, 0) == 1.716299);
0214   doTest(outMatrix->value(0, 1) ==  -0.485527);
0215   doTest(outMatrix->value(0, 2) == -0.288690);
0216   doTest(outMatrix->value(1, 0) == 1.716299);
0217   doTest(outMatrix->value(1, 1) == 0);
0218   doTest(outMatrix->value(1, 2) == -0.274957);
0219   doTest(outMatrix->value(2, 0) == 1.711721);
0220   doTest(outMatrix->value(2, 1) == -0.485527);
0221   doTest(outMatrix->value(2, 2) == -0.293267);
0222 
0223 }
0224 
0225 
0226 int main(int argc, char **argv) {
0227   atexit(exitHelper);
0228 
0229   QCoreApplication app(argc, argv);
0230 
0231   doTests();
0232   // Don't put tests in main because we need to ensure that no KstObjects
0233   // remain past the exit handler
0234 
0235   exitHelper(); // need to run it here before kapp goes away in some cases.
0236   if (rc == KstTestSuccess) {
0237     printf("All tests passed!\n");
0238   }
0239   return -rc;
0240 }