Add support for uint64_t to pmt.
[debian/gnuradio] / gruel / src / lib / pmt / qa_pmt_prims.cc
index 899674bbb18b4d2deaaff8cb60902c927b7a2f33..985361f13f36e5fa7e0286703757b5b18eb07fe1 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2006,2009 Free Software Foundation, Inc.
+ * Copyright 2006,2009,2010 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
@@ -22,8 +22,9 @@
 
 #include <qa_pmt_prims.h>
 #include <cppunit/TestAssert.h>
-#include <gruel/pmt.h>
-#include <stdio.h>
+#include <gruel/msg_passing.h>
+#include <cstdio>
+#include <cstring>
 #include <sstream>
 
 using namespace pmt;
@@ -35,14 +36,14 @@ qa_pmt_prims::test_symbols()
   CPPUNIT_ASSERT(!pmt_is_symbol(PMT_F));
   CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_F), pmt_wrong_type);
 
-  pmt_t sym1 = pmt_string_to_symbol("test");
+  pmt_t sym1 = mp("test");
   CPPUNIT_ASSERT(pmt_is_symbol(sym1));
   CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1));
   CPPUNIT_ASSERT(pmt_is_true(sym1));
   CPPUNIT_ASSERT(!pmt_is_false(sym1));
 
-  pmt_t sym2 = pmt_string_to_symbol("foo");
-  pmt_t sym3 = pmt_string_to_symbol("test");
+  pmt_t sym2 = mp("foo");
+  pmt_t sym3 = mp("test");
   CPPUNIT_ASSERT_EQUAL(sym1, sym3);
   CPPUNIT_ASSERT(sym1 != sym2);
   CPPUNIT_ASSERT(sym1 == sym3);
@@ -55,7 +56,7 @@ qa_pmt_prims::test_symbols()
   for (int i = 0; i < N; i++){
     char buf[100];
     snprintf(buf, sizeof(buf), "test-%d", i);
-    v1[i] = pmt_string_to_symbol(buf);
+    v1[i] = mp(buf);
   }
 
   // confirm that they are all unique
@@ -67,7 +68,7 @@ qa_pmt_prims::test_symbols()
   for (int i = 0; i < N; i++){
     char buf[100];
     snprintf(buf, sizeof(buf), "test-%d", i);
-    v2[i] = pmt_string_to_symbol(buf);
+    v2[i] = mp(buf);
   }
 
   // confirm that we get the same ones back
@@ -78,7 +79,7 @@ qa_pmt_prims::test_symbols()
 void
 qa_pmt_prims::test_booleans()
 {
-  pmt_t sym = pmt_string_to_symbol("test");
+  pmt_t sym = mp("test");
   CPPUNIT_ASSERT(pmt_is_bool(PMT_T));
   CPPUNIT_ASSERT(pmt_is_bool(PMT_F));
   CPPUNIT_ASSERT(!pmt_is_bool(sym));
@@ -102,6 +103,19 @@ qa_pmt_prims::test_integers()
   CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1));
 }
 
+void
+qa_pmt_prims::test_uint64s()
+{
+  pmt_t p1 = pmt_from_uint64((uint64_t)1);
+  pmt_t m1 = pmt_from_uint64((uint64_t)8589934592ULL);
+  CPPUNIT_ASSERT(!pmt_is_uint64(PMT_T));
+  CPPUNIT_ASSERT(pmt_is_uint64(p1));
+  CPPUNIT_ASSERT(pmt_is_uint64(m1));
+  CPPUNIT_ASSERT_THROW(pmt_to_uint64(PMT_T), pmt_wrong_type);
+  CPPUNIT_ASSERT_EQUAL((uint64_t)8589934592ULL, (uint64_t)pmt_to_uint64(m1));
+  CPPUNIT_ASSERT_EQUAL((uint64_t)1ULL, (uint64_t)pmt_to_uint64(p1));
+}
+
 void
 qa_pmt_prims::test_reals()
 {
@@ -136,9 +150,9 @@ qa_pmt_prims::test_pairs()
 {
   CPPUNIT_ASSERT(pmt_is_null(PMT_NIL));
   CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL));
-  pmt_t s1 = pmt_string_to_symbol("s1");
-  pmt_t s2 = pmt_string_to_symbol("s2");
-  pmt_t s3 = pmt_string_to_symbol("s3");
+  pmt_t s1 = mp("s1");
+  pmt_t s2 = mp("s2");
+  pmt_t s3 = mp("s3");
 
 
   CPPUNIT_ASSERT_EQUAL((size_t)0, pmt_length(PMT_NIL));
@@ -173,9 +187,9 @@ qa_pmt_prims::test_vectors()
   static const size_t N = 3;
   pmt_t v1 = pmt_make_vector(N, PMT_NIL);
   CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1));
-  pmt_t s0 = pmt_string_to_symbol("s0");
-  pmt_t s1 = pmt_string_to_symbol("s1");
-  pmt_t s2 = pmt_string_to_symbol("s2");
+  pmt_t s0 = mp("s0");
+  pmt_t s1 = mp("s1");
+  pmt_t s2 = mp("s2");
 
   pmt_vector_set(v1, 0, s0);
   pmt_vector_set(v1, 1, s1);
@@ -212,7 +226,7 @@ qa_pmt_prims::test_tuples()
   for (size_t i = 0; i < 10; i++){
     std::ostringstream os;
     os << "s" << i;
-    s[i] = pmt_string_to_symbol(os.str());
+    s[i] = mp(os.str());
     pmt_vector_set(v, i, s[i]);
   }
 
@@ -281,9 +295,9 @@ qa_pmt_prims::test_tuples()
 void
 qa_pmt_prims::test_equivalence()
 {
-  pmt_t s0 = pmt_string_to_symbol("s0");
-  pmt_t s1 = pmt_string_to_symbol("s1");
-  pmt_t s2 = pmt_string_to_symbol("s2");
+  pmt_t s0 = mp("s0");
+  pmt_t s1 = mp("s1");
+  pmt_t s2 = mp("s2");
   pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
   pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL)));
   pmt_t i0 = pmt_from_long(42);
@@ -323,13 +337,13 @@ qa_pmt_prims::test_equivalence()
 void
 qa_pmt_prims::test_misc()
 {
-  pmt_t k0 = pmt_string_to_symbol("k0");
-  pmt_t k1 = pmt_string_to_symbol("k1");
-  pmt_t k2 = pmt_string_to_symbol("k2");
-  pmt_t k3 = pmt_string_to_symbol("k3");
-  pmt_t v0 = pmt_string_to_symbol("v0");
-  pmt_t v1 = pmt_string_to_symbol("v1");
-  pmt_t v2 = pmt_string_to_symbol("v2");
+  pmt_t k0 = mp("k0");
+  pmt_t k1 = mp("k1");
+  pmt_t k2 = mp("k2");
+  pmt_t k3 = mp("k3");
+  pmt_t v0 = mp("v0");
+  pmt_t v1 = mp("v1");
+  pmt_t v2 = mp("v2");
   pmt_t p0 = pmt_cons(k0, v0);
   pmt_t p1 = pmt_cons(k1, v1);
   pmt_t p2 = pmt_cons(k2, v2);
@@ -350,29 +364,31 @@ qa_pmt_prims::test_dict()
   pmt_t dict = pmt_make_dict();
   CPPUNIT_ASSERT(pmt_is_dict(dict));
 
-  pmt_t k0 = pmt_string_to_symbol("k0");
-  pmt_t k1 = pmt_string_to_symbol("k1");
-  pmt_t k2 = pmt_string_to_symbol("k2");
-  pmt_t k3 = pmt_string_to_symbol("k3");
-  pmt_t v0 = pmt_string_to_symbol("v0");
-  pmt_t v1 = pmt_string_to_symbol("v1");
-  pmt_t v2 = pmt_string_to_symbol("v2");
-  pmt_t v3 = pmt_string_to_symbol("v3");
+  pmt_t k0 = mp("k0");
+  pmt_t k1 = mp("k1");
+  pmt_t k2 = mp("k2");
+  pmt_t k3 = mp("k3");
+  pmt_t v0 = mp("v0");
+  pmt_t v1 = mp("v1");
+  pmt_t v2 = mp("v2");
+  pmt_t v3 = mp("v3");
   pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL);
   
   CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0));
-  pmt_dict_set(dict, k0, v0);
+  dict = pmt_dict_add(dict, k0, v0);
   CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0));
   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0));
   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found));
-  pmt_dict_set(dict, k1, v1);
-  pmt_dict_set(dict, k2, v2);
+  dict = pmt_dict_add(dict, k1, v1);
+  dict = pmt_dict_add(dict, k2, v2);
   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1));
-  pmt_dict_set(dict, k1, v3);
+  dict = pmt_dict_add(dict, k1, v3);
   CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3));
 
-  pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL)));
-  pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL)));
+  pmt_t keys = pmt_list3(k1, k2, k0);
+  pmt_t vals = pmt_list3(v3, v2, v0);
+  //std::cout << "pmt_dict_keys:   " << pmt_dict_keys(dict) << std::endl;
+  //std::cout << "pmt_dict_values: " << pmt_dict_values(dict) << std::endl;
   CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict)));
   CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict)));
 }
@@ -380,10 +396,10 @@ qa_pmt_prims::test_dict()
 void
 qa_pmt_prims::test_io()
 {
-  pmt_t k0 = pmt_string_to_symbol("k0");
-  pmt_t k1 = pmt_string_to_symbol("k1");
-  pmt_t k2 = pmt_string_to_symbol("k2");
-  pmt_t k3 = pmt_string_to_symbol("k3");
+  pmt_t k0 = mp("k0");
+  pmt_t k1 = mp("k1");
+  pmt_t k2 = mp("k2");
+  pmt_t k3 = mp("k3");
 
   CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0));
 }
@@ -391,10 +407,10 @@ qa_pmt_prims::test_io()
 void
 qa_pmt_prims::test_lists()
 {
-  pmt_t s0 = pmt_intern("s0");
-  pmt_t s1 = pmt_intern("s1");
-  pmt_t s2 = pmt_intern("s2");
-  pmt_t s3 = pmt_intern("s3");
+  pmt_t s0 = mp("s0");
+  pmt_t s1 = mp("s1");
+  pmt_t s2 = mp("s2");
+  pmt_t s3 = mp("s3");
 
   pmt_t l1 = pmt_list4(s0, s1, s2, s3);
   pmt_t l2 = pmt_list3(s0, s1, s2);
@@ -453,20 +469,55 @@ qa_pmt_prims::test_any()
 
 // ------------------------------------------------------------------------
 
+class qa_pmt_msg_accepter_nop : public gruel::msg_accepter {
+public:
+  qa_pmt_msg_accepter_nop(){};
+  ~qa_pmt_msg_accepter_nop();
+  void post(pmt_t){};
+};
+
+qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){}
+
+void
+qa_pmt_prims::test_msg_accepter()
+{
+  pmt_t sym = mp("my-symbol");
+
+  boost::any a0;
+  a0 = std::string("Hello!");
+  pmt_t p0 = pmt_make_any(a0);
+
+  gruel::msg_accepter_sptr ma0 = gruel::msg_accepter_sptr(new qa_pmt_msg_accepter_nop());
+  pmt_t p1 = pmt_make_msg_accepter(ma0);
+
+  CPPUNIT_ASSERT_EQUAL(ma0.get(), pmt_msg_accepter_ref(p1).get());
+
+  CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(sym), pmt_wrong_type);
+  CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0),  pmt_wrong_type);
+
+  // just confirm interfaces on send are OK
+  gruel::send(ma0.get(), sym);
+  gruel::send(ma0, sym);
+  gruel::send(p1, sym);
+
+}
+
+// ------------------------------------------------------------------------
+
 void
 qa_pmt_prims::test_serialize()
 {
   std::stringbuf sb;           // fake channel
-  pmt_t a = pmt_intern("a");
-  pmt_t b = pmt_intern("b");
-  pmt_t c = pmt_intern("c");
+  pmt_t a = mp("a");
+  pmt_t b = mp("b");
+  pmt_t c = mp("c");
 
   sb.str("");                  // reset channel to empty
 
   // write stuff to channel
 
   pmt_serialize(PMT_NIL, sb);
-  pmt_serialize(pmt_intern("foobarvia"), sb);
+  pmt_serialize(mp("foobarvia"), sb);
   pmt_serialize(pmt_from_long(123456789), sb);
   pmt_serialize(pmt_from_long(-123456789), sb);
   pmt_serialize(pmt_cons(PMT_NIL, PMT_NIL), sb);
@@ -481,7 +532,7 @@ qa_pmt_prims::test_serialize()
   // read it back
 
   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_NIL));
-  CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_intern("foobarvia")));
+  CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), mp("foobarvia")));
   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(123456789)));
   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(-123456789)));
   CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(PMT_NIL, PMT_NIL)));
@@ -504,9 +555,9 @@ qa_pmt_prims::test_serialize()
 void
 qa_pmt_prims::test_sets()
 {
-  pmt_t s1 = pmt_intern("s1");
-  pmt_t s2 = pmt_intern("s2");
-  pmt_t s3 = pmt_intern("s3");
+  pmt_t s1 = mp("s1");
+  pmt_t s2 = mp("s2");
+  pmt_t s3 = mp("s3");
 
   pmt_t l1 = pmt_list1(s1);
   pmt_t l2 = pmt_list2(s2,s3);
@@ -522,3 +573,19 @@ qa_pmt_prims::test_sets()
   CPPUNIT_ASSERT(!pmt_subsetp(l3,l2));
 }
 
+void
+qa_pmt_prims::test_sugar()
+{
+  CPPUNIT_ASSERT(pmt_is_symbol(mp("my-symbol")));
+  CPPUNIT_ASSERT_EQUAL((long) 10, pmt_to_long(mp(10)));
+  CPPUNIT_ASSERT_EQUAL((double) 1e6, pmt_to_double(mp(1e6)));
+  CPPUNIT_ASSERT_EQUAL(std::complex<double>(2, 3),
+                      pmt_to_complex(mp(std::complex<double>(2, 3))));
+
+  int buf[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+  pmt_t blob = mp(buf, sizeof(buf));
+  const void *data = pmt_blob_data(blob);
+  size_t nbytes = pmt_blob_length(blob);
+  CPPUNIT_ASSERT_EQUAL(sizeof(buf), nbytes);
+  CPPUNIT_ASSERT(memcmp(buf, data, nbytes) == 0);
+}