deba@1018: /* -*- mode: C++; indent-tabs-mode: nil; -*- deba@1018: * deba@1018: * This file is a part of LEMON, a generic C++ optimization library. deba@1018: * deba@1018: * Copyright (C) 2003-2010 deba@1018: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@1018: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@1018: * deba@1018: * Permission to use, modify and distribute this software is granted deba@1018: * provided that this copyright notice appears in all copies. For deba@1018: * precise terms see the accompanying LICENSE file. deba@1018: * deba@1018: * This software is provided "AS IS" with no warranty of any kind, deba@1018: * express or implied, and with no claim as to its suitability for any deba@1018: * purpose. deba@1018: * deba@1018: */ deba@1018: deba@1018: #include deba@1018: //#include deba@1019: #include deba@1018: //#include deba@1018: deba@1018: #include "test_tools.h" deba@1018: #include "graph_test.h" deba@1018: deba@1018: using namespace lemon; deba@1018: using namespace lemon::concepts; deba@1018: deba@1019: template deba@1019: void checkBpGraphBuild() { deba@1019: TEMPLATE_BPGRAPH_TYPEDEFS(BpGraph); deba@1019: deba@1019: BpGraph G; deba@1019: checkGraphNodeList(G, 0); deba@1019: checkGraphRedNodeList(G, 0); deba@1019: checkGraphBlueNodeList(G, 0); deba@1019: checkGraphEdgeList(G, 0); deba@1019: checkGraphArcList(G, 0); deba@1019: deba@1019: G.reserveNode(3); deba@1019: G.reserveEdge(3); deba@1019: deba@1019: Node deba@1019: rn1 = G.addRedNode(); deba@1019: checkGraphNodeList(G, 1); deba@1019: checkGraphRedNodeList(G, 1); deba@1019: checkGraphBlueNodeList(G, 0); deba@1019: checkGraphEdgeList(G, 0); deba@1019: checkGraphArcList(G, 0); deba@1019: deba@1019: Node deba@1019: bn1 = G.addBlueNode(), deba@1019: bn2 = G.addBlueNode(); deba@1019: checkGraphNodeList(G, 3); deba@1019: checkGraphRedNodeList(G, 1); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 0); deba@1019: checkGraphArcList(G, 0); deba@1019: deba@1019: Edge e1 = G.addEdge(rn1, bn2); deba@1019: check(G.redNode(e1) == rn1 && G.blueNode(e1) == bn2, "Wrong edge"); deba@1019: check(G.u(e1) == rn1 && G.v(e1) == bn2, "Wrong edge"); deba@1019: deba@1019: checkGraphNodeList(G, 3); deba@1019: checkGraphRedNodeList(G, 1); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 1); deba@1019: checkGraphArcList(G, 2); deba@1019: deba@1019: checkGraphIncEdgeArcLists(G, rn1, 1); deba@1019: checkGraphIncEdgeArcLists(G, bn1, 0); deba@1019: checkGraphIncEdgeArcLists(G, bn2, 1); deba@1019: deba@1019: checkGraphConEdgeList(G, 1); deba@1019: checkGraphConArcList(G, 2); deba@1019: deba@1019: Edge deba@1019: e2 = G.addEdge(rn1, bn1), deba@1019: e3 = G.addEdge(rn1, bn2); deba@1019: deba@1019: checkGraphNodeList(G, 3); deba@1019: checkGraphRedNodeList(G, 1); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 3); deba@1019: checkGraphArcList(G, 6); deba@1019: deba@1019: checkGraphIncEdgeArcLists(G, rn1, 3); deba@1019: checkGraphIncEdgeArcLists(G, bn1, 1); deba@1019: checkGraphIncEdgeArcLists(G, bn2, 2); deba@1019: deba@1019: checkGraphConEdgeList(G, 3); deba@1019: checkGraphConArcList(G, 6); deba@1019: deba@1019: checkArcDirections(G); deba@1019: deba@1019: checkNodeIds(G); deba@1019: checkRedNodeIds(G); deba@1019: checkBlueNodeIds(G); deba@1019: checkArcIds(G); deba@1019: checkEdgeIds(G); deba@1019: deba@1019: checkGraphNodeMap(G); deba@1019: checkGraphRedMap(G); deba@1019: checkGraphBlueMap(G); deba@1019: checkGraphArcMap(G); deba@1019: checkGraphEdgeMap(G); deba@1019: } deba@1019: deba@1019: template deba@1019: void checkBpGraphSnapshot() { deba@1019: TEMPLATE_BPGRAPH_TYPEDEFS(Graph); deba@1019: deba@1019: Graph G; deba@1019: Node deba@1019: n1 = G.addRedNode(), deba@1019: n2 = G.addBlueNode(), deba@1019: n3 = G.addBlueNode(); deba@1019: Edge deba@1019: e1 = G.addEdge(n1, n2), deba@1019: e2 = G.addEdge(n1, n3); deba@1019: deba@1019: checkGraphNodeList(G, 3); deba@1019: checkGraphRedNodeList(G, 1); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 2); deba@1019: checkGraphArcList(G, 4); deba@1019: deba@1019: typename Graph::Snapshot snapshot(G); deba@1019: deba@1019: Node n4 = G.addRedNode(); deba@1019: G.addEdge(n4, n2); deba@1019: G.addEdge(n4, n3); deba@1019: deba@1019: checkGraphNodeList(G, 4); deba@1019: checkGraphRedNodeList(G, 2); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 4); deba@1019: checkGraphArcList(G, 8); deba@1019: deba@1019: snapshot.restore(); deba@1019: deba@1019: checkGraphNodeList(G, 3); deba@1019: checkGraphRedNodeList(G, 1); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 2); deba@1019: checkGraphArcList(G, 4); deba@1019: deba@1019: checkGraphIncEdgeArcLists(G, n1, 2); deba@1019: checkGraphIncEdgeArcLists(G, n2, 1); deba@1019: checkGraphIncEdgeArcLists(G, n3, 1); deba@1019: deba@1019: checkGraphConEdgeList(G, 2); deba@1019: checkGraphConArcList(G, 4); deba@1019: deba@1019: checkNodeIds(G); deba@1019: checkRedNodeIds(G); deba@1019: checkBlueNodeIds(G); deba@1019: checkArcIds(G); deba@1019: checkEdgeIds(G); deba@1019: deba@1019: checkGraphNodeMap(G); deba@1019: checkGraphRedMap(G); deba@1019: checkGraphBlueMap(G); deba@1019: checkGraphArcMap(G); deba@1019: checkGraphEdgeMap(G); deba@1019: deba@1019: G.addRedNode(); deba@1019: snapshot.save(G); deba@1019: deba@1019: G.addEdge(G.addRedNode(), G.addBlueNode()); deba@1019: deba@1019: snapshot.restore(); deba@1019: snapshot.save(G); deba@1019: deba@1019: checkGraphNodeList(G, 4); deba@1019: checkGraphRedNodeList(G, 2); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 2); deba@1019: checkGraphArcList(G, 4); deba@1019: deba@1019: G.addEdge(G.addRedNode(), G.addBlueNode()); deba@1019: deba@1019: snapshot.restore(); deba@1019: deba@1019: checkGraphNodeList(G, 4); deba@1019: checkGraphRedNodeList(G, 2); deba@1019: checkGraphBlueNodeList(G, 2); deba@1019: checkGraphEdgeList(G, 2); deba@1019: checkGraphArcList(G, 4); deba@1019: } deba@1019: deba@1019: template deba@1019: void checkBpGraphValidity() { deba@1019: TEMPLATE_GRAPH_TYPEDEFS(Graph); deba@1019: Graph g; deba@1019: deba@1019: Node deba@1019: n1 = g.addRedNode(), deba@1019: n2 = g.addBlueNode(), deba@1019: n3 = g.addBlueNode(); deba@1019: deba@1019: Edge deba@1019: e1 = g.addEdge(n1, n2), deba@1019: e2 = g.addEdge(n1, n3); deba@1019: deba@1019: check(g.valid(n1), "Wrong validity check"); deba@1019: check(g.valid(e1), "Wrong validity check"); deba@1019: check(g.valid(g.direct(e1, true)), "Wrong validity check"); deba@1019: deba@1019: check(!g.valid(g.nodeFromId(-1)), "Wrong validity check"); deba@1019: check(!g.valid(g.edgeFromId(-1)), "Wrong validity check"); deba@1019: check(!g.valid(g.arcFromId(-1)), "Wrong validity check"); deba@1019: } deba@1019: deba@1018: void checkConcepts() { deba@1018: { // Checking graph components deba@1018: checkConcept(); deba@1018: deba@1018: checkConcept, deba@1018: IDableBpGraphComponent<> >(); deba@1018: deba@1018: checkConcept, deba@1018: IterableBpGraphComponent<> >(); deba@1018: deba@1018: checkConcept, deba@1018: AlterableBpGraphComponent<> >(); deba@1018: deba@1018: checkConcept, deba@1018: MappableBpGraphComponent<> >(); deba@1018: deba@1018: checkConcept, deba@1018: ExtendableBpGraphComponent<> >(); deba@1018: deba@1018: checkConcept, deba@1018: ErasableBpGraphComponent<> >(); deba@1018: deba@1019: checkConcept, deba@1019: ClearableBpGraphComponent<> >(); deba@1018: deba@1018: } deba@1018: { // Checking skeleton graph deba@1018: checkConcept(); deba@1018: } deba@1019: { // Checking SmartBpGraph deba@1019: checkConcept(); deba@1019: checkConcept, SmartBpGraph>(); deba@1019: checkConcept, SmartBpGraph>(); deba@1019: checkConcept, SmartBpGraph>(); deba@1019: } deba@1018: } deba@1018: deba@1018: void checkGraphs() { deba@1019: { // Checking SmartGraph deba@1019: checkBpGraphBuild(); deba@1019: checkBpGraphSnapshot(); deba@1019: checkBpGraphValidity(); deba@1019: } deba@1018: } deba@1018: deba@1018: int main() { deba@1018: checkConcepts(); deba@1018: checkGraphs(); deba@1018: return 0; deba@1018: }