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()