ValueBaseTest.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "ValueBase.h"
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cppunit/extensions/HelperMacros.h>
  5. #include "Exception.h"
  6. #include "util.h"
  7. namespace aria2 {
  8. class ValueBaseTest:public CppUnit::TestFixture {
  9. CPPUNIT_TEST_SUITE(ValueBaseTest);
  10. CPPUNIT_TEST(testString);
  11. CPPUNIT_TEST(testDict);
  12. CPPUNIT_TEST(testDictIter);
  13. CPPUNIT_TEST(testList);
  14. CPPUNIT_TEST(testListIter);
  15. CPPUNIT_TEST(testDowncast);
  16. CPPUNIT_TEST_SUITE_END();
  17. public:
  18. void setUp() {}
  19. void tearDown() {}
  20. void testString();
  21. void testDict();
  22. void testDictIter();
  23. void testList();
  24. void testListIter();
  25. void testDowncast();
  26. };
  27. CPPUNIT_TEST_SUITE_REGISTRATION(ValueBaseTest);
  28. void ValueBaseTest::testString()
  29. {
  30. String s(std::string("aria2"));
  31. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), s.s());
  32. unsigned char dataWithNull[] = { 0xf0, '\0', 0x0f };
  33. String sWithNull(dataWithNull, sizeof(dataWithNull));
  34. CPPUNIT_ASSERT(memcmp(dataWithNull, sWithNull.s().c_str(),
  35. sizeof(dataWithNull)) == 0);
  36. String zero("");
  37. CPPUNIT_ASSERT_EQUAL(std::string(""), zero.s());
  38. String z;
  39. CPPUNIT_ASSERT_EQUAL(std::string(""), z.s());
  40. const unsigned char uc[] = { 0x08, 0x19, 0x2a, 0x3b };
  41. String data(uc, sizeof(uc));
  42. CPPUNIT_ASSERT_EQUAL(util::toHex(uc, sizeof(uc)),
  43. util::toHex(data.uc(), data.s().size()));
  44. }
  45. void ValueBaseTest::testDowncast()
  46. {
  47. Integer integer(100);
  48. const Integer* x = downcast<Integer>(&integer);
  49. CPPUNIT_ASSERT(x);
  50. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(100), x->i());
  51. CPPUNIT_ASSERT(!downcast<String>(&integer));
  52. SharedHandle<Integer> si(new Integer(101));
  53. const Integer* x2 = downcast<Integer>(si);
  54. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(101), x2->i());
  55. String str("foo");
  56. const String* x3 = downcast<String>(&str);
  57. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("foo"), x3->s());
  58. List list;
  59. const List* x4 = downcast<List>(&list);
  60. CPPUNIT_ASSERT(x4);
  61. Dict dict;
  62. const Dict* x5 = downcast<Dict>(&dict);
  63. CPPUNIT_ASSERT(x5);
  64. }
  65. void ValueBaseTest::testDict()
  66. {
  67. Dict dict;
  68. CPPUNIT_ASSERT(dict.empty());
  69. dict["ki"] = Integer::g(7);
  70. dict["ks"] = String::g("abc");
  71. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
  72. CPPUNIT_ASSERT(dict.containsKey("ki"));
  73. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  74. downcast<Integer>(dict["ki"])->i());
  75. CPPUNIT_ASSERT(dict.containsKey("ks"));
  76. CPPUNIT_ASSERT_EQUAL(std::string("abc"),
  77. downcast<String>(dict["ks"])->s());
  78. CPPUNIT_ASSERT(!dict["kn"]); // This adds kn key with default value.
  79. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), dict.size());
  80. CPPUNIT_ASSERT(dict.containsKey("kn"));
  81. const Dict& ref = dict;
  82. ref["kn2"]; // This doesn't add kn2 key.
  83. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), ref.size());
  84. CPPUNIT_ASSERT(!ref.containsKey("kn2"));
  85. dict.removeKey("kn");
  86. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
  87. CPPUNIT_ASSERT(!dict.containsKey("kn"));
  88. }
  89. void ValueBaseTest::testDictIter()
  90. {
  91. Dict dict;
  92. dict["alpha2"] = String::g("alpha2");
  93. dict["charlie"] = String::g("charlie");
  94. dict["bravo"] = String::g("bravo");
  95. dict["alpha"] = String::g("alpha");
  96. Dict::ValueType::iterator i = dict.begin();
  97. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*i++).first);
  98. CPPUNIT_ASSERT_EQUAL(std::string("alpha2"), (*i++).first);
  99. CPPUNIT_ASSERT_EQUAL(std::string("bravo"), (*i++).first);
  100. CPPUNIT_ASSERT_EQUAL(std::string("charlie"), (*i++).first);
  101. CPPUNIT_ASSERT(dict.end() == i);
  102. const Dict& ref = dict;
  103. Dict::ValueType::const_iterator ci = ref.begin();
  104. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*ci++).first);
  105. std::advance(ci, 3);
  106. CPPUNIT_ASSERT(ref.end() == ci);
  107. }
  108. void ValueBaseTest::testList()
  109. {
  110. List list;
  111. CPPUNIT_ASSERT(list.empty());
  112. list << Integer::g(7) << String::g("aria2");
  113. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), list.size());
  114. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  115. downcast<Integer>(list[0])->i());
  116. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
  117. downcast<String>(list[1])->s());
  118. const List& ref = list;
  119. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  120. downcast<Integer>(ref[0])->i());
  121. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
  122. downcast<String>(ref[1])->s());
  123. }
  124. void ValueBaseTest::testListIter()
  125. {
  126. List list;
  127. list << String::g("alpha2")
  128. << String::g("charlie")
  129. << String::g("bravo")
  130. << String::g("alpha");
  131. List::ValueType::iterator i = list.begin();
  132. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
  133. downcast<String>(*i++)->s());
  134. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("charlie"),
  135. downcast<String>(*i++)->s());
  136. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("bravo"),
  137. downcast<String>(*i++)->s());
  138. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha"),
  139. downcast<String>(*i++)->s());
  140. CPPUNIT_ASSERT(list.end() == i);
  141. const List& ref = list;
  142. List::ValueType::const_iterator ci = ref.begin();
  143. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
  144. downcast<String>(*ci++)->s());
  145. std::advance(ci, 3);
  146. CPPUNIT_ASSERT(ref.end() == ci);
  147. }
  148. } // namespace aria2