diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-06-18 14:47:09 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-06-18 14:47:09 +0000 |
| commit | 8ba97188ce42be38b5427e9bd70bb7f5ba8238f9 (patch) | |
| tree | 6cba1ad1496b6865c215881e7a0f21c009287912 /test/ValueBaseTest.cc | |
| parent | 98dc02192d4b10eb6057a7d6a724b2e05a5767ef (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.cc | 182 |
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 |
