X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FVectorParser.test.cc;h=e1f9d2b747eb57ac9dc736205d6a27dc997f3036;hb=a4ebeef29f8eb69dc2dad10668d762540002b924;hp=d8c0d75d4793b6f48217382e089e82fd4bea4f86;hpb=f73fa16ed5abdce272ac77f8b8b9ef2b9922c266;p=senf.git diff --git a/Packets/VectorParser.test.cc b/Packets/VectorParser.test.cc index d8c0d75..e1f9d2b 100644 --- a/Packets/VectorParser.test.cc +++ b/Packets/VectorParser.test.cc @@ -1,8 +1,8 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -48,7 +48,7 @@ BOOST_AUTO_UNIT_TEST(VectorParser) senf::PacketInterpreterBase::ptr p (senf::PacketInterpreter::create(data)); typedef senf::VectorParser< senf::UInt16Parser, - senf::detail::VectorNParser_Sizer + senf::detail::FixedAuxParserPolicy > UInt16VectorParser; { @@ -123,7 +123,7 @@ BOOST_AUTO_UNIT_TEST(VectorParser_wrapper) senf::PacketInterpreterBase::ptr p (senf::PacketInterpreter::create(data)); typedef senf::VectorParser< senf::UInt16Parser, - senf::detail::VectorNParser_Sizer + senf::detail::FixedAuxParserPolicy > UInt16VectorParser; UInt16VectorParser v (boost::next(p->data().begin(),1), &p->data()); UInt16VectorParser::container w (v); @@ -172,6 +172,81 @@ BOOST_AUTO_UNIT_TEST(VectorParser_wrapper) BOOST_CHECK_EQUAL( w.parser().size(), 0u ); } +BOOST_AUTO_UNIT_TEST(dynamicPolicyVector) +{ + unsigned char data[] = { 0x03, // size + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, // data + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25 }; + senf::PacketInterpreterBase::ptr p (senf::PacketInterpreter::create(data)); + + typedef senf::VectorParser< + senf::UInt16Parser, + senf::detail::DynamicAuxParserPolicy + > UInt16VectorParser; + + UInt16VectorParser v (senf::UInt8Parser(p->data().begin(), &p->data()), + boost::next(p->data().begin(),1), &p->data()); + UInt16VectorParser::container w (v); + + BOOST_CHECK_EQUAL( v.size(), 3u ); + BOOST_CHECK_EQUAL( w.size(), 3u ); + + BOOST_CHECK_EQUAL( v[0], 0x1011 ); + BOOST_CHECK_EQUAL( v[2], 0x1415 ); + + BOOST_CHECK_EQUAL( w[0], 0x1011 ); + BOOST_CHECK_EQUAL( w[2], 0x1415 ); +} + +namespace { + + struct TestTransform + { + typedef unsigned value_type; + static unsigned get(unsigned v) { return v-2; } + static unsigned set(unsigned v) { return v+2; } + }; + + struct TestVectorParser + : public senf::PacketParserBase + { +# include SENF_PARSER() + + SENF_PARSER_PRIVATE_FIELD ( size1 , senf::UInt8Parser ); + SENF_PARSER_PRIVATE_FIELD ( size2 , senf::UInt8Parser ); + SENF_PARSER_FIELD ( dummy , senf::UInt32Parser ); + SENF_PARSER_VECTOR ( vec1 , transform(TestTransform, size1) , senf::UInt16Parser ); + SENF_PARSER_VECTOR ( vec2 , bytes(size2) , senf::UInt16Parser ); + + SENF_PARSER_FINALIZE( TestVectorParser ); + }; + +} + +BOOST_AUTO_UNIT_TEST(vectorMacro) +{ + unsigned char data[] = { 0x05, // size1 + 0x04, // size2 + 0x01, 0x02, 0x03, 0x04, // dummy + 0x05, 0x06, // vec1[0] + 0x07, 0x08, // vec1[1] + 0x09, 0x0A, // vec1[2] + 0x0B, 0x0C, // vec2[0] + 0x0D, 0x0E }; // vec2[1] + + senf::DataPacket p (senf::DataPacket::create(data)); + TestVectorParser parser (p.data().begin(), &p.data()); + + BOOST_CHECK_EQUAL( parser.vec1().size(), 3u ); + BOOST_CHECK_EQUAL( parser.vec2().size(), 2u ); + BOOST_CHECK_EQUAL( parser.dummy(), 0x01020304u ); + BOOST_CHECK_EQUAL( parser.vec1()[0], 0x0506u ); + BOOST_CHECK_EQUAL( parser.vec1()[1], 0x0708u ); + BOOST_CHECK_EQUAL( parser.vec1()[2], 0x090Au ); + BOOST_CHECK_EQUAL( parser.vec2()[0], 0x0B0Cu ); + BOOST_CHECK_EQUAL( parser.vec2()[1], 0x0D0Eu ); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_