exclude: Fixes of Exclude and adding unit tests for the exclude filter

Change-Id: I2392d98abc1dd46fee53f2bb9206141a01aa37c3
fixes: #1158
diff --git a/src/exclude.cpp b/src/exclude.cpp
index 11edd82..42fb843 100644
--- a/src/exclude.cpp
+++ b/src/exclude.cpp
@@ -214,7 +214,7 @@
   Block::element_const_iterator i = wire_.getAll().begin();
   if (i->type() == Tlv::Any)
     {
-      appendExclude("/", true);
+      appendExclude(name::Component(), true);
       ++i;
     }
 
diff --git a/tests/test-exclude.cpp b/tests/test-exclude.cpp
new file mode 100644
index 0000000..6f7f306
--- /dev/null
+++ b/tests/test-exclude.cpp
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Alexander Afanasyev
+ *
+ * BSD license, See the LICENSE file for more information
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "exclude.hpp"
+
+#include <boost/test/unit_test.hpp>
+
+namespace ndn {
+
+BOOST_AUTO_TEST_SUITE(TestExclude)
+
+BOOST_AUTO_TEST_CASE (Basic)
+{
+  Exclude e;
+  e.excludeOne (name::Component("b"));
+  BOOST_CHECK_EQUAL (e.size (), 1);
+  BOOST_CHECK_EQUAL (e.toUri(), "b");
+
+  e.excludeOne (name::Component("d"));
+  BOOST_CHECK_EQUAL (e.size (), 2);
+  BOOST_CHECK_EQUAL (e.toUri(), "b,d");
+
+  e.excludeOne (name::Component("a"));
+  BOOST_CHECK_EQUAL (e.size (), 3);
+  BOOST_CHECK_EQUAL (e.toUri(), "a,b,d");
+
+  e.excludeOne (name::Component("aa"));
+  BOOST_CHECK_EQUAL (e.size (), 4);
+  BOOST_CHECK_EQUAL (e.toUri(), "a,b,d,aa");
+
+  e.excludeOne (name::Component("cc"));
+  BOOST_CHECK_EQUAL (e.size (), 5);
+  BOOST_CHECK_EQUAL (e.toUri(), "a,b,d,aa,cc");
+
+  e.excludeOne (name::Component("c"));
+  BOOST_CHECK_EQUAL (e.size (), 6);
+  BOOST_CHECK_EQUAL (e.toUri(), "a,b,c,d,aa,cc");
+}
+
+BOOST_AUTO_TEST_CASE (Before)
+{
+  // based on http://redmine.named-data.net/issues/1158
+  ndn::Exclude e;
+  BOOST_REQUIRE_NO_THROW(e.excludeBefore(name::Component("PuQxMaf91")));
+
+  BOOST_CHECK_EQUAL(e.toUri(), "*,PuQxMaf91");
+}
+
+BOOST_AUTO_TEST_CASE (Ranges)
+{
+// example: ANY /b /d ANY /f
+
+  Exclude e;
+  e.excludeOne (name::Component ("b0"));
+  BOOST_CHECK_EQUAL (e.size (), 1);
+  BOOST_CHECK_EQUAL (e.toUri(), "b0");
+
+  e.excludeRange (name::Component (), name::Component ("b1"));
+  BOOST_CHECK_EQUAL (e.size (), 2);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,b1");
+
+  e.excludeRange (name::Component (), name::Component("c0"));
+  BOOST_CHECK_EQUAL (e.size (), 2);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,c0");
+
+  e.excludeRange (name::Component("a0"), name::Component("c0"));
+  BOOST_CHECK_EQUAL (e.size (), 2);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,c0");
+
+  e.excludeRange (name::Component("d0"), name::Component("e0"));
+  BOOST_CHECK_EQUAL (e.size (), 4);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,c0,d0,*,e0");
+
+  e.excludeRange (name::Component("c1"), name::Component("d1"));
+  BOOST_CHECK_EQUAL (e.size (), 4);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,c0,c1,*,e0");
+
+  e.excludeRange (name::Component("a1"), name::Component("d1"));
+  BOOST_CHECK_EQUAL (e.size (), 2);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,e0");
+
+  e.excludeBefore (name::Component("e2"));
+  BOOST_CHECK_EQUAL (e.size (), 2);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,e2");
+
+  e.excludeAfter (name::Component("f0"));
+  BOOST_CHECK_EQUAL (e.size (), 3);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,e2,f0,*");
+
+  e.excludeAfter (name::Component("e5"));
+  BOOST_CHECK_EQUAL (e.size (), 3);
+  BOOST_CHECK_EQUAL (e.toUri(), "*,e2,e5,*");
+
+  e.excludeAfter (name::Component("b2"));
+  BOOST_CHECK_EQUAL (e.size (), 1);
+  BOOST_CHECK_EQUAL (e.toUri(), "*");
+
+  BOOST_REQUIRE_THROW (e.excludeRange (name::Component("d0"), name::Component("a0")), Exclude::Error);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace ndn