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 }