forked from cawka/ndn.cxx
diff --git a/test/name-tests.cc b/test/name-tests.cc
new file mode 100644
index 0000000..1431f79
--- /dev/null
+++ b/test/name-tests.cc
@@ -0,0 +1,162 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Alexander Afanasyev
+ *                     Zhenkai Zhu
+ *
+ * BSD license, See the LICENSE file for more information
+ *
+ * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include <sstream>
+#include "ndn-cpp/fields/name.h"
+#include "ndn-cpp/fields/name-component.h"
+#include "ndn-cpp/error.h"
+#include "ndn-cpp/wire/ccnb.h"
+
+#define BOOST_TEST_MAIN 1
+
+#include <boost/test/unit_test.hpp>
+
+using namespace ndn;
+using namespace std;
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE(NameTests)
+
+BOOST_AUTO_TEST_CASE (Component)
+{
+  name::Component x;
+  BOOST_CHECK_EQUAL (x.size (), 0);
+
+  x = name::Component ("test");
+  BOOST_CHECK_EQUAL (x.size (), 4);
+
+  x = name::Component ("%21test");
+  BOOST_CHECK_EQUAL (x.size (), 5);
+
+  BOOST_CHECK_EQUAL (x.toUri (), "!test");
+
+  x = name::Component ("%20test");
+  BOOST_CHECK_EQUAL (x.size (), 5);
+
+  BOOST_CHECK_EQUAL (x.toUri (), "%20test");
+}
+
+BOOST_AUTO_TEST_CASE (Basic)
+{
+  Name empty = Name ();
+  Name root = Name ("/");
+  BOOST_CHECK_EQUAL (empty, root);
+  BOOST_CHECK_EQUAL (empty, Name ("/"));
+  BOOST_CHECK_EQUAL (root.size(), 0);
+
+  empty.append ("hello");
+  empty.append ("world");
+  BOOST_CHECK_EQUAL (empty.size(), 2);
+  BOOST_CHECK_EQUAL (empty.toUri(), "/hello/world");
+  empty = empty + root;
+  BOOST_CHECK_EQUAL (empty.toUri(), "/hello/world");
+  BOOST_CHECK_EQUAL (empty.get (0).toUri (), "hello");
+  BOOST_CHECK_EQUAL (empty.getSubName(1, 1), Name("/world"));
+  Name name("/hello/world");
+  BOOST_CHECK_EQUAL (empty, name);
+  BOOST_CHECK_EQUAL (name, Name("/hello") + Name("/world"));
+
+  name.appendSeqNum (1);
+  name.appendSeqNum (255);
+  name.appendSeqNum (256);
+  name.appendSeqNum (1234567890);
+
+  BOOST_CHECK_EQUAL (name.toUri (), "/hello/world/%00%01/%00%FF/%00%01%00/%00I%96%02%D2");
+
+  BOOST_CHECK_EQUAL (name.get (5).toSeqNum (), 1234567890);
+  BOOST_CHECK_EQUAL (name.get (4).toSeqNum (), 256);
+  BOOST_CHECK_EQUAL (name.get (3).toSeqNum (), 255);
+  BOOST_CHECK_EQUAL (name.get (2).toSeqNum (), 1);
+
+  BOOST_CHECK_EQUAL (name.get (-1).toUri (), "%00I%96%02%D2");
+
+  BOOST_CHECK_EQUAL (Name ("/%00").get (0).toSeqNum (), 0);
+
+  const char tmp [] = {0, 1, 2, 3, 0x50};
+  BOOST_CHECK_EQUAL (Name ().append (tmp, sizeof(tmp)).toUri (), "/%00%01%02%03P");
+
+  string entree("entr\u00E9e");
+  BOOST_CHECK_EQUAL (Name ().append (entree.c_str(), entree.size()).toUri (), "/entr%C3%A9e");
+  Name entreeName("/entr%C3%A9e");
+  BOOST_CHECK_EQUAL_COLLECTIONS (entreeName.get(0).begin(), entreeName.get(0).end(), entree.begin(), entree.end() );
+
+  Name appendName ("/hello/you");
+  appendName.append (Name ("/hello/you/too"));
+  BOOST_CHECK_EQUAL (appendName.toUri (), "/hello/you/hello/you/too");
+
+  Name appendSelf ("/hello/you");
+  appendSelf.append (appendSelf);
+  BOOST_CHECK_EQUAL (appendSelf.toUri (), "/hello/you/hello/you");
+
+  Name withVersion ("/hello.txt/%FD%95-%25U1%DE%04/%00%01");
+  BOOST_REQUIRE_NO_THROW (withVersion.get (1).toVersion ());
+  BOOST_CHECK_EQUAL (withVersion.get (1).toVersion (), 1370203370106261);
+  
+  BOOST_CHECK_EQUAL (Name("/!").toUri(), "/%21");
+}
+
+BOOST_AUTO_TEST_CASE (Advanced)
+{
+  BOOST_REQUIRE_THROW (Name (""),       error::Name);
+  BOOST_REQUIRE_THROW (Name ("//"), error::Name);
+  BOOST_REQUIRE_THROW (Name ("ndn://"), error::Name);
+  BOOST_REQUIRE_THROW (Name ("bla"),    error::Name);
+  BOOST_REQUIRE_THROW (Name ("bla/"),   error::Name);
+  BOOST_REQUIRE_THROW (Name ("http:/test"), error::Name);
+
+  BOOST_CHECK_EQUAL (Name ("ndn:///").toUri (), "/");
+  BOOST_CHECK_EQUAL (Name ("ccnx:///").toUri (), "/");
+  BOOST_CHECK_EQUAL (Name ("/").toUri (), "/");
+  BOOST_CHECK_EQUAL (Name ("///").toUri (), "/");
+  BOOST_CHECK_EQUAL (Name ("////////////////////////////////////////////////").toUri (), "/");
+  BOOST_CHECK_EQUAL (Name ("ndn://bla:random@something-else:0000/actual/name").toUri (), "/actual/name");
+  BOOST_CHECK_EQUAL (Name ("/slash/").toUri (), "/slash");
+  
+  BOOST_CHECK_EQUAL (Name ().append (".", 1).toUri (), "/...");
+  BOOST_CHECK_EQUAL (Name ("/.").get(0).size(), 0);
+  BOOST_CHECK_EQUAL (Name ("/..").get(0).size(), 0);
+  BOOST_CHECK_EQUAL (Name ("/...").get(0).size(), 0);
+  BOOST_CHECK_EQUAL (Name ("/....").get(0).size(), 1);
+  
+  BOOST_CHECK_EQUAL (Name ().append ("", 0).toUri (), "/...");
+  const char tmp [] = {'.'};
+  BOOST_CHECK_EQUAL (Name ().append (tmp, sizeof(tmp)).toUri (), "/....");
+}
+
+BOOST_AUTO_TEST_CASE (Ordering)
+{
+  // check "canonical" ordering
+  BOOST_CHECK_EQUAL (Name ("/test"), Name ("/test"));
+  BOOST_CHECK_GE (Name ("/test"), Name ("/aaaa"));
+  BOOST_CHECK_GT (Name ("/test"), Name ("/aaaa"));
+  BOOST_CHECK_GT (Name ("/test/test/test"), Name ("/test/test"));
+  BOOST_CHECK_GE (Name ("/test/test/test"), Name ("/test/test"));
+  BOOST_CHECK_GE (Name ("/test/test/test"), Name ("/test/test/test"));
+
+  BOOST_CHECK_LE (Name ("/test"), Name ("/aaaaa"));
+  BOOST_CHECK_LT (Name ("/test"), Name ("/aaaaa"));
+  BOOST_CHECK_LT (Name ("/test/test"), Name ("/test/test/test"));
+  BOOST_CHECK_LE (Name ("/test/test"), Name ("/test/test/test"));
+  BOOST_CHECK_LE (Name ("/test/test/test"), Name ("/test/test/test"));
+}
+
+BOOST_AUTO_TEST_CASE (Encoding)
+{
+  std::stringbuf buffer;
+  std::ostream output (&buffer);
+
+  Name root = Name ("/");
+  wire::Ccnb::appendName(output, root);
+  BOOST_CHECK_EQUAL (buffer.str().size(), 2);
+}
+
+BOOST_AUTO_TEST_SUITE_END()