24 #include "../DotGrammar.h"
25 #include "../DotFileFormatPlugin.h"
33 static const std::string
simple =
"digraph simple {a_2 -> b; c; d -> e /* error -> comment*/}";
35 static const std::string
subgraph =
"digraph trees {"
37 " 0 -> \"1\" [label = \"A\"];"
38 " 0 -> \"2\" [label = \"B\"];"
41 " Animal -> Cat [label = \"feline\"];"
42 " Animal -> Dot [label = \"canine\"];"
46 void DotFileFormatTest::checkNodes(
DataStructurePtr dataStructure, QList<QString> nodeNames)
48 QList<DataPtr> dataList = dataStructure->dataList(0);
54 foreach(
const DataPtr &node, dataList) {
55 QString name = node->property(
"name").toString();
56 int index = nodeNames.indexOf(name);
58 kDebug() <<
"Node "<< name <<
" was created unnecessarily.";
61 nodeNames.removeAt(index);
63 QVERIFY(nodeNames.isEmpty());
66 void DotFileFormatTest::init()
70 QFAIL(
"No plugin of DS, no way to continue!");
73 QVERIFY2(pl,
"Could create data structure of type Graph");
76 void DotFileFormatTest::simpleGraphParsing()
81 QVERIFY(doc.dataStructures().count() == 1);
82 if (doc.dataStructures().count() == 0) {
87 QVERIFY(graph->dataList(0).count() == 5);
88 QVERIFY(graph->pointers(0).count() == 2);
92 void DotFileFormatTest::parseSubgraphs()
99 void DotFileFormatTest::parseFileER()
103 importer.setFile(KUrl::fromLocalFile(
"undirected/ER.gv"));
105 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
106 Document *doc = importer.graphDocument();
110 QList<QString> nodeNames;
111 nodeNames <<
"course" <<
"institute" <<
"student" <<
"name0" <<
"name1" <<
"name2" <<
"code" <<
"grade" <<
"number" <<
"C-I" <<
"S-C" <<
"S-I";
112 checkNodes(dataStructure, nodeNames);
115 QVERIFY(dataStructure->pointers(0).count() == 12);
118 QList<DataPtr> dataList = dataStructure->dataList(0);
121 foreach(
const DataPtr &node, dataList) {
122 QString name = node->property(
"name").toString();
123 if (name ==
"student") {
129 if (name ==
"name0" || name ==
"name1" || name ==
"name2") {
130 QVERIFY(node->property(
"label").toString() ==
"name");
133 PointerPtr betweenPtr = start->pointerList(end).at(0);
134 QVERIFY(betweenPtr->property(
"label") ==
"m");
138 void DotFileFormatTest::parseFileHeawood()
142 importer.setFile(KUrl::fromLocalFile(
"undirected/Heawood.gv"));
144 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
148 void DotFileFormatTest::parseFileNgk104()
152 importer.setFile(KUrl::fromLocalFile(
"undirected/ngk10_4.gv"));
154 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
158 void DotFileFormatTest::parseFilePetersen()
162 importer.setFile(KUrl::fromLocalFile(
"undirected/Petersen.gv"));
164 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
168 void DotFileFormatTest::parseFileProcess()
172 importer.setFile(KUrl::fromLocalFile(
"undirected/process.gv"));
174 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
175 Document* doc = importer.graphDocument();
178 QList<QString> nodeNames;
179 nodeNames <<
"run" <<
"intr" <<
"runbl" <<
"kernel" <<
"zombie" <<
"sleep" <<
"swap" <<
"runmem" <<
"runswap" <<
"new";
180 checkNodes(dataStructure, nodeNames);
182 QVERIFY(dataStructure->pointers(0).count() == 13);
186 void DotFileFormatTest::parseFileAbstract()
190 importer.setFile(KUrl::fromLocalFile(
"directed/abstract.gv"));
192 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
196 void DotFileFormatTest::parseFileAlf()
200 importer.setFile(KUrl::fromLocalFile(
"directed/alf.gv"));
202 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
206 void DotFileFormatTest::parseFileArrows()
210 importer.setFile(KUrl::fromLocalFile(
"directed/arrows.gv"));
212 QEXPECT_FAIL(
"",
"File contains invalid identifiers with underbar at beginning.", Continue);
213 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
217 void DotFileFormatTest::parseFileAwilliams()
221 importer.setFile(KUrl::fromLocalFile(
"directed/awilliams.gv"));
223 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
227 void DotFileFormatTest::parseFileClust()
231 importer.setFile(KUrl::fromLocalFile(
"directed/clust.gv"));
233 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
237 void DotFileFormatTest::parseFileClust1()
241 importer.setFile(KUrl::fromLocalFile(
"directed/clust1.gv"));
243 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
247 void DotFileFormatTest::parseFileClust2()
251 importer.setFile(KUrl::fromLocalFile(
"directed/clust2.gv"));
253 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
257 void DotFileFormatTest::parseFileClust3()
261 importer.setFile(KUrl::fromLocalFile(
"directed/clust3.gv"));
263 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
267 void DotFileFormatTest::parseFileClust4()
271 importer.setFile(KUrl::fromLocalFile(
"directed/clust4.gv"));
273 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
277 void DotFileFormatTest::parseFileClust5()
281 importer.setFile(KUrl::fromLocalFile(
"directed/clust5.gv"));
283 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
287 void DotFileFormatTest::parseFileCrazy()
291 importer.setFile(KUrl::fromLocalFile(
"directed/crazy.gv"));
293 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
297 void DotFileFormatTest::parseFileCtext()
301 importer.setFile(KUrl::fromLocalFile(
"directed/ctext.gv"));
303 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
307 void DotFileFormatTest::parseFileDfa()
311 importer.setFile(KUrl::fromLocalFile(
"directed/dfa.gv"));
313 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
317 void DotFileFormatTest::parseFileFig6()
321 importer.setFile(KUrl::fromLocalFile(
"directed/fig6.gv"));
323 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
327 void DotFileFormatTest::parseFileFsm()
331 importer.setFile(KUrl::fromLocalFile(
"directed/fsm.gv"));
333 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
334 Document *doc = importer.graphDocument();
338 QList<QString> nodeNames;
339 nodeNames <<
"LR_0" <<
"LR_1" <<
"LR_2" <<
"LR_3" <<
"LR_4" <<
"LR_5" <<
"LR_6" <<
"LR_7" <<
"LR_8";
340 checkNodes(dataStructure, nodeNames);
343 QVERIFY(dataStructure->pointers(0).count() == 14);
346 QList<DataPtr> dataList = dataStructure->dataList(0);
347 QVERIFY(dataList.length() == 9);
350 foreach(
const DataPtr &node, dataList) {
351 QString name = node->property(
"name").toString();
352 if (name ==
"LR_0") {
354 QVERIFY(node->property(
"shape").toString() ==
"doublecircle");
356 if (name ==
"LR_2") {
358 QVERIFY(node->property(
"shape").toString() ==
"circle");
361 PointerPtr betweenPtr = start->pointerList(end).at(0);
362 QVERIFY(betweenPtr->property(
"label") ==
"SS(B)");
366 void DotFileFormatTest::parseFileKW91()
370 importer.setFile(KUrl::fromLocalFile(
"directed/KW91.gv"));
372 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
376 void DotFileFormatTest::parseFileLatin1()
380 importer.setFile(KUrl::fromLocalFile(
"directed/Latin1.gv"));
382 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
386 void DotFileFormatTest::parseFileNaN()
390 importer.setFile(KUrl::fromLocalFile(
"directed/NaN.gv"));
392 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
396 void DotFileFormatTest::parseFileGrammar()
400 importer.setFile(KUrl::fromLocalFile(
"directed/grammar.gv"));
402 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
406 void DotFileFormatTest::parseFileHashtable()
410 importer.setFile(KUrl::fromLocalFile(
"directed/hashtable.gv"));
412 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
416 void DotFileFormatTest::parseFileHondaTokoro()
420 importer.setFile(KUrl::fromLocalFile(
"directed/honda-tokoro.gv"));
422 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
426 void DotFileFormatTest::parseFileJapanese()
430 importer.setFile(KUrl::fromLocalFile(
"directed/japanese.gv"));
432 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
436 void DotFileFormatTest::parseFileJcctree()
440 importer.setFile(KUrl::fromLocalFile(
"directed/jcctree.gv"));
442 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
446 void DotFileFormatTest::parseFileJsort()
450 importer.setFile(KUrl::fromLocalFile(
"directed/jsort.gv"));
452 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
456 void DotFileFormatTest::parseFileLdbxtried()
460 importer.setFile(KUrl::fromLocalFile(
"directed/ldbxtried.gv"));
462 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
466 void DotFileFormatTest::parseFileLongflat()
470 importer.setFile(KUrl::fromLocalFile(
"directed/longflat.gv"));
472 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
476 void DotFileFormatTest::parseFileMike()
480 importer.setFile(KUrl::fromLocalFile(
"directed/mike.gv"));
482 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
486 void DotFileFormatTest::parseFileNhg()
490 importer.setFile(KUrl::fromLocalFile(
"directed/nhg.gv"));
492 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
496 void DotFileFormatTest::parseFileOldarrows()
500 importer.setFile(KUrl::fromLocalFile(
"directed/oldarrows.gv"));
502 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
506 void DotFileFormatTest::parseFilePgram()
510 importer.setFile(KUrl::fromLocalFile(
"directed/pgram.gv"));
512 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
516 void DotFileFormatTest::parseFilePm2way()
520 importer.setFile(KUrl::fromLocalFile(
"directed/pm2way.gv"));
522 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
526 void DotFileFormatTest::parseFilePmpipe()
530 importer.setFile(KUrl::fromLocalFile(
"directed/pmpipe.gv"));
532 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
536 void DotFileFormatTest::parseFilePolypoly()
540 importer.setFile(KUrl::fromLocalFile(
"directed/polypoly.gv"));
542 QEXPECT_FAIL(
"",
"Not parsing with unknown reason: need to investigate further.", Continue);
543 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
547 void DotFileFormatTest::parseFileProc3d()
551 importer.setFile(KUrl::fromLocalFile(
"directed/proc3d.gv"));
553 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
557 void DotFileFormatTest::parseFilePsfonttest()
561 importer.setFile(KUrl::fromLocalFile(
"directed/psfonttest.gv"));
563 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
567 void DotFileFormatTest::parseFileRecord2()
571 importer.setFile(KUrl::fromLocalFile(
"directed/record2.gv"));
573 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
577 void DotFileFormatTest::parseFileRecords()
581 importer.setFile(KUrl::fromLocalFile(
"directed/records.gv"));
583 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
587 void DotFileFormatTest::parseFileRowe()
591 importer.setFile(KUrl::fromLocalFile(
"directed/rowe.gv"));
593 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
597 void DotFileFormatTest::parseFileRussian()
601 importer.setFile(KUrl::fromLocalFile(
"directed/russian.gv"));
604 QEXPECT_FAIL(
"",
"Parsing of cyrillic characters for identifiers not yet supported.", Continue);
605 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
609 void DotFileFormatTest::parseFileSdh()
613 importer.setFile(KUrl::fromLocalFile(
"directed/sdh.gv"));
615 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
619 void DotFileFormatTest::parseFileShells()
623 importer.setFile(KUrl::fromLocalFile(
"directed/shells.gv"));
625 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
629 void DotFileFormatTest::parseFileStates()
633 importer.setFile(KUrl::fromLocalFile(
"directed/states.gv"));
635 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
639 void DotFileFormatTest::parseFileStructs()
643 importer.setFile(KUrl::fromLocalFile(
"directed/structs.gv"));
645 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
649 void DotFileFormatTest::parseFileSwitch()
653 importer.setFile(KUrl::fromLocalFile(
"directed/switch.gv"));
655 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
659 void DotFileFormatTest::parseFileTable()
663 importer.setFile(KUrl::fromLocalFile(
"directed/table.gv"));
666 QEXPECT_FAIL(
"",
"Parsing of interleaved XML tags not implemented", Continue);
667 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
671 void DotFileFormatTest::parseFileTrain11()
675 importer.setFile(KUrl::fromLocalFile(
"directed/train11.gv"));
677 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
681 void DotFileFormatTest::parseFileTrapeziumlr()
685 importer.setFile(KUrl::fromLocalFile(
"directed/trapeziumlr.gv"));
687 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
691 void DotFileFormatTest::parseFileTree()
695 importer.setFile(KUrl::fromLocalFile(
"directed/tree.gv"));
697 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
701 void DotFileFormatTest::parseFileTriedds()
705 importer.setFile(KUrl::fromLocalFile(
"directed/triedds.gv"));
707 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
711 void DotFileFormatTest::parseFileTry()
715 importer.setFile(KUrl::fromLocalFile(
"directed/try.gv"));
717 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
721 void DotFileFormatTest::parseFileUnix()
725 importer.setFile(KUrl::fromLocalFile(
"directed/unix.gv"));
727 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
728 Document *doc = importer.graphDocument();
732 QList<QString> nodeNames;
733 nodeNames <<
"5th Edition" <<
"6th Edition" <<
"PWB 1.0" <<
"LSX" <<
"1 BSD" <<
"Mini Unix"
734 <<
"Wollongong" <<
"Interdata" <<
"Unix/TS 3.0" <<
"PWB 2.0" <<
"7th Edition"
735 <<
"8th Edition" <<
"32V" <<
"V7M" <<
"Ultrix-11" <<
"Xenix" <<
"UniPlus+" <<
"9th Edition"
736 <<
"2 BSD" <<
"2.8 BSD" <<
"2.9 BSD" <<
"3 BSD" <<
"4 BSD" <<
"4.1 BSD" <<
"4.2 BSD"
737 <<
"4.3 BSD" <<
"Ultrix-32" <<
"PWB 1.2" <<
"USG 1.0" <<
"CB Unix 1" <<
"USG 2.0" <<
738 "CB Unix 2" <<
"CB Unix 3" <<
"Unix/TS++" <<
"PDP-11 Sys V" <<
"USG 3.0" <<
"Unix/TS 1.0"
739 <<
"TS 4.0" <<
"System V.0" <<
"System V.2" <<
"System V.3";
740 checkNodes(dataStructure, nodeNames);
743 QVERIFY(dataStructure->pointers(0).count() == 49);
747 void DotFileFormatTest::parseFileUnix2()
751 importer.setFile(KUrl::fromLocalFile(
"directed/unix2.gv"));
753 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
757 void DotFileFormatTest::parseFileViewfile()
761 importer.setFile(KUrl::fromLocalFile(
"directed/viewfile.gv"));
763 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
767 void DotFileFormatTest::parseFileWorld()
771 importer.setFile(KUrl::fromLocalFile(
"directed/world.gv"));
773 QVERIFY2(importer.hasError() ==
false, importer.errorString().toStdString().c_str());
boost::shared_ptr< DataStructure > DataStructurePtr
static DataStructureBackendManager & self()
Returns self reference to backend manager.
boost::shared_ptr< Pointer > PointerPtr
DataStructurePtr activeDataStructure() const
boost::shared_ptr< Data > DataPtr
bool parse(const std::string &str, Document *graphDoc)
Parse the given string str that represents the textual respresentation of a graph in DOT/Graphviz for...
DataStructureBackendInterface * backend(const QString &internalName) const
Returns data structure backend identified by its identifier internalName.