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

0001 /*
0002  *  Copyright 2004, The University of Toronto
0003  *  Licensed under GPL.
0004  */
0005 
0006 #include "ksttestcase.h"
0007 #include <kstdataobjectcollection.h>
0008 #include <labelparser.h>
0009 
0010 static void exitHelper() {
0011   KST::vectorList.clear();
0012   KST::scalarList.clear();
0013   KST::dataObjectList.clear();
0014 }
0015 
0016 
0017 static void dumpAttributes(Label::Chunk *l, QString indent) {
0018   printf("%sb:%d i:%d u:%d c:%s\n", indent.toLatin1().data(), l->attributes.bold, l->attributes.italic, l->attributes.underline, l->attributes.color.name().toLatin1().data());
0019 }
0020 
0021 
0022 static void dumpTree(Label::Chunk *l, QString indent = "") {
0023   while (l) {
0024     printf("%sNode: %p %s[%s]%s\n", indent.toLatin1().data(), l, l->vOffset == Label::Chunk::None ? "" : (l->vOffset == Label::Chunk::Up ? "U " : "D "), l->text.toLatin1().data(), l->group ? " [G]" : "");
0025     printf("%sPrev: %p Next: %p Up: %p Down: %p\n", indent.toLatin1().data(), l->prev, l->next, l->up, l->down);
0026     dumpAttributes(l, indent);
0027     if (l->group) {
0028       dumpTree(l->group, indent + "   ");
0029     }
0030     if (l->up) {
0031       dumpTree(l->up, indent + "   ");
0032     }
0033     if (l->down) {
0034       dumpTree(l->down, indent + "   ");
0035     }
0036     l = l->next;
0037   }
0038 }
0039 
0040 
0041 static void dumpTree(Label::Parsed *l) {
0042   dumpTree(l->chunk);
0043 }
0044 
0045 
0046 int rc = KstTestSuccess;
0047 
0048 #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__))
0049 #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y))
0050 
0051 void testAssert(bool result, const QString& text = "Unknown") {
0052   if (!result) {
0053     KstTestFailed();
0054     printf("Test [%s] failed.\n", text.toLatin1().data());
0055   }
0056 }
0057 
0058 
0059 void doTests() {
0060   Label::Parsed *parsed = Label::parse("");
0061   doTestD(parsed != 0L, "Empty label parsed");
0062   doTest(parsed->chunk->prev == 0L);
0063   doTest(parsed->chunk->next == 0L);
0064   doTest(parsed->chunk->text == QString::null);
0065   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0066   delete parsed;
0067 
0068   parsed = Label::parse("a");
0069   doTest(parsed != 0L);
0070   doTest(parsed->chunk->prev == 0L);
0071   doTest(parsed->chunk->next == 0L);
0072   doTest(parsed->chunk->text == "a");
0073   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0074   delete parsed;
0075 
0076   parsed = Label::parse("\\]");
0077   doTest(parsed != 0L);
0078   doTest(parsed->chunk->prev == 0L);
0079   doTest(parsed->chunk->next == 0L);
0080   doTest(parsed->chunk->text == "]");
0081   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0082   delete parsed;
0083 
0084   parsed = Label::parse("\\\\");
0085   doTest(parsed != 0L);
0086   doTest(parsed->chunk->prev == 0L);
0087   doTest(parsed->chunk->next == 0L);
0088   doTest(parsed->chunk->text == "\\");
0089   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0090   delete parsed;
0091 
0092   parsed = Label::parse("\\tau");
0093   doTest(parsed != 0L);
0094   doTest(parsed->chunk->prev == 0L);
0095   doTest(parsed->chunk->next == 0L);
0096   doTest(parsed->chunk->text == QChar(0x3A4 + 0x20));
0097   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0098   delete parsed;
0099 
0100   parsed = Label::parse("\\t");
0101   doTest(parsed != 0L);
0102   doTest(parsed->chunk->text == "");
0103   doTest(parsed->chunk->tab == true);
0104   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0105   delete parsed;
0106 
0107   parsed = Label::parse("\\n");
0108   doTest(parsed != 0L);
0109   doTest(parsed->chunk->text == "");
0110   doTest(parsed->chunk->linebreak == true);
0111   doTest(parsed->chunk->vOffset == Label::Chunk::None);
0112   delete parsed;
0113 
0114   parsed = Label::parse("\\tau\\Theta");
0115   doTest(parsed != 0L);
0116   doTest(parsed->chunk->next == 0L);
0117   doTest(parsed->chunk->text[0] == QChar(0x3A4 + 0x20));
0118   doTest(parsed->chunk->text[1] == QChar(0x398));
0119   doTest(parsed->chunk->text.length() == 2);
0120   delete parsed;
0121 
0122   Label::Chunk *c = 0L;
0123 
0124   parsed = Label::parse("\\taufoo bar\\n\\Theta");
0125   doTest(parsed != 0L);
0126   c = parsed->chunk;
0127   doTest(c->next != 0L);
0128   doTest(c->text == QString(QChar(0x3A4 + 0x20)) + "foo bar");
0129   c = c->next;
0130   doTest(c->prev != 0L);
0131   doTest(c->next != 0L);
0132   doTest(c->text == "");
0133   doTest(c->linebreak == true);
0134   c = c->next;
0135   doTest(c->prev != 0L);
0136   doTest(c->next == 0L);
0137   doTest(c->text == QChar(0x398));
0138   delete parsed;
0139 
0140   parsed = Label::parse("x^y^z");
0141   doTest(parsed == 0L);
0142 
0143   parsed = Label::parse("x_y_z");
0144   doTest(parsed == 0L);
0145 
0146   parsed = Label::parse("x^y_z");
0147   doTest(parsed != 0L);
0148   c = parsed->chunk;
0149   doTest(c->prev == 0L);
0150   doTest(c->next == 0L);
0151   doTest(c->up != 0L);
0152   doTest(c->down != 0L);
0153   doTest(c->text == "x");
0154   doTest(c->vOffset == Label::Chunk::None);
0155   c = c->up;
0156   doTest(c->prev != 0L);
0157   doTest(c->next == 0L);
0158   doTest(c->up == 0L);
0159   doTest(c->down == 0L);
0160   doTest(c->text == "y");
0161   doTest(c->vOffset == Label::Chunk::Up);
0162   c = c->prev->down;
0163   doTest(c->prev != 0L);
0164   doTest(c->next == 0L);
0165   doTest(c->up == 0L);
0166   doTest(c->down == 0L);
0167   doTest(c->text == "z");
0168   doTest(c->vOffset == Label::Chunk::Down);
0169   delete parsed;
0170 
0171   parsed = Label::parse("x^{}");
0172   doTest(parsed != 0L);
0173   c = parsed->chunk;
0174   doTest(c->prev == 0L);
0175   doTest(c->next == 0L);
0176   doTest(c->up != 0L);
0177   doTest(c->down == 0L);
0178   doTest(c->text == "x");
0179   doTest(c->group == 0L);
0180   doTest(c->vOffset == Label::Chunk::None);
0181   c = c->up;
0182   doTest(c->prev != 0L);
0183   doTest(c->next == 0L);
0184   doTest(c->up == 0L);
0185   doTest(c->down == 0L);
0186   doTest(c->group != 0L);
0187   doTest(c->vOffset == Label::Chunk::Up);
0188   c = c->group;
0189   doTest(c->text == "");
0190   doTest(c->prev != 0L);
0191   doTest(c->next == 0L);
0192   doTest(c->up == 0L);
0193   doTest(c->down == 0L);
0194   doTest(c->group == 0L);
0195   doTest(c->vOffset == Label::Chunk::None);
0196   delete parsed;
0197 
0198   parsed = Label::parse("x^{y+1}_{z-1}");
0199   doTest(parsed != 0L);
0200   c = parsed->chunk;
0201   doTest(c->prev == 0L);
0202   doTest(c->next == 0L);
0203   doTest(c->up != 0L);
0204   doTest(c->down != 0L);
0205   doTest(c->text == "x");
0206   doTest(c->group == 0L);
0207   doTest(c->vOffset == Label::Chunk::None);
0208   c = c->up;
0209   doTest(c->prev != 0L);
0210   doTest(c->next == 0L);
0211   doTest(c->up == 0L);
0212   doTest(c->down == 0L);
0213   doTest(c->group != 0L);
0214   doTest(c->vOffset == Label::Chunk::Up);
0215   c = c->group;
0216   doTest(c->text == "y+1");
0217   doTest(c->group == 0L);
0218   doTest(c->vOffset == Label::Chunk::None);
0219   c = c->prev->prev->down;
0220   doTest(c->prev != 0L);
0221   doTest(c->next == 0L);
0222   doTest(c->up == 0L);
0223   doTest(c->down == 0L);
0224   doTest(c->group != 0L);
0225   doTest(c->vOffset == Label::Chunk::Down);
0226   c = c->group;
0227   doTest(c->text == "z-1");
0228   doTest(c->group == 0L);
0229   doTest(c->vOffset == Label::Chunk::None);
0230   delete parsed;
0231 
0232   parsed = Label::parse("x\\^y");
0233   doTest(parsed != 0L);
0234   c = parsed->chunk;
0235   doTest(c->prev == 0L);
0236   doTest(c->next == 0L);
0237   doTest(c->up == 0L);
0238   doTest(c->down == 0L);
0239   doTest(c->text == "x^y");
0240   doTest(c->vOffset == Label::Chunk::None);
0241   delete parsed;
0242 
0243   parsed = Label::parse("x^{y^{q+1} + 1}_{z-1}");
0244   doTest(parsed != 0L);
0245   c = parsed->chunk;
0246   doTest(c->prev == 0L);
0247   doTest(c->next == 0L);
0248   doTest(c->up != 0L);
0249   doTest(c->down != 0L);
0250   doTest(c->text == "x");
0251   doTest(c->vOffset == Label::Chunk::None);
0252   c = c->up;
0253   doTest(c->prev != 0L);
0254   doTest(c->next == 0L);
0255   doTest(c->up == 0L);
0256   doTest(c->down == 0L);
0257   doTest(c->group != 0L);
0258   doTest(c->vOffset == Label::Chunk::Up);
0259   c = c->group;
0260   doTest(c->text == "y");
0261   doTest(c->prev != 0L);
0262   doTest(c->next != 0L);
0263   doTest(c->up != 0L);
0264   doTest(c->down == 0L);
0265   doTest(c->group == 0L);
0266   doTest(c->vOffset == Label::Chunk::None);
0267   c = c->up;
0268   doTest(c->prev != 0L);
0269   doTest(c->next == 0L);
0270   doTest(c->up == 0L);
0271   doTest(c->down == 0L);
0272   doTest(c->group != 0L);
0273   doTest(c->vOffset == Label::Chunk::Up);
0274   c = c->group;
0275   doTest(c->prev != 0L);
0276   doTest(c->next == 0L);
0277   doTest(c->up == 0L);
0278   doTest(c->down == 0L);
0279   doTest(c->text == "q+1");
0280   doTest(c->vOffset == Label::Chunk::None);
0281   c = c->prev->prev->next;
0282   doTest(c->prev != 0L);
0283   doTest(c->next == 0L);
0284   doTest(c->up == 0L);
0285   doTest(c->down == 0L);
0286   doTest(c->text == " + 1");
0287   doTest(c->vOffset == Label::Chunk::None);
0288   c = c->prev->prev->prev->down;
0289   doTest(c->prev != 0L);
0290   doTest(c->next == 0L);
0291   doTest(c->up == 0L);
0292   doTest(c->down == 0L);
0293   doTest(c->group);
0294   doTest(c->vOffset == Label::Chunk::Down);
0295   c = c->group;
0296   doTest(c->prev != 0L);
0297   doTest(c->next == 0L);
0298   doTest(c->up == 0L);
0299   doTest(c->down == 0L);
0300   doTest(c->text == "z-1");
0301   doTest(c->vOffset == Label::Chunk::None);
0302   delete parsed;
0303 
0304   parsed = Label::parse("{2*2}");
0305   doTest(parsed != 0L);
0306   c = parsed->chunk;
0307   doTest(c->next == 0L);
0308   doTest(c->group != 0L);
0309   doTest(c->vOffset == Label::Chunk::None);
0310   c = c->group;
0311   doTest(c->text == "2*2");
0312   doTest(c->vOffset == Label::Chunk::None);
0313   delete parsed;
0314 
0315   parsed = Label::parse("x^100");
0316   doTest(parsed != 0L);
0317   c = parsed->chunk;
0318   doTest(c->next != 0L);
0319   doTest(c->up != 0L);
0320   doTest(c->text == "x");
0321   doTest(c->vOffset == Label::Chunk::None);
0322   c = c->next;
0323   doTest(c->next == 0L);
0324   doTest(c->text == "00");
0325   doTest(c->vOffset == Label::Chunk::None);
0326   c = c->prev->up;
0327   doTest(c->next == 0L);
0328   doTest(c->text == "1");
0329   doTest(c->vOffset == Label::Chunk::Up);
0330   delete parsed;
0331 
0332   parsed = Label::parse("x^100*200");
0333   doTest(parsed != 0L);
0334   c = parsed->chunk;
0335   doTest(c->next != 0L);
0336   doTest(c->up != 0L);
0337   doTest(c->text == "x");
0338   doTest(c->vOffset == Label::Chunk::None);
0339   c = c->next;
0340   doTest(c->next == 0L);
0341   doTest(c->text == "00*200");
0342   doTest(c->vOffset == Label::Chunk::None);
0343   c = c->prev->up;
0344   doTest(c->next == 0L);
0345   doTest(c->text == "1");
0346   doTest(c->vOffset == Label::Chunk::Up);
0347   delete parsed;
0348 
0349   parsed = Label::parse("[ a ^label ]");
0350   doTest(parsed != 0L);
0351   c = parsed->chunk;
0352   doTest(c->next == 0L);
0353   doTest(c->up == 0L);
0354   doTest(c->down == 0L);
0355   doTest(c->text == "a ^label");
0356   doTest(c->scalar);
0357   delete parsed;
0358 
0359   parsed = Label::parse("[vector[2]]");
0360   doTest(parsed != 0L);
0361   c = parsed->chunk;
0362   doTest(c->next == 0L);
0363   doTest(c->up == 0L);
0364   doTest(c->down == 0L);
0365   doTest(c->text == "vector");
0366   doTest(c->expression == "2");
0367   doTest(c->vector);
0368   delete parsed;
0369 
0370   parsed = Label::parse("[a][b]");
0371   doTest(parsed != 0L);
0372   c = parsed->chunk;
0373   doTest(c->next != 0L);
0374   doTest(c->up == 0L);
0375   doTest(c->down == 0L);
0376   doTest(c->text == "a");
0377   doTest(c->scalar);
0378   c = c->next;
0379   doTest(c->next == 0L);
0380   doTest(c->up == 0L);
0381   doTest(c->down == 0L);
0382   doTest(c->text == "b");
0383   doTest(c->scalar);
0384   delete parsed;
0385 
0386   parsed = Label::parse("[a]*[b]");
0387   doTest(parsed != 0L);
0388   c = parsed->chunk;
0389   doTest(c->next != 0L);
0390   doTest(c->up == 0L);
0391   doTest(c->down == 0L);
0392   doTest(c->text == "a");
0393   doTest(c->scalar);
0394   c = c->next;
0395   doTest(c->next != 0L);
0396   doTest(c->up == 0L);
0397   doTest(c->down == 0L);
0398   doTest(c->text == "*");
0399   doTest(!c->scalar);
0400   c = c->next;
0401   doTest(c->next == 0L);
0402   doTest(c->up == 0L);
0403   doTest(c->down == 0L);
0404   doTest(c->text == "b");
0405   doTest(c->scalar);
0406   delete parsed;
0407 
0408   parsed = Label::parse("[x]^[a]_[b][c]");
0409   doTest(parsed != 0L);
0410   c = parsed->chunk;
0411   doTest(c->next != 0L);
0412   doTest(c->up != 0L);
0413   doTest(c->down != 0L);
0414   doTest(c->text == "x");
0415   doTest(c->scalar);
0416   c = c->up;
0417   doTest(c->next == 0L);
0418   doTest(c->up == 0L);
0419   doTest(c->down == 0L);
0420   doTest(c->text == "a");
0421   doTest(c->scalar);
0422   c = c->prev->down;
0423   doTest(c->next == 0L);
0424   doTest(c->up == 0L);
0425   doTest(c->down == 0L);
0426   doTest(c->text == "b");
0427   doTest(c->scalar);
0428   c = c->prev->next;
0429   doTest(c->next == 0L);
0430   doTest(c->up == 0L);
0431   doTest(c->down == 0L);
0432   doTest(c->text == "c");
0433   doTest(c->scalar);
0434   delete parsed;
0435 
0436   parsed = Label::parse("Ends in a \\");
0437   delete parsed;
0438 
0439   parsed = Label::parse("_");
0440   delete parsed;
0441 
0442   parsed = Label::parse("A weird { case }");
0443   delete parsed;
0444 
0445   parsed = Label::parse("x^y^foo{ case }");
0446   delete parsed;
0447 
0448   parsed = Label::parse("x^5\\");
0449   delete parsed;
0450 
0451   parsed = Label::parse("}");
0452   delete parsed;
0453 
0454   parsed = Label::parse("Average period (ADU)");
0455   delete parsed;
0456 
0457   parsed = Label::parse("PSD (ADU/{Hz^{1/2}})");
0458   delete parsed;
0459 
0460   parsed = Label::parse("\\Sigma^{(x+5)^2}_{5+1} + \\Pi^{\\Sigma^{i-j}_{i+j}}_{x = 0} + 5");
0461   doTest(parsed != 0L);
0462   // more to test here
0463   delete parsed;
0464 
0465   parsed = Label::parse("A test \\textbf{bold \\textit{italicbold}} \\textit{italic}\n42^{\\textbf{42}^{42}} 42^\\textbf{42^{42}} 42^{42}\n\\underline{a whole\\tregion  underlined}");
0466   //dumpTree(parsed);
0467   // FIXME
0468   delete parsed;
0469 
0470   parsed = Label::parse("\\textbf{\\textit{italicbold}bold}");
0471   // FIXME
0472   delete parsed;
0473 
0474   parsed = Label::parse("\\textcolor{red}{red}black");
0475   // FIXME
0476   delete parsed;
0477 
0478   parsed = Label::parse("\\textbf{bold}unbold");
0479   // FIXME
0480   delete parsed;
0481 
0482   // more to test...
0483 }
0484 
0485 
0486 int main(int argc, char **argv) {
0487   atexit(exitHelper);
0488 
0489   QCoreApplication app(argc, argv);
0490 
0491   doTests();
0492   // Don't put tests in main because we need to ensure that no KstObjects
0493   // remain past the exit handler
0494 
0495   exitHelper(); // need to run it here before kapp goes away in some cases.
0496   if (rc == KstTestSuccess) {
0497     printf("All tests passed!\n");
0498   }
0499   return -rc;
0500 }
0501 
0502 // vim: ts=2 sw=2 et