3
* Copyright 2007 Free Software Foundation, Inc.
5
* This file is part of GNU Radio
7
* GNU Radio is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 3, or (at your option)
12
* GNU Radio is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with GNU Radio; see the file COPYING. If not, write to
19
* the Free Software Foundation, Inc., 51 Franklin Street,
20
* Boston, MA 02110-1301, USA.
27
#include <qa_gr_flowgraph.h>
28
#include <gr_flowgraph.h>
30
#include <gr_null_source.h>
31
#include <gr_null_sink.h>
33
void qa_gr_flowgraph::t0()
35
gr_flowgraph_sptr fg = gr_make_flowgraph();
40
void qa_gr_flowgraph::t1_connect()
42
gr_flowgraph_sptr fg = gr_make_flowgraph();
44
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
45
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
47
fg->connect(nop1, 0, nop2, 0);
50
void qa_gr_flowgraph::t2_connect_invalid_src_port_neg()
52
gr_flowgraph_sptr fg = gr_make_flowgraph();
54
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
55
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
57
CPPUNIT_ASSERT_THROW(fg->connect(nop1, -1, nop2, 0), std::invalid_argument);
60
void qa_gr_flowgraph::t3_connect_src_port_exceeds()
62
gr_flowgraph_sptr fg = gr_make_flowgraph();
64
gr_block_sptr src = gr_make_null_source(sizeof(int));
65
gr_block_sptr dst = gr_make_null_sink(sizeof(int));
67
CPPUNIT_ASSERT_THROW(fg->connect(src, 1, dst, 0), std::invalid_argument);
70
void qa_gr_flowgraph::t4_connect_invalid_dst_port_neg()
72
gr_flowgraph_sptr fg = gr_make_flowgraph();
74
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
75
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
77
CPPUNIT_ASSERT_THROW(fg->connect(nop1, 0, nop2, -1), std::invalid_argument);
80
void qa_gr_flowgraph::t5_connect_dst_port_exceeds()
82
gr_flowgraph_sptr fg = gr_make_flowgraph();
84
gr_block_sptr src = gr_make_null_source(sizeof(int));
85
gr_block_sptr dst = gr_make_null_sink(sizeof(int));
87
CPPUNIT_ASSERT_THROW(fg->connect(src, 0, dst, 1), std::invalid_argument);
90
void qa_gr_flowgraph::t6_connect_dst_in_use()
92
gr_flowgraph_sptr fg = gr_make_flowgraph();
94
gr_block_sptr src1 = gr_make_null_source(sizeof(int));
95
gr_block_sptr src2 = gr_make_null_source(sizeof(int));
96
gr_block_sptr dst = gr_make_null_sink(sizeof(int));
98
fg->connect(src1, 0, dst, 0);
99
CPPUNIT_ASSERT_THROW(fg->connect(src2, 0, dst, 0), std::invalid_argument);
102
void qa_gr_flowgraph::t7_connect_one_src_two_dst()
104
gr_flowgraph_sptr fg = gr_make_flowgraph();
106
gr_block_sptr src = gr_make_null_source(sizeof(int));
107
gr_block_sptr dst1 = gr_make_null_sink(sizeof(int));
108
gr_block_sptr dst2 = gr_make_null_sink(sizeof(int));
110
fg->connect(src, 0, dst1, 0);
111
fg->connect(src, 0, dst2, 0);
114
void qa_gr_flowgraph::t8_connect_type_mismatch()
116
gr_flowgraph_sptr fg = gr_make_flowgraph();
118
gr_block_sptr nop1 = gr_make_nop(sizeof(char));
119
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
121
CPPUNIT_ASSERT_THROW(fg->connect(nop1, 0, nop2, 0), std::invalid_argument);
124
void qa_gr_flowgraph::t9_disconnect()
126
gr_flowgraph_sptr fg = gr_make_flowgraph();
128
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
129
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
131
fg->connect(nop1, 0, nop2, 0);
132
fg->disconnect(nop1, 0, nop2, 0);
135
void qa_gr_flowgraph::t10_disconnect_unconnected_block()
137
gr_flowgraph_sptr fg = gr_make_flowgraph();
139
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
140
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
141
gr_block_sptr nop3 = gr_make_nop(sizeof(int));
143
fg->connect(nop1, 0, nop2, 0);
144
CPPUNIT_ASSERT_THROW(fg->disconnect(nop1, 0, nop3, 0), std::invalid_argument);
147
void qa_gr_flowgraph::t11_disconnect_unconnected_port()
149
gr_flowgraph_sptr fg = gr_make_flowgraph();
151
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
152
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
154
fg->connect(nop1, 0, nop2, 0);
155
CPPUNIT_ASSERT_THROW(fg->disconnect(nop1, 0, nop2, 1), std::invalid_argument);
158
void qa_gr_flowgraph::t12_validate()
160
gr_flowgraph_sptr fg = gr_make_flowgraph();
162
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
163
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
165
fg->connect(nop1, 0, nop2, 0);
169
void qa_gr_flowgraph::t13_validate_missing_input_assignment()
171
gr_flowgraph_sptr fg = gr_make_flowgraph();
173
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
174
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
176
fg->connect(nop1, 0, nop2, 0);
177
fg->connect(nop1, 0, nop2, 2);
178
CPPUNIT_ASSERT_THROW(fg->validate(), std::runtime_error);
181
void qa_gr_flowgraph::t14_validate_missing_output_assignment()
183
gr_flowgraph_sptr fg = gr_make_flowgraph();
185
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
186
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
188
fg->connect(nop1, 0, nop2, 0);
189
fg->connect(nop1, 2, nop2, 1);
190
CPPUNIT_ASSERT_THROW(fg->validate(), std::runtime_error);
193
void qa_gr_flowgraph::t15_clear()
195
gr_flowgraph_sptr fg = gr_make_flowgraph();
197
gr_block_sptr nop1 = gr_make_nop(sizeof(int));
198
gr_block_sptr nop2 = gr_make_nop(sizeof(int));
200
fg->connect(nop1, 0, nop2, 0);
202
CPPUNIT_ASSERT(fg->edges().size() == 1);
203
CPPUNIT_ASSERT(fg->calc_used_blocks().size() == 2);
207
CPPUNIT_ASSERT(fg->edges().size() == 0);
208
CPPUNIT_ASSERT(fg->calc_used_blocks().size() == 0);
211
void qa_gr_flowgraph::t16_partition()
213
gr_flowgraph_sptr fg = gr_make_flowgraph();
215
gr_block_sptr nop11 = gr_make_nop(sizeof(int));
216
gr_block_sptr nop12 = gr_make_nop(sizeof(int));
217
gr_block_sptr nop13 = gr_make_nop(sizeof(int));
218
gr_block_sptr nop14 = gr_make_nop(sizeof(int));
220
gr_block_sptr nop21 = gr_make_nop(sizeof(int));
221
gr_block_sptr nop22 = gr_make_nop(sizeof(int));
222
gr_block_sptr nop23 = gr_make_nop(sizeof(int));
224
gr_block_sptr nop31 = gr_make_nop(sizeof(int));
225
gr_block_sptr nop32 = gr_make_nop(sizeof(int));
227
// Build disjoint graph #1
228
fg->connect(nop11, 0, nop12, 0);
229
fg->connect(nop12, 0, nop13, 0);
230
fg->connect(nop13, 0, nop14, 0);
232
// Build disjoint graph #2
233
fg->connect(nop21, 0, nop22, 0);
234
fg->connect(nop22, 0, nop23, 0);
236
// Build disjoint graph #3
237
fg->connect(nop31, 0, nop32, 0);
239
std::vector<gr_basic_block_vector_t> graphs = fg->partition();
241
CPPUNIT_ASSERT(graphs.size() == 3);
242
CPPUNIT_ASSERT(graphs[0].size() == 4);
243
CPPUNIT_ASSERT(graphs[1].size() == 3);
244
CPPUNIT_ASSERT(graphs[2].size() == 2);