stl_util_unittest.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. // Copyright 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "butil/stl_util.h"
  5. #include <set>
  6. #include <gtest/gtest.h>
  7. namespace {
  8. // Used as test case to ensure the various butil::STLXxx functions don't require
  9. // more than operators "<" and "==" on values stored in containers.
  10. class ComparableValue {
  11. public:
  12. explicit ComparableValue(int value) : value_(value) {}
  13. bool operator==(const ComparableValue& rhs) const {
  14. return value_ == rhs.value_;
  15. }
  16. bool operator<(const ComparableValue& rhs) const {
  17. return value_ < rhs.value_;
  18. }
  19. private:
  20. int value_;
  21. };
  22. }
  23. namespace butil {
  24. namespace {
  25. TEST(STLUtilTest, STLIsSorted) {
  26. {
  27. std::set<int> set;
  28. set.insert(24);
  29. set.insert(1);
  30. set.insert(12);
  31. EXPECT_TRUE(STLIsSorted(set));
  32. }
  33. {
  34. std::set<ComparableValue> set;
  35. set.insert(ComparableValue(24));
  36. set.insert(ComparableValue(1));
  37. set.insert(ComparableValue(12));
  38. EXPECT_TRUE(STLIsSorted(set));
  39. }
  40. {
  41. std::vector<int> vector;
  42. vector.push_back(1);
  43. vector.push_back(1);
  44. vector.push_back(4);
  45. vector.push_back(64);
  46. vector.push_back(12432);
  47. EXPECT_TRUE(STLIsSorted(vector));
  48. vector.back() = 1;
  49. EXPECT_FALSE(STLIsSorted(vector));
  50. }
  51. }
  52. TEST(STLUtilTest, STLSetDifference) {
  53. std::set<int> a1;
  54. a1.insert(1);
  55. a1.insert(2);
  56. a1.insert(3);
  57. a1.insert(4);
  58. std::set<int> a2;
  59. a2.insert(3);
  60. a2.insert(4);
  61. a2.insert(5);
  62. a2.insert(6);
  63. a2.insert(7);
  64. {
  65. std::set<int> difference;
  66. difference.insert(1);
  67. difference.insert(2);
  68. EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a1, a2));
  69. }
  70. {
  71. std::set<int> difference;
  72. difference.insert(5);
  73. difference.insert(6);
  74. difference.insert(7);
  75. EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a2, a1));
  76. }
  77. {
  78. std::vector<int> difference;
  79. difference.push_back(1);
  80. difference.push_back(2);
  81. EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a1, a2));
  82. }
  83. {
  84. std::vector<int> difference;
  85. difference.push_back(5);
  86. difference.push_back(6);
  87. difference.push_back(7);
  88. EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a2, a1));
  89. }
  90. }
  91. TEST(STLUtilTest, STLSetUnion) {
  92. std::set<int> a1;
  93. a1.insert(1);
  94. a1.insert(2);
  95. a1.insert(3);
  96. a1.insert(4);
  97. std::set<int> a2;
  98. a2.insert(3);
  99. a2.insert(4);
  100. a2.insert(5);
  101. a2.insert(6);
  102. a2.insert(7);
  103. {
  104. std::set<int> result;
  105. result.insert(1);
  106. result.insert(2);
  107. result.insert(3);
  108. result.insert(4);
  109. result.insert(5);
  110. result.insert(6);
  111. result.insert(7);
  112. EXPECT_EQ(result, STLSetUnion<std::set<int> >(a1, a2));
  113. }
  114. {
  115. std::set<int> result;
  116. result.insert(1);
  117. result.insert(2);
  118. result.insert(3);
  119. result.insert(4);
  120. result.insert(5);
  121. result.insert(6);
  122. result.insert(7);
  123. EXPECT_EQ(result, STLSetUnion<std::set<int> >(a2, a1));
  124. }
  125. {
  126. std::vector<int> result;
  127. result.push_back(1);
  128. result.push_back(2);
  129. result.push_back(3);
  130. result.push_back(4);
  131. result.push_back(5);
  132. result.push_back(6);
  133. result.push_back(7);
  134. EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a1, a2));
  135. }
  136. {
  137. std::vector<int> result;
  138. result.push_back(1);
  139. result.push_back(2);
  140. result.push_back(3);
  141. result.push_back(4);
  142. result.push_back(5);
  143. result.push_back(6);
  144. result.push_back(7);
  145. EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a2, a1));
  146. }
  147. }
  148. TEST(STLUtilTest, STLSetIntersection) {
  149. std::set<int> a1;
  150. a1.insert(1);
  151. a1.insert(2);
  152. a1.insert(3);
  153. a1.insert(4);
  154. std::set<int> a2;
  155. a2.insert(3);
  156. a2.insert(4);
  157. a2.insert(5);
  158. a2.insert(6);
  159. a2.insert(7);
  160. {
  161. std::set<int> result;
  162. result.insert(3);
  163. result.insert(4);
  164. EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a1, a2));
  165. }
  166. {
  167. std::set<int> result;
  168. result.insert(3);
  169. result.insert(4);
  170. EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a2, a1));
  171. }
  172. {
  173. std::vector<int> result;
  174. result.push_back(3);
  175. result.push_back(4);
  176. EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a1, a2));
  177. }
  178. {
  179. std::vector<int> result;
  180. result.push_back(3);
  181. result.push_back(4);
  182. EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a2, a1));
  183. }
  184. }
  185. TEST(STLUtilTest, STLIncludes) {
  186. std::set<int> a1;
  187. a1.insert(1);
  188. a1.insert(2);
  189. a1.insert(3);
  190. a1.insert(4);
  191. std::set<int> a2;
  192. a2.insert(3);
  193. a2.insert(4);
  194. std::set<int> a3;
  195. a3.insert(3);
  196. a3.insert(4);
  197. a3.insert(5);
  198. EXPECT_TRUE(STLIncludes<std::set<int> >(a1, a2));
  199. EXPECT_FALSE(STLIncludes<std::set<int> >(a1, a3));
  200. EXPECT_FALSE(STLIncludes<std::set<int> >(a2, a1));
  201. EXPECT_FALSE(STLIncludes<std::set<int> >(a2, a3));
  202. EXPECT_FALSE(STLIncludes<std::set<int> >(a3, a1));
  203. EXPECT_TRUE(STLIncludes<std::set<int> >(a3, a2));
  204. }
  205. } // namespace
  206. } // namespace butil