void KisNodeFacadeTest::testCreation() { TestGraphListener graphListener; KisNodeSP node = new TestNodeA(); QVERIFY(node->graphListener() == 0); KisNodeFacade facade(node); QVERIFY(facade.root() == node); node->setGraphListener(&graphListener); QVERIFY(node->graphListener() != 0); // Test contract for initial state QVERIFY(node->parent() == 0); QVERIFY(node->firstChild() == 0); QVERIFY(node->lastChild() == 0); QVERIFY(node->prevSibling() == 0); QVERIFY(node->nextSibling() == 0); QVERIFY(node->childCount() == 0); QVERIFY(node->at(0) == 0); QVERIFY(node->at(UINT_MAX) == 0); QVERIFY(node->index(0) == -1); }
void KisNodeFacadeTest::testMove() { TestGraphListener graphListener; KisNodeSP root = new TestNodeA(); root->setGraphListener(&graphListener); KisNodeFacade facade(root); KisNodeSP node1 = new TestNodeA(); node1->setName("node1"); KisNodeSP node2 = new TestNodeA(); node2->setName("node2"); KisNodeSP node3 = new TestNodeA(); node3->setName("node3"); facade.addNode(node1); facade.addNode(node2); facade.addNode(node3); QVERIFY(root->at(0) == node1); QVERIFY(root->at(1) == node2); QVERIFY(root->at(2) == node3); facade.moveNode(node3, root, node1); QVERIFY(root->at(0) == node1); QVERIFY(root->at(1) == node3); QVERIFY(root->at(2) == node2); }
void KisNodeFacadeTest::testOrdering() { TestGraphListener graphListener; KisNodeSP root = new TestNodeA(); root->setGraphListener(&graphListener); KisNodeFacade facade(root); KisNodeSP node1 = new TestNodeA(); KisNodeSP node2 = new TestNodeA(); KisNodeSP node3 = new TestNodeA(); KisNodeSP node4 = new TestNodeA(); KisNodeSP node5 = new TestNodeA(); /* +---------+ | node 4 | | node 2 | | node 3| | node 1 | |root | +---------+ */ graphListener.resetBools(); QVERIFY(facade.addNode(node1, root, root->childCount()) == true); QVERIFY(graphListener.beforeInsertRow == true); QVERIFY(graphListener.afterInsertRow == true); QVERIFY(graphListener.beforeRemoveRow == false); QVERIFY(graphListener.afterRemoveRow == false); QVERIFY(root->firstChild() == node1); QVERIFY(root->lastChild() == node1); QVERIFY(root->childCount() == 1); graphListener.resetBools(); QVERIFY(facade.addNode(node2, root, root->childCount()) == true); QVERIFY(graphListener.beforeInsertRow == true); QVERIFY(graphListener.afterInsertRow == true); QVERIFY(graphListener.beforeRemoveRow == false); QVERIFY(graphListener.afterRemoveRow == false); QVERIFY(root->firstChild() == node1); QVERIFY(root->lastChild() == node2); QVERIFY(root->childCount() == 2); graphListener.resetBools(); QVERIFY(facade.addNode(node3, node1) == true); QVERIFY(graphListener.beforeInsertRow == true); QVERIFY(graphListener.afterInsertRow == true); QVERIFY(graphListener.beforeRemoveRow == false); QVERIFY(graphListener.afterRemoveRow == false); QVERIFY(root->firstChild() == node1); QVERIFY(root->lastChild() == node2); QVERIFY(root->childCount() == 2); QVERIFY(node1->childCount() == 1); graphListener.resetBools(); QVERIFY(facade.addNode(node4, root, root->lastChild()) == true); QVERIFY(graphListener.beforeInsertRow == true); QVERIFY(graphListener.afterInsertRow == true); QVERIFY(graphListener.beforeRemoveRow == false); QVERIFY(graphListener.afterRemoveRow == false); QVERIFY(root->firstChild() == node1); QVERIFY(root->lastChild() == node4); QVERIFY(root->childCount() == 3); graphListener.resetBools(); QVERIFY(node1->parent() == root); QVERIFY(node2->parent() == root); QVERIFY(node3->parent() == node1); QVERIFY(node4->parent() == root); QVERIFY(root->firstChild() == node1); QVERIFY(root->lastChild() == node4); QVERIFY(root->at(0) == node1); QVERIFY(root->at(1) == node2); QVERIFY(root->at(2) == node4); QVERIFY(node1->at(0) == node3); QVERIFY(root->index(node1) == 0); QVERIFY(root->index(node2) == 1); QVERIFY(root->index(node4) == 2); QVERIFY(node1->index(node3) == 0); QVERIFY(node4->prevSibling() == node2); QVERIFY(node2->prevSibling() == node1); QVERIFY(node1->prevSibling() == 0); QVERIFY(node3->prevSibling() == 0); QVERIFY(node4->nextSibling() == 0); QVERIFY(node2->nextSibling() == node4); QVERIFY(node1->nextSibling() == node2); QVERIFY(node3->nextSibling() == 0); /* node 4 node 2 node 3 node 1 root */ graphListener.resetBools(); QVERIFY(facade.removeNode(node4) == true); QVERIFY(node4->parent() == 0); QVERIFY(graphListener.beforeInsertRow == false); QVERIFY(graphListener.afterInsertRow == false); QVERIFY(graphListener.beforeRemoveRow == true); QVERIFY(graphListener.afterRemoveRow == true); QVERIFY(root->childCount() == 2); QVERIFY(root->lastChild() == node2); QVERIFY(root->firstChild() == node1); QVERIFY(node4->prevSibling() == 0); QVERIFY(node4->nextSibling() == 0); graphListener.resetBools(); QVERIFY(facade.addNode(node4, node3) == true); QVERIFY(graphListener.beforeInsertRow == true); QVERIFY(graphListener.afterInsertRow == true); QVERIFY(graphListener.beforeRemoveRow == false); QVERIFY(graphListener.afterRemoveRow == false); QVERIFY(root->childCount() == 2); QVERIFY(root->lastChild() == node2); QVERIFY(root->firstChild() == node1); QVERIFY(node3->childCount() == 1); QVERIFY(node3->firstChild() == node4); QVERIFY(node3->lastChild() == node4); QVERIFY(node4->prevSibling() == 0); QVERIFY(node4->nextSibling() == 0); graphListener.resetBools(); QVERIFY(facade.removeNode(node4) == true); QVERIFY(graphListener.beforeInsertRow == false); QVERIFY(graphListener.afterInsertRow == false); QVERIFY(graphListener.beforeRemoveRow == true); QVERIFY(graphListener.afterRemoveRow == true); QVERIFY(node3->childCount() == 0); QVERIFY(node4->parent() == 0); QVERIFY(root->childCount() == 2); QVERIFY(root->lastChild() == node2); QVERIFY(root->firstChild() == node1); QVERIFY(node4->prevSibling() == 0); QVERIFY(node4->nextSibling() == 0); graphListener.resetBools(); QVERIFY(facade.addNode(node4, node2) == true); graphListener.resetBools(); QVERIFY(graphListener.beforeMove == false); QVERIFY(graphListener.afterMove == false); QVERIFY(facade.moveNode(node3, root, 0) == true); QVERIFY(graphListener.beforeMove == true); QVERIFY(graphListener.afterMove == true); graphListener.resetBools(); /* node4 node2 node1 node 3 root */ QVERIFY(facade.moveNode(node1, node3, 0) == true); QVERIFY(facade.moveNode(node2, node3, node1) == true); QVERIFY(graphListener.beforeInsertRow == true); QVERIFY(graphListener.afterInsertRow == true); QVERIFY(graphListener.beforeRemoveRow == true); QVERIFY(graphListener.afterRemoveRow == true); graphListener.resetBools(); QVERIFY(facade.moveNode(node4, node4, node4) == false); QVERIFY(graphListener.beforeInsertRow == false); QVERIFY(graphListener.afterInsertRow == false); QVERIFY(graphListener.beforeRemoveRow == false); QVERIFY(graphListener.afterRemoveRow == false); graphListener.resetBools(); QCOMPARE(root->childCount(), 1u); QVERIFY(root->firstChild() == node3); QVERIFY(root->lastChild() == node3); QVERIFY(node3->childCount() == 2); QVERIFY(node3->firstChild() == node1); QVERIFY(node3->lastChild() == node2); /* node4 node2 node5 node1 node3 root */ QVERIFY(facade.addNode(node5, node3, node1) == true); QVERIFY(node5->parent() == node3); QVERIFY(node5->prevSibling() == node1); QVERIFY(node5->nextSibling() == node2); /* node5 node4 node2 node1 node3 root */ QVERIFY(facade.raiseNode(node5) == true); QVERIFY(node5->parent() == node3); QVERIFY(node5->nextSibling() == 0); QVERIFY(node5->prevSibling() == node2); // Try raising topnode to top QVERIFY(facade.raiseNode(node5) == true); QVERIFY(node5->parent() == node3); QVERIFY(node5->nextSibling() == 0); QVERIFY(node5->prevSibling() == node2); /* node5 node1 node4 node2 node3 root */ QVERIFY(facade.lowerNode(node2) == true); QVERIFY(node2->nextSibling() == node1); QVERIFY(node2->prevSibling() == 0); // Try lowering bottomnode to bottomg QVERIFY(facade.lowerNode(node2) == true); QVERIFY(node2->nextSibling() == node1); QVERIFY(node2->prevSibling() == 0); /** node4 node2 node5 node1 node3 root */ QVERIFY(facade.toTop(node2) == true); QVERIFY(node2->nextSibling() == 0); QVERIFY(node2->prevSibling() == node5); /** node5 node1 node4 node2 node3 root */ QVERIFY(facade.toBottom(node2) == true); QVERIFY(node2->nextSibling() == node1); QVERIFY(node2->prevSibling() == 0); }
bool ReactionInChIFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if (pmol == NULL || !pmol->IsReaction()) return false; ostream &ofs = *pConv->GetOutStream(); OBFormat* pInChIFormat = OBConversion::FindFormat("inchi"); if (!pInChIFormat) return false; bool isEquilibrium = pConv->IsOption("e"); OBConversion inchiconv; inchiconv.SetOutFormat(pInChIFormat); stringstream ss; inchiconv.SetOutStream(&ss); #define M_REACTANTS 0 #define M_PRODUCTS 1 #define M_AGENTS 2 OBReactionFacade facade(pmol); std::vector<std::vector<std::string> > inchis(3); unsigned int nonInchi[3] = { 0, 0, 0 }; bool hasNonInchi = false; OBMol mol; for (int part = 0; part <= 2; ++part) { unsigned int N; switch (part) { case M_REACTANTS: N = facade.NumComponents(REACTANT); break; case M_PRODUCTS: N = facade.NumComponents(PRODUCT); break; case M_AGENTS: N = facade.NumComponents(AGENT); break; } for (unsigned int i = 0; i < N; ++i) { mol.Clear(); switch (part) { case M_REACTANTS: facade.GetComponent(&mol, REACTANT, i); break; case M_PRODUCTS: facade.GetComponent(&mol, PRODUCT, i); break; case M_AGENTS: facade.GetComponent(&mol, AGENT, i); break; } if (mol.NumAtoms() == 1 && mol.GetFirstAtom()->GetAtomicNum() == 0) { // This represents an unknown component nonInchi[part]++; hasNonInchi = true; } else { bool ok = inchiconv.Write(&mol); if (!ok) { nonInchi[part]++; hasNonInchi = true; } else { string inchi = ss.str(); if (strncmp(inchi.c_str(), "InChI=1S/", 9) != 0) return false; inchis[part].push_back(TrimInChI(inchi.c_str())); } ss.str(""); } } } std::sort(inchis[M_REACTANTS].begin(), inchis[M_REACTANTS].end()); std::sort(inchis[M_PRODUCTS].begin(), inchis[M_PRODUCTS].end()); std::sort(inchis[M_AGENTS].begin(), inchis[M_AGENTS].end()); std::string reactants_string = ""; const int rsize = inchis[M_REACTANTS].size(); for (int i = 0; i < rsize; ++i) { if (i > 0) reactants_string += '!'; reactants_string += inchis[M_REACTANTS][i]; } std::string products_string = ""; const int psize = inchis[M_PRODUCTS].size(); for (int i = 0; i < psize; ++i) { if (i > 0) products_string += '!'; products_string += inchis[M_PRODUCTS][i]; } bool reactants_first = reactants_string <= products_string; ofs << RINCHI_VERSION_STRING; if (rsize > 0 || psize > 0 || !inchis[M_AGENTS].empty()) { ofs << (reactants_first ? reactants_string : products_string); ofs << "<>"; ofs << (reactants_first ? products_string : reactants_string); if (!inchis[M_AGENTS].empty()) { ofs << "<>"; for (std::vector<std::string>::const_iterator vit = inchis[M_AGENTS].begin(); vit != inchis[M_AGENTS].end(); ++vit) { if (vit != inchis[M_AGENTS].begin()) ofs << '!'; ofs << *vit; } } } ofs << "/d"; if (isEquilibrium) ofs << '='; else ofs << (reactants_first ? '+' : '-'); if (hasNonInchi) { ofs << "/u" << (reactants_first ? nonInchi[M_REACTANTS] : nonInchi[M_PRODUCTS]) << '-' << (reactants_first ? nonInchi[M_PRODUCTS] : nonInchi[M_REACTANTS]) << '-' << nonInchi[M_AGENTS]; } ofs << '\n'; return true; }