summaryrefslogtreecommitdiff
path: root/test/ValueBaseTest.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-06-18 14:47:09 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-06-18 14:47:09 +0000
commit8ba97188ce42be38b5427e9bd70bb7f5ba8238f9 (patch)
tree6cba1ad1496b6865c215881e7a0f21c009287912 /test/ValueBaseTest.cc
parent98dc02192d4b10eb6057a7d6a724b2e05a5767ef (diff)
2010-06-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Introduced ValueBase class, which is a replacement of BDE. In this change ValueBase is used instead of BDE except DHT messages, UTMetadata messages and XML-RPC. They'll be replaced in the later commits. DownloadContext::_attrs is now ContextAttribute rather than BDE. * src/ActivePeerConnectionCommand.cc * src/AnnounceList.cc * src/AnnounceList.h * src/BtDependency.cc * src/BtRegistry.cc * src/BtSetup.cc * src/ConsoleStatCalc.cc * src/ContextAttribute.h * src/DefaultBtAnnounce.cc * src/DefaultBtInteractive.cc * src/DownloadContext.cc * src/DownloadContext.h * src/HandshakeExtensionMessage.cc * src/InitiateConnectionCommand.cc * src/LpdReceiveMessageCommand.cc * src/MSEHandshake.cc * src/Makefile.am * src/Makefile.in * src/PeerInteractionCommand.cc * src/PeerListProcessor.h * src/ProtocolDetector.cc * src/RequestGroup.cc * src/RequestGroupMan.cc * src/TorrentAttribute.h * src/TrackerWatcherCommand.cc * src/UTMetadataDataExtensionMessage.cc * src/UTMetadataPostDownloadHandler.cc * src/UTMetadataRequestExtensionMessage.cc * src/ValueBase.cc * src/ValueBase.h * src/XmlRpcMethodImpl.cc * src/XmlRpcMethodImpl.h * src/bencode2.cc * src/bencode2.h * src/bittorrent_helper.cc * src/bittorrent_helper.h * src/download_helper.cc * src/magnet.cc * src/magnet.h * test/AnnounceListTest.cc * test/Bencode2Test.cc * test/BencodeTest.cc * test/BittorrentHelperTest.cc * test/BtDependencyTest.cc * test/BtRegistryTest.cc * test/DefaultBtAnnounceTest.cc * test/DefaultBtProgressInfoFileTest.cc * test/HandshakeExtensionMessageTest.cc * test/MSEHandshakeTest.cc * test/MagnetTest.cc * test/Makefile.am * test/Makefile.in * test/RequestGroupManTest.cc * test/UTMetadataDataExtensionMessageTest.cc * test/UTMetadataPostDownloadHandlerTest.cc * test/UTMetadataRequestExtensionMessageTest.cc * test/ValueBaseTest.cc * test/XmlRpcMethodTest.cc
Diffstat (limited to 'test/ValueBaseTest.cc')
-rw-r--r--test/ValueBaseTest.cc182
1 files changed, 182 insertions, 0 deletions
diff --git a/test/ValueBaseTest.cc b/test/ValueBaseTest.cc
new file mode 100644
index 00000000..c55ce69d
--- /dev/null
+++ b/test/ValueBaseTest.cc
@@ -0,0 +1,182 @@
+#include "ValueBase.h"
+
+#include <cstring>
+#include <iostream>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "Exception.h"
+#include "util.h"
+
+namespace aria2 {
+
+class ValueBaseTest:public CppUnit::TestFixture {
+
+ CPPUNIT_TEST_SUITE(ValueBaseTest);
+ CPPUNIT_TEST(testString);
+ CPPUNIT_TEST(testDict);
+ CPPUNIT_TEST(testDictIter);
+ CPPUNIT_TEST(testList);
+ CPPUNIT_TEST(testListIter);
+ CPPUNIT_TEST(testDowncast);
+ CPPUNIT_TEST_SUITE_END();
+public:
+ void setUp() {}
+
+ void tearDown() {}
+
+ void testString();
+ void testDict();
+ void testDictIter();
+ void testList();
+ void testListIter();
+ void testDowncast();
+};
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ValueBaseTest);
+
+void ValueBaseTest::testString()
+{
+ String s(std::string("aria2"));
+ CPPUNIT_ASSERT_EQUAL(std::string("aria2"), s.s());
+
+ unsigned char dataWithNull[] = { 0xf0, '\0', 0x0f };
+ String sWithNull(dataWithNull, sizeof(dataWithNull));
+ CPPUNIT_ASSERT(memcmp(dataWithNull, sWithNull.s().c_str(),
+ sizeof(dataWithNull)) == 0);
+
+ String zero("");
+ CPPUNIT_ASSERT_EQUAL(std::string(""), zero.s());
+
+ String z;
+ CPPUNIT_ASSERT_EQUAL(std::string(""), z.s());
+
+ const unsigned char uc[] = { 0x08, 0x19, 0x2a, 0x3b };
+ String data(uc, sizeof(uc));
+ CPPUNIT_ASSERT_EQUAL(util::toHex(uc, sizeof(uc)),
+ util::toHex(data.uc(), data.s().size()));
+}
+
+void ValueBaseTest::testDowncast()
+{
+ Integer integer(100);
+ const Integer* x = asInteger(&integer);
+ CPPUNIT_ASSERT(x);
+ CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(100), x->i());
+ SharedHandle<Integer> si(new Integer(101));
+ const Integer* x2 = asInteger(si);
+ CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(101), x2->i());
+
+ String str("foo");
+ const String* x3 = asString(&str);
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("foo"), x3->s());
+
+ List list;
+ const List* x4 = asList(&list);
+ CPPUNIT_ASSERT(x4);
+
+ Dict dict;
+ const Dict* x5 = asDict(&dict);
+ CPPUNIT_ASSERT(x5);
+}
+
+void ValueBaseTest::testDict()
+{
+ Dict dict;
+ CPPUNIT_ASSERT(dict.empty());
+
+ dict["ki"] = Integer::g(7);
+ dict["ks"] = String::g("abc");
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
+ CPPUNIT_ASSERT(dict.containsKey("ki"));
+ CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
+ asInteger(dict["ki"])->i());
+ CPPUNIT_ASSERT(dict.containsKey("ks"));
+ CPPUNIT_ASSERT_EQUAL(std::string("abc"),
+ asString(dict["ks"])->s());
+
+ CPPUNIT_ASSERT(dict["kn"].isNull()); // This adds kn key with default value.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), dict.size());
+ CPPUNIT_ASSERT(dict.containsKey("kn"));
+
+ const Dict& ref = dict;
+ ref["kn2"]; // This doesn't add kn2 key.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), ref.size());
+ CPPUNIT_ASSERT(!ref.containsKey("kn2"));
+
+ dict.removeKey("kn");
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
+ CPPUNIT_ASSERT(!dict.containsKey("kn"));
+}
+
+void ValueBaseTest::testDictIter()
+{
+ Dict dict;
+ dict["alpha2"] = String::g("alpha2");
+ dict["charlie"] = String::g("charlie");
+ dict["bravo"] = String::g("bravo");
+ dict["alpha"] = String::g("alpha");
+
+ Dict::ValueType::iterator i = dict.begin();
+ CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*i++).first);
+ CPPUNIT_ASSERT_EQUAL(std::string("alpha2"), (*i++).first);
+ CPPUNIT_ASSERT_EQUAL(std::string("bravo"), (*i++).first);
+ CPPUNIT_ASSERT_EQUAL(std::string("charlie"), (*i++).first);
+ CPPUNIT_ASSERT(dict.end() == i);
+
+ const Dict& ref = dict;
+ Dict::ValueType::const_iterator ci = ref.begin();
+ CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*ci++).first);
+ std::advance(ci, 3);
+ CPPUNIT_ASSERT(ref.end() == ci);
+}
+
+void ValueBaseTest::testList()
+{
+ List list;
+ CPPUNIT_ASSERT(list.empty());
+ list << Integer::g(7) << String::g("aria2");
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), list.size());
+ CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
+ asInteger(list[0])->i());
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
+ asString(list[1])->s());
+
+ const List& ref = list;
+ CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
+ asInteger(ref[0])->i());
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
+ asString(ref[1])->s());
+}
+
+void ValueBaseTest::testListIter()
+{
+ List list;
+ list << String::g("alpha2")
+ << String::g("charlie")
+ << String::g("bravo")
+ << String::g("alpha");
+
+ List::ValueType::iterator i = list.begin();
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
+ asString(*i++)->s());
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("charlie"),
+ asString(*i++)->s());
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("bravo"),
+ asString(*i++)->s());
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha"),
+ asString(*i++)->s());
+ CPPUNIT_ASSERT(list.end() == i);
+
+ const List& ref = list;
+ List::ValueType::const_iterator ci = ref.begin();
+ CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
+ asString(*ci++)->s());
+ std::advance(ci, 3);
+ CPPUNIT_ASSERT(ref.end() == ci);
+}
+
+} // namespace aria2