summaryrefslogtreecommitdiffstats
path: root/mojo/public/cpp/bindings/tests/array_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/public/cpp/bindings/tests/array_unittest.cc')
-rw-r--r--mojo/public/cpp/bindings/tests/array_unittest.cc393
1 files changed, 18 insertions, 375 deletions
diff --git a/mojo/public/cpp/bindings/tests/array_unittest.cc b/mojo/public/cpp/bindings/tests/array_unittest.cc
index f4dad7c..0700bb1 100644
--- a/mojo/public/cpp/bindings/tests/array_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/array_unittest.cc
@@ -4,391 +4,34 @@
#include "mojo/public/cpp/bindings/array.h"
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
+#include "mojo/public/cpp/bindings/tests/array_common_test.h"
#include "mojo/public/cpp/bindings/tests/container_test_util.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
namespace test {
namespace {
-using mojo::internal::Array_Data;
-using mojo::internal::ArrayValidateParams;
-using mojo::internal::FixedBufferForTesting;
-using mojo::internal::String_Data;
-
using ArrayTest = testing::Test;
-// Tests null and empty arrays.
-TEST_F(ArrayTest, NullAndEmpty) {
- Array<char> array0;
- EXPECT_TRUE(array0.empty());
- EXPECT_FALSE(array0.is_null());
- array0 = nullptr;
- EXPECT_TRUE(array0.is_null());
- EXPECT_FALSE(array0.empty());
-
- Array<char> array1(nullptr);
- EXPECT_TRUE(array1.is_null());
- EXPECT_FALSE(array1.empty());
- array1.SetToEmpty();
- EXPECT_TRUE(array1.empty());
- EXPECT_FALSE(array1.is_null());
-}
-
-// Tests that basic Array operations work.
-TEST_F(ArrayTest, Basic) {
- Array<char> array(8);
- for (size_t i = 0; i < array.size(); ++i) {
- char val = static_cast<char>(i * 2);
- array[i] = val;
- EXPECT_EQ(val, array.at(i));
- }
-}
-
-// Tests that basic Array<bool> operations work.
-TEST_F(ArrayTest, Bool) {
- Array<bool> array(64);
- for (size_t i = 0; i < array.size(); ++i) {
- bool val = i % 3 == 0;
- array[i] = val;
- EXPECT_EQ(val, array.at(i));
- }
-}
-
-// Tests that Array<ScopedMessagePipeHandle> supports transferring handles.
-TEST_F(ArrayTest, Handle) {
- MessagePipe pipe;
- Array<ScopedMessagePipeHandle> handles(2);
- handles[0] = std::move(pipe.handle0);
- handles[1].reset(pipe.handle1.release());
-
- EXPECT_FALSE(pipe.handle0.is_valid());
- EXPECT_FALSE(pipe.handle1.is_valid());
-
- Array<ScopedMessagePipeHandle> handles2 = std::move(handles);
- EXPECT_TRUE(handles2[0].is_valid());
- EXPECT_TRUE(handles2[1].is_valid());
-
- ScopedMessagePipeHandle pipe_handle = std::move(handles2[0]);
- EXPECT_TRUE(pipe_handle.is_valid());
- EXPECT_FALSE(handles2[0].is_valid());
-}
-
-// Tests that Array<ScopedMessagePipeHandle> supports closing handles.
-TEST_F(ArrayTest, HandlesAreClosed) {
- MessagePipe pipe;
- MojoHandle pipe0_value = pipe.handle0.get().value();
- MojoHandle pipe1_value = pipe.handle0.get().value();
-
- {
- Array<ScopedMessagePipeHandle> handles(2);
- handles[0] = std::move(pipe.handle0);
- handles[1].reset(pipe.handle0.release());
- }
-
- // We expect the pipes to have been closed.
- EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value));
- EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value));
-}
-
-TEST_F(ArrayTest, Clone) {
- {
- // Test POD.
- Array<int32_t> array(3);
- for (size_t i = 0; i < array.size(); ++i)
- array[i] = static_cast<int32_t>(i);
-
- Array<int32_t> clone_array = array.Clone();
- EXPECT_EQ(array.size(), clone_array.size());
- for (size_t i = 0; i < array.size(); ++i)
- EXPECT_EQ(array[i], clone_array[i]);
- }
-
- {
- // Test copyable object.
- Array<String> array(2);
- array[0] = "hello";
- array[1] = "world";
-
- Array<String> clone_array = array.Clone();
- EXPECT_EQ(array.size(), clone_array.size());
- for (size_t i = 0; i < array.size(); ++i)
- EXPECT_EQ(array[i], clone_array[i]);
- }
-
- {
- // Test struct.
- Array<RectPtr> array(2);
- array[1] = Rect::New();
- array[1]->x = 1;
- array[1]->y = 2;
- array[1]->width = 3;
- array[1]->height = 4;
-
- Array<RectPtr> clone_array = array.Clone();
- EXPECT_EQ(array.size(), clone_array.size());
- EXPECT_TRUE(clone_array[0].is_null());
- EXPECT_EQ(array[1]->x, clone_array[1]->x);
- EXPECT_EQ(array[1]->y, clone_array[1]->y);
- EXPECT_EQ(array[1]->width, clone_array[1]->width);
- EXPECT_EQ(array[1]->height, clone_array[1]->height);
- }
-
- {
- // Test array of array.
- Array<Array<int8_t>> array(2);
- array[0] = nullptr;
- array[1] = Array<int8_t>(2);
- array[1][0] = 0;
- array[1][1] = 1;
-
- Array<Array<int8_t>> clone_array = array.Clone();
- EXPECT_EQ(array.size(), clone_array.size());
- EXPECT_TRUE(clone_array[0].is_null());
- EXPECT_EQ(array[1].size(), clone_array[1].size());
- EXPECT_EQ(array[1][0], clone_array[1][0]);
- EXPECT_EQ(array[1][1], clone_array[1][1]);
- }
-
- {
- // Test that array of handles still works although Clone() is not available.
- Array<ScopedMessagePipeHandle> array(10);
- EXPECT_FALSE(array[0].is_valid());
- }
-}
-
-TEST_F(ArrayTest, Serialization_ArrayOfPOD) {
- Array<int32_t> array(4);
- for (size_t i = 0; i < array.size(); ++i)
- array[i] = static_cast<int32_t>(i);
-
- size_t size = GetSerializedSize_(array, nullptr);
- EXPECT_EQ(8U + 4 * 4U, size);
-
- FixedBufferForTesting buf(size);
- Array_Data<int32_t>* data;
- ArrayValidateParams validate_params(0, false, nullptr);
- SerializeArray_(std::move(array), &buf, &data, &validate_params, nullptr);
-
- Array<int32_t> array2;
- Deserialize_(data, &array2, nullptr);
-
- EXPECT_EQ(4U, array2.size());
- for (size_t i = 0; i < array2.size(); ++i)
- EXPECT_EQ(static_cast<int32_t>(i), array2[i]);
-}
-
-TEST_F(ArrayTest, Serialization_EmptyArrayOfPOD) {
- Array<int32_t> array;
- size_t size = GetSerializedSize_(array, nullptr);
- EXPECT_EQ(8U, size);
-
- FixedBufferForTesting buf(size);
- Array_Data<int32_t>* data;
- ArrayValidateParams validate_params(0, false, nullptr);
- SerializeArray_(std::move(array), &buf, &data, &validate_params, nullptr);
-
- Array<int32_t> array2;
- Deserialize_(data, &array2, nullptr);
- EXPECT_EQ(0U, array2.size());
-}
-
-TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) {
- Array<Array<int32_t>> array(2);
- for (size_t j = 0; j < array.size(); ++j) {
- Array<int32_t> inner(4);
- for (size_t i = 0; i < inner.size(); ++i)
- inner[i] = static_cast<int32_t>(i + (j * 10));
- array[j] = std::move(inner);
- }
-
- size_t size = GetSerializedSize_(array, nullptr);
- EXPECT_EQ(8U + 2 * 8U + 2 * (8U + 4 * 4U), size);
-
- FixedBufferForTesting buf(size);
- Array_Data<Array_Data<int32_t>*>* data;
- ArrayValidateParams validate_params(
- 0, false, new ArrayValidateParams(0, false, nullptr));
- SerializeArray_(std::move(array), &buf, &data, &validate_params, nullptr);
-
- Array<Array<int32_t>> array2;
- Deserialize_(data, &array2, nullptr);
-
- EXPECT_EQ(2U, array2.size());
- for (size_t j = 0; j < array2.size(); ++j) {
- const Array<int32_t>& inner = array2[j];
- EXPECT_EQ(4U, inner.size());
- for (size_t i = 0; i < inner.size(); ++i)
- EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]);
- }
-}
-
-TEST_F(ArrayTest, Serialization_ArrayOfBool) {
- Array<bool> array(10);
- for (size_t i = 0; i < array.size(); ++i)
- array[i] = i % 2 ? true : false;
-
- size_t size = GetSerializedSize_(array, nullptr);
- EXPECT_EQ(8U + 8U, size);
-
- FixedBufferForTesting buf(size);
- Array_Data<bool>* data;
- ArrayValidateParams validate_params(0, false, nullptr);
- SerializeArray_(std::move(array), &buf, &data, &validate_params, nullptr);
-
- Array<bool> array2;
- Deserialize_(data, &array2, nullptr);
-
- EXPECT_EQ(10U, array2.size());
- for (size_t i = 0; i < array2.size(); ++i)
- EXPECT_EQ(i % 2 ? true : false, array2[i]);
-}
-
-TEST_F(ArrayTest, Serialization_ArrayOfString) {
- Array<String> array(10);
- for (size_t i = 0; i < array.size(); ++i) {
- char c = 'A' + static_cast<char>(i);
- array[i] = String(&c, 1);
- }
-
- size_t size = GetSerializedSize_(array, nullptr);
- EXPECT_EQ(8U + // array header
- 10 * 8U + // array payload (10 pointers)
- 10 * (8U + // string header
- 8U), // string length of 1 padded to 8
- size);
-
- FixedBufferForTesting buf(size);
- Array_Data<String_Data*>* data;
- ArrayValidateParams validate_params(
- 0, false, new ArrayValidateParams(0, false, nullptr));
- SerializeArray_(std::move(array), &buf, &data, &validate_params, nullptr);
-
- Array<String> array2;
- Deserialize_(data, &array2, nullptr);
-
- EXPECT_EQ(10U, array2.size());
- for (size_t i = 0; i < array2.size(); ++i) {
- char c = 'A' + static_cast<char>(i);
- EXPECT_EQ(String(&c, 1), array2[i]);
- }
-}
-
-TEST_F(ArrayTest, Resize_Copyable) {
- ASSERT_EQ(0u, CopyableType::num_instances());
- mojo::Array<CopyableType> array(3);
- std::vector<CopyableType*> value_ptrs;
- value_ptrs.push_back(array[0].ptr());
- value_ptrs.push_back(array[1].ptr());
-
- for (size_t i = 0; i < array.size(); i++)
- array[i].ResetCopied();
-
- array.resize(2);
- ASSERT_EQ(2u, array.size());
- EXPECT_EQ(array.size(), CopyableType::num_instances());
- for (size_t i = 0; i < array.size(); i++) {
- EXPECT_FALSE(array[i].copied());
- EXPECT_EQ(value_ptrs[i], array[i].ptr());
- }
-
- array.resize(3);
- array[2].ResetCopied();
- ASSERT_EQ(3u, array.size());
- EXPECT_EQ(array.size(), CopyableType::num_instances());
- for (size_t i = 0; i < array.size(); i++)
- EXPECT_FALSE(array[i].copied());
- value_ptrs.push_back(array[2].ptr());
-
- size_t capacity = array.storage().capacity();
- array.resize(capacity);
- ASSERT_EQ(capacity, array.size());
- EXPECT_EQ(array.size(), CopyableType::num_instances());
- for (size_t i = 0; i < 3; i++)
- EXPECT_FALSE(array[i].copied());
- for (size_t i = 3; i < array.size(); i++) {
- array[i].ResetCopied();
- value_ptrs.push_back(array[i].ptr());
- }
-
- array.resize(capacity + 2);
- ASSERT_EQ(capacity + 2, array.size());
- EXPECT_EQ(array.size(), CopyableType::num_instances());
- for (size_t i = 0; i < capacity; i++) {
- EXPECT_TRUE(array[i].copied());
- EXPECT_EQ(value_ptrs[i], array[i].ptr());
- }
- array = nullptr;
- EXPECT_EQ(0u, CopyableType::num_instances());
- EXPECT_FALSE(array);
- array.resize(0);
- EXPECT_EQ(0u, CopyableType::num_instances());
- EXPECT_TRUE(array);
-}
-
-TEST_F(ArrayTest, Resize_MoveOnly) {
- ASSERT_EQ(0u, MoveOnlyType::num_instances());
- mojo::Array<MoveOnlyType> array(3);
- std::vector<MoveOnlyType*> value_ptrs;
- value_ptrs.push_back(array[0].ptr());
- value_ptrs.push_back(array[1].ptr());
-
- for (size_t i = 0; i < array.size(); i++)
- EXPECT_FALSE(array[i].moved());
-
- array.resize(2);
- ASSERT_EQ(2u, array.size());
- EXPECT_EQ(array.size(), MoveOnlyType::num_instances());
- for (size_t i = 0; i < array.size(); i++) {
- EXPECT_FALSE(array[i].moved());
- EXPECT_EQ(value_ptrs[i], array[i].ptr());
- }
-
- array.resize(3);
- ASSERT_EQ(3u, array.size());
- EXPECT_EQ(array.size(), MoveOnlyType::num_instances());
- for (size_t i = 0; i < array.size(); i++)
- EXPECT_FALSE(array[i].moved());
- value_ptrs.push_back(array[2].ptr());
-
- size_t capacity = array.storage().capacity();
- array.resize(capacity);
- ASSERT_EQ(capacity, array.size());
- EXPECT_EQ(array.size(), MoveOnlyType::num_instances());
- for (size_t i = 0; i < array.size(); i++)
- EXPECT_FALSE(array[i].moved());
- for (size_t i = 3; i < array.size(); i++)
- value_ptrs.push_back(array[i].ptr());
-
- array.resize(capacity + 2);
- ASSERT_EQ(capacity + 2, array.size());
- EXPECT_EQ(array.size(), MoveOnlyType::num_instances());
- for (size_t i = 0; i < capacity; i++) {
- EXPECT_TRUE(array[i].moved());
- EXPECT_EQ(value_ptrs[i], array[i].ptr());
- }
- for (size_t i = capacity; i < array.size(); i++)
- EXPECT_FALSE(array[i].moved());
-
- array = nullptr;
- EXPECT_EQ(0u, MoveOnlyType::num_instances());
- EXPECT_FALSE(array);
- array.resize(0);
- EXPECT_EQ(0u, MoveOnlyType::num_instances());
- EXPECT_TRUE(array);
-}
+ARRAY_COMMON_TEST(Array, NullAndEmpty)
+ARRAY_COMMON_TEST(Array, Basic)
+ARRAY_COMMON_TEST(Array, Bool)
+ARRAY_COMMON_TEST(Array, Handle)
+ARRAY_COMMON_TEST(Array, HandlesAreClosed)
+ARRAY_COMMON_TEST(Array, Clone)
+ARRAY_COMMON_TEST(Array, Serialization_ArrayOfPOD)
+ARRAY_COMMON_TEST(Array, Serialization_EmptyArrayOfPOD)
+ARRAY_COMMON_TEST(Array, Serialization_ArrayOfArrayOfPOD)
+ARRAY_COMMON_TEST(Array, Serialization_ArrayOfBool)
+ARRAY_COMMON_TEST(Array, Serialization_ArrayOfString)
+ARRAY_COMMON_TEST(Array, Resize_Copyable)
+ARRAY_COMMON_TEST(Array, Resize_MoveOnly)
TEST_F(ArrayTest, PushBack_Copyable) {
ASSERT_EQ(0u, CopyableType::num_instances());
- mojo::Array<CopyableType> array(2);
+ Array<CopyableType> array(2);
array = nullptr;
std::vector<CopyableType*> value_ptrs;
size_t capacity = array.storage().capacity();
@@ -423,7 +66,7 @@ TEST_F(ArrayTest, PushBack_Copyable) {
TEST_F(ArrayTest, PushBack_MoveOnly) {
ASSERT_EQ(0u, MoveOnlyType::num_instances());
- mojo::Array<MoveOnlyType> array(2);
+ Array<MoveOnlyType> array(2);
array = nullptr;
std::vector<MoveOnlyType*> value_ptrs;
size_t capacity = array.storage().capacity();
@@ -458,7 +101,7 @@ TEST_F(ArrayTest, PushBack_MoveOnly) {
TEST_F(ArrayTest, MoveFromAndToSTLVector_Copyable) {
std::vector<CopyableType> vec1(1);
- mojo::Array<CopyableType> arr(std::move(vec1));
+ Array<CopyableType> arr(std::move(vec1));
ASSERT_EQ(1u, arr.size());
ASSERT_FALSE(arr[0].copied());
@@ -472,7 +115,7 @@ TEST_F(ArrayTest, MoveFromAndToSTLVector_Copyable) {
TEST_F(ArrayTest, MoveFromAndToSTLVector_MoveOnly) {
std::vector<MoveOnlyType> vec1(1);
- mojo::Array<MoveOnlyType> arr(std::move(vec1));
+ Array<MoveOnlyType> arr(std::move(vec1));
ASSERT_EQ(1u, arr.size());