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);