Additional QA for tuple.
[debian/gnuradio] / gruel / src / lib / pmt / qa_pmt_prims.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2006,2009 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 #include <qa_pmt_prims.h>
24 #include <cppunit/TestAssert.h>
25 #include <gruel/pmt.h>
26 #include <stdio.h>
27 #include <sstream>
28
29 using namespace pmt;
30
31 void
32 qa_pmt_prims::test_symbols()
33 {
34   CPPUNIT_ASSERT(!pmt_is_symbol(PMT_T));
35   CPPUNIT_ASSERT(!pmt_is_symbol(PMT_F));
36   CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_F), pmt_wrong_type);
37
38   pmt_t sym1 = pmt_string_to_symbol("test");
39   CPPUNIT_ASSERT(pmt_is_symbol(sym1));
40   CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1));
41   CPPUNIT_ASSERT(pmt_is_true(sym1));
42   CPPUNIT_ASSERT(!pmt_is_false(sym1));
43
44   pmt_t sym2 = pmt_string_to_symbol("foo");
45   pmt_t sym3 = pmt_string_to_symbol("test");
46   CPPUNIT_ASSERT_EQUAL(sym1, sym3);
47   CPPUNIT_ASSERT(sym1 != sym2);
48   CPPUNIT_ASSERT(sym1 == sym3);
49
50   static const int N = 2048;
51   std::vector<pmt_t> v1(N);
52   std::vector<pmt_t> v2(N);
53
54   // generate a bunch of symbols
55   for (int i = 0; i < N; i++){
56     char buf[100];
57     snprintf(buf, sizeof(buf), "test-%d", i);
58     v1[i] = pmt_string_to_symbol(buf);
59   }
60
61   // confirm that they are all unique
62   for (int i = 0; i < N; i++)
63     for (int j = i + 1; j < N; j++)
64       CPPUNIT_ASSERT(v1[i] != v1[j]);
65
66   // generate the same symbols again
67   for (int i = 0; i < N; i++){
68     char buf[100];
69     snprintf(buf, sizeof(buf), "test-%d", i);
70     v2[i] = pmt_string_to_symbol(buf);
71   }
72
73   // confirm that we get the same ones back
74   for (int i = 0; i < N; i++)
75     CPPUNIT_ASSERT(v1[i] == v2[i]);
76 }
77
78 void
79 qa_pmt_prims::test_booleans()
80 {
81   pmt_t sym = pmt_string_to_symbol("test");
82   CPPUNIT_ASSERT(pmt_is_bool(PMT_T));
83   CPPUNIT_ASSERT(pmt_is_bool(PMT_F));
84   CPPUNIT_ASSERT(!pmt_is_bool(sym));
85   CPPUNIT_ASSERT_EQUAL(pmt_from_bool(false), PMT_F);
86   CPPUNIT_ASSERT_EQUAL(pmt_from_bool(true), PMT_T);
87   CPPUNIT_ASSERT_EQUAL(false, pmt_to_bool(PMT_F));
88   CPPUNIT_ASSERT_EQUAL(true, pmt_to_bool(PMT_T));
89   CPPUNIT_ASSERT_THROW(pmt_to_bool(sym), pmt_wrong_type);
90 }
91
92 void
93 qa_pmt_prims::test_integers()
94 {
95   pmt_t p1 = pmt_from_long(1);
96   pmt_t m1 = pmt_from_long(-1);
97   CPPUNIT_ASSERT(!pmt_is_integer(PMT_T));
98   CPPUNIT_ASSERT(pmt_is_integer(p1));
99   CPPUNIT_ASSERT(pmt_is_integer(m1));
100   CPPUNIT_ASSERT_THROW(pmt_to_long(PMT_T), pmt_wrong_type);
101   CPPUNIT_ASSERT_EQUAL(-1L, pmt_to_long(m1));
102   CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1));
103 }
104
105 void
106 qa_pmt_prims::test_reals()
107 {
108   pmt_t p1 = pmt_from_double(1);
109   pmt_t m1 = pmt_from_double(-1);
110   CPPUNIT_ASSERT(!pmt_is_real(PMT_T));
111   CPPUNIT_ASSERT(pmt_is_real(p1));
112   CPPUNIT_ASSERT(pmt_is_real(m1));
113   CPPUNIT_ASSERT_THROW(pmt_to_double(PMT_T), pmt_wrong_type);
114   CPPUNIT_ASSERT_EQUAL(-1.0, pmt_to_double(m1));
115   CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(p1));
116   CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(pmt_from_long(1)));
117 }
118
119 void
120 qa_pmt_prims::test_complexes()
121 {
122   pmt_t p1 = pmt_make_rectangular(2, -3);
123   pmt_t m1 = pmt_make_rectangular(-3, 2);
124   CPPUNIT_ASSERT(!pmt_is_complex(PMT_T));
125   CPPUNIT_ASSERT(pmt_is_complex(p1));
126   CPPUNIT_ASSERT(pmt_is_complex(m1));
127   CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_T), pmt_wrong_type);
128   CPPUNIT_ASSERT_EQUAL(std::complex<double>(2, -3), pmt_to_complex(p1));
129   CPPUNIT_ASSERT_EQUAL(std::complex<double>(-3, 2), pmt_to_complex(m1));
130   CPPUNIT_ASSERT_EQUAL(std::complex<double>(1.0, 0), pmt_to_complex(pmt_from_long(1)));
131   CPPUNIT_ASSERT_EQUAL(std::complex<double>(1.0, 0), pmt_to_complex(pmt_from_double(1.0)));
132 }
133
134 void
135 qa_pmt_prims::test_pairs()
136 {
137   CPPUNIT_ASSERT(pmt_is_null(PMT_NIL));
138   CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL));
139   pmt_t s1 = pmt_string_to_symbol("s1");
140   pmt_t s2 = pmt_string_to_symbol("s2");
141   pmt_t s3 = pmt_string_to_symbol("s3");
142
143
144   CPPUNIT_ASSERT_EQUAL((size_t)0, pmt_length(PMT_NIL));
145   CPPUNIT_ASSERT_THROW(pmt_length(s1), pmt_wrong_type);
146   CPPUNIT_ASSERT_THROW(pmt_length(pmt_from_double(42)), pmt_wrong_type);
147
148   pmt_t c1 = pmt_cons(s1, PMT_NIL);
149   CPPUNIT_ASSERT(pmt_is_pair(c1));
150   CPPUNIT_ASSERT(!pmt_is_pair(s1));
151   CPPUNIT_ASSERT_EQUAL(s1, pmt_car(c1));
152   CPPUNIT_ASSERT_EQUAL(PMT_NIL, pmt_cdr(c1));
153   CPPUNIT_ASSERT_EQUAL((size_t) 1, pmt_length(c1));
154
155   pmt_t c3 = pmt_cons(s3, PMT_NIL);
156   pmt_t c2 = pmt_cons(s2, c3);
157   pmt_set_cdr(c1, c2);
158   CPPUNIT_ASSERT_EQUAL(c2, pmt_cdr(c1));
159   pmt_set_car(c1, s3);
160   CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1));
161   CPPUNIT_ASSERT_EQUAL((size_t)1, pmt_length(c3));
162   CPPUNIT_ASSERT_EQUAL((size_t)2, pmt_length(c2));
163   
164   CPPUNIT_ASSERT_THROW(pmt_cdr(PMT_NIL), pmt_wrong_type);
165   CPPUNIT_ASSERT_THROW(pmt_car(PMT_NIL), pmt_wrong_type);
166   CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type);
167   CPPUNIT_ASSERT_THROW(pmt_set_cdr(s1, PMT_NIL), pmt_wrong_type);
168 }
169
170 void
171 qa_pmt_prims::test_vectors()
172 {
173   static const size_t N = 3;
174   pmt_t v1 = pmt_make_vector(N, PMT_NIL);
175   CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1));
176   pmt_t s0 = pmt_string_to_symbol("s0");
177   pmt_t s1 = pmt_string_to_symbol("s1");
178   pmt_t s2 = pmt_string_to_symbol("s2");
179
180   pmt_vector_set(v1, 0, s0);
181   pmt_vector_set(v1, 1, s1);
182   pmt_vector_set(v1, 2, s2);
183
184   CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, 0));
185   CPPUNIT_ASSERT_EQUAL(s1, pmt_vector_ref(v1, 1));
186   CPPUNIT_ASSERT_EQUAL(s2, pmt_vector_ref(v1, 2));
187
188   CPPUNIT_ASSERT_THROW(pmt_vector_ref(v1, N), pmt_out_of_range);
189   CPPUNIT_ASSERT_THROW(pmt_vector_set(v1, N, PMT_NIL), pmt_out_of_range);
190
191   pmt_vector_fill(v1, s0);
192   for (size_t i = 0; i < N; i++)
193     CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i));
194 }
195
196 static void
197 check_tuple(size_t len, const std::vector<pmt_t> &s, pmt_t t)
198 {
199   CPPUNIT_ASSERT_EQUAL(true, pmt_is_tuple(t));
200   CPPUNIT_ASSERT_EQUAL(len, pmt_length(t));
201
202   for (size_t i = 0; i < len; i++)
203     CPPUNIT_ASSERT_EQUAL(s[i], pmt_tuple_ref(t, i));
204
205 }
206
207 void
208 qa_pmt_prims::test_tuples()
209 {
210   pmt_t v = pmt_make_vector(10, PMT_NIL);
211   std::vector<pmt_t> s(10);
212   for (size_t i = 0; i < 10; i++){
213     std::ostringstream os;
214     os << "s" << i;
215     s[i] = pmt_string_to_symbol(os.str());
216     pmt_vector_set(v, i, s[i]);
217   }
218
219   pmt_t t;
220
221   t = pmt_make_tuple();
222   check_tuple(0, s, t);
223
224   t = pmt_make_tuple(s[0]);
225   check_tuple(1, s, t);
226
227   t = pmt_make_tuple(s[0], s[1]);
228   check_tuple(2, s, t);
229
230   t = pmt_make_tuple(s[0], s[1], s[2]);
231   check_tuple(3, s, t);
232
233   t = pmt_make_tuple(s[0], s[1], s[2], s[3]);
234   check_tuple(4, s, t);
235
236   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4]);
237   check_tuple(5, s, t);
238
239   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5]);
240   check_tuple(6, s, t);
241
242   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
243   check_tuple(7, s, t);
244
245   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]);
246   check_tuple(8, s, t);
247
248   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8]);
249   check_tuple(9, s, t);
250
251   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
252   check_tuple(10, s, t);
253
254   t = pmt_make_tuple(s[0], s[1], s[2]);
255   CPPUNIT_ASSERT_THROW(pmt_tuple_ref(t, 3), pmt_out_of_range);
256
257   t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
258   check_tuple(10, s, t);
259
260   pmt_t t2 = pmt_to_tuple(v);
261   CPPUNIT_ASSERT_EQUAL(size_t(10), pmt_length(v));
262   CPPUNIT_ASSERT(pmt_equal(t, t2));
263   
264   t = pmt_make_tuple(s[0], s[1], s[2]);
265   pmt_t list0 = pmt_list3(s[0], s[1], s[2]);
266   CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(list0));
267   t2 = pmt_to_tuple(list0);
268   CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(t2));
269   CPPUNIT_ASSERT(pmt_equal(t, t2));
270 }
271
272 void
273 qa_pmt_prims::test_equivalence()
274 {
275   pmt_t s0 = pmt_string_to_symbol("s0");
276   pmt_t s1 = pmt_string_to_symbol("s1");
277   pmt_t s2 = pmt_string_to_symbol("s2");
278   pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
279   pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
280   pmt_t i0 = pmt_from_long(42);
281   pmt_t i1 = pmt_from_long(42);
282   pmt_t r0 = pmt_from_double(42);
283   pmt_t r1 = pmt_from_double(42);
284   pmt_t r2 = pmt_from_double(43);
285
286   CPPUNIT_ASSERT(pmt_eq(s0, s0));
287   CPPUNIT_ASSERT(!pmt_eq(s0, s1));
288   CPPUNIT_ASSERT(pmt_eqv(s0, s0));
289   CPPUNIT_ASSERT(!pmt_eqv(s0, s1));
290
291   CPPUNIT_ASSERT(pmt_eqv(i0, i1));
292   CPPUNIT_ASSERT(pmt_eqv(r0, r1));
293   CPPUNIT_ASSERT(!pmt_eqv(r0, r2));
294   CPPUNIT_ASSERT(!pmt_eqv(i0, r0));
295
296   CPPUNIT_ASSERT(!pmt_eq(list0, list1));
297   CPPUNIT_ASSERT(!pmt_eqv(list0, list1));
298   CPPUNIT_ASSERT(pmt_equal(list0, list1));
299
300   pmt_t v0 = pmt_make_vector(3, s0);
301   pmt_t v1 = pmt_make_vector(3, s0);
302   pmt_t v2 = pmt_make_vector(4, s0);
303   CPPUNIT_ASSERT(!pmt_eqv(v0, v1));
304   CPPUNIT_ASSERT(pmt_equal(v0, v1));
305   CPPUNIT_ASSERT(!pmt_equal(v0, v2));
306
307   pmt_vector_set(v0, 0, list0);
308   pmt_vector_set(v0, 1, list0);
309   pmt_vector_set(v1, 0, list1);
310   pmt_vector_set(v1, 1, list1);
311   CPPUNIT_ASSERT(pmt_equal(v0, v1));
312 }
313
314 void
315 qa_pmt_prims::test_misc()
316 {
317   pmt_t k0 = pmt_string_to_symbol("k0");
318   pmt_t k1 = pmt_string_to_symbol("k1");
319   pmt_t k2 = pmt_string_to_symbol("k2");
320   pmt_t k3 = pmt_string_to_symbol("k3");
321   pmt_t v0 = pmt_string_to_symbol("v0");
322   pmt_t v1 = pmt_string_to_symbol("v1");
323   pmt_t v2 = pmt_string_to_symbol("v2");
324   pmt_t p0 = pmt_cons(k0, v0);
325   pmt_t p1 = pmt_cons(k1, v1);
326   pmt_t p2 = pmt_cons(k2, v2);
327   
328   pmt_t alist = pmt_cons(p0, pmt_cons(p1, pmt_cons(p2, PMT_NIL)));
329   CPPUNIT_ASSERT(pmt_eq(p1, pmt_assv(k1, alist)));
330   CPPUNIT_ASSERT(pmt_eq(PMT_F, pmt_assv(k3, alist)));
331   
332   pmt_t keys = pmt_cons(k0, pmt_cons(k1, pmt_cons(k2, PMT_NIL)));
333   pmt_t vals = pmt_cons(v0, pmt_cons(v1, pmt_cons(v2, PMT_NIL)));
334   CPPUNIT_ASSERT(pmt_equal(keys, pmt_map(pmt_car, alist)));
335   CPPUNIT_ASSERT(pmt_equal(vals, pmt_map(pmt_cdr, alist)));
336 }
337
338 void
339 qa_pmt_prims::test_dict()
340 {
341   pmt_t dict = pmt_make_dict();
342   CPPUNIT_ASSERT(pmt_is_dict(dict));
343
344   pmt_t k0 = pmt_string_to_symbol("k0");
345   pmt_t k1 = pmt_string_to_symbol("k1");
346   pmt_t k2 = pmt_string_to_symbol("k2");
347   pmt_t k3 = pmt_string_to_symbol("k3");
348   pmt_t v0 = pmt_string_to_symbol("v0");
349   pmt_t v1 = pmt_string_to_symbol("v1");
350   pmt_t v2 = pmt_string_to_symbol("v2");
351   pmt_t v3 = pmt_string_to_symbol("v3");
352   pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL);
353   
354   CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0));
355   pmt_dict_set(dict, k0, v0);
356   CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0));
357   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0));
358   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found));
359   pmt_dict_set(dict, k1, v1);
360   pmt_dict_set(dict, k2, v2);
361   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1));
362   pmt_dict_set(dict, k1, v3);
363   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3));
364
365   pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL)));
366   pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL)));
367   CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict)));
368   CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict)));
369 }
370
371 void
372 qa_pmt_prims::test_io()
373 {
374   pmt_t k0 = pmt_string_to_symbol("k0");
375   pmt_t k1 = pmt_string_to_symbol("k1");
376   pmt_t k2 = pmt_string_to_symbol("k2");
377   pmt_t k3 = pmt_string_to_symbol("k3");
378
379   CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0));
380 }
381
382 void
383 qa_pmt_prims::test_lists()
384 {
385   pmt_t s0 = pmt_intern("s0");
386   pmt_t s1 = pmt_intern("s1");
387   pmt_t s2 = pmt_intern("s2");
388   pmt_t s3 = pmt_intern("s3");
389
390   pmt_t l1 = pmt_list4(s0, s1, s2, s3);
391   pmt_t l2 = pmt_list3(s0, s1, s2);
392   pmt_t l3 = pmt_list_add(l2, s3);
393   CPPUNIT_ASSERT(pmt_equal(l1, l3));
394 }
395
396 // ------------------------------------------------------------------------
397
398 // class foo is used in test_any below.
399 // It can't be declared in the scope of test_any because of template
400 // namespace problems.
401
402 class foo {
403 public:
404   double        d_double;
405   int           d_int;
406   foo(double d=0, int i=0) : d_double(d), d_int(i) {}
407 };
408
409 bool operator==(const foo &a, const foo &b)
410 {
411   return a.d_double == b.d_double && a.d_int == b.d_int;
412 }
413
414 std::ostream& operator<<(std::ostream &os, const foo obj)
415 {
416   os << "<foo: " << obj.d_double << ", " << obj.d_int << ">";
417   return os;
418 }
419
420 void
421 qa_pmt_prims::test_any()
422 {
423   boost::any a0;
424   boost::any a1;
425   boost::any a2;
426
427   a0 = std::string("Hello!");
428   a1 = 42;
429   a2 = foo(3.250, 21);
430
431   pmt_t p0 = pmt_make_any(a0);
432   pmt_t p1 = pmt_make_any(a1);
433   pmt_t p2 = pmt_make_any(a2);
434
435   CPPUNIT_ASSERT_EQUAL(std::string("Hello!"),
436                        boost::any_cast<std::string>(pmt_any_ref(p0)));
437
438   CPPUNIT_ASSERT_EQUAL(42,
439                        boost::any_cast<int>(pmt_any_ref(p1)));
440
441   CPPUNIT_ASSERT_EQUAL(foo(3.250, 21),
442                        boost::any_cast<foo>(pmt_any_ref(p2)));
443 }
444
445 // ------------------------------------------------------------------------
446
447 void
448 qa_pmt_prims::test_serialize()
449 {
450   std::stringbuf sb;            // fake channel
451   pmt_t a = pmt_intern("a");
452   pmt_t b = pmt_intern("b");
453   pmt_t c = pmt_intern("c");
454
455   sb.str("");                   // reset channel to empty
456
457   // write stuff to channel
458
459   pmt_serialize(PMT_NIL, sb);
460   pmt_serialize(pmt_intern("foobarvia"), sb);
461   pmt_serialize(pmt_from_long(123456789), sb);
462   pmt_serialize(pmt_from_long(-123456789), sb);
463   pmt_serialize(pmt_cons(PMT_NIL, PMT_NIL), sb);
464   pmt_serialize(pmt_cons(a, b), sb);
465   pmt_serialize(pmt_list1(a), sb);
466   pmt_serialize(pmt_list2(a, b), sb);
467   pmt_serialize(pmt_list3(a, b, c), sb);
468   pmt_serialize(pmt_list3(a, pmt_list3(c, b, a), c), sb);
469   pmt_serialize(PMT_T, sb);
470   pmt_serialize(PMT_F, sb);
471
472   // read it back
473
474   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_NIL));
475   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_intern("foobarvia")));
476   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(123456789)));
477   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(-123456789)));
478   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(PMT_NIL, PMT_NIL)));
479   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(a, b)));
480   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list1(a)));
481   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list2(a, b)));
482   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, b, c)));
483   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, pmt_list3(c, b, a), c)));
484   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_T));
485   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_F));
486
487   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_EOF));      // last item
488
489
490   // FIXME add tests for real, complex, vector, uniform-vector, dict
491   // FIXME add tests for malformed input too.
492
493 }
494
495 void
496 qa_pmt_prims::test_sets()
497 {
498   pmt_t s1 = pmt_intern("s1");
499   pmt_t s2 = pmt_intern("s2");
500   pmt_t s3 = pmt_intern("s3");
501
502   pmt_t l1 = pmt_list1(s1);
503   pmt_t l2 = pmt_list2(s2,s3);
504   pmt_t l3 = pmt_list3(s1,s2,s3);
505
506   CPPUNIT_ASSERT(pmt_is_pair(pmt_memq(s1,l1)));
507   CPPUNIT_ASSERT(pmt_is_false(pmt_memq(s3,l1)));
508
509   CPPUNIT_ASSERT(pmt_subsetp(l1,l3));
510   CPPUNIT_ASSERT(pmt_subsetp(l2,l3));
511   CPPUNIT_ASSERT(!pmt_subsetp(l1,l2));
512   CPPUNIT_ASSERT(!pmt_subsetp(l2,l1));
513   CPPUNIT_ASSERT(!pmt_subsetp(l3,l2));
514 }
515