util: ensure concepts.hpp can compile on its own

This commit also adds comments and test cases for concept checks.

refs #2270

Change-Id: Ibc4239adf8980f5b0c0c2d73b6c4b22fb94cbf18
diff --git a/src/util/concepts.hpp b/src/util/concepts.hpp
index 94baeaa..b61c301 100644
--- a/src/util/concepts.hpp
+++ b/src/util/concepts.hpp
@@ -23,9 +23,12 @@
 #define NDN_UTIL_CONCEPTS_HPP
 
 #include <boost/concept/usage.hpp>
+#include "../encoding/block.hpp"
 
 namespace ndn {
 
+/** \brief a concept check for TLV abstraction with .wireEncode method
+ */
 template<class X>
 class WireEncodable
 {
@@ -33,10 +36,14 @@
   BOOST_CONCEPT_USAGE(WireEncodable)
   {
     X j;
-    j.wireEncode();
+    Block block = j.wireEncode();
+    block.size(); // avoid 'unused variable block'
   }
 };
 
+/** \brief a concept check for TLV abstraction with .wireDecode method
+ *         and constructible from Block
+ */
 template<class X>
 class WireDecodable
 {
@@ -49,6 +56,8 @@
   }
 };
 
+/** \brief a concept check for CryptoPP hash algorithm
+ */
 template<class X>
 class Hashable
 {
diff --git a/tests/unit-tests/util/concepts.cpp b/tests/unit-tests/util/concepts.cpp
new file mode 100644
index 0000000..0486013
--- /dev/null
+++ b/tests/unit-tests/util/concepts.cpp
@@ -0,0 +1,61 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014,  Regents of the University of California,
+ *                      Arizona Board of Regents,
+ *                      Colorado State University,
+ *                      University Pierre & Marie Curie, Sorbonne University,
+ *                      Washington University in St. Louis,
+ *                      Beijing Institute of Technology,
+ *                      The University of Memphis
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#include "util/concepts.hpp"
+
+namespace ndn {
+namespace tests {
+
+class WireEncodableType
+{
+public:
+  const Block&
+  wireEncode();
+};
+BOOST_CONCEPT_ASSERT((WireEncodable<WireEncodableType>));
+
+class WireEncodableType2
+{
+public:
+  Block
+  wireEncode();
+};
+BOOST_CONCEPT_ASSERT((WireEncodable<WireEncodableType2>));
+
+class WireDecodableType
+{
+public:
+  explicit
+  WireDecodableType(const Block& wire);
+
+  void
+  wireDecode(const Block& wire);
+};
+BOOST_CONCEPT_ASSERT((WireDecodable<WireDecodableType>));
+
+} // namespace tests
+} // namespace ndn