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