Updated FSF address in all files. Fixes ticket:51
[debian/gnuradio] / pmt / src / lib / qa_pmt_prims.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2006 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 2, 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 #include <qa_pmt_prims.h>
24 #include <cppunit/TestAssert.h>
25 #include <pmt.h>
26 #include <stdio.h>
27
28 void
29 qa_pmt_prims::test_symbols()
30 {
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);
34
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));
40
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);
46
47   static const int N = 2048;
48   std::vector<pmt_t> v1(N);
49   std::vector<pmt_t> v2(N);
50
51   // generate a bunch of symbols
52   for (int i = 0; i < N; i++){
53     char buf[100];
54     snprintf(buf, sizeof(buf), "test-%d", i);
55     v1[i] = pmt_string_to_symbol(buf);
56   }
57
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]);
62
63   // generate the same symbols again
64   for (int i = 0; i < N; i++){
65     char buf[100];
66     snprintf(buf, sizeof(buf), "test-%d", i);
67     v2[i] = pmt_string_to_symbol(buf);
68   }
69
70   // confirm that we get the same ones back
71   for (int i = 0; i < N; i++)
72     CPPUNIT_ASSERT(v1[i] == v2[i]);
73 }
74
75 void
76 qa_pmt_prims::test_booleans()
77 {
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);
87 }
88
89 void
90 qa_pmt_prims::test_integers()
91 {
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));
100 }
101
102 void
103 qa_pmt_prims::test_reals()
104 {
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)));
114 }
115
116 void
117 qa_pmt_prims::test_complexes()
118 {
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)));
129 }
130
131 void
132 qa_pmt_prims::test_pairs()
133 {
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");
139
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));
145
146   pmt_t c3 = pmt_cons(s3, PMT_NIL);
147   pmt_t c2 = pmt_cons(s2, c3);
148   pmt_set_cdr(c1, c2);
149   CPPUNIT_ASSERT_EQUAL(c2, pmt_cdr(c1));
150   pmt_set_car(c1, s3);
151   CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1));
152
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);
157 }
158
159 void
160 qa_pmt_prims::test_vectors()
161 {
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");
168
169   pmt_vector_set(v1, 0, s0);
170   pmt_vector_set(v1, 1, s1);
171   pmt_vector_set(v1, 2, s2);
172
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));
176
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);
179
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));
183 }
184
185 void
186 qa_pmt_prims::test_equivalence()
187 {
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);
198
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));
203
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));
208
209   CPPUNIT_ASSERT(!pmt_eq(list0, list1));
210   CPPUNIT_ASSERT(!pmt_eqv(list0, list1));
211   CPPUNIT_ASSERT(pmt_equal(list0, list1));
212
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));
219
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));
225 }
226
227 void
228 qa_pmt_prims::test_misc()
229 {
230   CPPUNIT_ASSERT_THROW(pmt_length(PMT_NIL), pmt_wrong_type);
231
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);
242   
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)));
246   
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)));
251 }
252
253 void
254 qa_pmt_prims::test_dict()
255 {
256   pmt_t dict = pmt_make_dict();
257   CPPUNIT_ASSERT(pmt_is_dict(dict));
258
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);
268   
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));
279
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)));
284 }