Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: mojo/public/cpp/bindings/tests/map_unittest.cc

Issue 2034273002: Mojo C++ bindings: introduce mojo::WTFMap for blink bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: removed the code of adding enum key support to WTF::HashMap; which turned out to be non-trivial; wi… Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/public/cpp/bindings/map.h" 5 #include "mojo/public/cpp/bindings/map.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <utility> 9 #include <utility>
10 10
11 #include "mojo/public/cpp/bindings/array.h" 11 #include "mojo/public/cpp/bindings/array.h"
12 #include "mojo/public/cpp/bindings/lib/bindings_internal.h"
13 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
14 #include "mojo/public/cpp/bindings/lib/serialization.h"
15 #include "mojo/public/cpp/bindings/lib/validate_params.h"
16 #include "mojo/public/cpp/bindings/string.h" 12 #include "mojo/public/cpp/bindings/string.h"
17 #include "mojo/public/cpp/bindings/tests/container_test_util.h" 13 #include "mojo/public/cpp/bindings/tests/container_test_util.h"
14 #include "mojo/public/cpp/bindings/tests/map_common_test.h"
18 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
19 16
20 namespace mojo { 17 namespace mojo {
21 namespace test { 18 namespace test {
22 19
23 namespace { 20 namespace {
24 21
25 using mojo::internal::Array_Data;
26 using mojo::internal::ContainerValidateParams;
27 using mojo::internal::FixedBufferForTesting;
28 using mojo::internal::Map_Data;
29 using mojo::internal::String_Data;
30
31 struct StringIntData {
32 const char* string_data;
33 int int_data;
34 } kStringIntData[] = {
35 {"one", 1},
36 {"two", 2},
37 {"three", 3},
38 {"four", 4},
39 };
40
41 const size_t kStringIntDataSize = 4;
42
43 using MapTest = testing::Test; 22 using MapTest = testing::Test;
44 23
45 // Tests null and empty maps. 24 MAP_COMMON_TEST(Map, NullAndEmpty)
46 TEST_F(MapTest, NullAndEmpty) { 25 MAP_COMMON_TEST(Map, InsertWorks)
47 Map<char, char> map0; 26 MAP_COMMON_TEST(Map, TestIndexOperator)
48 EXPECT_TRUE(map0.empty()); 27 MAP_COMMON_TEST(Map, TestIndexOperatorAsRValue)
49 EXPECT_FALSE(map0.is_null()); 28 MAP_COMMON_TEST(Map, TestIndexOperatorMoveOnly)
50 map0 = nullptr; 29 MAP_COMMON_TEST(Map, MapArrayClone)
51 EXPECT_TRUE(map0.is_null()); 30 MAP_COMMON_TEST(Map, ArrayOfMap)
52 EXPECT_FALSE(map0.empty());
53
54 Map<char, char> map1(nullptr);
55 EXPECT_TRUE(map1.is_null());
56 EXPECT_FALSE(map1.empty());
57 map1.SetToEmpty();
58 EXPECT_TRUE(map1.empty());
59 EXPECT_FALSE(map1.is_null());
60 }
61
62 // Tests that basic Map operations work.
63 TEST_F(MapTest, InsertWorks) {
64 Map<String, int> map;
65 for (size_t i = 0; i < kStringIntDataSize; ++i)
66 map.insert(kStringIntData[i].string_data, kStringIntData[i].int_data);
67
68 for (size_t i = 0; i < kStringIntDataSize; ++i) {
69 EXPECT_EQ(kStringIntData[i].int_data,
70 map.at(kStringIntData[i].string_data));
71 }
72 }
73
74 TEST_F(MapTest, TestIndexOperator) {
75 Map<String, int> map;
76 for (size_t i = 0; i < kStringIntDataSize; ++i)
77 map[kStringIntData[i].string_data] = kStringIntData[i].int_data;
78
79 for (size_t i = 0; i < kStringIntDataSize; ++i) {
80 EXPECT_EQ(kStringIntData[i].int_data,
81 map.at(kStringIntData[i].string_data));
82 }
83 }
84
85 TEST_F(MapTest, TestIndexOperatorAsRValue) {
86 Map<String, int> map;
87 for (size_t i = 0; i < kStringIntDataSize; ++i)
88 map.insert(kStringIntData[i].string_data, kStringIntData[i].int_data);
89
90 for (size_t i = 0; i < kStringIntDataSize; ++i) {
91 EXPECT_EQ(kStringIntData[i].int_data, map[kStringIntData[i].string_data]);
92 }
93 }
94
95 TEST_F(MapTest, TestIndexOperatorMoveOnly) {
96 ASSERT_EQ(0u, MoveOnlyType::num_instances());
97 mojo::Map<mojo::String, mojo::Array<int32_t>> map;
98 std::vector<MoveOnlyType*> value_ptrs;
99
100 for (size_t i = 0; i < kStringIntDataSize; ++i) {
101 const char* key = kStringIntData[i].string_data;
102 Array<int32_t> array(1);
103 array[0] = kStringIntData[i].int_data;
104 map[key] = std::move(array);
105 EXPECT_TRUE(map);
106 }
107
108 // We now read back that data, to test the behavior of operator[].
109 for (size_t i = 0; i < kStringIntDataSize; ++i) {
110 auto it = map.find(kStringIntData[i].string_data);
111 ASSERT_TRUE(it != map.end());
112 ASSERT_EQ(1u, it->second.size());
113 EXPECT_EQ(kStringIntData[i].int_data, it->second[0]);
114 }
115 }
116 31
117 TEST_F(MapTest, ConstructedFromArray) { 32 TEST_F(MapTest, ConstructedFromArray) {
118 Array<String> keys(kStringIntDataSize); 33 Array<String> keys(kStringIntDataSize);
119 Array<int> values(kStringIntDataSize); 34 Array<int> values(kStringIntDataSize);
120 for (size_t i = 0; i < kStringIntDataSize; ++i) { 35 for (size_t i = 0; i < kStringIntDataSize; ++i) {
121 keys[i] = kStringIntData[i].string_data; 36 keys[i] = kStringIntData[i].string_data;
122 values[i] = kStringIntData[i].int_data; 37 values[i] = kStringIntData[i].int_data;
123 } 38 }
124 39
125 Map<String, int> map(std::move(keys), std::move(values)); 40 Map<String, int> map(std::move(keys), std::move(values));
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 180
266 std::map<std::string, int> stl_map = 181 std::map<std::string, int> stl_map =
267 mojo_map.To<std::map<std::string, int>>(); 182 mojo_map.To<std::map<std::string, int>>();
268 for (size_t i = 0; i < kStringIntDataSize; ++i) { 183 for (size_t i = 0; i < kStringIntDataSize; ++i) {
269 auto it = stl_map.find(kStringIntData[i].string_data); 184 auto it = stl_map.find(kStringIntData[i].string_data);
270 ASSERT_TRUE(it != stl_map.end()); 185 ASSERT_TRUE(it != stl_map.end());
271 EXPECT_EQ(kStringIntData[i].int_data, it->second); 186 EXPECT_EQ(kStringIntData[i].int_data, it->second);
272 } 187 }
273 } 188 }
274 189
275 TEST_F(MapTest, MapArrayClone) {
276 Map<String, Array<String>> m;
277 for (size_t i = 0; i < kStringIntDataSize; ++i) {
278 Array<String> s;
279 s.push_back(kStringIntData[i].string_data);
280 m.insert(kStringIntData[i].string_data, std::move(s));
281 }
282
283 Map<String, Array<String>> m2 = m.Clone();
284
285 for (auto it = m2.begin(); it != m2.end(); ++it) {
286 ASSERT_EQ(1u, it->second.size());
287 EXPECT_EQ(it->first, it->second.at(0));
288 }
289 }
290
291 TEST_F(MapTest, ArrayOfMap) {
292 {
293 Array<Map<int32_t, int8_t>> array(1);
294 array[0].insert(1, 42);
295
296 mojo::internal::SerializationContext context;
297 size_t size =
298 mojo::internal::PrepareToSerialize<Array<Map<int32_t, int8_t>>>(
299 array, &context);
300 FixedBufferForTesting buf(size);
301 Array_Data<Map_Data<int32_t, int8_t>*>* data;
302 ContainerValidateParams validate_params(
303 0, false, new ContainerValidateParams(
304 new ContainerValidateParams(0, false, nullptr),
305 new ContainerValidateParams(0, false, nullptr)));
306 mojo::internal::Serialize<Array<Map<int32_t, int8_t>>>(
307 array, &buf, &data, &validate_params, &context);
308
309 Array<Map<int32_t, int8_t>> deserialized_array;
310 mojo::internal::Deserialize<Array<Map<int32_t, int8_t>>>(
311 data, &deserialized_array, &context);
312
313 ASSERT_EQ(1u, deserialized_array.size());
314 ASSERT_EQ(1u, deserialized_array[0].size());
315 ASSERT_EQ(42, deserialized_array[0].at(1));
316 }
317
318 {
319 Array<Map<String, Array<bool>>> array(1);
320 Array<bool> map_value(2);
321 map_value[0] = false;
322 map_value[1] = true;
323 array[0].insert("hello world", std::move(map_value));
324
325 mojo::internal::SerializationContext context;
326 size_t size =
327 mojo::internal::PrepareToSerialize<Array<Map<String, Array<bool>>>>(
328 array, &context);
329 FixedBufferForTesting buf(size);
330 Array_Data<Map_Data<String_Data*, Array_Data<bool>*>*>* data;
331 ContainerValidateParams validate_params(
332 0, false,
333 new ContainerValidateParams(
334 new ContainerValidateParams(
335 0, false, new ContainerValidateParams(0, false, nullptr)),
336 new ContainerValidateParams(
337 0, false, new ContainerValidateParams(0, false, nullptr))));
338 mojo::internal::Serialize<Array<Map<String, Array<bool>>>>(
339 array, &buf, &data, &validate_params, &context);
340
341 Array<Map<String, Array<bool>>> deserialized_array;
342 mojo::internal::Deserialize<Array<Map<String, Array<bool>>>>(
343 data, &deserialized_array, &context);
344
345 ASSERT_EQ(1u, deserialized_array.size());
346 ASSERT_EQ(1u, deserialized_array[0].size());
347 ASSERT_FALSE(deserialized_array[0].at("hello world")[0]);
348 ASSERT_TRUE(deserialized_array[0].at("hello world")[1]);
349 }
350 }
351
352 TEST_F(MapTest, MoveFromAndToSTLMap_Copyable) { 190 TEST_F(MapTest, MoveFromAndToSTLMap_Copyable) {
353 std::map<int32_t, CopyableType> map1; 191 std::map<int32_t, CopyableType> map1;
354 map1.insert(std::make_pair(123, CopyableType())); 192 map1.insert(std::make_pair(123, CopyableType()));
355 map1[123].ResetCopied(); 193 map1[123].ResetCopied();
356 194
357 Map<int32_t, CopyableType> mojo_map(std::move(map1)); 195 Map<int32_t, CopyableType> mojo_map(std::move(map1));
358 ASSERT_EQ(1u, mojo_map.size()); 196 ASSERT_EQ(1u, mojo_map.size());
359 ASSERT_NE(mojo_map.end(), mojo_map.find(123)); 197 ASSERT_NE(mojo_map.end(), mojo_map.find(123));
360 ASSERT_FALSE(mojo_map[123].copied()); 198 ASSERT_FALSE(mojo_map[123].copied());
361 199
(...skipping 18 matching lines...) Expand all
380 ASSERT_EQ(1u, map2.size()); 218 ASSERT_EQ(1u, map2.size());
381 ASSERT_NE(map2.end(), map2.find(123)); 219 ASSERT_NE(map2.end(), map2.find(123));
382 220
383 ASSERT_EQ(0u, mojo_map.size()); 221 ASSERT_EQ(0u, mojo_map.size());
384 ASSERT_TRUE(mojo_map.is_null()); 222 ASSERT_TRUE(mojo_map.is_null());
385 } 223 }
386 224
387 } // namespace 225 } // namespace
388 } // namespace test 226 } // namespace test
389 } // namespace mojo 227 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/tests/map_common_test.h ('k') | mojo/public/cpp/bindings/tests/wtf_map_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698