ValueBaseTest.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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 = asInteger(&integer);
  49. CPPUNIT_ASSERT(x);
  50. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(100), x->i());
  51. SharedHandle<Integer> si(new Integer(101));
  52. const Integer* x2 = asInteger(si);
  53. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(101), x2->i());
  54. String str("foo");
  55. const String* x3 = asString(&str);
  56. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("foo"), x3->s());
  57. List list;
  58. const List* x4 = asList(&list);
  59. CPPUNIT_ASSERT(x4);
  60. Dict dict;
  61. const Dict* x5 = asDict(&dict);
  62. CPPUNIT_ASSERT(x5);
  63. }
  64. void ValueBaseTest::testDict()
  65. {
  66. Dict dict;
  67. CPPUNIT_ASSERT(dict.empty());
  68. dict["ki"] = Integer::g(7);
  69. dict["ks"] = String::g("abc");
  70. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
  71. CPPUNIT_ASSERT(dict.containsKey("ki"));
  72. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  73. asInteger(dict["ki"])->i());
  74. CPPUNIT_ASSERT(dict.containsKey("ks"));
  75. CPPUNIT_ASSERT_EQUAL(std::string("abc"),
  76. asString(dict["ks"])->s());
  77. CPPUNIT_ASSERT(!dict["kn"]); // This adds kn key with default value.
  78. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), dict.size());
  79. CPPUNIT_ASSERT(dict.containsKey("kn"));
  80. const Dict& ref = dict;
  81. ref["kn2"]; // This doesn't add kn2 key.
  82. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), ref.size());
  83. CPPUNIT_ASSERT(!ref.containsKey("kn2"));
  84. dict.removeKey("kn");
  85. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), dict.size());
  86. CPPUNIT_ASSERT(!dict.containsKey("kn"));
  87. }
  88. void ValueBaseTest::testDictIter()
  89. {
  90. Dict dict;
  91. dict["alpha2"] = String::g("alpha2");
  92. dict["charlie"] = String::g("charlie");
  93. dict["bravo"] = String::g("bravo");
  94. dict["alpha"] = String::g("alpha");
  95. Dict::ValueType::iterator i = dict.begin();
  96. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*i++).first);
  97. CPPUNIT_ASSERT_EQUAL(std::string("alpha2"), (*i++).first);
  98. CPPUNIT_ASSERT_EQUAL(std::string("bravo"), (*i++).first);
  99. CPPUNIT_ASSERT_EQUAL(std::string("charlie"), (*i++).first);
  100. CPPUNIT_ASSERT(dict.end() == i);
  101. const Dict& ref = dict;
  102. Dict::ValueType::const_iterator ci = ref.begin();
  103. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), (*ci++).first);
  104. std::advance(ci, 3);
  105. CPPUNIT_ASSERT(ref.end() == ci);
  106. }
  107. void ValueBaseTest::testList()
  108. {
  109. List list;
  110. CPPUNIT_ASSERT(list.empty());
  111. list << Integer::g(7) << String::g("aria2");
  112. CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), list.size());
  113. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  114. asInteger(list[0])->i());
  115. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
  116. asString(list[1])->s());
  117. const List& ref = list;
  118. CPPUNIT_ASSERT_EQUAL(static_cast<Integer::ValueType>(7),
  119. asInteger(ref[0])->i());
  120. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("aria2"),
  121. asString(ref[1])->s());
  122. }
  123. void ValueBaseTest::testListIter()
  124. {
  125. List list;
  126. list << String::g("alpha2")
  127. << String::g("charlie")
  128. << String::g("bravo")
  129. << String::g("alpha");
  130. List::ValueType::iterator i = list.begin();
  131. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
  132. asString(*i++)->s());
  133. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("charlie"),
  134. asString(*i++)->s());
  135. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("bravo"),
  136. asString(*i++)->s());
  137. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha"),
  138. asString(*i++)->s());
  139. CPPUNIT_ASSERT(list.end() == i);
  140. const List& ref = list;
  141. List::ValueType::const_iterator ci = ref.begin();
  142. CPPUNIT_ASSERT_EQUAL(static_cast<String::ValueType>("alpha2"),
  143. asString(*ci++)->s());
  144. std::advance(ci, 3);
  145. CPPUNIT_ASSERT(ref.end() == ci);
  146. }
  147. } // namespace aria2