3 * Copyright 2006 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 2, 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.
23 #include <qa_pmt_prims.h>
24 #include <cppunit/TestAssert.h>
29 qa_pmt_prims::test_symbols()
31 CPPUNIT_ASSERT(!pmt_is_symbol(PMT_BOOL_T));
32 CPPUNIT_ASSERT(!pmt_is_symbol(PMT_BOOL_F));
33 CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_BOOL_F), pmt_wrong_type);
35 pmt_t sym1 = pmt_string_to_symbol("test");
36 CPPUNIT_ASSERT(pmt_is_symbol(sym1));
37 CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1));
38 CPPUNIT_ASSERT(pmt_is_true(sym1));
39 CPPUNIT_ASSERT(!pmt_is_false(sym1));
41 pmt_t sym2 = pmt_string_to_symbol("foo");
42 pmt_t sym3 = pmt_string_to_symbol("test");
43 CPPUNIT_ASSERT_EQUAL(sym1, sym3);
44 CPPUNIT_ASSERT(sym1 != sym2);
45 CPPUNIT_ASSERT(sym1 == sym3);
47 static const int N = 2048;
48 std::vector<pmt_t> v1(N);
49 std::vector<pmt_t> v2(N);
51 // generate a bunch of symbols
52 for (int i = 0; i < N; i++){
54 snprintf(buf, sizeof(buf), "test-%d", i);
55 v1[i] = pmt_string_to_symbol(buf);
58 // confirm that they are all unique
59 for (int i = 0; i < N; i++)
60 for (int j = i + 1; j < N; j++)
61 CPPUNIT_ASSERT(v1[i] != v1[j]);
63 // generate the same symbols again
64 for (int i = 0; i < N; i++){
66 snprintf(buf, sizeof(buf), "test-%d", i);
67 v2[i] = pmt_string_to_symbol(buf);
70 // confirm that we get the same ones back
71 for (int i = 0; i < N; i++)
72 CPPUNIT_ASSERT(v1[i] == v2[i]);
76 qa_pmt_prims::test_booleans()
78 pmt_t sym = pmt_string_to_symbol("test");
79 CPPUNIT_ASSERT(pmt_is_bool(PMT_BOOL_T));
80 CPPUNIT_ASSERT(pmt_is_bool(PMT_BOOL_F));
81 CPPUNIT_ASSERT(!pmt_is_bool(sym));
82 CPPUNIT_ASSERT_EQUAL(pmt_from_bool(false), PMT_BOOL_F);
83 CPPUNIT_ASSERT_EQUAL(pmt_from_bool(true), PMT_BOOL_T);
84 CPPUNIT_ASSERT_EQUAL(false, pmt_to_bool(PMT_BOOL_F));
85 CPPUNIT_ASSERT_EQUAL(true, pmt_to_bool(PMT_BOOL_T));
86 CPPUNIT_ASSERT_THROW(pmt_to_bool(sym), pmt_wrong_type);
90 qa_pmt_prims::test_integers()
92 pmt_t p1 = pmt_from_long(1);
93 pmt_t m1 = pmt_from_long(-1);
94 CPPUNIT_ASSERT(!pmt_is_integer(PMT_BOOL_T));
95 CPPUNIT_ASSERT(pmt_is_integer(p1));
96 CPPUNIT_ASSERT(pmt_is_integer(m1));
97 CPPUNIT_ASSERT_THROW(pmt_to_long(PMT_BOOL_T), pmt_wrong_type);
98 CPPUNIT_ASSERT_EQUAL(-1L, pmt_to_long(m1));
99 CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1));
103 qa_pmt_prims::test_reals()
105 pmt_t p1 = pmt_from_double(1);
106 pmt_t m1 = pmt_from_double(-1);
107 CPPUNIT_ASSERT(!pmt_is_real(PMT_BOOL_T));
108 CPPUNIT_ASSERT(pmt_is_real(p1));
109 CPPUNIT_ASSERT(pmt_is_real(m1));
110 CPPUNIT_ASSERT_THROW(pmt_to_double(PMT_BOOL_T), pmt_wrong_type);
111 CPPUNIT_ASSERT_EQUAL(-1.0, pmt_to_double(m1));
112 CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(p1));
113 CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(pmt_from_long(1)));
117 qa_pmt_prims::test_complexes()
119 pmt_t p1 = pmt_make_rectangular(2, -3);
120 pmt_t m1 = pmt_make_rectangular(-3, 2);
121 CPPUNIT_ASSERT(!pmt_is_complex(PMT_BOOL_T));
122 CPPUNIT_ASSERT(pmt_is_complex(p1));
123 CPPUNIT_ASSERT(pmt_is_complex(m1));
124 CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_BOOL_T), pmt_wrong_type);
125 CPPUNIT_ASSERT_EQUAL(std::complex<double>(2, -3), pmt_to_complex(p1));
126 CPPUNIT_ASSERT_EQUAL(std::complex<double>(-3, 2), pmt_to_complex(m1));
127 CPPUNIT_ASSERT_EQUAL(std::complex<double>(1.0, 0), pmt_to_complex(pmt_from_long(1)));
128 CPPUNIT_ASSERT_EQUAL(std::complex<double>(1.0, 0), pmt_to_complex(pmt_from_double(1.0)));
132 qa_pmt_prims::test_pairs()
134 CPPUNIT_ASSERT(pmt_is_null(PMT_NIL));
135 CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL));
136 pmt_t s1 = pmt_string_to_symbol("s1");
137 pmt_t s2 = pmt_string_to_symbol("s2");
138 pmt_t s3 = pmt_string_to_symbol("s3");
140 pmt_t c1 = pmt_cons(s1, PMT_NIL);
141 CPPUNIT_ASSERT(pmt_is_pair(c1));
142 CPPUNIT_ASSERT(!pmt_is_pair(s1));
143 CPPUNIT_ASSERT_EQUAL(s1, pmt_car(c1));
144 CPPUNIT_ASSERT_EQUAL(PMT_NIL, pmt_cdr(c1));
146 pmt_t c3 = pmt_cons(s3, PMT_NIL);
147 pmt_t c2 = pmt_cons(s2, c3);
149 CPPUNIT_ASSERT_EQUAL(c2, pmt_cdr(c1));
151 CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1));
153 CPPUNIT_ASSERT_THROW(pmt_cdr(PMT_NIL), pmt_wrong_type);
154 CPPUNIT_ASSERT_THROW(pmt_car(PMT_NIL), pmt_wrong_type);
155 CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type);
156 CPPUNIT_ASSERT_THROW(pmt_set_cdr(s1, PMT_NIL), pmt_wrong_type);
160 qa_pmt_prims::test_vectors()
162 static const size_t N = 3;
163 pmt_t v1 = pmt_make_vector(N, PMT_NIL);
164 CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1));
165 pmt_t s0 = pmt_string_to_symbol("s0");
166 pmt_t s1 = pmt_string_to_symbol("s1");
167 pmt_t s2 = pmt_string_to_symbol("s2");
169 pmt_vector_set(v1, 0, s0);
170 pmt_vector_set(v1, 1, s1);
171 pmt_vector_set(v1, 2, s2);
173 CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, 0));
174 CPPUNIT_ASSERT_EQUAL(s1, pmt_vector_ref(v1, 1));
175 CPPUNIT_ASSERT_EQUAL(s2, pmt_vector_ref(v1, 2));
177 CPPUNIT_ASSERT_THROW(pmt_vector_ref(v1, N), pmt_out_of_range);
178 CPPUNIT_ASSERT_THROW(pmt_vector_set(v1, N, PMT_NIL), pmt_out_of_range);
180 pmt_vector_fill(v1, s0);
181 for (size_t i = 0; i < N; i++)
182 CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i));
186 qa_pmt_prims::test_equivalence()
188 pmt_t s0 = pmt_string_to_symbol("s0");
189 pmt_t s1 = pmt_string_to_symbol("s1");
190 pmt_t s2 = pmt_string_to_symbol("s2");
191 pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
192 pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
193 pmt_t i0 = pmt_from_long(42);
194 pmt_t i1 = pmt_from_long(42);
195 pmt_t r0 = pmt_from_double(42);
196 pmt_t r1 = pmt_from_double(42);
197 pmt_t r2 = pmt_from_double(43);
199 CPPUNIT_ASSERT(pmt_eq(s0, s0));
200 CPPUNIT_ASSERT(!pmt_eq(s0, s1));
201 CPPUNIT_ASSERT(pmt_eqv(s0, s0));
202 CPPUNIT_ASSERT(!pmt_eqv(s0, s1));
204 CPPUNIT_ASSERT(pmt_eqv(i0, i1));
205 CPPUNIT_ASSERT(pmt_eqv(r0, r1));
206 CPPUNIT_ASSERT(!pmt_eqv(r0, r2));
207 CPPUNIT_ASSERT(!pmt_eqv(i0, r0));
209 CPPUNIT_ASSERT(!pmt_eq(list0, list1));
210 CPPUNIT_ASSERT(!pmt_eqv(list0, list1));
211 CPPUNIT_ASSERT(pmt_equal(list0, list1));
213 pmt_t v0 = pmt_make_vector(3, s0);
214 pmt_t v1 = pmt_make_vector(3, s0);
215 pmt_t v2 = pmt_make_vector(4, s0);
216 CPPUNIT_ASSERT(!pmt_eqv(v0, v1));
217 CPPUNIT_ASSERT(pmt_equal(v0, v1));
218 CPPUNIT_ASSERT(!pmt_equal(v0, v2));
220 pmt_vector_set(v0, 0, list0);
221 pmt_vector_set(v0, 1, list0);
222 pmt_vector_set(v1, 0, list1);
223 pmt_vector_set(v1, 1, list1);
224 CPPUNIT_ASSERT(pmt_equal(v0, v1));
228 qa_pmt_prims::test_misc()
230 CPPUNIT_ASSERT_THROW(pmt_length(PMT_NIL), pmt_wrong_type);
232 pmt_t k0 = pmt_string_to_symbol("k0");
233 pmt_t k1 = pmt_string_to_symbol("k1");
234 pmt_t k2 = pmt_string_to_symbol("k2");
235 pmt_t k3 = pmt_string_to_symbol("k3");
236 pmt_t v0 = pmt_string_to_symbol("v0");
237 pmt_t v1 = pmt_string_to_symbol("v1");
238 pmt_t v2 = pmt_string_to_symbol("v2");
239 pmt_t p0 = pmt_cons(k0, v0);
240 pmt_t p1 = pmt_cons(k1, v1);
241 pmt_t p2 = pmt_cons(k2, v2);
243 pmt_t alist = pmt_cons(p0, pmt_cons(p1, pmt_cons(p2, PMT_NIL)));
244 CPPUNIT_ASSERT(pmt_eq(p1, pmt_assv(k1, alist)));
245 CPPUNIT_ASSERT(pmt_eq(PMT_BOOL_F, pmt_assv(k3, alist)));
247 pmt_t keys = pmt_cons(k0, pmt_cons(k1, pmt_cons(k2, PMT_NIL)));
248 pmt_t vals = pmt_cons(v0, pmt_cons(v1, pmt_cons(v2, PMT_NIL)));
249 CPPUNIT_ASSERT(pmt_equal(keys, pmt_map(pmt_car, alist)));
250 CPPUNIT_ASSERT(pmt_equal(vals, pmt_map(pmt_cdr, alist)));
254 qa_pmt_prims::test_dict()
256 pmt_t dict = pmt_make_dict();
257 CPPUNIT_ASSERT(pmt_is_dict(dict));
259 pmt_t k0 = pmt_string_to_symbol("k0");
260 pmt_t k1 = pmt_string_to_symbol("k1");
261 pmt_t k2 = pmt_string_to_symbol("k2");
262 pmt_t k3 = pmt_string_to_symbol("k3");
263 pmt_t v0 = pmt_string_to_symbol("v0");
264 pmt_t v1 = pmt_string_to_symbol("v1");
265 pmt_t v2 = pmt_string_to_symbol("v2");
266 pmt_t v3 = pmt_string_to_symbol("v3");
267 pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL);
269 CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0));
270 pmt_dict_set(dict, k0, v0);
271 CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0));
272 CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0));
273 CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found));
274 pmt_dict_set(dict, k1, v1);
275 pmt_dict_set(dict, k2, v2);
276 CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1));
277 pmt_dict_set(dict, k1, v3);
278 CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3));
280 pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL)));
281 pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL)));
282 CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict)));
283 CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict)));
287 qa_pmt_prims::test_io()
289 pmt_t k0 = pmt_string_to_symbol("k0");
290 pmt_t k1 = pmt_string_to_symbol("k1");
291 pmt_t k2 = pmt_string_to_symbol("k2");
292 pmt_t k3 = pmt_string_to_symbol("k3");
294 CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0));