Imported Upstream version 3.2.2
[debian/gnuradio] / gnuradio-core / src / lib / runtime / qa_gr_flowgraph.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2007 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
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)
10  * any later version.
11  * 
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.
16  * 
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.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <qa_gr_flowgraph.h>
28 #include <gr_flowgraph.h>
29 #include <gr_nop.h>
30 #include <gr_null_source.h>
31 #include <gr_null_sink.h>
32
33 void qa_gr_flowgraph::t0()
34 {
35   gr_flowgraph_sptr fg = gr_make_flowgraph();
36
37   CPPUNIT_ASSERT(fg);
38 }
39
40 void qa_gr_flowgraph::t1_connect()
41 {
42   gr_flowgraph_sptr fg = gr_make_flowgraph();
43
44   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
45   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
46
47   fg->connect(nop1, 0, nop2, 0);
48 }
49
50 void qa_gr_flowgraph::t2_connect_invalid_src_port_neg()
51 {
52   gr_flowgraph_sptr fg = gr_make_flowgraph();
53
54   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
55   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
56
57   CPPUNIT_ASSERT_THROW(fg->connect(nop1, -1, nop2, 0), std::invalid_argument);
58 }
59
60 void qa_gr_flowgraph::t3_connect_src_port_exceeds()
61 {
62   gr_flowgraph_sptr fg = gr_make_flowgraph();
63
64   gr_block_sptr src = gr_make_null_source(sizeof(int));
65   gr_block_sptr dst = gr_make_null_sink(sizeof(int));
66
67   CPPUNIT_ASSERT_THROW(fg->connect(src, 1, dst, 0), std::invalid_argument);
68 }
69
70 void qa_gr_flowgraph::t4_connect_invalid_dst_port_neg()
71 {
72   gr_flowgraph_sptr fg = gr_make_flowgraph();
73
74   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
75   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
76
77   CPPUNIT_ASSERT_THROW(fg->connect(nop1, 0, nop2, -1), std::invalid_argument);
78 }
79
80 void qa_gr_flowgraph::t5_connect_dst_port_exceeds()
81 {
82   gr_flowgraph_sptr fg = gr_make_flowgraph();
83
84   gr_block_sptr src = gr_make_null_source(sizeof(int));
85   gr_block_sptr dst = gr_make_null_sink(sizeof(int));
86
87   CPPUNIT_ASSERT_THROW(fg->connect(src, 0, dst, 1), std::invalid_argument);
88 }
89
90 void qa_gr_flowgraph::t6_connect_dst_in_use()
91 {
92   gr_flowgraph_sptr fg = gr_make_flowgraph();
93
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));
97
98   fg->connect(src1, 0, dst, 0);
99   CPPUNIT_ASSERT_THROW(fg->connect(src2, 0, dst, 0), std::invalid_argument);
100 }
101
102 void qa_gr_flowgraph::t7_connect_one_src_two_dst()
103 {
104   gr_flowgraph_sptr fg = gr_make_flowgraph();
105
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));
109
110   fg->connect(src, 0, dst1, 0);
111   fg->connect(src, 0, dst2, 0);
112 }
113
114 void qa_gr_flowgraph::t8_connect_type_mismatch()
115 {
116   gr_flowgraph_sptr fg = gr_make_flowgraph();
117
118   gr_block_sptr nop1 = gr_make_nop(sizeof(char));
119   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
120
121   CPPUNIT_ASSERT_THROW(fg->connect(nop1, 0, nop2, 0), std::invalid_argument);
122 }
123
124 void qa_gr_flowgraph::t9_disconnect()
125 {
126   gr_flowgraph_sptr fg = gr_make_flowgraph();
127
128   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
129   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
130
131   fg->connect(nop1, 0, nop2, 0);
132   fg->disconnect(nop1, 0, nop2, 0);
133 }
134
135 void qa_gr_flowgraph::t10_disconnect_unconnected_block()
136 {
137   gr_flowgraph_sptr fg = gr_make_flowgraph();
138
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));
142
143   fg->connect(nop1, 0, nop2, 0);
144   CPPUNIT_ASSERT_THROW(fg->disconnect(nop1, 0, nop3, 0), std::invalid_argument);
145 }
146
147 void qa_gr_flowgraph::t11_disconnect_unconnected_port()
148 {
149   gr_flowgraph_sptr fg = gr_make_flowgraph();
150
151   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
152   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
153
154   fg->connect(nop1, 0, nop2, 0);
155   CPPUNIT_ASSERT_THROW(fg->disconnect(nop1, 0, nop2, 1), std::invalid_argument);
156 }
157
158 void qa_gr_flowgraph::t12_validate()
159 {
160   gr_flowgraph_sptr fg = gr_make_flowgraph();
161
162   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
163   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
164
165   fg->connect(nop1, 0, nop2, 0);
166   fg->validate();
167 }
168
169 void qa_gr_flowgraph::t13_validate_missing_input_assignment()
170 {
171   gr_flowgraph_sptr fg = gr_make_flowgraph();
172
173   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
174   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
175
176   fg->connect(nop1, 0, nop2, 0);
177   fg->connect(nop1, 0, nop2, 2);
178   CPPUNIT_ASSERT_THROW(fg->validate(), std::runtime_error);
179 }
180
181 void qa_gr_flowgraph::t14_validate_missing_output_assignment()
182 {
183   gr_flowgraph_sptr fg = gr_make_flowgraph();
184
185   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
186   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
187
188   fg->connect(nop1, 0, nop2, 0);
189   fg->connect(nop1, 2, nop2, 1);
190   CPPUNIT_ASSERT_THROW(fg->validate(), std::runtime_error);
191 }
192
193 void qa_gr_flowgraph::t15_clear()
194 {
195   gr_flowgraph_sptr fg = gr_make_flowgraph();
196
197   gr_block_sptr nop1 = gr_make_nop(sizeof(int));
198   gr_block_sptr nop2 = gr_make_nop(sizeof(int));
199
200   fg->connect(nop1, 0, nop2, 0);
201
202   CPPUNIT_ASSERT(fg->edges().size() == 1);
203   CPPUNIT_ASSERT(fg->calc_used_blocks().size() == 2);
204
205   fg->clear();
206
207   CPPUNIT_ASSERT(fg->edges().size() == 0);
208   CPPUNIT_ASSERT(fg->calc_used_blocks().size() == 0);
209 }
210
211 void qa_gr_flowgraph::t16_partition()
212 {
213   gr_flowgraph_sptr fg = gr_make_flowgraph();
214
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));
219
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));
223
224   gr_block_sptr nop31 = gr_make_nop(sizeof(int));
225   gr_block_sptr nop32 = gr_make_nop(sizeof(int));
226   
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);
231
232   // Build disjoint graph #2
233   fg->connect(nop21, 0, nop22, 0);
234   fg->connect(nop22, 0, nop23, 0);
235
236   // Build disjoint graph #3
237   fg->connect(nop31, 0, nop32, 0);
238
239   std::vector<gr_basic_block_vector_t> graphs = fg->partition();
240
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);
245 }