Utils: Add SENF_CHECK_EQUAL_COLLECTIONS() unit-test for better char range support
g0dil [Wed, 23 Sep 2009 19:50:24 +0000 (19:50 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1436 270642c3-0616-0410-b53a-bc976706d245

senf/Packets/DefaultBundle/IPv6Extensions.test.cc
senf/Utils/auto_unit_test.hh
senf/Utils/auto_unit_test.ih [new file with mode: 0644]

index 380b696..15075bb 100644 (file)
@@ -286,9 +286,9 @@ BOOST_AUTO_UNIT_TEST(ipv6Extensions_hopByHop_create)
     icmp->code() = 0u;
     ip.finalizeAll();
     SENF_CHECK_NO_THROW( ip.dump(oss) );
-    BOOST_CHECK_EQUAL_COLLECTIONS(
-            HopByHop_packetData, HopByHop_packetData+sizeof(HopByHop_packetData),
-            ip.data().begin(), ip.data().end() );
+    SENF_CHECK_EQUAL_COLLECTIONS(
+        HopByHop_packetData, HopByHop_packetData+sizeof(HopByHop_packetData),
+        ip.data().begin(), ip.data().end() );
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
index c12bb7d..118f0de 100644 (file)
@@ -41,6 +41,7 @@
 #include <boost/version.hpp>
 
 //#include "auto_unit_test.mpp"
+#include "auto_unit_test.ih"
 ///////////////////////////////hh.p////////////////////////////////////////
 
 #if BOOST_VERSION >= 103400
         try { expr ; }                                                                            \
         catch (std::exception & e) { std::cerr << e.what() << std::endl; throw; } )
 
+namespace senf {
+namespace test {
+
+    template <class Iterator>
+    typename detail::NoCharIterator<Iterator>::type nocharIterator(Iterator i)
+    { return typename detail::NoCharIterator<Iterator>::type (i); }
+
+    template <class Value>
+    typename detail::NoCharIterator<Value *>::type nocharIterator(Value * i)
+    { return typename detail::NoCharIterator<Value *>::type (i); }
+
+    template <class Value>
+    typename detail::NoCharIterator<Value const *>::type nocharIterator(Value const * i)
+    { return typename detail::NoCharIterator<Value const *>::type (i); }
+
+}}
+
+/** \brief Check ranges for equality, writing char's as int's
+
+    \ref SENF_CHECK_EQUAL_COLLECTIONS() is like \c BOOST_CHECK_EQUAL_COLLECTIONS(). The only
+    difference is, that \ref SENF_CHECK_EQUAL_COLLECTIONS() will write out collection values in
+    numeric form (and not as single characters) if the elements are of any char type. Other types
+    are not affected.
+
+    \ingroup unittest
+ */
+#define SENF_CHECK_EQUAL_COLLECTIONS(a,b,c,d)                                                    \
+    BOOST_CHECK_EQUAL_COLLECTIONS(senf::test::nocharIterator(a), senf::test::nocharIterator(b),  \
+                                  senf::test::nocharIterator(c), senf::test::nocharIterator(d))
+
 ///////////////////////////////hh.e////////////////////////////////////////
 //#include "auto_unit_test.cci"
 //#include "auto_unit_test.ct"
diff --git a/senf/Utils/auto_unit_test.ih b/senf/Utils/auto_unit_test.ih
new file mode 100644 (file)
index 0000000..01283d6
--- /dev/null
@@ -0,0 +1,79 @@
+// $Id$
+//
+// Copyright (C) 2009 
+// 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
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief auto_unit_test internal header */
+
+#ifndef IH_SENF_senf_Utils_auto_unit_test_
+#define IH_SENF_senf_Utils_auto_unit_test_ 1
+
+// Custom includes
+#include <iterator>
+#include <boost/iterator/iterator_adaptor.hpp>
+
+///////////////////////////////ih.p////////////////////////////////////////
+
+namespace senf {
+namespace test {
+namespace detail {
+
+    template <class Type, class Iterator>
+    struct ConvertingIterator 
+        : public boost::iterator_adaptor<
+            ConvertingIterator<Type, Iterator>, Iterator, Type, boost::use_default, Type>
+    {
+        typedef boost::iterator_adaptor<
+            ConvertingIterator<Type, Iterator>, Iterator, Type, boost::use_default, Type> Base;
+        ConvertingIterator(Iterator i) : Base (i) {}
+    };
+
+    template <class Iterator, class vt = typename std::iterator_traits<Iterator>::value_type>
+    struct NoCharIterator
+    { typedef Iterator type; };
+
+    template <class Iterator>
+    struct NoCharIterator<Iterator, char>
+    { typedef ConvertingIterator<int,Iterator> type; };
+
+    template <class Iterator>
+    struct NoCharIterator<Iterator, signed char>
+    { typedef ConvertingIterator<int,Iterator> type; };
+
+    template <class Iterator>
+    struct NoCharIterator<Iterator, unsigned char>
+    { typedef ConvertingIterator<unsigned,Iterator> type; };
+
+}}}
+
+///////////////////////////////ih.e////////////////////////////////////////
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End: