data: do not encode a Content element if not set

Add Data::hasContent() and Data::unsetContent().
Change the behavior of Interest::setApplicationParameters(Block{}) for
consistency with the corresponding getter and with Data::setContent().

Change-Id: I4cc9058912510db0dfe3da614adee727db149415
diff --git a/tests/unit/metadata-object.t.cpp b/tests/unit/metadata-object.t.cpp
index 364600e..632e15f 100644
--- a/tests/unit/metadata-object.t.cpp
+++ b/tests/unit/metadata-object.t.cpp
@@ -85,23 +85,34 @@
 {
   Data data;
 
-  // invalid content type
-  data.setName(Name("/ndn/unit/test").append(metadataComponent));
-  data.setContentType(tlv::ContentType_Key);
-  BOOST_CHECK_THROW(MetadataObject metadata(data), tlv::Error);
-
   // invalid metadata name
   data.setName("/ndn/unit/test");
-  data.setContentType(tlv::ContentType_Blob);
-  BOOST_CHECK_THROW(MetadataObject metadata(data), tlv::Error);
+  BOOST_CHECK_EXCEPTION(MetadataObject{data}, tlv::Error, [] (const auto& e) {
+    return e.what() == "Name /ndn/unit/test is not a valid MetadataObject name"s;
+  });
+  data.setName(Name("/ndn/unit/test").append(metadataComponent));
+  BOOST_CHECK_EXCEPTION(MetadataObject{data}, tlv::Error, [] (const auto& e) {
+    return e.what() == "Name /ndn/unit/test/32=metadata is not a valid MetadataObject name"s;
+  });
+
+  // invalid content type
+  data.setName(Name("/ndn/unit/test").append(metadataComponent).appendVersion().appendSegment(0));
+  data.setContentType(tlv::ContentType_Key);
+  BOOST_CHECK_EXCEPTION(MetadataObject{data}, tlv::Error, [] (const auto& e) {
+    return e.what() == "MetadataObject has invalid ContentType 2"s;
+  });
 
   // empty content
-  data.setName(Name("ndn/unit/test").append(metadataComponent));
-  BOOST_CHECK_THROW(MetadataObject metadata(data), tlv::Error);
+  data.setContentType(tlv::ContentType_Blob);
+  BOOST_CHECK_EXCEPTION(MetadataObject{data}, tlv::Error, [] (const auto& e) {
+    return e.what() == "MetadataObject is empty"s;
+  });
 
   // non-empty content with no name element
   data.setContent("F000"_block);
-  BOOST_CHECK_THROW(MetadataObject metadata(data), tlv::Error);
+  BOOST_CHECK_EXCEPTION(MetadataObject{data}, tlv::Error, [] (const auto& e) {
+    return e.what() == "No sub-element of type 7 found in block of type 21"s;
+  });
 }
 
 BOOST_AUTO_TEST_CASE(IsValidName)