ValueBaseTest.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. std::shared_ptr<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.put("ki", Integer::g(7));
  70. dict.put("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 does not adds kn key
  79. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
  80. auto& ref = dict;
  81. ref["kn2"]; // This doesn't add kn2 key.
  82. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), ref.size());
  83. CPPUNIT_ASSERT(!ref.containsKey("kn2"));
  84. dict.removeKey("ks");
  85. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), dict.size());
  86. CPPUNIT_ASSERT(!dict.containsKey("ks"));
  87. auto ki = dict.popValue("ki");
  88. CPPUNIT_ASSERT_EQUAL(Integer::ValueType{7}, downcast<Integer>(ki)->i());
  89. CPPUNIT_ASSERT(dict.empty());
  90. CPPUNIT_ASSERT(!dict.containsKey("ki"));
  91. }
  92. void ValueBaseTest::testDictIter()
  93. {
  94. Dict dict;
  95. dict.put("alpha2", String::g("alpha2"));
  96. dict.put("charlie", String::g("charlie"));
  97. dict.put("bravo", String::g("bravo"));
  98. dict.put("alpha", String::g("alpha"));
  99. Dict::ValueType::iterator i = dict.begin();
  100. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*i++).first);
  101. CPPUNIT_ASSERT_EQUAL(std::string("alpha2"), (*i++).first);
  102. CPPUNIT_ASSERT_EQUAL(std::string("bravo"), (*i++).first);
  103. CPPUNIT_ASSERT_EQUAL(std::string("charlie"), (*i++).first);
  104. CPPUNIT_ASSERT(dict.end() == i);
  105. const Dict& ref = dict;
  106. Dict::ValueType::const_iterator ci = ref.begin();
  107. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*ci++).first);
  108. std::advance(ci, 3);
  109. CPPUNIT_ASSERT(ref.end() == ci);
  110. }
  111. void ValueBaseTest::testList()
  112. {
  113. List list;
  114. CPPUNIT_ASSERT(list.empty());
  115. list << Integer::g(7) << String::g("aria2");
  116. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), list.size());
  117. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  118. downcast<Integer>(list[0])->i());
  119. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
  120. downcast<String>(list[1])->s());
  121. const List& ref = list;
  122. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  123. downcast<Integer>(ref[0])->i());
  124. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
  125. downcast<String>(ref[1])->s());
  126. }
  127. void ValueBaseTest::testListIter()
  128. {
  129. List list;
  130. list << String::g("alpha2")
  131. << String::g("charlie")
  132. << String::g("bravo")
  133. << String::g("alpha");
  134. List::ValueType::iterator i = list.begin();
  135. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
  136. downcast<String>(*i++)->s());
  137. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("charlie"),
  138. downcast<String>(*i++)->s());
  139. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("bravo"),
  140. downcast<String>(*i++)->s());
  141. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha"),
  142. downcast<String>(*i++)->s());
  143. CPPUNIT_ASSERT(list.end() == i);
  144. const List& ref = list;
  145. List::ValueType::const_iterator ci = ref.begin();
  146. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
  147. downcast<String>(*ci++)->s());
  148. std::advance(ci, 3);
  149. CPPUNIT_ASSERT(ref.end() == ci);
  150. }
  151. } // namespace aria2