Update SENF to compile using g++ 4.3.2 (Ubuntu 8.10)
[senf.git] / Packets / Packet.test.cc
index 2da754d..e61d67a 100644 (file)
@@ -28,6 +28,7 @@
 
 // Custom includes
 #include <sstream>
+#include <boost/static_assert.hpp>
 #include "Packets.hh"
 
 #include "../Utils/auto_unit_test.hh"
@@ -109,6 +110,28 @@ namespace {
         senf::PacketRegistry<RegTag>::RegistrationProxy<BarPacket> registerBar(2u);
     }
 
+    struct IntAnnotation {
+        unsigned value;
+    };
+    
+    struct LargeAnnotation {
+        char value[32];
+    };
+
+    struct ComplexAnnotation : senf::ComplexAnnotation
+    {
+        std::string s;
+        int i;
+    };
+
+    struct ComplexEmptyAnnotation : senf::ComplexAnnotation
+    {};
+
+    struct InvalidAnnotation
+    {
+        std::string value;
+    };
+
 }
 
 BOOST_AUTO_UNIT_TEST(packet)
@@ -161,8 +184,11 @@ BOOST_AUTO_UNIT_TEST(packet)
     
     packet.finalizeAll();
     BOOST_CHECK_EQUAL( packet.last().as<BarPacket>()->type(), 
-                       BarPacket::type::parser::type_t::value_type(-1) );
+                       BarPacket::Parser::type_t::value_type(-1) );
     packet.last().append(FooPacket::create());
+    packet.finalizeThis();
+    packet.finalizeTo<BarPacket>();
+    packet.finalizeTo(packet.find<BarPacket>());
     packet.finalizeAll();
     BOOST_CHECK_EQUAL( packet.find<BarPacket>()->type(), 1u );
 
@@ -231,6 +257,46 @@ BOOST_AUTO_UNIT_TEST(concretePacket)
     BOOST_CHECK_EQUAL( BarPacket::create()->reserved(), 0xA0A0u );
 }
 
+BOOST_AUTO_UNIT_TEST(packetAnnotation)
+{
+    senf::Packet packet (FooPacket::create());
+    BarPacket::createAfter(packet);
+
+    ComplexAnnotation & ca (packet.annotation<ComplexAnnotation>());
+    ca.s = "dead beef";
+    ca.i = 0x12345678;
+    SENF_CHECK_NO_THROW( packet.annotation<IntAnnotation>().value = 0xDEADBEEF );
+
+    senf::Packet p2 (packet.next());
+
+    BOOST_CHECK_EQUAL( p2.annotation<IntAnnotation>().value, 0xDEADBEEFu );
+    BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().s, "dead beef" );
+    BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().i, 0x12345678 );
+
+    BOOST_CHECK( senf::detail::AnnotationIndexer<IntAnnotation>::Small );
+    BOOST_CHECK( ! senf::detail::AnnotationIndexer<LargeAnnotation>::Small );
+    BOOST_CHECK( ! senf::detail::AnnotationIndexer<ComplexAnnotation>::Small );
+    BOOST_CHECK( ! senf::detail::AnnotationIndexer<ComplexEmptyAnnotation>::Small );
+}
+
+#ifdef COMPILE_CHECK
+
+COMPILE_FAIL(invalidAnnotation)
+{
+#   ifdef BOOST_HAS_TYPE_TRAITS_INTRINSICS
+
+    senf::Packet packet (FooPacket::create());
+    (void) packet.annotation<InvalidAnnotation>();
+
+#   else
+
+    invalid_annotation_check_disabled();
+
+#   endif
+}
+
+#endif
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_