Socket/Protocols/Raw: EUI64 documentation
[senf.git] / Packets / VariantParser.test.cc
index 9b807e6..364349e 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institute for Open Communication Systems (FOKUS) 
-// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
@@ -21,7 +21,7 @@
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 /** \file
-    \brief VariantParser.test unit tests */
+    \brief VariantParser unit tests */
 
 //#include "VariantParser.test.hh"
 //#include "VariantParser.test.ih"
 BOOST_AUTO_UNIT_TEST(VariantParser)
 {
     typedef senf::ArrayParser<10, senf::UInt8Parser> Array10;
-    typedef senf::DirectVariantParser< senf::UInt8Parser, 1, senf::detail::VariantParser_IdentityTranslator,
-        senf::VoidPacketParser,
-        Array10, 
-        senf:: UInt32Parser 
-        >::parser Variant;
+    typedef senf::VariantParser< senf::detail::FixedAuxParserPolicy<senf::UInt8Parser, 1>,
+        boost::mpl::vector<senf::VoidPacketParser, Array10, senf:: UInt32Parser> > Variant;
     
     unsigned char data[] = { 0x01, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
                              0x19, 0x1A, 0x1B };
@@ -81,7 +78,10 @@ BOOST_AUTO_UNIT_TEST(VariantParser)
     };
 }
 
-namespace {
+// We can't use the unnamed namespace here since there's a bug in gcc-4.2.3 which is 
+// the default version of gcc on ubuntu hardy :-(
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34213
+namespace VariantParser_test_cc_anon_namespace {
     
     struct SubParser : public senf::PacketParserBase
     { 
@@ -96,19 +96,26 @@ namespace {
     struct TestParser : public senf::PacketParserBase
     {
 #       include SENF_PARSER()
-        
-        SENF_PARSER_SKIP_BITS( 4 );
-        SENF_PARSER_PRIVATE_BITFIELD( type_, 4, unsigned );
-        SENF_PARSER_PRIVATE_VARIANT( content_, type_, (senf::VoidPacketParser)(SubParser) );
 
-        bool hasContent() const { return content_().variant() == 1; }
-        void hasContent(bool v) const { if (v) content_().init<1>(); else content_().init<0>(); }
-        SubParser content() const { return content_().get<1>(); }
+        SENF_PARSER_BITFIELD_RO( len,  4, unsigned );
+        SENF_PARSER_BITFIELD_RO( type, 4, unsigned );
+        // just here so the second variant is 'var'
+        SENF_PARSER_VARIANT( value, len, 
+                                 (senf::VoidPacketParser)
+                                 (senf::UInt8Parser)
+                                 (senf::UInt16Parser)
+                                 (senf::UInt32Parser)
+            );
+        SENF_PARSER_VARIANT( content_, type,
+                                 ( novalue( nocontent, key(10, senf::VoidPacketParser) ) )
+                                 (      id( content,           SubParser               ) )
+            );
 
         SENF_PARSER_FINALIZE(TestParser);
     };
     
 }
+using namespace VariantParser_test_cc_anon_namespace;
 
 BOOST_AUTO_UNIT_TEST(VariantParserMacro)
 {
@@ -116,17 +123,21 @@ BOOST_AUTO_UNIT_TEST(VariantParserMacro)
     
     {
         TestParser v (p.data().begin(), & p.data());
-    
-        BOOST_CHECK( ! v.hasContent() );
+        v.init();
+        BOOST_CHECK( ! v.has_content() );
         BOOST_CHECK_EQUAL( senf::bytes(v), 1u );
-        v.hasContent(true);
+        BOOST_CHECK_EQUAL( v.type(), 10u );
+        v.init_content();
         // Parser invalidated
     }
     {
         TestParser v (p.data().begin(), & p.data());
-        BOOST_CHECK( v.hasContent() );
+        BOOST_CHECK( v.has_content() );
         BOOST_CHECK_EQUAL( senf::bytes(v), 7u );
         BOOST_CHECK_EQUAL( v.content().foo(), 0u );
+        BOOST_CHECK_EQUAL( v.type(), 1u );
+        v.nocontent();
+        // Parser invalidated
     }
 }