1 /* 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 // Borrowed from Chromium's src/base/stl_util_unittest.cc 12 #include "webrtc/system_wrappers/include/stl_util.h" 13 14 #include <set> 15 16 #include "testing/gtest/include/gtest/gtest.h" 17 18 namespace { 19 20 // Used as test case to ensure the various base::STLXxx functions don't require 21 // more than operators "<" and "==" on values stored in containers. 22 class ComparableValue { 23 public: 24 explicit ComparableValue(int value) : value_(value) {} 25 26 bool operator==(const ComparableValue& rhs) const { 27 return value_ == rhs.value_; 28 } 29 30 bool operator<(const ComparableValue& rhs) const { 31 return value_ < rhs.value_; 32 } 33 34 private: 35 int value_; 36 }; 37 38 } // namespace 39 40 namespace webrtc { 41 namespace { 42 43 TEST(STLUtilTest, STLIsSorted) { 44 { 45 std::set<int> set; 46 set.insert(24); 47 set.insert(1); 48 set.insert(12); 49 EXPECT_TRUE(STLIsSorted(set)); 50 } 51 52 { 53 std::set<ComparableValue> set; 54 set.insert(ComparableValue(24)); 55 set.insert(ComparableValue(1)); 56 set.insert(ComparableValue(12)); 57 EXPECT_TRUE(STLIsSorted(set)); 58 } 59 60 { 61 std::vector<int> vector; 62 vector.push_back(1); 63 vector.push_back(1); 64 vector.push_back(4); 65 vector.push_back(64); 66 vector.push_back(12432); 67 EXPECT_TRUE(STLIsSorted(vector)); 68 vector.back() = 1; 69 EXPECT_FALSE(STLIsSorted(vector)); 70 } 71 } 72 73 TEST(STLUtilTest, STLSetDifference) { 74 std::set<int> a1; 75 a1.insert(1); 76 a1.insert(2); 77 a1.insert(3); 78 a1.insert(4); 79 80 std::set<int> a2; 81 a2.insert(3); 82 a2.insert(4); 83 a2.insert(5); 84 a2.insert(6); 85 a2.insert(7); 86 87 { 88 std::set<int> difference; 89 difference.insert(1); 90 difference.insert(2); 91 EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a1, a2)); 92 } 93 94 { 95 std::set<int> difference; 96 difference.insert(5); 97 difference.insert(6); 98 difference.insert(7); 99 EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a2, a1)); 100 } 101 102 { 103 std::vector<int> difference; 104 difference.push_back(1); 105 difference.push_back(2); 106 EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a1, a2)); 107 } 108 109 { 110 std::vector<int> difference; 111 difference.push_back(5); 112 difference.push_back(6); 113 difference.push_back(7); 114 EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a2, a1)); 115 } 116 } 117 118 TEST(STLUtilTest, STLSetUnion) { 119 std::set<int> a1; 120 a1.insert(1); 121 a1.insert(2); 122 a1.insert(3); 123 a1.insert(4); 124 125 std::set<int> a2; 126 a2.insert(3); 127 a2.insert(4); 128 a2.insert(5); 129 a2.insert(6); 130 a2.insert(7); 131 132 { 133 std::set<int> result; 134 result.insert(1); 135 result.insert(2); 136 result.insert(3); 137 result.insert(4); 138 result.insert(5); 139 result.insert(6); 140 result.insert(7); 141 EXPECT_EQ(result, STLSetUnion<std::set<int> >(a1, a2)); 142 } 143 144 { 145 std::set<int> result; 146 result.insert(1); 147 result.insert(2); 148 result.insert(3); 149 result.insert(4); 150 result.insert(5); 151 result.insert(6); 152 result.insert(7); 153 EXPECT_EQ(result, STLSetUnion<std::set<int> >(a2, a1)); 154 } 155 156 { 157 std::vector<int> result; 158 result.push_back(1); 159 result.push_back(2); 160 result.push_back(3); 161 result.push_back(4); 162 result.push_back(5); 163 result.push_back(6); 164 result.push_back(7); 165 EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a1, a2)); 166 } 167 168 { 169 std::vector<int> result; 170 result.push_back(1); 171 result.push_back(2); 172 result.push_back(3); 173 result.push_back(4); 174 result.push_back(5); 175 result.push_back(6); 176 result.push_back(7); 177 EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a2, a1)); 178 } 179 } 180 181 TEST(STLUtilTest, STLSetIntersection) { 182 std::set<int> a1; 183 a1.insert(1); 184 a1.insert(2); 185 a1.insert(3); 186 a1.insert(4); 187 188 std::set<int> a2; 189 a2.insert(3); 190 a2.insert(4); 191 a2.insert(5); 192 a2.insert(6); 193 a2.insert(7); 194 195 { 196 std::set<int> result; 197 result.insert(3); 198 result.insert(4); 199 EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a1, a2)); 200 } 201 202 { 203 std::set<int> result; 204 result.insert(3); 205 result.insert(4); 206 EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a2, a1)); 207 } 208 209 { 210 std::vector<int> result; 211 result.push_back(3); 212 result.push_back(4); 213 EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a1, a2)); 214 } 215 216 { 217 std::vector<int> result; 218 result.push_back(3); 219 result.push_back(4); 220 EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a2, a1)); 221 } 222 } 223 224 TEST(STLUtilTest, STLIncludes) { 225 std::set<int> a1; 226 a1.insert(1); 227 a1.insert(2); 228 a1.insert(3); 229 a1.insert(4); 230 231 std::set<int> a2; 232 a2.insert(3); 233 a2.insert(4); 234 235 std::set<int> a3; 236 a3.insert(3); 237 a3.insert(4); 238 a3.insert(5); 239 240 EXPECT_TRUE(STLIncludes<std::set<int> >(a1, a2)); 241 EXPECT_FALSE(STLIncludes<std::set<int> >(a1, a3)); 242 EXPECT_FALSE(STLIncludes<std::set<int> >(a2, a1)); 243 EXPECT_FALSE(STLIncludes<std::set<int> >(a2, a3)); 244 EXPECT_FALSE(STLIncludes<std::set<int> >(a3, a1)); 245 EXPECT_TRUE(STLIncludes<std::set<int> >(a3, a2)); 246 } 247 248 } // namespace 249 } // namespace webrtc 250 251