Index: mojo/public/cpp/bindings/tests/map_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/map_unittest.cc b/mojo/public/cpp/bindings/tests/map_unittest.cc |
index 5651eef71e391f831c9656ce903c662dcdd2a5f4..3df89d305ce9e0f6054eb588374d118993552aec 100644 |
--- a/mojo/public/cpp/bindings/tests/map_unittest.cc |
+++ b/mojo/public/cpp/bindings/tests/map_unittest.cc |
@@ -12,6 +12,7 @@ |
#include "mojo/public/cpp/bindings/string.h" |
#include "mojo/public/cpp/bindings/tests/container_test_util.h" |
#include "mojo/public/cpp/environment/environment.h" |
+#include "mojo/public/interfaces/bindings/tests/rect.mojom.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace mojo { |
@@ -24,6 +25,7 @@ using mojo::internal::ArrayValidateParams; |
using mojo::internal::FixedBufferForTesting; |
using mojo::internal::Map_Data; |
using mojo::internal::String_Data; |
+using mojo::internal::ValidationError; |
struct StringIntData { |
const char* string_data; |
@@ -256,7 +258,7 @@ TEST_F(MapTest, ArrayOfMap) { |
Array_Data<Map_Data<int32_t, int8_t>*>* data = nullptr; |
ArrayValidateParams validate_params( |
0, false, new ArrayValidateParams(0, false, nullptr)); |
- EXPECT_EQ(internal::ValidationError::NONE, |
+ EXPECT_EQ(ValidationError::NONE, |
SerializeArray_(&array, &buf, &data, &validate_params)); |
Array<Map<int32_t, int8_t>> deserialized_array; |
@@ -280,7 +282,7 @@ TEST_F(MapTest, ArrayOfMap) { |
ArrayValidateParams validate_params( |
0, false, new ArrayValidateParams( |
0, false, new ArrayValidateParams(0, false, nullptr))); |
- EXPECT_EQ(internal::ValidationError::NONE, |
+ EXPECT_EQ(ValidationError::NONE, |
SerializeArray_(&array, &buf, &data, &validate_params)); |
Array<Map<String, Array<bool>>> deserialized_array; |
@@ -377,6 +379,60 @@ TEST_F(MapTest, Serialization_MapWithScopedEnumVals) { |
} |
} |
+// Test serialization/deserialization of a map with null elements. |
+TEST_F(MapTest, Serialization_MapOfNullableStructs) { |
+ ArrayValidateParams validate_nullable(2, true, nullptr); |
+ ArrayValidateParams validate_non_nullable(2, false, nullptr); |
+ |
+ Map<uint32_t, RectPtr> map; |
+ map[0] = RectPtr(); |
+ map[1] = Rect::New(); |
+ map[1]->x = 1; |
+ map[1]->y = 2; |
+ map[1]->width = 3; |
+ map[1]->height = 4; |
+ EXPECT_TRUE(map[0].is_null()); |
+ EXPECT_TRUE(!map[1].is_null()); |
+ |
+ size_t size = GetSerializedSize_(map); |
+ EXPECT_EQ(8u + // map header |
+ (8u + 8u) + // pointers to keys and values array |
+ (8u + 2 * 4u) + // keys array data |
+ (8u + // values array data |
+ (8u) + // 1 null value |
+ (8u + 8U + 4 * 4U)), // 1 Rect value |
+ size); |
+ |
+ // 1. Should not be able to serialize null elements. |
+ { |
+ FixedBufferForTesting buf(size); |
+ Map_Data<int32_t, Rect::Data_*>* data = nullptr; |
+ EXPECT_EQ(ValidationError::UNEXPECTED_NULL_POINTER, |
+ SerializeMap_(&map, &buf, &data, &validate_non_nullable)); |
+ } |
+ |
+ // 2. Successfully serialize null elements. |
+ FixedBufferForTesting buf(size); |
+ Map_Data<int32_t, Rect::Data_*>* data = nullptr; |
+ EXPECT_EQ(ValidationError::NONE, |
+ SerializeMap_(&map, &buf, &data, &validate_nullable)); |
+ EXPECT_NE(nullptr, data); |
+ |
+ // 3. Deserialize deserialize null elements. |
+ Map<uint32_t, RectPtr> map2; |
+ EXPECT_EQ(0u, map2.size()); |
+ EXPECT_TRUE(map2.is_null()); |
+ Deserialize_(data, &map2); |
+ EXPECT_EQ(2u, map2.size()); |
+ EXPECT_FALSE(map2.is_null()); |
+ EXPECT_TRUE(map2[0].is_null()); |
+ EXPECT_FALSE(map2[1].is_null()); |
+ EXPECT_EQ(1, map2[1]->x); |
+ EXPECT_EQ(2, map2[1]->y); |
+ EXPECT_EQ(3, map2[1]->width); |
+ EXPECT_EQ(4, map2[1]->height); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace mojo |