gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Improve and redesign test programs + unify their output (ticket #25) - Move graph related utilities form test_tools.h to graph_test.h. - Move the contents of graph_utils_test.h to graph_utils_test.cc. - Rename map_test.h -> graph_maps_test.h. - Rename digraph_test.h -> graph_test.h. - Many improvements in the following files: * digraph_test.cc * graph_test.cc * graph_test.h * graph_maps_test.h * graph_utils_test.cc * bfs_test.cc * dfs_test.cc * counter_test.cc - Test programs print messages only if it really seems necessary. - Remove \file commands form .cc test files.
3 17 2
default
22 files changed with 894 insertions and 966 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_TEST_MAP_TEST_H
20
#define LEMON_TEST_MAP_TEST_H
21

	
22
#include <vector>
23
#include <lemon/maps.h>
24

	
25
#include "test_tools.h"
26

	
27
namespace lemon {
28

	
29
  template <typename Graph>
30
  void checkGraphNodeMap() {
31
    Graph graph;
32
    const int num = 16;
33

	
34
    typedef typename Graph::Node Node;
35

	
36
    std::vector<Node> nodes;
37
    for (int i = 0; i < num; ++i) {
38
      nodes.push_back(graph.addNode());
39
    }
40
    typedef typename Graph::template NodeMap<int> IntNodeMap;
41
    IntNodeMap map(graph, 42);
42
    for (int i = 0; i < int(nodes.size()); ++i) {
43
      check(map[nodes[i]] == 42, "Wrong map constructor.");
44
    }
45
    for (int i = 0; i < num; ++i) {
46
      nodes.push_back(graph.addNode());
47
      map[nodes.back()] = 23;
48
      check(map[nodes.back()] == 23, "Wrong operator[].");
49
    }
50
    map = constMap<Node>(12);
51
    for (int i = 0; i < int(nodes.size()); ++i) {
52
      check(map[nodes[i]] == 12, "Wrong map constructor.");
53
    }
54
    graph.clear();
55
    nodes.clear();
56
  }
57

	
58
  template <typename Graph>
59
  void checkGraphArcMap() {
60
    Graph graph;
61
    const int num = 16;
62

	
63
    typedef typename Graph::Node Node;
64
    typedef typename Graph::Arc Arc;
65

	
66
    std::vector<Node> nodes;
67
    for (int i = 0; i < num; ++i) {
68
      nodes.push_back(graph.addNode());
69
    }
70

	
71
    std::vector<Arc> arcs;
72
    for (int i = 0; i < num; ++i) {
73
      for (int j = 0; j < i; ++j) {
74
	arcs.push_back(graph.addArc(nodes[i], nodes[j]));
75
      }
76
    }
77

	
78
    typedef typename Graph::template ArcMap<int> IntArcMap;
79
    IntArcMap map(graph, 42);
80

	
81
    for (int i = 0; i < int(arcs.size()); ++i) {
82
      check(map[arcs[i]] == 42, "Wrong map constructor.");
83
    }
84

	
85
    for (int i = 0; i < num; ++i) {
86
      for (int j = i + 1; j < num; ++j) {
87
	arcs.push_back(graph.addArc(nodes[i], nodes[j]));
88
	map[arcs.back()] = 23;
89
        check(map[arcs.back()] == 23, "Wrong operator[].");
90
      }
91
    }
92
    map = constMap<Arc>(12);
93
    for (int i = 0; i < int(arcs.size()); ++i) {
94
      check(map[arcs[i]] == 12, "Wrong map constructor.");
95
    }
96
    graph.clear();
97
    arcs.clear();
98
  }
99

	
100
  template <typename Graph>
101
  void checkGraphEdgeMap() {
102
    Graph graph;
103
    const int num = 16;
104

	
105
    typedef typename Graph::Node Node;
106
    typedef typename Graph::Edge Edge;
107

	
108
    std::vector<Node> nodes;
109
    for (int i = 0; i < num; ++i) {
110
      nodes.push_back(graph.addNode());
111
    }
112

	
113
    std::vector<Edge> edges;
114
    for (int i = 0; i < num; ++i) {
115
      for (int j = 0; j < i; ++j) {
116
	edges.push_back(graph.addEdge(nodes[i], nodes[j]));
117
      }
118
    }
119

	
120
    typedef typename Graph::template EdgeMap<int> IntEdgeMap;
121
    IntEdgeMap map(graph, 42);
122

	
123
    for (int i = 0; i < int(edges.size()); ++i) {
124
      check(map[edges[i]] == 42, "Wrong map constructor.");
125
    }
126

	
127
    for (int i = 0; i < num; ++i) {
128
      for (int j = i + 1; j < num; ++j) {
129
	edges.push_back(graph.addEdge(nodes[i], nodes[j]));
130
	map[edges.back()] = 23;
131
        check(map[edges.back()] == 23, "Wrong operator[].");
132
      }
133
    }
134
    map = constMap<Edge>(12);
135
    for (int i = 0; i < int(edges.size()); ++i) {
136
      check(map[edges[i]] == 12, "Wrong map constructor.");
137
    }
138
    graph.clear();
139
    edges.clear();
140
  }
141

	
142
}
143

	
144
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_TEST_GRAPH_TEST_H
20
#define LEMON_TEST_GRAPH_TEST_H
21

	
22
#include <lemon/graph_utils.h>
23
#include "test_tools.h"
24

	
25
namespace lemon {
26

	
27
  template<class Graph>
28
  void checkGraphNodeList(const Graph &G, int cnt)
29
  {
30
    typename Graph::NodeIt n(G);
31
    for(int i=0;i<cnt;i++) {
32
      check(n!=INVALID,"Wrong Node list linking.");
33
      ++n;
34
    }
35
    check(n==INVALID,"Wrong Node list linking.");
36
    check(countNodes(G)==cnt,"Wrong Node number.");
37
  }
38

	
39
  template<class Graph>
40
  void checkGraphArcList(const Graph &G, int cnt)
41
  {
42
    typename Graph::ArcIt e(G);
43
    for(int i=0;i<cnt;i++) {
44
      check(e!=INVALID,"Wrong Arc list linking.");
45
      ++e;
46
    }
47
    check(e==INVALID,"Wrong Arc list linking.");
48
    check(countArcs(G)==cnt,"Wrong Arc number.");
49
  }
50

	
51
  template<class Graph>
52
  void checkGraphOutArcList(const Graph &G, typename Graph::Node n, int cnt)
53
  {
54
    typename Graph::OutArcIt e(G,n);
55
    for(int i=0;i<cnt;i++) {
56
      check(e!=INVALID,"Wrong OutArc list linking.");
57
      check(n==G.source(e),"Wrong OutArc list linking.");
58
      ++e;
59
    }
60
    check(e==INVALID,"Wrong OutArc list linking.");
61
    check(countOutArcs(G,n)==cnt,"Wrong OutArc number.");
62
  }
63

	
64
  template<class Graph>
65
  void checkGraphInArcList(const Graph &G, typename Graph::Node n, int cnt)
66
  {
67
    typename Graph::InArcIt e(G,n);
68
    for(int i=0;i<cnt;i++) {
69
      check(e!=INVALID,"Wrong InArc list linking.");
70
      check(n==G.target(e),"Wrong InArc list linking.");
71
      ++e;
72
    }
73
    check(e==INVALID,"Wrong InArc list linking.");
74
    check(countInArcs(G,n)==cnt,"Wrong InArc number.");
75
  }
76

	
77
  template<class Graph>
78
  void checkGraphEdgeList(const Graph &G, int cnt)
79
  {
80
    typename Graph::EdgeIt e(G);
81
    for(int i=0;i<cnt;i++) {
82
      check(e!=INVALID,"Wrong Edge list linking.");
83
      ++e;
84
    }
85
    check(e==INVALID,"Wrong Edge list linking.");
86
    check(countEdges(G)==cnt,"Wrong Edge number.");
87
  }
88

	
89
  template<class Graph>
90
  void checkGraphIncEdgeList(const Graph &G, typename Graph::Node n, int cnt)
91
  {
92
    typename Graph::IncEdgeIt e(G,n);
93
    for(int i=0;i<cnt;i++) {
94
      check(e!=INVALID,"Wrong IncEdge list linking.");
95
      check(n==G.u(e) || n==G.v(e),"Wrong IncEdge list linking.");
96
      ++e;
97
    }
98
    check(e==INVALID,"Wrong IncEdge list linking.");
99
    check(countIncEdges(G,n)==cnt,"Wrong IncEdge number.");
100
  }
101

	
102
  template <class Digraph>
103
  void checkDigraphIterators() {
104
    typedef typename Digraph::Node Node;
105
    typedef typename Digraph::NodeIt NodeIt;
106
    typedef typename Digraph::Arc Arc;
107
    typedef typename Digraph::ArcIt ArcIt;
108
    typedef typename Digraph::InArcIt InArcIt;
109
    typedef typename Digraph::OutArcIt OutArcIt;
110
  }
111

	
112
  template <class Graph>
113
  void checkGraphIterators() {
114
    checkDigraphIterators<Graph>();
115
    typedef typename Graph::Edge Edge;
116
    typedef typename Graph::EdgeIt EdgeIt;
117
    typedef typename Graph::IncEdgeIt IncEdgeIt;
118
  }
119

	
120
  // Structure returned by addPetersen()
121
  template<class Digraph>
122
  struct PetStruct
123
  {
124
    // Vector containing the outer nodes
125
    std::vector<typename Digraph::Node> outer;
126
    // Vector containing the inner nodes
127
    std::vector<typename Digraph::Node> inner;
128
    // Vector containing the arcs of the inner circle
129
    std::vector<typename Digraph::Arc> incir;
130
    // Vector containing the arcs of the outer circle
131
    std::vector<typename Digraph::Arc> outcir;
132
    // Vector containing the chord arcs
133
    std::vector<typename Digraph::Arc> chords;
134
  };
135

	
136
  // Adds the reverse pair of all arcs to a digraph
137
  template<class Digraph>
138
  void bidirDigraph(Digraph &G)
139
  {
140
    typedef typename Digraph::Arc Arc;
141
    typedef typename Digraph::ArcIt ArcIt;
142

	
143
    std::vector<Arc> ee;
144

	
145
    for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e);
146

	
147
    for(int i=0;i<int(ee.size());++i)
148
      G.addArc(G.target(ee[i]),G.source(ee[i]));
149
  }
150

	
151
  // Adds a Petersen digraph to G.
152
  // Returns the nodes and arcs of the generated digraph.
153
  template<typename Digraph>
154
  PetStruct<Digraph> addPetersen(Digraph &G,int num = 5)
155
  {
156
    PetStruct<Digraph> n;
157

	
158
    for(int i=0;i<num;i++) {
159
      n.outer.push_back(G.addNode());
160
      n.inner.push_back(G.addNode());
161
    }
162

	
163
    for(int i=0;i<num;i++) {
164
      n.chords.push_back(G.addArc(n.outer[i],n.inner[i]));
165
      n.outcir.push_back(G.addArc(n.outer[i],n.outer[(i+1) % num]));
166
      n.incir.push_back(G.addArc(n.inner[i],n.inner[(i+2) % num]));
167
    }
168

	
169
    return n;
170
  }
171

	
172
  // Checks the bidirectioned Petersen digraph
173
  template<class Digraph>
174
  void checkBidirPetersen(const Digraph &G, int num = 5)
175
  {
176
    typedef typename Digraph::NodeIt NodeIt;
177

	
178
    checkGraphNodeList(G, 2 * num);
179
    checkGraphArcList(G, 6 * num);
180

	
181
    for(NodeIt n(G);n!=INVALID;++n) {
182
      checkGraphInArcList(G, n, 3);
183
      checkGraphOutArcList(G, n, 3);
184
    }
185
  }
186

	
187
  // Structure returned by addUPetersen()
188
  template<class Graph>
189
  struct UPetStruct
190
  {
191
    // Vector containing the outer nodes
192
    std::vector<typename Graph::Node> outer;
193
    // Vector containing the inner nodes
194
    std::vector<typename Graph::Node> inner;
195
    // Vector containing the edges of the inner circle
196
    std::vector<typename Graph::Edge> incir;
197
    // Vector containing the edges of the outer circle
198
    std::vector<typename Graph::Edge> outcir;
199
    // Vector containing the chord edges
200
    std::vector<typename Graph::Edge> chords;
201
  };
202

	
203
  // Adds a Petersen graph to \c G.
204
  // Returns the nodes and edges of the generated graph.
205
  template<typename Graph>
206
  UPetStruct<Graph> addUPetersen(Graph &G,int num=5)
207
  {
208
    UPetStruct<Graph> n;
209

	
210
    for(int i=0;i<num;i++) {
211
      n.outer.push_back(G.addNode());
212
      n.inner.push_back(G.addNode());
213
    }
214

	
215
    for(int i=0;i<num;i++) {
216
      n.chords.push_back(G.addEdge(n.outer[i],n.inner[i]));
217
      n.outcir.push_back(G.addEdge(n.outer[i],n.outer[(i+1)%num]));
218
      n.incir.push_back(G.addEdge(n.inner[i],n.inner[(i+2)%num]));
219
    }
220
    
221
    return n;
222
  }
223

	
224
  // Checks the undirected Petersen graph
225
  template<class Graph>
226
  void checkUndirPetersen(const Graph &G, int num = 5)
227
  {
228
    typedef typename Graph::NodeIt NodeIt;
229

	
230
    checkGraphNodeList(G, 2 * num);
231
    checkGraphEdgeList(G, 3 * num);
232
    checkGraphArcList(G, 6 * num);
233

	
234
    for(NodeIt n(G);n!=INVALID;++n) {
235
      checkGraphIncEdgeList(G, n, 3);
236
    }
237
  }
238

	
239
  template <class Digraph>
240
  void checkDigraph() {
241
    const int num = 5;
242
    Digraph G;
243
    checkGraphNodeList(G, 0);
244
    checkGraphArcList(G, 0);
245
    addPetersen(G, num);
246
    bidirDigraph(G);
247
    checkBidirPetersen(G, num);
248
  }
249
  
250
  template <class Graph>
251
  void checkGraph() {
252
    const int num = 5;
253
    Graph G;
254
    checkGraphNodeList(G, 0);
255
    checkGraphEdgeList(G, 0);
256
    addUPetersen(G, num);
257
    checkUndirPetersen(G, num);
258
  }
259

	
260
} //namespace lemon
261

	
262
#endif
Ignore white space 6 line context
... ...
@@ -8,16 +8,17 @@
8 8
  dfs_test
9 9
  digraph_test
10 10
  dijkstra_test
11 11
  dim_test
12 12
  error_test
13 13
  graph_test
14
  graph_utils_test
14 15
  kruskal_test
15 16
  maps_test
17
  path_test
16 18
  random_test
17
  path_test
18 19
  time_measure_test
19 20
  unionfind_test)
20 21

	
21 22
foreach (TEST_NAME ${TESTS})
22 23
  add_executable (${TEST_NAME} ${TEST_NAME}.cc)
23 24
  target_link_libraries (${TEST_NAME} lemon)
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	test/CMakeLists.txt
3 3

	
4 4
noinst_HEADERS += \
5
	test/digraph_test.h \
6
	test/graph_utils_test.h \
5
	test/graph_test.h \
7 6
	test/heap_test.h \
8
	test/map_test.h \
7
	test/graph_maps_test.h \
9 8
        test/test_tools.h
10 9

	
11 10
check_PROGRAMS += \
12 11
	test/bfs_test \
13 12
        test/counter_test \
14 13
	test/dfs_test \
Ignore white space 12 line context
... ...
@@ -13,38 +13,31 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#include "test_tools.h"
20
//#include <lemon/smart_graph.h>
19
#include <lemon/concepts/digraph.h>
20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/bfs.h>
23 23
#include <lemon/path.h>
24
#include<lemon/concepts/digraph.h>
24

	
25
#include "graph_test.h"
26
#include "test_tools.h"
25 27

	
26 28
using namespace lemon;
27 29

	
28
const int PET_SIZE =5;
29

	
30

	
31
void check_Bfs_Compile() 
30
void checkBfsCompile() 
32 31
{
33 32
  typedef concepts::Digraph Digraph;
34

	
35
  typedef Digraph::Arc Arc;
36
  typedef Digraph::Node Node;
37
  typedef Digraph::ArcIt ArcIt;
38
  typedef Digraph::NodeIt NodeIt;
39
 
40 33
  typedef Bfs<Digraph> BType;
41 34
  
42 35
  Digraph G;
43
  Node n;
44
  Arc e;
36
  Digraph::Node n;
37
  Digraph::Arc e;
45 38
  int l;
46 39
  bool b;
47 40
  BType::DistMap d(G);
48 41
  BType::PredMap p(G);
49 42
  //  BType::PredNodeMap pn(G);
50 43
  
... ...
@@ -60,61 +53,48 @@
60 53
  //  pn = bfs_test.predNodeMap();
61 54
  b  = bfs_test.reached(n);
62 55

	
63 56
  Path<Digraph> pp = bfs_test.path(n);
64 57
}
65 58

	
66
void check_Bfs_Function_Compile() 
59
void checkBfsFunctionCompile() 
67 60
{
68 61
  typedef int VType;
69 62
  typedef concepts::Digraph Digraph;
70

	
71 63
  typedef Digraph::Arc Arc;
72 64
  typedef Digraph::Node Node;
73
  typedef Digraph::ArcIt ArcIt;
74
  typedef Digraph::NodeIt NodeIt;
75
  typedef concepts::ReadMap<Arc,VType> LengthMap;
76 65
   
77 66
  Digraph g;
78 67
  bfs(g,Node()).run();
79 68
  bfs(g).source(Node()).run();
80 69
  bfs(g)
81 70
    .predMap(concepts::WriteMap<Node,Arc>())
82 71
    .distMap(concepts::WriteMap<Node,VType>())
83 72
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
84 73
    .processedMap(concepts::WriteMap<Node,bool>())
85 74
    .run(Node());
86
  
87 75
}
88 76

	
89
int main()
90
{
91
    
92
  // typedef SmartDigraph Digraph;
93
  typedef ListDigraph Digraph;
94

	
95
  typedef Digraph::Arc Arc;
96
  typedef Digraph::Node Node;
97
  typedef Digraph::ArcIt ArcIt;
98
  typedef Digraph::NodeIt NodeIt;
99
  typedef Digraph::ArcMap<int> LengthMap;
77
template <class Digraph>
78
void checkBfs() {
79
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
100 80

	
101 81
  Digraph G;
102 82
  Node s, t;
103
  PetStruct<Digraph> ps = addPetersen(G,PET_SIZE);
83
  PetStruct<Digraph> ps = addPetersen(G, 5);
104 84
   
105 85
  s=ps.outer[2];
106 86
  t=ps.inner[0];
107 87
  
108 88
  Bfs<Digraph> bfs_test(G);
109 89
  bfs_test.run(s);
110 90
  
111
  check(bfs_test.dist(t)==3,"Bfs found a wrong path. " << bfs_test.dist(t));
91
  check(bfs_test.dist(t)==3,"Bfs found a wrong path." << bfs_test.dist(t));
112 92

	
113 93
  Path<Digraph> p = bfs_test.path(t);
114
  check(p.length()==3,"getPath() found a wrong path.");
94
  check(p.length()==3,"path() found a wrong path.");
115 95
  check(checkPath(G, p),"path() found a wrong path.");
116 96
  check(pathSource(G, p) == s,"path() found a wrong path.");
117 97
  check(pathTarget(G, p) == t,"path() found a wrong path.");
118 98
  
119 99

	
120 100
  for(ArcIt e(G); e==INVALID; ++e) {
... ...
@@ -136,6 +116,12 @@
136 116
	    << std::abs(bfs_test.dist(v) - bfs_test.dist(u) 
137 117
			- 1));
138 118
    }
139 119
  }
140 120
}
141 121

	
122
int main()
123
{
124
  checkBfs<ListDigraph>();
125
  checkBfs<SmartDigraph>();
126
  return 0;
127
}
Ignore white space 6 line context
... ...
@@ -14,53 +14,78 @@
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/counter.h>
20
#include <vector>
20 21

	
21
///\file \brief Test cases for time_measure.h
22
///
23
///\todo To be extended
22
using namespace lemon;
24 23

	
24
template <typename T>
25
void bubbleSort(std::vector<T>& v) {
26
  Counter op("Bubble Sort - Operations: ");
27
  Counter::NoSubCounter as(op, "Assignments: ");
28
  Counter::NoSubCounter co(op, "Comparisons: ");
29
  for (int i = v.size()-1; i > 0; --i) {
30
    for (int j = 0; j < i; ++j) {
31
      if (v[j] > v[j+1]) {
32
        T tmp = v[j];
33
        v[j] = v[j+1];
34
        v[j+1] = tmp;
35
        as += 3;
36
      }
37
      ++co;
38
    }
39
  }
40
}
25 41

	
26
int fibonacci(int f) 
27
{
28
  static lemon::Counter count("Fibonacci steps: ");
29
  count++;
30
  if(f<1) return 0;
31
  else if(f==1) return 1;
32
  else return fibonacci(f-1)+fibonacci(f-2);
42
template <typename T>
43
void insertionSort(std::vector<T>& v) {
44
  Counter op("Insertion Sort - Operations: ");
45
  Counter::NoSubCounter as(op, "Assignments: ");
46
  Counter::NoSubCounter co(op, "Comparisons: ");
47
  for (int i = 1; i < int(v.size()); ++i) {
48
    T value = v[i];
49
    ++as;
50
    int j = i;
51
    while (j > 0 && v[j-1] > value) {
52
      v[j] = v[j-1];
53
      --j;
54
      ++co; ++as;
55
    }
56
    v[j] = value;
57
    ++as;
58
  }
59
}
60

	
61
template <typename MyCounter>
62
void counterTest() {
63
  MyCounter c("Main Counter: ");
64
  c++;
65
  typename MyCounter::SubCounter d(c, "SubCounter: ");
66
  d++;
67
  typename MyCounter::SubCounter::NoSubCounter e(d, "SubSubCounter: ");
68
  e++;
69
  d+=3;
70
  c-=4;
71
  e-=2;
72
  c.reset(2);
73
  c.reset();
74
}
75

	
76
void init(std::vector<int>& v) {
77
  v[0] = 10; v[1] = 60; v[2] = 20; v[3] = 90; v[4] = 100;
78
  v[5] = 80; v[6] = 40; v[7] = 30; v[8] = 50; v[9] = 70; 
33 79
}
34 80

	
35 81
int main()
36 82
{
37
  fibonacci(10);
83
  counterTest<Counter>();
84
  counterTest<NoCounter>();
38 85
  
39
  {  
40
    typedef lemon::Counter MyCounter;
41
    MyCounter c("Main counter: ");
42
    c++;
43
    c++;
44
    MyCounter::SubCounter d(c,"Subcounter: ");
45
    d++;
46
    d++;
47
    MyCounter::SubCounter::SubCounter e(d,"SubSubCounter: ");
48
    e++;
49
    e++;
50
  }
51
  
52
  {
53
    typedef lemon::NoCounter MyCounter;
54
    MyCounter c("Main counter: ");
55
    c++;
56
    c++;
57
    MyCounter::SubCounter d(c,"Subcounter: ");
58
    d++;
59
    d++;
60
    MyCounter::SubCounter::SubCounter e(d,"SubSubCounter: ");
61
    e++;
62
    e++;
63
  }
86
  std::vector<int> x(10);
87
  init(x); bubbleSort(x);
88
  init(x); insertionSort(x);
64 89

	
65 90
  return 0;
66 91
}
Ignore white space 6 line context
... ...
@@ -13,38 +13,31 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#include "test_tools.h"
20
// #include <lemon/smart_graph.h>
19
#include <lemon/concepts/digraph.h>
20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/dfs.h>
23 23
#include <lemon/path.h>
24
#include <lemon/concepts/digraph.h>
24

	
25
#include "graph_test.h"
26
#include "test_tools.h"
25 27

	
26 28
using namespace lemon;
27 29

	
28
const int PET_SIZE =5;
29

	
30

	
31
void check_Dfs_SmartDigraph_Compile() 
30
void checkDfsCompile() 
32 31
{
33 32
  typedef concepts::Digraph Digraph;
34

	
35
  typedef Digraph::Arc Arc;
36
  typedef Digraph::Node Node;
37
  typedef Digraph::ArcIt ArcIt;
38
  typedef Digraph::NodeIt NodeIt;
39
 
40 33
  typedef Dfs<Digraph> DType;
41 34
  
42 35
  Digraph G;
43
  Node n;
44
  Arc e;
36
  Digraph::Node n;
37
  Digraph::Arc e;
45 38
  int l;
46 39
  bool b;
47 40
  DType::DistMap d(G);
48 41
  DType::PredMap p(G);
49 42
  //  DType::PredNodeMap pn(G);
50 43
  
... ...
@@ -60,60 +53,46 @@
60 53
  //  pn = dfs_test.predNodeMap();
61 54
  b  = dfs_test.reached(n);
62 55

	
63 56
  Path<Digraph> pp = dfs_test.path(n);
64 57
}
65 58

	
66

	
67
void check_Dfs_Function_Compile() 
59
void checkDfsFunctionCompile() 
68 60
{
69 61
  typedef int VType;
70 62
  typedef concepts::Digraph Digraph;
71

	
72 63
  typedef Digraph::Arc Arc;
73 64
  typedef Digraph::Node Node;
74
  typedef Digraph::ArcIt ArcIt;
75
  typedef Digraph::NodeIt NodeIt;
76
  typedef concepts::ReadMap<Arc,VType> LengthMap;
77 65
   
78 66
  Digraph g;
79 67
  dfs(g,Node()).run();
80 68
  dfs(g).source(Node()).run();
81 69
  dfs(g)
82 70
    .predMap(concepts::WriteMap<Node,Arc>())
83 71
    .distMap(concepts::WriteMap<Node,VType>())
84 72
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
85 73
    .processedMap(concepts::WriteMap<Node,bool>())
86
    .run(Node());
87
  
74
    .run(Node()); 
88 75
}
89 76

	
90
int main()
91
{
92
    
93
  // typedef SmartDigraph Digraph;
94
  typedef ListDigraph Digraph;
95

	
96
  typedef Digraph::Arc Arc;
97
  typedef Digraph::Node Node;
98
  typedef Digraph::ArcIt ArcIt;
99
  typedef Digraph::NodeIt NodeIt;
100
  typedef Digraph::ArcMap<int> LengthMap;
77
template <class Digraph>
78
void checkDfs() {
79
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
101 80

	
102 81
  Digraph G;
103 82
  Node s, t;
104
  PetStruct<Digraph> ps = addPetersen(G,PET_SIZE);
83
  PetStruct<Digraph> ps = addPetersen(G, 5);
105 84
   
106 85
  s=ps.outer[2];
107 86
  t=ps.inner[0];
108 87
  
109 88
  Dfs<Digraph> dfs_test(G);
110 89
  dfs_test.run(s);  
111 90
  
112 91
  Path<Digraph> p = dfs_test.path(t);
113
  check(p.length()==dfs_test.dist(t),"path() found a wrong path.");
92
  check(p.length() == dfs_test.dist(t),"path() found a wrong path.");
114 93
  check(checkPath(G, p),"path() found a wrong path.");
115 94
  check(pathSource(G, p) == s,"path() found a wrong path.");
116 95
  check(pathTarget(G, p) == t,"path() found a wrong path.");
117 96
  
118 97
  for(NodeIt v(G); v!=INVALID; ++v) {
119 98
    check(dfs_test.reached(v),"Each node should be reached.");
... ...
@@ -125,6 +104,12 @@
125 104
	    "Wrong distance. (" << dfs_test.dist(u) << "->" 
126 105
	    <<dfs_test.dist(v) << ')');
127 106
    }
128 107
  }
129 108
}
130 109

	
110
int main()
111
{
112
  checkDfs<ListDigraph>();
113
  checkDfs<SmartDigraph>();
114
  return 0;
115
}
Ignore white space 6 line context
... ...
@@ -13,70 +13,132 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#include <iostream>
20
#include <vector>
21

	
22 19
#include <lemon/concepts/digraph.h>
23 20
#include <lemon/list_graph.h>
24
//#include <lemon/smart_graph.h>
21
#include <lemon/smart_graph.h>
25 22
//#include <lemon/full_graph.h>
26 23
//#include <lemon/hypercube_graph.h>
27 24

	
28 25
#include "test_tools.h"
29
#include "digraph_test.h"
30
#include "map_test.h"
31

	
26
#include "graph_test.h"
27
#include "graph_maps_test.h"
32 28

	
33 29
using namespace lemon;
34 30
using namespace lemon::concepts;
35 31

	
36

	
37
int main() {
38
  { // checking digraph components
32
void check_concepts() {
33
  { // Checking digraph components
39 34
    checkConcept<BaseDigraphComponent, BaseDigraphComponent >();
40 35

	
41 36
    checkConcept<IDableDigraphComponent<>, 
42 37
      IDableDigraphComponent<> >();
43 38

	
44 39
    checkConcept<IterableDigraphComponent<>, 
45 40
      IterableDigraphComponent<> >();
46 41

	
47 42
    checkConcept<MappableDigraphComponent<>, 
48 43
      MappableDigraphComponent<> >();
49

	
50 44
  }
51
  { // checking skeleton digraphs
45
  { // Checking skeleton digraph
52 46
    checkConcept<Digraph, Digraph>();
53 47
  }
54
  { // checking list digraph
55
    checkConcept<Digraph, ListDigraph >();
48
  { // Checking ListDigraph
49
    checkConcept<Digraph, ListDigraph>();
56 50
    checkConcept<AlterableDigraphComponent<>, ListDigraph>();
57 51
    checkConcept<ExtendableDigraphComponent<>, ListDigraph>();
58 52
    checkConcept<ClearableDigraphComponent<>, ListDigraph>();
59 53
    checkConcept<ErasableDigraphComponent<>, ListDigraph>();
54
    checkDigraphIterators<ListDigraph>();
55
  }
56
  { // Checking SmartDigraph
57
    checkConcept<Digraph, SmartDigraph>();
58
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
59
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
60
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
61
    checkDigraphIterators<SmartDigraph>();
62
  }
63
//  { // Checking FullDigraph
64
//    checkConcept<Digraph, FullDigraph>();
65
//    checkDigraphIterators<FullDigraph>();
66
//  }
67
//  { // Checking HyperCubeDigraph
68
//    checkConcept<Digraph, HyperCubeDigraph>();
69
//    checkDigraphIterators<HyperCubeDigraph>();
70
//  }
71
}
60 72

	
73
template <typename Digraph>
74
void check_graph_validity() {
75
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
76
  Digraph g;
77

	
78
  Node
79
    n1 = g.addNode(),
80
    n2 = g.addNode(),
81
    n3 = g.addNode();
82

	
83
  Arc
84
    e1 = g.addArc(n1, n2),
85
    e2 = g.addArc(n2, n3);
86

	
87
  check(g.valid(n1), "Wrong validity check");
88
  check(g.valid(e1), "Wrong validity check");
89

	
90
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
91
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
92
}
93

	
94
template <typename Digraph>
95
void check_graph_validity_erase() {
96
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
97
  Digraph g;
98

	
99
  Node
100
    n1 = g.addNode(),
101
    n2 = g.addNode(),
102
    n3 = g.addNode();
103

	
104
  Arc
105
    e1 = g.addArc(n1, n2),
106
    e2 = g.addArc(n2, n3);
107

	
108
  check(g.valid(n1), "Wrong validity check");
109
  check(g.valid(e1), "Wrong validity check");
110

	
111
  g.erase(n1);
112

	
113
  check(!g.valid(n1), "Wrong validity check");
114
  check(g.valid(n2), "Wrong validity check");
115
  check(g.valid(n3), "Wrong validity check");
116
  check(!g.valid(e1), "Wrong validity check");
117
  check(g.valid(e2), "Wrong validity check");
118

	
119
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
120
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
121
}
122

	
123
void check_digraphs() {
124
  { // Checking ListDigraph
61 125
    checkDigraph<ListDigraph>();
62 126
    checkGraphNodeMap<ListDigraph>();
63 127
    checkGraphArcMap<ListDigraph>();
128

	
129
    check_graph_validity_erase<ListDigraph>();
64 130
  }
65
//   { // checking smart digraph
66
//     checkConcept<Digraph, SmartDigraph >();
131
  { // Checking SmartDigraph
132
    checkDigraph<SmartDigraph>();
133
    checkGraphNodeMap<SmartDigraph>();
134
    checkGraphArcMap<SmartDigraph>();
67 135

	
68
//     checkDigraph<SmartDigraph>();
69
//     checkDigraphNodeMap<SmartDigraph>();
70
//     checkDigraphArcMap<SmartDigraph>();
71
//   }
72
//   { // checking full digraph
73
//     checkConcept<Digraph, FullDigraph >();
74
//   }
75
//   { // checking full digraph
76
//     checkConcept<Digraph, HyperCubeDigraph >();
77
//   }
136
    check_graph_validity<SmartDigraph>();
137
  }
138
}
78 139

	
79
  std::cout << __FILE__ ": All tests passed.\n";
80

	
140
int main() {
141
  check_concepts();
142
  check_digraphs();
81 143
  return 0;
82 144
}
Ignore white space 6 line context
... ...
@@ -13,22 +13,20 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
///\file
20
///\brief Test cases for Dijkstra algorithm.
21

	
22 19
#include <lemon/concepts/digraph.h>
23 20
#include <lemon/smart_graph.h>
24 21
#include <lemon/list_graph.h>
25 22
#include <lemon/graph_utils.h>
26 23
#include <lemon/dijkstra.h>
27 24
#include <lemon/path.h>
28 25

	
26
#include "graph_test.h"
29 27
#include "test_tools.h"
30 28

	
31 29
using namespace lemon;
32 30

	
33 31
void checkDijkstraCompile() 
34 32
{
Ignore white space 6 line context
... ...
@@ -22,66 +22,62 @@
22 22

	
23 23
using namespace std;
24 24
using namespace lemon;
25 25

	
26 26
int main()
27 27
{
28
  cout << "Testing classes 'dim2::Point' and 'dim2::BoundingBox'." << endl;
29

	
30 28
  typedef dim2::Point<int> Point;
31 29

	
32 30
  Point p;
33
  check(p.size()==2, "Wrong vector initialization.");
31
  check(p.size()==2, "Wrong dim2::Point initialization.");
34 32

	
35 33
  Point a(1,2);
36 34
  Point b(3,4);
37
  check(a[0]==1 && a[1]==2, "Wrong vector initialization.");
35
  check(a[0]==1 && a[1]==2, "Wrong dim2::Point initialization.");
38 36

	
39 37
  p = a+b;
40
  check(p.x==4 && p.y==6, "Wrong vector addition.");
38
  check(p.x==4 && p.y==6, "Wrong dim2::Point addition.");
41 39

	
42 40
  p = a-b;
43
  check(p.x==-2 && p.y==-2, "Wrong vector subtraction.");
41
  check(p.x==-2 && p.y==-2, "Wrong dim2::Point subtraction.");
44 42

	
45
  check(a.normSquare()==5,"Wrong vector norm calculation.");
46
  check(a*b==11, "Wrong vector scalar product.");
43
  check(a.normSquare()==5,"Wrong dim2::Point norm calculation.");
44
  check(a*b==11, "Wrong dim2::Point scalar product.");
47 45

	
48 46
  int l=2;
49 47
  p = a*l;
50
  check(p.x==2 && p.y==4, "Wrong vector multiplication by a scalar.");
48
  check(p.x==2 && p.y==4, "Wrong dim2::Point multiplication by a scalar.");
51 49

	
52 50
  p = b/l;
53
  check(p.x==1 && p.y==2, "Wrong vector division by a scalar.");
51
  check(p.x==1 && p.y==2, "Wrong dim2::Point division by a scalar.");
54 52

	
55 53
  typedef dim2::BoundingBox<int> BB;
56 54
  BB box1;
57
  check(box1.empty(), "It should be empty.");
55
  check(box1.empty(), "Wrong empty() in dim2::BoundingBox.");
58 56

	
59 57
  box1.add(a);
60
  check(!box1.empty(), "It should not be empty.");
58
  check(!box1.empty(), "Wrong empty() in dim2::BoundingBox.");
61 59
  box1.add(b);
62 60

	
63 61
  check(box1.bottomLeft().x==1 &&
64 62
        box1.bottomLeft().y==2 &&
65 63
        box1.topRight().x==3 &&
66 64
        box1.topRight().y==4,
67
        "Wrong addition of points to box.");
65
        "Wrong addition of points to dim2::BoundingBox.");
68 66

	
69 67
  p.x=2; p.y=3;
70
  check(box1.inside(p), "It should be inside.");
68
  check(box1.inside(p), "Wrong inside() in dim2::BoundingBox.");
71 69

	
72 70
  p.x=1; p.y=3;
73
  check(box1.inside(p), "It should be inside.");
71
  check(box1.inside(p), "Wrong inside() in dim2::BoundingBox.");
74 72

	
75 73
  p.x=0; p.y=3;
76
  check(!box1.inside(p), "It should not be inside.");
74
  check(!box1.inside(p), "Wrong inside() in dim2::BoundingBox.");
77 75

	
78 76
  BB box2(p);
79
  check(!box2.empty(),
80
        "It should not be empty. Constructed from 1 point.");
77
  check(!box2.empty(), "Wrong empty() in dim2::BoundingBox.");
81 78

	
82 79
  box2.add(box1);
83
  check(box2.inside(p),
84
        "It should be inside. Incremented a box with another one.");
80
  check(box2.inside(p), "Wrong inside() in dim2::BoundingBox.");
85 81

	
86 82
  return 0;
87 83
}
Ignore white space 6 line context
... ...
@@ -51,12 +51,13 @@
51 51
  no_assertion_text_disable();
52 52
  assertion_text_disable();
53 53
  fixme_disable();
54 54
}
55 55
#undef LEMON_DISABLE_ASSERTS
56 56

	
57
//checking custom assert handler
57 58
#define LEMON_ASSERT_CUSTOM
58 59

	
59 60
static int cnt = 0;
60 61
void my_assert_handler(const char*, int, const char*, 
61 62
		       const char*, const char*) {
62 63
  ++cnt;
Ignore white space 6 line context
... ...
@@ -19,155 +19,114 @@
19 19
#include <lemon/concepts/graph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
// #include <lemon/full_graph.h>
23 23
// #include <lemon/grid_graph.h>
24 24

	
25
#include <lemon/graph_utils.h>
26

	
27 25
#include "test_tools.h"
28

	
26
#include "graph_test.h"
27
#include "graph_maps_test.h"
29 28

	
30 29
using namespace lemon;
31 30
using namespace lemon::concepts;
32 31

	
33 32
void check_concepts() {
34

	
35
  { // checking digraph components
33
  { // Checking graph components
36 34
    checkConcept<BaseGraphComponent, BaseGraphComponent >();
37 35

	
38 36
    checkConcept<IDableGraphComponent<>, 
39 37
      IDableGraphComponent<> >();
40 38

	
41 39
    checkConcept<IterableGraphComponent<>, 
42 40
      IterableGraphComponent<> >();
43 41

	
44 42
    checkConcept<MappableGraphComponent<>, 
45 43
      MappableGraphComponent<> >();
46

	
47 44
  }
48
  {
49
    checkConcept<Graph, ListGraph>();    
50
    checkConcept<Graph, SmartGraph>();    
51
//     checkConcept<Graph, FullGraph>();    
52
//     checkConcept<Graph, Graph>();    
53
//     checkConcept<Graph, GridGraph>();
45
  { // Checking skeleton graph
46
    checkConcept<Graph, Graph>();
54 47
  }
48
  { // Checking ListGraph
49
    checkConcept<Graph, ListGraph>();
50
    checkConcept<AlterableGraphComponent<>, ListGraph>();
51
    checkConcept<ExtendableGraphComponent<>, ListGraph>();
52
    checkConcept<ClearableGraphComponent<>, ListGraph>();
53
    checkConcept<ErasableGraphComponent<>, ListGraph>();
54
    checkGraphIterators<ListGraph>();
55
  }
56
  { // Checking SmartGraph
57
    checkConcept<Graph, SmartGraph>();
58
    checkConcept<AlterableGraphComponent<>, SmartGraph>();
59
    checkConcept<ExtendableGraphComponent<>, SmartGraph>();
60
    checkConcept<ClearableGraphComponent<>, SmartGraph>();
61
    checkGraphIterators<SmartGraph>();
62
  }
63
//  { // Checking FullGraph
64
//    checkConcept<Graph, FullGraph>();
65
//    checkGraphIterators<FullGraph>();
66
//  }
67
//  { // Checking GridGraph
68
//    checkConcept<Graph, GridGraph>();
69
//    checkGraphIterators<GridGraph>();
70
//  }
55 71
}
56 72

	
57 73
template <typename Graph>
58
void check_item_counts(Graph &g, int n, int e) {
59
  int nn = 0;
60
  for (typename Graph::NodeIt it(g); it != INVALID; ++it) {
61
    ++nn;
62
  }
63

	
64
  check(nn == n, "Wrong node number.");
65
  //  check(countNodes(g) == n, "Wrong node number.");
66

	
67
  int ee = 0;
68
  for (typename Graph::ArcIt it(g); it != INVALID; ++it) {
69
    ++ee;
70
  }
71

	
72
  check(ee == 2*e, "Wrong arc number.");
73
  //  check(countArcs(g) == 2*e, "Wrong arc number.");
74

	
75
  int uee = 0;
76
  for (typename Graph::EdgeIt it(g); it != INVALID; ++it) {
77
    ++uee;
78
  }
79

	
80
  check(uee == e, "Wrong edge number.");
81
  //  check(countEdges(g) == e, "Wrong edge number.");
82
}
83

	
84
template <typename Graph>
85
void check_graph_counts() {
86

	
74
void check_graph_validity() {
87 75
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
88 76
  Graph g;
89 77

	
90
  check_item_counts(g,0,0);
91

	
92 78
  Node
93 79
    n1 = g.addNode(),
94 80
    n2 = g.addNode(),
95 81
    n3 = g.addNode();
96 82

	
97 83
  Edge
98 84
    e1 = g.addEdge(n1, n2),
99 85
    e2 = g.addEdge(n2, n3);
100 86

	
101
  check_item_counts(g,3,2);
87
  check(g.valid(n1), "Wrong validity check");
88
  check(g.valid(e1), "Wrong validity check");
89
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
90

	
91
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
92
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
93
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
102 94
}
103 95

	
104 96
template <typename Graph>
105
void check_graph_validity() {
106

	
97
void check_graph_validity_erase() {
107 98
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
108 99
  Graph g;
109 100

	
110
  check_item_counts(g,0,0);
111

	
112 101
  Node
113 102
    n1 = g.addNode(),
114 103
    n2 = g.addNode(),
115 104
    n3 = g.addNode();
116 105

	
117 106
  Edge
118 107
    e1 = g.addEdge(n1, n2),
119 108
    e2 = g.addEdge(n2, n3);
120 109

	
121
  check(g.valid(n1), "Validity check");
122
  check(g.valid(e1), "Validity check");
123
  check(g.valid(g.direct(e1, true)), "Validity check");
124

	
125
  check(!g.valid(g.nodeFromId(-1)), "Validity check");
126
  check(!g.valid(g.edgeFromId(-1)), "Validity check");
127
  check(!g.valid(g.arcFromId(-1)), "Validity check");
128
    
129
}
130

	
131
template <typename Graph>
132
void check_graph_validity_erase() {
133

	
134
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
135
  Graph g;
136

	
137
  check_item_counts(g,0,0);
138

	
139
  Node
140
    n1 = g.addNode(),
141
    n2 = g.addNode(),
142
    n3 = g.addNode();
143

	
144
  Edge
145
    e1 = g.addEdge(n1, n2),
146
    e2 = g.addEdge(n2, n3);
147

	
148
  check(g.valid(n1), "Validity check");
149
  check(g.valid(e1), "Validity check");
150
  check(g.valid(g.direct(e1, true)), "Validity check");
110
  check(g.valid(n1), "Wrong validity check");
111
  check(g.valid(e1), "Wrong validity check");
112
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
151 113

	
152 114
  g.erase(n1);
153 115

	
154
  check(!g.valid(n1), "Validity check");
155
  check(g.valid(n2), "Validity check");
156
  check(g.valid(n3), "Validity check");
157
  check(!g.valid(e1), "Validity check");
158
  check(g.valid(e2), "Validity check");
116
  check(!g.valid(n1), "Wrong validity check");
117
  check(g.valid(n2), "Wrong validity check");
118
  check(g.valid(n3), "Wrong validity check");
119
  check(!g.valid(e1), "Wrong validity check");
120
  check(g.valid(e2), "Wrong validity check");
159 121

	
160
  check(!g.valid(g.nodeFromId(-1)), "Validity check");
161
  check(!g.valid(g.edgeFromId(-1)), "Validity check");
162
  check(!g.valid(g.arcFromId(-1)), "Validity check");
163
    
122
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
123
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
124
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
164 125
}
165 126

	
166

	
167

	
168 127
// void checkGridGraph(const GridGraph& g, int w, int h) {
169 128
//   check(g.width() == w, "Wrong width");
170 129
//   check(g.height() == h, "Wrong height");
171 130

	
172 131
//   for (int i = 0; i < w; ++i) {
173 132
//     for (int j = 0; j < h; ++j) {
... ...
@@ -206,30 +165,39 @@
206 165
//       check(g.target(g.left(g(i, j))) == g(i - 1, j), "Wrong left");      
207 166
//     }
208 167
//     check(g.left(g(0, j)) == INVALID, "Wrong left");    
209 168
//   }
210 169
// }
211 170

	
171
void check_graphs() {
172
  { // Checking ListGraph
173
    checkGraph<ListGraph>();
174
    checkGraphNodeMap<ListGraph>();
175
    checkGraphEdgeMap<ListGraph>();
176

	
177
    check_graph_validity_erase<ListGraph>();
178
  }
179
  { // Checking SmartGraph
180
    checkGraph<SmartGraph>();
181
    checkGraphNodeMap<SmartGraph>();
182
    checkGraphEdgeMap<SmartGraph>();
183

	
184
    check_graph_validity<SmartGraph>();
185
  }
186
//   { // Checking FullGraph
187
//     FullGraph g(5);
188
//     checkGraphNodeList(g, 5);
189
//     checkGraphEdgeList(g, 10);
190
//   }
191
//   { // Checking GridGraph
192
//     GridGraph g(5, 6);
193
//     checkGraphNodeList(g, 30);
194
//     checkGraphEdgeList(g, 49);
195
//     checkGridGraph(g, 5, 6);
196
//   }
197
}
198

	
212 199
int main() {
213 200
  check_concepts();
214

	
215
  check_graph_counts<ListGraph>();
216
  check_graph_counts<SmartGraph>();
217

	
218
  check_graph_validity_erase<ListGraph>();
219
  check_graph_validity<SmartGraph>();
220

	
221
//   {
222
//     FullGraph g(5);
223
//     check_item_counts(g, 5, 10);
224
//   }
225

	
226
//   {
227
//     GridGraph g(5, 6);
228
//     check_item_counts(g, 30, 49);
229
//     checkGridGraph(g, 5, 6);
230
//   }
231

	
232
  std::cout << __FILE__ ": All tests passed.\n";
233

	
201
  check_graphs();
234 202
  return 0;
235 203
}
Ignore white space 6 line context
... ...
@@ -13,129 +13,201 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#include <iostream>
20
#include <vector>
19
#include <cstdlib>
20
#include <ctime>
21 21

	
22
#include <lemon/random.h>
22 23
#include <lemon/graph_utils.h>
23

	
24 24
#include <lemon/list_graph.h>
25 25
#include <lemon/smart_graph.h>
26 26

	
27
#include "graph_test.h"
27 28
#include "test_tools.h"
28
#include "graph_utils_test.h"
29

	
30 29

	
31 30
using namespace lemon;
32 31

	
33
template <class Graph>
34
void checkSnapDeg() 
32
template <typename Digraph>
33
void checkFindArcs() {
34
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
35

	
36
  {
37
    Digraph digraph;
38
    for (int i = 0; i < 10; ++i) {
39
      digraph.addNode();
40
    }
41
    DescriptorMap<Digraph, Node> nodes(digraph);
42
    typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes);
43
    for (int i = 0; i < 100; ++i) {
44
      int src = rnd[invNodes.size()];
45
      int trg = rnd[invNodes.size()];
46
      digraph.addArc(invNodes[src], invNodes[trg]);
47
    }
48
    typename Digraph::template ArcMap<bool> found(digraph, false);
49
    DescriptorMap<Digraph, Arc> arcs(digraph);
50
    for (NodeIt src(digraph); src != INVALID; ++src) {
51
      for (NodeIt trg(digraph); trg != INVALID; ++trg) {
52
        for (ConArcIt<Digraph> con(digraph, src, trg); con != INVALID; ++con) {
53
          check(digraph.source(con) == src, "Wrong source.");
54
          check(digraph.target(con) == trg, "Wrong target.");
55
          check(found[con] == false, "The arc found already.");
56
          found[con] = true;
57
        }
58
      }
59
    }
60
    for (ArcIt it(digraph); it != INVALID; ++it) {
61
      check(found[it] == true, "The arc is not found.");
62
    }
63
  }
64

	
65
  {
66
    int num = 5;
67
    Digraph fg;
68
    std::vector<Node> nodes;
69
    for (int i = 0; i < num; ++i) {
70
      nodes.push_back(fg.addNode());
71
    }
72
    for (int i = 0; i < num * num; ++i) {
73
      fg.addArc(nodes[i / num], nodes[i % num]);
74
    }
75
    check(countNodes(fg) == num, "Wrong node number.");
76
    check(countArcs(fg) == num*num, "Wrong arc number.");
77
    for (NodeIt src(fg); src != INVALID; ++src) {
78
      for (NodeIt trg(fg); trg != INVALID; ++trg) {
79
        ConArcIt<Digraph> con(fg, src, trg);
80
        check(con != INVALID, "There is no connecting arc.");
81
        check(fg.source(con) == src, "Wrong source.");
82
        check(fg.target(con) == trg, "Wrong target.");
83
        check(++con == INVALID, "There is more connecting arc.");
84
      }
85
    }
86
    ArcLookUp<Digraph> al1(fg);
87
    DynArcLookUp<Digraph> al2(fg);
88
    AllArcLookUp<Digraph> al3(fg);
89
    for (NodeIt src(fg); src != INVALID; ++src) {
90
      for (NodeIt trg(fg); trg != INVALID; ++trg) {
91
        Arc con1 = al1(src, trg);
92
        Arc con2 = al2(src, trg);
93
        Arc con3 = al3(src, trg);
94
        Arc con4 = findArc(fg, src, trg);
95
        check(con1 == con2 && con2 == con3 && con3 == con4, "Different results.")
96
        check(con1 != INVALID, "There is no connecting arc.");
97
        check(fg.source(con1) == src, "Wrong source.");
98
        check(fg.target(con1) == trg, "Wrong target.");
99
        check(al3(src, trg, con3) == INVALID, "There is more connecting arc.");
100
        check(findArc(fg, src, trg, con4) == INVALID, "There is more connecting arc.");
101
      }
102
    }
103
  }
104
}
105

	
106
template <typename Graph>
107
void checkFindEdges() {
108
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
109
  Graph graph;
110
  for (int i = 0; i < 10; ++i) {
111
    graph.addNode();
112
  }
113
  DescriptorMap<Graph, Node> nodes(graph);
114
  typename DescriptorMap<Graph, Node>::InverseMap invNodes(nodes);
115
  for (int i = 0; i < 100; ++i) {
116
    int src = rnd[invNodes.size()];
117
    int trg = rnd[invNodes.size()];
118
    graph.addEdge(invNodes[src], invNodes[trg]);
119
  }
120
  typename Graph::template EdgeMap<int> found(graph, 0);
121
  DescriptorMap<Graph, Edge> edges(graph);
122
  for (NodeIt src(graph); src != INVALID; ++src) {
123
    for (NodeIt trg(graph); trg != INVALID; ++trg) {
124
      for (ConEdgeIt<Graph> con(graph, src, trg); con != INVALID; ++con) {
125
        check( (graph.u(con) == src && graph.v(con) == trg) ||
126
               (graph.v(con) == src && graph.u(con) == trg), "Wrong end nodes.");
127
        ++found[con];
128
        check(found[con] <= 2, "The edge found more than twice.");
129
      }
130
    }
131
  }
132
  for (EdgeIt it(graph); it != INVALID; ++it) {
133
    check( (graph.u(it) != graph.v(it) && found[it] == 2) ||
134
           (graph.u(it) == graph.v(it) && found[it] == 1),
135
           "The edge is not found correctly.");
136
  }
137
}
138

	
139
template <class Digraph>
140
void checkDeg()
35 141
{
36
  Graph g;
37
  typename Graph::Node n1=g.addNode();
38
  typename Graph::Node n2=g.addNode();
39
   
40
  InDegMap<Graph> ind(g);
41
 
142
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
143
  
144
  const int nodeNum = 10;
145
  const int arcNum = 100;
146
  Digraph digraph;
147
  InDegMap<Digraph> inDeg(digraph);
148
  OutDegMap<Digraph> outDeg(digraph);
149
  std::vector<Node> nodes(nodeNum);
150
  for (int i = 0; i < nodeNum; ++i) {
151
    nodes[i] = digraph.addNode();
152
  }
153
  std::vector<Arc> arcs(arcNum);
154
  for (int i = 0; i < arcNum; ++i) {
155
    arcs[i] = digraph.addArc(nodes[rnd[nodeNum]], nodes[rnd[nodeNum]]);
156
  }
157
  for (int i = 0; i < nodeNum; ++i) {
158
    check(inDeg[nodes[i]] == countInArcs(digraph, nodes[i]), 
159
          "Wrong in degree map");
160
  }
161
  for (int i = 0; i < nodeNum; ++i) {
162
    check(outDeg[nodes[i]] == countOutArcs(digraph, nodes[i]), 
163
          "Wrong out degree map");
164
  }
165
}
166

	
167
template <class Digraph>
168
void checkSnapDeg()
169
{
170
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
171

	
172
  Digraph g;
173
  Node n1=g.addNode();
174
  Node n2=g.addNode();
175
  
176
  InDegMap<Digraph> ind(g);
177
  
42 178
  g.addArc(n1,n2);
43 179
  
44
  typename Graph::Snapshot snap(g);
180
  typename Digraph::Snapshot snap(g);
45 181
  
46
  OutDegMap<Graph> outd(g);
182
  OutDegMap<Digraph> outd(g);
47 183
  
48 184
  check(ind[n1]==0 && ind[n2]==1, "Wrong InDegMap value.");
49 185
  check(outd[n1]==1 && outd[n2]==0, "Wrong OutDegMap value.");
50 186

	
51 187
  g.addArc(n1,n2);
52 188
  g.addArc(n2,n1);
53
 
189

	
54 190
  check(ind[n1]==1 && ind[n2]==2, "Wrong InDegMap value.");
55 191
  check(outd[n1]==2 && outd[n2]==1, "Wrong OutDegMap value.");
56 192

	
57 193
  snap.restore();
58 194

	
59 195
  check(ind[n1]==0 && ind[n2]==1, "Wrong InDegMap value.");
60 196
  check(outd[n1]==1 && outd[n2]==0, "Wrong OutDegMap value.");
61
  
62 197
}
63 198

	
64 199
int main() {
65
  ///\file
66
  { // checking list graph
67
    checkDigraphCounters<ListDigraph>();
68
    checkFindArc<ListDigraph>();
69
  }
70
  { // checking smart graph
71
    checkDigraphCounters<SmartDigraph>();
72
    checkFindArc<SmartDigraph>();
73
  }
74
  {
75
    int num = 5;
76
    SmartDigraph fg;
77
    std::vector<SmartDigraph::Node> nodes;
78
    for (int i = 0; i < num; ++i) {
79
      nodes.push_back(fg.addNode());
80
    }
81
    for (int i = 0; i < num * num; ++i) {
82
      fg.addArc(nodes[i / num], nodes[i % num]);
83
    }
84
    check(countNodes(fg) == num, "FullGraph: wrong node number.");
85
    check(countArcs(fg) == num*num, "FullGraph: wrong arc number.");
86
    for (SmartDigraph::NodeIt src(fg); src != INVALID; ++src) {
87
      for (SmartDigraph::NodeIt trg(fg); trg != INVALID; ++trg) {
88
	ConArcIt<SmartDigraph> con(fg, src, trg);
89
	check(con != INVALID, "There is no connecting arc.");
90
	check(fg.source(con) == src, "Wrong source.");
91
	check(fg.target(con) == trg, "Wrong target.");
92
	check(++con == INVALID, "There is more connecting arc.");
93
      }
94
    }
95
    AllArcLookUp<SmartDigraph> el(fg);
96
    for (SmartDigraph::NodeIt src(fg); src != INVALID; ++src) {
97
      for (SmartDigraph::NodeIt trg(fg); trg != INVALID; ++trg) {
98
	SmartDigraph::Arc con = el(src, trg);
99
	check(con != INVALID, "There is no connecting arc.");
100
	check(fg.source(con) == src, "Wrong source.");
101
	check(fg.target(con) == trg, "Wrong target.");
102
	check(el(src,trg,con) == INVALID, "There is more connecting arc.");
103
      }
104
    }
105
  }
200
  // Checking ConArcIt, ConEdgeIt, ArcLookUp, AllArcLookUp, and DynArcLookUp
201
  checkFindArcs<ListDigraph>();
202
  checkFindArcs<SmartDigraph>();
203
  checkFindEdges<ListGraph>();
204
  checkFindEdges<SmartGraph>();
106 205

	
107
  //check In/OutDegMap (and Snapshot feature)
108

	
206
  // Checking In/OutDegMap (and Snapshot feature)
207
  checkDeg<ListDigraph>();
208
  checkDeg<SmartDigraph>();
109 209
  checkSnapDeg<ListDigraph>();
110 210
  checkSnapDeg<SmartDigraph>();
111
  
112
  {
113
    const int nodeNum = 10;
114
    const int arcNum = 100;
115
    ListDigraph digraph;
116
    InDegMap<ListDigraph> inDeg(digraph);
117
    OutDegMap<ListDigraph> outDeg(digraph);
118
    std::vector<ListDigraph::Node> nodes(nodeNum);
119
    for (int i = 0; i < nodeNum; ++i) {
120
      nodes[i] = digraph.addNode();
121
    }
122
    std::vector<ListDigraph::Arc> arcs(arcNum);
123
    for (int i = 0; i < arcNum; ++i) {
124
      arcs[i] = 
125
	digraph.addArc(nodes[rnd[nodeNum]], nodes[rnd[nodeNum]]);
126
    }
127
    for (int i = 0; i < nodeNum; ++i) {
128
      check(inDeg[nodes[i]] == countInArcs(digraph, nodes[i]), 
129
	    "Wrong in degree map");
130
    }
131
    for (int i = 0; i < nodeNum; ++i) {
132
      check(outDeg[nodes[i]] == countOutArcs(digraph, nodes[i]), 
133
	    "Wrong in degree map");
134
    }
135
  }
136

	
137
  ///Everything is OK
138
  std::cout << __FILE__ ": All tests passed.\n";
139 211

	
140 212
  return 0;
141 213
}
Ignore white space 6 line context
... ...
@@ -39,13 +39,12 @@
39 39

	
40 40
#include <lemon/time_measure.h>
41 41

	
42 42
using namespace lemon;
43 43
using namespace lemon::concepts;
44 44

	
45

	
46 45
int main() {
47 46

	
48 47
  typedef int Item;
49 48
  typedef int Prio;
50 49
  typedef IntIntMap ItemIntMap;
51 50

	
... ...
@@ -74,13 +73,13 @@
74 73
  DigraphReader<Digraph>(input, digraph).
75 74
    readArcMap("capacity", length).
76 75
    readNode("source", start).
77 76
    run();  
78 77
 
79 78
  {
80
    std::cerr << "Checking Bin Heap" << std::endl;
79
    std::cout << "Checking Bin Heap" << std::endl;
81 80

	
82 81
    typedef BinHeap<Prio, ItemIntMap> IntHeap;
83 82
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
84 83
    heapSortTest<IntHeap>(100);
85 84
    heapIncreaseTest<IntHeap>(100);
86 85
    
... ...
@@ -88,13 +87,13 @@
88 87
    checkConcept<Heap<Prio, Digraph::NodeMap<int> >, NodeHeap>();
89 88
    Timer timer;
90 89
    dijkstraHeapTest<Digraph, LengthMap, NodeHeap>(digraph, length, start);
91 90
    std::cout << timer << std::endl;
92 91
  }
93 92
  {
94
    std::cerr << "Checking Fib Heap" << std::endl;
93
    std::cout << "Checking Fib Heap" << std::endl;
95 94

	
96 95
    typedef FibHeap<Prio, ItemIntMap> IntHeap;
97 96
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
98 97
    heapSortTest<IntHeap>(100);
99 98
    heapIncreaseTest<IntHeap>(100);
100 99

	
... ...
@@ -102,13 +101,13 @@
102 101
    checkConcept<Heap<Prio, Digraph::NodeMap<int> >, NodeHeap>();
103 102
    Timer timer;
104 103
    dijkstraHeapTest<Digraph, LengthMap, NodeHeap>(digraph, length, start);
105 104
    std::cout << timer << std::endl;
106 105
  }
107 106
  {
108
    std::cerr << "Checking Radix Heap" << std::endl;
107
    std::cout << "Checking Radix Heap" << std::endl;
109 108

	
110 109
    typedef RadixHeap<ItemIntMap> IntHeap;
111 110
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
112 111
    heapSortTest<IntHeap>(100);
113 112
    heapIncreaseTest<IntHeap>(100);
114 113

	
... ...
@@ -117,13 +116,13 @@
117 116
    Timer timer;
118 117
    dijkstraHeapTest<Digraph, LengthMap, NodeHeap>(digraph, length, start);
119 118
    std::cout << timer << std::endl;
120 119
  }
121 120

	
122 121
  {
123
    std::cerr << "Checking Bucket Heap" << std::endl;
122
    std::cout << "Checking Bucket Heap" << std::endl;
124 123

	
125 124
    typedef BucketHeap<ItemIntMap> IntHeap;
126 125
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
127 126
    heapSortTest<IntHeap>(100);
128 127
    heapIncreaseTest<IntHeap>(100);
129 128

	
... ...
@@ -131,10 +130,8 @@
131 130
    checkConcept<Heap<Prio, Digraph::NodeMap<int> >, NodeHeap>();
132 131
    Timer timer;
133 132
    dijkstraHeapTest<Digraph, LengthMap, NodeHeap>(digraph, length, start);
134 133
    std::cout << timer << std::endl;
135 134
  }
136 135

	
137
  std::cout << __FILE__ ": All tests passed.\n";
138

	
139 136
  return 0;
140 137
}
Ignore white space 6 line context
... ...
@@ -25,13 +25,12 @@
25 25
#include <lemon/list_graph.h>
26 26

	
27 27
#include <lemon/concepts/maps.h>
28 28
#include <lemon/concepts/digraph.h>
29 29
#include <lemon/concepts/graph.h>
30 30

	
31

	
32 31
using namespace std;
33 32
using namespace lemon;
34 33

	
35 34
void checkCompileKruskal()
36 35
{
37 36
  concepts::WriteMap<concepts::Digraph::Arc,bool> w;
... ...
@@ -54,13 +53,12 @@
54 53

	
55 54
  std::vector<concepts::Digraph::Arc> ws;
56 55
  std::vector<concepts::Graph::Edge> uws;
57 56

	
58 57
  kruskal(g, r, ws.begin());
59 58
  kruskal(ug, ur, uws.begin());
60

	
61 59
}
62 60

	
63 61
int main() {
64 62

	
65 63
  typedef ListGraph::Node Node;
66 64
  typedef ListGraph::Edge Edge;
... ...
@@ -94,13 +92,13 @@
94 92
  EBoolMap tree_map(G);
95 93
  
96 94

	
97 95
  //Test with const map.
98 96
  check(kruskal(G, ConstMap<ListGraph::Edge,int>(2), tree_map)==10,
99 97
	"Total cost should be 10");
100
  //Test with a edge map (filled with uniform costs).
98
  //Test with an edge map (filled with uniform costs).
101 99
  check(kruskal(G, edge_cost_map, tree_map)==10,
102 100
	"Total cost should be 10");
103 101

	
104 102
  edge_cost_map.set(e1, -10);
105 103
  edge_cost_map.set(e2, -9);
106 104
  edge_cost_map.set(e3, -8);
Ignore white space 6 line context
... ...
@@ -16,17 +16,12 @@
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/random.h>
20 20
#include "test_tools.h"
21 21

	
22
///\file \brief Test cases for random.h
23
///
24
///\todo To be extended
25
///
26

	
27 22
int seed_array[] = {1, 2};
28 23

	
29 24
int main()
30 25
{
31 26
  double a=lemon::rnd();
32 27
  check(a<1.0&&a>0.0,"This should be in [0,1)");
Ignore white space 6 line context
... ...
@@ -16,166 +16,32 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_TEST_TEST_TOOLS_H
20 20
#define LEMON_TEST_TEST_TOOLS_H
21 21

	
22
///\ingroup misc
23
///\file
24
///\brief Some utilities to write test programs.
25

	
22 26
#include <iostream>
23
#include <vector>
24 27

	
25
#include <cstdlib>
26
#include <ctime>
28
///If \c rc is fail, writes an error message and exits.
27 29

	
28
#include <lemon/concept_check.h>
29
#include <lemon/concepts/digraph.h>
30

	
31
#include <lemon/random.h>
32

	
33
using namespace lemon;
34

	
35
//! \ingroup misc
36
//! \file
37
//! \brief Some utilities to write test programs.
38

	
39

	
40
///If \c rc is fail, writes an error message end exit.
41

	
42
///If \c rc is fail, writes an error message end exit.
30
///If \c rc is fail, writes an error message and exits.
43 31
///The error message contains the file name and the line number of the
44 32
///source code in a standard from, which makes it possible to go there
45 33
///using good source browsers like e.g. \c emacs.
46 34
///
47 35
///For example
48 36
///\code check(0==1,"This is obviously false.");\endcode will
49
///print this (and then exits).
50
///\verbatim digraph_test.cc:123: error: This is obviously false. \endverbatim
37
///print something like this (and then exits).
38
///\verbatim file_name.cc:123: error: This is obviously false. \endverbatim
51 39
///
52
///\todo It should be in \c error.h
40
///\todo It should be in \c assert.h
53 41
#define check(rc, msg) \
54 42
  if(!(rc)) { \
55 43
    std::cerr << __FILE__ ":" << __LINE__ << ": error: " << msg << std::endl; \
56 44
    abort(); \
57 45
  } else { } \
58 46

	
59
///Structure returned by \ref addPetersen().
60

	
61
///Structure returned by \ref addPetersen().
62
///
63
template<class Digraph> struct PetStruct
64
{
65
  ///Vector containing the outer nodes.
66
  std::vector<typename Digraph::Node> outer;
67
  ///Vector containing the inner nodes.
68
  std::vector<typename Digraph::Node> inner;
69
  ///Vector containing the arcs of the inner circle.
70
  std::vector<typename Digraph::Arc> incir;
71
  ///Vector containing the arcs of the outer circle.
72
  std::vector<typename Digraph::Arc> outcir;
73
  ///Vector containing the chord arcs.
74
  std::vector<typename Digraph::Arc> chords;
75
};
76

	
77

	
78

	
79
///Adds a Petersen digraph to \c G.
80

	
81
///Adds a Petersen digraph to \c G.
82
///\return The nodes and arcs of the generated digraph.
83

	
84
template<typename Digraph>
85
PetStruct<Digraph> addPetersen(Digraph &G,int num = 5)
86
{
87
  PetStruct<Digraph> n;
88

	
89
  for(int i=0;i<num;i++) {
90
    n.outer.push_back(G.addNode());
91
    n.inner.push_back(G.addNode());
92
  }
93

	
94
 for(int i=0;i<num;i++) {
95
   n.chords.push_back(G.addArc(n.outer[i],n.inner[i]));
96
   n.outcir.push_back(G.addArc(n.outer[i],n.outer[(i+1) % num]));
97
   n.incir.push_back(G.addArc(n.inner[i],n.inner[(i+2) % num]));
98
  }
99
 return n;
100
}
101

	
102
/// \brief Adds to the digraph the reverse pair of all arcs.
103
///
104
/// Adds to the digraph the reverse pair of all arcs.
105
///
106
template<class Digraph> void bidirDigraph(Digraph &G)
107
{
108
  typedef typename Digraph::Arc Arc;
109
  typedef typename Digraph::ArcIt ArcIt;
110
  
111
  std::vector<Arc> ee;
112
  
113
  for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e);
114

	
115
  for(typename std::vector<Arc>::iterator p=ee.begin();p!=ee.end();p++)
116
    G.addArc(G.target(*p),G.source(*p));
117
}
118

	
119

	
120
/// \brief Checks the bidirectioned Petersen digraph.
121
///
122
///  Checks the bidirectioned Petersen digraph.
123
///
124
template<class Digraph> void checkBidirPetersen(Digraph &G, int num = 5)
125
{
126
  typedef typename Digraph::Node Node;
127

	
128
  typedef typename Digraph::ArcIt ArcIt;
129
  typedef typename Digraph::NodeIt NodeIt;
130

	
131
  checkDigraphNodeList(G, 2 * num);
132
  checkDigraphArcList(G, 6 * num);
133

	
134
  for(NodeIt n(G);n!=INVALID;++n) {
135
    checkDigraphInArcList(G, n, 3);
136
    checkDigraphOutArcList(G, n, 3);
137
  }  
138
}
139

	
140
///Structure returned by \ref addUPetersen().
141

	
142
///Structure returned by \ref addUPetersen().
143
///
144
template<class Digraph> struct UPetStruct
145
{
146
  ///Vector containing the outer nodes.
147
  std::vector<typename Digraph::Node> outer;
148
  ///Vector containing the inner nodes.
149
  std::vector<typename Digraph::Node> inner;
150
  ///Vector containing the arcs of the inner circle.
151
  std::vector<typename Digraph::Edge> incir;
152
  ///Vector containing the arcs of the outer circle.
153
  std::vector<typename Digraph::Edge> outcir;
154
  ///Vector containing the chord arcs.
155
  std::vector<typename Digraph::Edge> chords;
156
};
157

	
158
///Adds a Petersen digraph to the undirected \c G.
159

	
160
///Adds a Petersen digraph to the undirected \c G.
161
///\return The nodes and arcs of the generated digraph.
162

	
163
template<typename Digraph>
164
UPetStruct<Digraph> addUPetersen(Digraph &G,int num=5)
165
{
166
  UPetStruct<Digraph> n;
167

	
168
  for(int i=0;i<num;i++) {
169
    n.outer.push_back(G.addNode());
170
    n.inner.push_back(G.addNode());
171
  }
172

	
173
 for(int i=0;i<num;i++) {
174
   n.chords.push_back(G.addArc(n.outer[i],n.inner[i]));
175
   n.outcir.push_back(G.addArc(n.outer[i],n.outer[(i+1)%5]));
176
   n.incir.push_back(G.addArc(n.inner[i],n.inner[(i+2)%5]));
177
 }
178
 return n;
179
}
180

	
181 47
#endif
Ignore white space 6 line context
... ...
@@ -15,17 +15,12 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/time_measure.h>
20 20

	
21
///\file \brief Test cases for time_measure.h
22
///
23
///\todo To be extended
24

	
25

	
26 21
using namespace lemon;
27 22

	
28 23
void f() 
29 24
{
30 25
  double d=0;
31 26
  for(int i=0;i<1000;i++)
Ignore white space 6 line context
... ...
@@ -13,14 +13,12 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#include <iostream>
20

	
21 19
#include <lemon/list_graph.h>
22 20
#include <lemon/maps.h>
23 21
#include <lemon/unionfind.h>
24 22
#include "test_tools.h"
25 23

	
26 24
using namespace lemon;
... ...
@@ -36,69 +34,69 @@
36 34
  
37 35
  for(int i=0;i<20;i++) n.push_back(g.addNode());
38 36

	
39 37
  U.insert(n[1]);
40 38
  U.insert(n[2]);
41 39

	
42
  check(U.join(n[1],n[2]) != -1,"Test failed.");
40
  check(U.join(n[1],n[2]) != -1, "Something is wrong with UnionFindEnum");
43 41

	
44 42
  U.insert(n[3]);
45 43
  U.insert(n[4]);
46 44
  U.insert(n[5]);
47 45
  U.insert(n[6]);
48 46
  U.insert(n[7]);
49 47

	
50 48

	
51
  check(U.join(n[1],n[4]) != -1,"Test failed.");
52
  check(U.join(n[2],n[4]) == -1,"Test failed.");
53
  check(U.join(n[3],n[5]) != -1,"Test failed.");
49
  check(U.join(n[1],n[4]) != -1, "Something is wrong with UnionFindEnum");
50
  check(U.join(n[2],n[4]) == -1, "Something is wrong with UnionFindEnum");
51
  check(U.join(n[3],n[5]) != -1, "Something is wrong with UnionFindEnum");
54 52

	
55 53

	
56 54
  U.insert(n[8],U.find(n[5]));
57 55

	
58 56

	
59
  check(U.size(U.find(n[4])) == 3,"Test failed.");
60
  check(U.size(U.find(n[5])) == 3,"Test failed.");
61
  check(U.size(U.find(n[6])) == 1,"Test failed.");
62
  check(U.size(U.find(n[2])) == 3,"Test failed.");
57
  check(U.size(U.find(n[4])) == 3, "Something is wrong with UnionFindEnum");
58
  check(U.size(U.find(n[5])) == 3, "Something is wrong with UnionFindEnum");
59
  check(U.size(U.find(n[6])) == 1, "Something is wrong with UnionFindEnum");
60
  check(U.size(U.find(n[2])) == 3, "Something is wrong with UnionFindEnum");
63 61

	
64 62

	
65 63
  U.insert(n[9]);
66 64
  U.insert(n[10],U.find(n[9]));
67 65

	
68 66

	
69
  check(U.join(n[8],n[10]) != -1,"Test failed.");
67
  check(U.join(n[8],n[10])  != -1, "Something is wrong with UnionFindEnum");
70 68

	
71 69

	
72
  check(U.size(U.find(n[4])) == 3,"Test failed.");
73
  check(U.size(U.find(n[9])) == 5,"Test failed.");
70
  check(U.size(U.find(n[4])) == 3, "Something is wrong with UnionFindEnum");
71
  check(U.size(U.find(n[9])) == 5, "Something is wrong with UnionFindEnum");
74 72

	
75
  check(U.size(U.find(n[8])) == 5,"Test failed.");
73
  check(U.size(U.find(n[8])) == 5, "Something is wrong with UnionFindEnum");
76 74

	
77 75
  U.erase(n[9]);
78 76
  U.erase(n[1]);
79 77

	
80
  check(U.size(U.find(n[10])) == 4,"Test failed.");
81
  check(U.size(U.find(n[2])) == 2,"Test failed.");
78
  check(U.size(U.find(n[10])) == 4, "Something is wrong with UnionFindEnum");
79
  check(U.size(U.find(n[2]))  == 2, "Something is wrong with UnionFindEnum");
82 80

	
83 81
  U.erase(n[6]);
84 82
  U.split(U.find(n[8]));
85 83

	
86 84

	
87
  check(U.size(U.find(n[4])) == 2,"Test failed.");
88
  check(U.size(U.find(n[3])) == 1,"Test failed.");
89
  check(U.size(U.find(n[2])) == 2,"Test failed.");
85
  check(U.size(U.find(n[4])) == 2, "Something is wrong with UnionFindEnum");
86
  check(U.size(U.find(n[3])) == 1, "Something is wrong with UnionFindEnum");
87
  check(U.size(U.find(n[2])) == 2, "Something is wrong with UnionFindEnum");
90 88

	
91 89

	
92
  check(U.join(n[3],n[4]) != -1,"Test failed.");
93
  check(U.join(n[2],n[4]) == -1,"Test failed.");
90
  check(U.join(n[3],n[4]) != -1, "Something is wrong with UnionFindEnum");
91
  check(U.join(n[2],n[4]) == -1, "Something is wrong with UnionFindEnum");
94 92

	
95 93

	
96
  check(U.size(U.find(n[4])) == 3,"Test failed.");
97
  check(U.size(U.find(n[3])) == 3,"Test failed.");
98
  check(U.size(U.find(n[2])) == 3,"Test failed.");
94
  check(U.size(U.find(n[4])) == 3, "Something is wrong with UnionFindEnum");
95
  check(U.size(U.find(n[3])) == 3, "Something is wrong with UnionFindEnum");
96
  check(U.size(U.find(n[2])) == 3, "Something is wrong with UnionFindEnum");
99 97

	
100 98
  U.eraseClass(U.find(n[4]));
101 99
  U.eraseClass(U.find(n[7]));
102 100

	
103 101
  return 0;
104 102
}
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_TEST_GRAPH_TEST_H
20
#define LEMON_TEST_GRAPH_TEST_H
21

	
22
//#include <lemon/graph_utils.h>
23
#include "test_tools.h"
24

	
25
//! \ingroup misc
26
//! \file
27
//! \brief Some utility and test cases to test digraph classes.
28
namespace lemon {
29

	
30
  ///Structure returned by \ref addPetersen().
31

	
32
  ///Structure returned by \ref addPetersen().
33
  ///
34
  template<class Digraph> 
35
  struct PetStruct
36
  {
37
    ///Vector containing the outer nodes.
38
    std::vector<typename Digraph::Node> outer;
39
    ///Vector containing the inner nodes.
40
    std::vector<typename Digraph::Node> inner;
41
    ///Vector containing the edges of the inner circle.
42
    std::vector<typename Digraph::Arc> incir;
43
    ///Vector containing the edges of the outer circle.
44
    std::vector<typename Digraph::Arc> outcir;
45
    ///Vector containing the chord edges.
46
    std::vector<typename Digraph::Arc> chords;
47
  };
48

	
49

	
50

	
51
  ///Adds a Petersen graph to \c G.
52

	
53
  ///Adds a Petersen graph to \c G.
54
  ///\return The nodes and edges of the generated graph.
55

	
56
  template<typename Digraph>
57
  PetStruct<Digraph> addPetersen(Digraph &G,int num = 5)
58
  {
59
    PetStruct<Digraph> n;
60

	
61
    for(int i=0;i<num;i++) {
62
      n.outer.push_back(G.addNode());
63
      n.inner.push_back(G.addNode());
64
    }
65

	
66
    for(int i=0;i<num;i++) {
67
      n.chords.push_back(G.addArc(n.outer[i],n.inner[i]));
68
      n.outcir.push_back(G.addArc(n.outer[i],n.outer[(i+1) % num]));
69
      n.incir.push_back(G.addArc(n.inner[i],n.inner[(i+2) % num]));
70
    }
71
    return n;
72
  }
73

	
74
  /// \brief Adds to the digraph the reverse pair of all edges.
75
  ///
76
  /// Adds to the digraph the reverse pair of all edges.
77
  ///
78
  template<class Digraph> 
79
  void bidirDigraph(Digraph &G)
80
  {
81
    typedef typename Digraph::Arc Arc;
82
    typedef typename Digraph::ArcIt ArcIt;
83
  
84
    std::vector<Arc> ee;
85
  
86
    for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e);
87

	
88
    for(typename std::vector<Arc>::iterator p=ee.begin();p!=ee.end();p++)
89
      G.addArc(G.target(*p),G.source(*p));
90
  }
91

	
92

	
93
  /// \brief Checks the bidirectioned Petersen graph.
94
  ///
95
  ///  Checks the bidirectioned Petersen graph.
96
  ///
97
  template<class Digraph> 
98
  void checkBidirPetersen(Digraph &G, int num = 5)
99
  {
100
    typedef typename Digraph::Node Node;
101

	
102
    typedef typename Digraph::ArcIt ArcIt;
103
    typedef typename Digraph::NodeIt NodeIt;
104

	
105
    checkDigraphNodeList(G, 2 * num);
106
    checkDigraphArcList(G, 6 * num);
107

	
108
    for(NodeIt n(G);n!=INVALID;++n) {
109
      checkDigraphInArcList(G, n, 3);
110
      checkDigraphOutArcList(G, n, 3);
111
    }  
112
  }
113

	
114
  template<class Digraph> void checkDigraphNodeList(Digraph &G, int nn)
115
  {
116
    typename Digraph::NodeIt n(G);
117
    for(int i=0;i<nn;i++) {
118
      check(n!=INVALID,"Wrong Node list linking.");
119
      ++n;
120
    }
121
    check(n==INVALID,"Wrong Node list linking.");
122
  }
123

	
124
  template<class Digraph>
125
  void checkDigraphArcList(Digraph &G, int nn)
126
  {
127
    typedef typename Digraph::ArcIt ArcIt;
128

	
129
    ArcIt e(G);
130
    for(int i=0;i<nn;i++) {
131
      check(e!=INVALID,"Wrong Arc list linking.");
132
      ++e;
133
    }
134
    check(e==INVALID,"Wrong Arc list linking.");
135
  }
136

	
137
  template<class Digraph> 
138
  void checkDigraphOutArcList(Digraph &G, typename Digraph::Node n, int nn)
139
  {
140
    typename Digraph::OutArcIt e(G,n);
141
    for(int i=0;i<nn;i++) {
142
      check(e!=INVALID,"Wrong OutArc list linking.");
143
      check(n==G.source(e), "Wrong OutArc list linking.");
144
      ++e;
145
    }
146
    check(e==INVALID,"Wrong OutArc list linking.");
147
  }
148

	
149
  template<class Digraph> void 
150
  checkDigraphInArcList(Digraph &G, typename Digraph::Node n, int nn)
151
  {
152
    typename Digraph::InArcIt e(G,n);
153
    for(int i=0;i<nn;i++) {
154
      check(e!=INVALID,"Wrong InArc list linking.");
155
      check(n==G.target(e), "Wrong InArc list linking.");
156
      ++e;
157
    }
158
    check(e==INVALID,"Wrong InArc list linking.");
159
  }
160

	
161
  template <class Digraph> 
162
  void checkDigraph() {
163
    const int num = 5;
164
    Digraph G;
165
    addPetersen(G, num);
166
    bidirDigraph(G);
167
    checkBidirPetersen(G, num);
168
  }
169

	
170
  template <class Digraph> 
171
  void checkDigraphIterators(const Digraph& digraph) {
172
    typedef typename Digraph::Node Node;
173
    typedef typename Digraph::NodeIt NodeIt;
174
    typedef typename Digraph::Arc Arc;
175
    typedef typename Digraph::ArcIt ArcIt;
176
    typedef typename Digraph::InArcIt InArcIt;
177
    typedef typename Digraph::OutArcIt OutArcIt;
178
    //    typedef ConArcIt<Digraph> ConArcIt;
179
  }
180

	
181
  ///\file
182
  ///\todo Check target(), source() as well;
183

	
184
  
185
} //namespace lemon
186

	
187

	
188
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_TEST_GRAPH_UTILS_TEST_H
20
#define LEMON_TEST_GRAPH_UTILS_TEST_H
21

	
22

	
23
#include "test_tools.h"
24
#include <cstdlib>
25
#include <ctime>
26

	
27
//! \ingroup misc
28
//! \file
29
//! \brief Test cases for graph utils.
30
namespace lemon {
31
  
32
  template <typename Digraph>
33
  void checkDigraphCounters() {
34
    const int num = 5;
35
    Digraph digraph;
36
    addPetersen(digraph, num);
37
    bidirDigraph(digraph);
38
    check(countNodes(digraph) == 2*num, "Wrong node number.");
39
    check(countArcs(digraph) == 6*num, "Wrong arc number.");    
40
    for (typename Digraph::NodeIt it(digraph); it != INVALID; ++it) {
41
      check(countOutArcs(digraph, it) == 3, "Wrong out degree number.");
42
      check(countInArcs(digraph, it) == 3, "Wrong in degree number.");
43
    }
44
  }
45

	
46
  template <typename Digraph>
47
  void checkFindArc() {
48
    typedef typename Digraph::Node Node;
49
    typedef typename Digraph::Arc Arc;
50
    typedef typename Digraph::NodeIt NodeIt;
51
    typedef typename Digraph::ArcIt ArcIt;
52
    Digraph digraph;
53
    for (int i = 0; i < 10; ++i) {
54
      digraph.addNode();
55
    }
56
    DescriptorMap<Digraph, Node> nodes(digraph);
57
    typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes);
58
    for (int i = 0; i < 100; ++i) {
59
      int src = rnd[invNodes.size()];
60
      int trg = rnd[invNodes.size()];
61
      digraph.addArc(invNodes[src], invNodes[trg]);
62
    }
63
    typename Digraph::template ArcMap<bool> found(digraph, false);
64
    DescriptorMap<Digraph, Arc> arcs(digraph);
65
    for (NodeIt src(digraph); src != INVALID; ++src) {
66
      for (NodeIt trg(digraph); trg != INVALID; ++trg) {
67
	for (ConArcIt<Digraph> con(digraph, src, trg); con != INVALID; ++con) {
68
	  check(digraph.source(con) == src, "Wrong source.");
69
	  check(digraph.target(con) == trg, "Wrong target.");
70
	  check(found[con] == false, "The arc found already.");
71
	  found[con] = true;
72
	}
73
      }
74
    }
75
    for (ArcIt it(digraph); it != INVALID; ++it) {
76
      check(found[it] == true, "The arc is not found.");
77
    }
78
  }
79
  
80
} //namespace lemon
81

	
82

	
83
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_TEST_MAP_TEST_H
20
#define LEMON_TEST_MAP_TEST_H
21

	
22

	
23
#include <vector>
24
#include <lemon/maps.h>
25

	
26
#include "test_tools.h"
27

	
28

	
29
//! \ingroup misc
30
//! \file
31
//! \brief Some utilities to test map classes.
32

	
33
namespace lemon {
34

	
35

	
36

	
37
  template <typename Graph>
38
  void checkGraphNodeMap() {
39
    Graph graph;
40
    const int num = 16;
41
    
42
    typedef typename Graph::Node Node;
43

	
44
    std::vector<Node> nodes;
45
    for (int i = 0; i < num; ++i) {
46
      nodes.push_back(graph.addNode());      
47
    }
48
    typedef typename Graph::template NodeMap<int> IntNodeMap;
49
    IntNodeMap map(graph, 42);
50
    for (int i = 0; i < int(nodes.size()); ++i) {
51
      check(map[nodes[i]] == 42, "Wrong map constructor.");      
52
    }
53
    for (int i = 0; i < num; ++i) {
54
      nodes.push_back(graph.addNode());
55
      map[nodes.back()] = 23;
56
    }
57
    map = constMap<Node>(12);
58
    for (int i = 0; i < int(nodes.size()); ++i) {
59
      check(map[nodes[i]] == 12, "Wrong map constructor.");      
60
    }    
61
    graph.clear();
62
    nodes.clear();
63
  }
64

	
65
  template <typename Graph>
66
  void checkGraphArcMap() {
67
    Graph graph;
68
    const int num = 16;
69
    
70
    typedef typename Graph::Node Node;
71
    typedef typename Graph::Arc Arc;
72
    
73
    std::vector<Node> nodes;
74
    for (int i = 0; i < num; ++i) {
75
      nodes.push_back(graph.addNode());
76
    }
77
    
78
    std::vector<Arc> edges;
79
    for (int i = 0; i < num; ++i) {
80
      for (int j = 0; j < i; ++j) {
81
	edges.push_back(graph.addArc(nodes[i], nodes[j]));
82
      }
83
    }
84
    
85
    typedef typename Graph::template ArcMap<int> IntArcMap;
86
    IntArcMap map(graph, 42);
87
    
88
    for (int i = 0; i < int(edges.size()); ++i) {
89
      check(map[edges[i]] == 42, "Wrong map constructor.");      
90
    }
91
    
92
    for (int i = 0; i < num; ++i) {
93
      for (int j = i + 1; j < num; ++j) {
94
	edges.push_back(graph.addArc(nodes[i], nodes[j]));
95
	map[edges.back()] = 23;
96
      }
97
    }
98
    map = constMap<Arc>(12);
99
    for (int i = 0; i < int(edges.size()); ++i) {
100
      check(map[edges[i]] == 12, "Wrong map constructor.");      
101
    }    
102
    graph.clear();
103
    edges.clear();    
104
  }
105

	
106
  template <typename Graph>
107
  void checkGraphEdgeMap() {
108
    Graph graph;
109
    const int num = 16;
110
    
111
    typedef typename Graph::Node Node;
112
    typedef typename Graph::Edge Edge;
113
    
114
    std::vector<Node> nodes;
115
    for (int i = 0; i < num; ++i) {
116
      nodes.push_back(graph.addNode());
117
    }
118
    
119
    std::vector<Edge> edges;
120
    for (int i = 0; i < num; ++i) {
121
      for (int j = 0; j < i; ++j) {
122
	edges.push_back(graph.addEdge(nodes[i], nodes[j]));
123
      }
124
    }
125
    
126
    typedef typename Graph::template EdgeMap<int> IntEdgeMap;
127
    IntEdgeMap map(graph, 42);
128
    
129
    for (int i = 0; i < int(edges.size()); ++i) {
130
      check(map[edges[i]] == 42, "Wrong map constructor.");      
131
    }
132
    
133
    for (int i = 0; i < num; ++i) {
134
      for (int j = i + 1; j < num; ++j) {
135
	edges.push_back(graph.addEdge(nodes[i], nodes[j]));
136
	map[edges.back()] = 23;
137
      }
138
    }
139
    map = constMap<Edge>(12);
140
    for (int i = 0; i < int(edges.size()); ++i) {
141
      check(map[edges[i]] == 12, "Wrong map constructor.");      
142
    }    
143
    graph.clear();
144
    edges.clear();    
145
  }
146

	
147
}
148

	
149
#endif
0 comments (0 inline)