| OLD | NEW |
| 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/array.h" | 5 #include "mojo/public/cpp/bindings/array.h" |
| 6 #include "mojo/public/cpp/bindings/lib/array_internal.h" | 6 #include "mojo/public/cpp/bindings/lib/array_internal.h" |
| 7 #include "mojo/public/cpp/bindings/lib/array_serialization.h" | 7 #include "mojo/public/cpp/bindings/lib/array_serialization.h" |
| 8 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" | 8 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
| 9 #include "mojo/public/cpp/bindings/tests/container_test_util.h" | 9 #include "mojo/public/cpp/bindings/tests/container_test_util.h" |
| 10 #include "mojo/public/cpp/bindings/tests/iterator_test_util.h" | 10 #include "mojo/public/cpp/bindings/tests/iterator_test_util.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 class ArrayTest : public testing::Test { | 24 class ArrayTest : public testing::Test { |
| 25 public: | 25 public: |
| 26 ~ArrayTest() override {} | 26 ~ArrayTest() override {} |
| 27 | 27 |
| 28 private: | 28 private: |
| 29 Environment env_; | 29 Environment env_; |
| 30 }; | 30 }; |
| 31 | 31 |
| 32 // Tests that basic Array operations work. | 32 // Tests that basic Array operations work. |
| 33 TEST_F(ArrayTest, Basic) { | 33 TEST_F(ArrayTest, Basic) { |
| 34 Array<char> array(8); | 34 auto array = Array<char>::New(8); |
| 35 for (size_t i = 0; i < array.size(); ++i) { | 35 for (size_t i = 0; i < array.size(); ++i) { |
| 36 char val = static_cast<char>(i * 2); | 36 char val = static_cast<char>(i * 2); |
| 37 array[i] = val; | 37 array[i] = val; |
| 38 EXPECT_EQ(val, array.at(i)); | 38 EXPECT_EQ(val, array.at(i)); |
| 39 } | 39 } |
| 40 } | 40 } |
| 41 | 41 |
| 42 // Tests that basic Array<bool> operations work. | 42 // Tests that basic Array<bool> operations work. |
| 43 TEST_F(ArrayTest, Bool) { | 43 TEST_F(ArrayTest, Bool) { |
| 44 Array<bool> array(64); | 44 auto array = Array<bool>::New(64); |
| 45 for (size_t i = 0; i < array.size(); ++i) { | 45 for (size_t i = 0; i < array.size(); ++i) { |
| 46 bool val = i % 3 == 0; | 46 bool val = i % 3 == 0; |
| 47 array[i] = val; | 47 array[i] = val; |
| 48 EXPECT_EQ(val, array.at(i)); | 48 EXPECT_EQ(val, array.at(i)); |
| 49 } | 49 } |
| 50 } | 50 } |
| 51 | 51 |
| 52 // Tests that Array<ScopedMessagePipeHandle> supports transferring handles. | 52 // Tests that Array<ScopedMessagePipeHandle> supports transferring handles. |
| 53 TEST_F(ArrayTest, Handle) { | 53 TEST_F(ArrayTest, Handle) { |
| 54 MessagePipe pipe; | 54 MessagePipe pipe; |
| 55 Array<ScopedMessagePipeHandle> handles(2); | 55 auto handles = Array<ScopedMessagePipeHandle>::New(2); |
| 56 handles[0] = pipe.handle0.Pass(); | 56 handles[0] = pipe.handle0.Pass(); |
| 57 handles[1].reset(pipe.handle1.release()); | 57 handles[1].reset(pipe.handle1.release()); |
| 58 | 58 |
| 59 EXPECT_FALSE(pipe.handle0.is_valid()); | 59 EXPECT_FALSE(pipe.handle0.is_valid()); |
| 60 EXPECT_FALSE(pipe.handle1.is_valid()); | 60 EXPECT_FALSE(pipe.handle1.is_valid()); |
| 61 | 61 |
| 62 Array<ScopedMessagePipeHandle> handles2 = handles.Pass(); | 62 Array<ScopedMessagePipeHandle> handles2 = handles.Pass(); |
| 63 EXPECT_TRUE(handles2[0].is_valid()); | 63 EXPECT_TRUE(handles2[0].is_valid()); |
| 64 EXPECT_TRUE(handles2[1].is_valid()); | 64 EXPECT_TRUE(handles2[1].is_valid()); |
| 65 | 65 |
| 66 ScopedMessagePipeHandle pipe_handle = handles2[0].Pass(); | 66 ScopedMessagePipeHandle pipe_handle = handles2[0].Pass(); |
| 67 EXPECT_TRUE(pipe_handle.is_valid()); | 67 EXPECT_TRUE(pipe_handle.is_valid()); |
| 68 EXPECT_FALSE(handles2[0].is_valid()); | 68 EXPECT_FALSE(handles2[0].is_valid()); |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Tests that Array<ScopedMessagePipeHandle> supports closing handles. | 71 // Tests that Array<ScopedMessagePipeHandle> supports closing handles. |
| 72 TEST_F(ArrayTest, HandlesAreClosed) { | 72 TEST_F(ArrayTest, HandlesAreClosed) { |
| 73 MessagePipe pipe; | 73 MessagePipe pipe; |
| 74 MojoHandle pipe0_value = pipe.handle0.get().value(); | 74 MojoHandle pipe0_value = pipe.handle0.get().value(); |
| 75 MojoHandle pipe1_value = pipe.handle0.get().value(); | 75 MojoHandle pipe1_value = pipe.handle0.get().value(); |
| 76 | 76 |
| 77 { | 77 { |
| 78 Array<ScopedMessagePipeHandle> handles(2); | 78 auto handles = Array<ScopedMessagePipeHandle>::New(2); |
| 79 handles[0] = pipe.handle0.Pass(); | 79 handles[0] = pipe.handle0.Pass(); |
| 80 handles[1].reset(pipe.handle0.release()); | 80 handles[1].reset(pipe.handle0.release()); |
| 81 } | 81 } |
| 82 | 82 |
| 83 // We expect the pipes to have been closed. | 83 // We expect the pipes to have been closed. |
| 84 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); | 84 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); |
| 85 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); | 85 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); |
| 86 } | 86 } |
| 87 | 87 |
| 88 TEST_F(ArrayTest, Clone) { | 88 TEST_F(ArrayTest, Clone) { |
| 89 { | 89 { |
| 90 // Test POD. | 90 // Test POD. |
| 91 Array<int32_t> array(3); | 91 auto array = Array<int32_t>::New(3); |
| 92 for (size_t i = 0; i < array.size(); ++i) | 92 for (size_t i = 0; i < array.size(); ++i) |
| 93 array[i] = static_cast<int32_t>(i); | 93 array[i] = static_cast<int32_t>(i); |
| 94 | 94 |
| 95 Array<int32_t> clone_array = array.Clone(); | 95 Array<int32_t> clone_array = array.Clone(); |
| 96 EXPECT_EQ(array.size(), clone_array.size()); | 96 EXPECT_EQ(array.size(), clone_array.size()); |
| 97 for (size_t i = 0; i < array.size(); ++i) | 97 for (size_t i = 0; i < array.size(); ++i) |
| 98 EXPECT_EQ(array[i], clone_array[i]); | 98 EXPECT_EQ(array[i], clone_array[i]); |
| 99 } | 99 } |
| 100 | 100 |
| 101 { | 101 { |
| 102 // Test copyable object. | 102 // Test copyable object. |
| 103 Array<String> array(2); | 103 auto array = Array<String>::New(2); |
| 104 array[0] = "hello"; | 104 array[0] = "hello"; |
| 105 array[1] = "world"; | 105 array[1] = "world"; |
| 106 | 106 |
| 107 Array<String> clone_array = array.Clone(); | 107 Array<String> clone_array = array.Clone(); |
| 108 EXPECT_EQ(array.size(), clone_array.size()); | 108 EXPECT_EQ(array.size(), clone_array.size()); |
| 109 for (size_t i = 0; i < array.size(); ++i) | 109 for (size_t i = 0; i < array.size(); ++i) |
| 110 EXPECT_EQ(array[i], clone_array[i]); | 110 EXPECT_EQ(array[i], clone_array[i]); |
| 111 } | 111 } |
| 112 | 112 |
| 113 { | 113 { |
| 114 // Test struct. | 114 // Test struct. |
| 115 Array<RectPtr> array(2); | 115 auto array = Array<RectPtr>::New(2); |
| 116 array[1] = Rect::New(); | 116 array[1] = Rect::New(); |
| 117 array[1]->x = 1; | 117 array[1]->x = 1; |
| 118 array[1]->y = 2; | 118 array[1]->y = 2; |
| 119 array[1]->width = 3; | 119 array[1]->width = 3; |
| 120 array[1]->height = 4; | 120 array[1]->height = 4; |
| 121 | 121 |
| 122 Array<RectPtr> clone_array = array.Clone(); | 122 Array<RectPtr> clone_array = array.Clone(); |
| 123 EXPECT_EQ(array.size(), clone_array.size()); | 123 EXPECT_EQ(array.size(), clone_array.size()); |
| 124 EXPECT_TRUE(clone_array[0].is_null()); | 124 EXPECT_TRUE(clone_array[0].is_null()); |
| 125 EXPECT_EQ(array[1]->x, clone_array[1]->x); | 125 EXPECT_EQ(array[1]->x, clone_array[1]->x); |
| 126 EXPECT_EQ(array[1]->y, clone_array[1]->y); | 126 EXPECT_EQ(array[1]->y, clone_array[1]->y); |
| 127 EXPECT_EQ(array[1]->width, clone_array[1]->width); | 127 EXPECT_EQ(array[1]->width, clone_array[1]->width); |
| 128 EXPECT_EQ(array[1]->height, clone_array[1]->height); | 128 EXPECT_EQ(array[1]->height, clone_array[1]->height); |
| 129 } | 129 } |
| 130 | 130 |
| 131 { | 131 { |
| 132 // Test array of array. | 132 // Test array of array. |
| 133 Array<Array<int8_t>> array(2); | 133 auto array = Array<Array<int8_t>>::New(2); |
| 134 array[1] = Array<int8_t>(2); | 134 array[1] = Array<int8_t>::New(2); |
| 135 array[1][0] = 0; | 135 array[1][0] = 0; |
| 136 array[1][1] = 1; | 136 array[1][1] = 1; |
| 137 | 137 |
| 138 Array<Array<int8_t>> clone_array = array.Clone(); | 138 Array<Array<int8_t>> clone_array = array.Clone(); |
| 139 EXPECT_EQ(array.size(), clone_array.size()); | 139 EXPECT_EQ(array.size(), clone_array.size()); |
| 140 EXPECT_TRUE(clone_array[0].is_null()); | 140 EXPECT_TRUE(clone_array[0].is_null()); |
| 141 EXPECT_EQ(array[1].size(), clone_array[1].size()); | 141 EXPECT_EQ(array[1].size(), clone_array[1].size()); |
| 142 EXPECT_EQ(array[1][0], clone_array[1][0]); | 142 EXPECT_EQ(array[1][0], clone_array[1][0]); |
| 143 EXPECT_EQ(array[1][1], clone_array[1][1]); | 143 EXPECT_EQ(array[1][1], clone_array[1][1]); |
| 144 } | 144 } |
| 145 | 145 |
| 146 { | 146 { |
| 147 // Test that array of handles still works although Clone() is not available. | 147 // Test that array of handles still works although Clone() is not available. |
| 148 Array<ScopedMessagePipeHandle> array(10); | 148 auto array = Array<ScopedMessagePipeHandle>::New(10); |
| 149 EXPECT_FALSE(array[0].is_valid()); | 149 EXPECT_FALSE(array[0].is_valid()); |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 | 152 |
| 153 TEST_F(ArrayTest, Serialization_ArrayOfPOD) { | 153 TEST_F(ArrayTest, Serialization_ArrayOfPOD) { |
| 154 Array<int32_t> array(4); | 154 auto array = Array<int32_t>::New(4); |
| 155 for (size_t i = 0; i < array.size(); ++i) | 155 for (size_t i = 0; i < array.size(); ++i) |
| 156 array[i] = static_cast<int32_t>(i); | 156 array[i] = static_cast<int32_t>(i); |
| 157 | 157 |
| 158 size_t size = GetSerializedSize_(array); | 158 size_t size = GetSerializedSize_(array); |
| 159 EXPECT_EQ(8U + 4 * 4U, size); | 159 EXPECT_EQ(8U + 4 * 4U, size); |
| 160 | 160 |
| 161 FixedBufferForTesting buf(size); | 161 FixedBufferForTesting buf(size); |
| 162 Array_Data<int32_t>* data; | 162 Array_Data<int32_t>* data; |
| 163 ArrayValidateParams validate_params(0, false, nullptr); | 163 ArrayValidateParams validate_params(0, false, nullptr); |
| 164 SerializeArray_(&array, &buf, &data, &validate_params); | 164 SerializeArray_(&array, &buf, &data, &validate_params); |
| 165 | 165 |
| 166 Array<int32_t> array2; | 166 Array<int32_t> array2; |
| 167 Deserialize_(data, &array2); | 167 Deserialize_(data, &array2); |
| 168 | 168 |
| 169 EXPECT_EQ(4U, array2.size()); | 169 EXPECT_EQ(4U, array2.size()); |
| 170 for (size_t i = 0; i < array2.size(); ++i) | 170 for (size_t i = 0; i < array2.size(); ++i) |
| 171 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); | 171 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); |
| 172 } | 172 } |
| 173 | 173 |
| 174 TEST_F(ArrayTest, Serialization_EmptyArrayOfPOD) { | 174 TEST_F(ArrayTest, Serialization_EmptyArrayOfPOD) { |
| 175 Array<int32_t> array(0); | 175 auto array = Array<int32_t>::New(0); |
| 176 size_t size = GetSerializedSize_(array); | 176 size_t size = GetSerializedSize_(array); |
| 177 EXPECT_EQ(8U, size); | 177 EXPECT_EQ(8U, size); |
| 178 | 178 |
| 179 FixedBufferForTesting buf(size); | 179 FixedBufferForTesting buf(size); |
| 180 Array_Data<int32_t>* data; | 180 Array_Data<int32_t>* data; |
| 181 ArrayValidateParams validate_params(0, false, nullptr); | 181 ArrayValidateParams validate_params(0, false, nullptr); |
| 182 SerializeArray_(&array, &buf, &data, &validate_params); | 182 SerializeArray_(&array, &buf, &data, &validate_params); |
| 183 | 183 |
| 184 Array<int32_t> array2; | 184 Array<int32_t> array2; |
| 185 Deserialize_(data, &array2); | 185 Deserialize_(data, &array2); |
| 186 EXPECT_EQ(0U, array2.size()); | 186 EXPECT_EQ(0U, array2.size()); |
| 187 } | 187 } |
| 188 | 188 |
| 189 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) { | 189 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) { |
| 190 Array<Array<int32_t>> array(2); | 190 auto array = Array<Array<int32_t>>::New(2); |
| 191 for (size_t j = 0; j < array.size(); ++j) { | 191 for (size_t j = 0; j < array.size(); ++j) { |
| 192 Array<int32_t> inner(4); | 192 auto inner = Array<int32_t>::New(4); |
| 193 for (size_t i = 0; i < inner.size(); ++i) | 193 for (size_t i = 0; i < inner.size(); ++i) |
| 194 inner[i] = static_cast<int32_t>(i + (j * 10)); | 194 inner[i] = static_cast<int32_t>(i + (j * 10)); |
| 195 array[j] = inner.Pass(); | 195 array[j] = inner.Pass(); |
| 196 } | 196 } |
| 197 | 197 |
| 198 size_t size = GetSerializedSize_(array); | 198 size_t size = GetSerializedSize_(array); |
| 199 EXPECT_EQ(8U + 2 * 8U + 2 * (8U + 4 * 4U), size); | 199 EXPECT_EQ(8U + 2 * 8U + 2 * (8U + 4 * 4U), size); |
| 200 | 200 |
| 201 FixedBufferForTesting buf(size); | 201 FixedBufferForTesting buf(size); |
| 202 Array_Data<Array_Data<int32_t>*>* data; | 202 Array_Data<Array_Data<int32_t>*>* data; |
| 203 ArrayValidateParams validate_params( | 203 ArrayValidateParams validate_params( |
| 204 0, false, new ArrayValidateParams(0, false, nullptr)); | 204 0, false, new ArrayValidateParams(0, false, nullptr)); |
| 205 SerializeArray_(&array, &buf, &data, &validate_params); | 205 SerializeArray_(&array, &buf, &data, &validate_params); |
| 206 | 206 |
| 207 Array<Array<int32_t>> array2; | 207 Array<Array<int32_t>> array2; |
| 208 Deserialize_(data, &array2); | 208 Deserialize_(data, &array2); |
| 209 | 209 |
| 210 EXPECT_EQ(2U, array2.size()); | 210 EXPECT_EQ(2U, array2.size()); |
| 211 for (size_t j = 0; j < array2.size(); ++j) { | 211 for (size_t j = 0; j < array2.size(); ++j) { |
| 212 const Array<int32_t>& inner = array2[j]; | 212 const Array<int32_t>& inner = array2[j]; |
| 213 EXPECT_EQ(4U, inner.size()); | 213 EXPECT_EQ(4U, inner.size()); |
| 214 for (size_t i = 0; i < inner.size(); ++i) | 214 for (size_t i = 0; i < inner.size(); ++i) |
| 215 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); | 215 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); |
| 216 } | 216 } |
| 217 } | 217 } |
| 218 | 218 |
| 219 TEST_F(ArrayTest, Serialization_ArrayOfBool) { | 219 TEST_F(ArrayTest, Serialization_ArrayOfBool) { |
| 220 Array<bool> array(10); | 220 auto array = Array<bool>::New(10); |
| 221 for (size_t i = 0; i < array.size(); ++i) | 221 for (size_t i = 0; i < array.size(); ++i) |
| 222 array[i] = i % 2 ? true : false; | 222 array[i] = i % 2 ? true : false; |
| 223 | 223 |
| 224 size_t size = GetSerializedSize_(array); | 224 size_t size = GetSerializedSize_(array); |
| 225 EXPECT_EQ(8U + 8U, size); | 225 EXPECT_EQ(8U + 8U, size); |
| 226 | 226 |
| 227 FixedBufferForTesting buf(size); | 227 FixedBufferForTesting buf(size); |
| 228 Array_Data<bool>* data; | 228 Array_Data<bool>* data; |
| 229 ArrayValidateParams validate_params(0, false, nullptr); | 229 ArrayValidateParams validate_params(0, false, nullptr); |
| 230 SerializeArray_(&array, &buf, &data, &validate_params); | 230 SerializeArray_(&array, &buf, &data, &validate_params); |
| 231 | 231 |
| 232 Array<bool> array2; | 232 Array<bool> array2; |
| 233 Deserialize_(data, &array2); | 233 Deserialize_(data, &array2); |
| 234 | 234 |
| 235 EXPECT_EQ(10U, array2.size()); | 235 EXPECT_EQ(10U, array2.size()); |
| 236 for (size_t i = 0; i < array2.size(); ++i) | 236 for (size_t i = 0; i < array2.size(); ++i) |
| 237 EXPECT_EQ(i % 2 ? true : false, array2[i]); | 237 EXPECT_EQ(i % 2 ? true : false, array2[i]); |
| 238 } | 238 } |
| 239 | 239 |
| 240 TEST_F(ArrayTest, Serialization_ArrayOfString) { | 240 TEST_F(ArrayTest, Serialization_ArrayOfString) { |
| 241 Array<String> array(10); | 241 auto array = Array<String>::New(10); |
| 242 for (size_t i = 0; i < array.size(); ++i) { | 242 for (size_t i = 0; i < array.size(); ++i) { |
| 243 char c = 'A' + static_cast<char>(i); | 243 char c = 'A' + static_cast<char>(i); |
| 244 array[i] = String(&c, 1); | 244 array[i] = String(&c, 1); |
| 245 } | 245 } |
| 246 | 246 |
| 247 size_t size = GetSerializedSize_(array); | 247 size_t size = GetSerializedSize_(array); |
| 248 EXPECT_EQ(8U + // array header | 248 EXPECT_EQ(8U + // array header |
| 249 10 * 8U + // array payload (10 pointers) | 249 10 * 8U + // array payload (10 pointers) |
| 250 10 * (8U + // string header | 250 10 * (8U + // string header |
| 251 8U), // string length of 1 padded to 8 | 251 8U), // string length of 1 padded to 8 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 262 | 262 |
| 263 EXPECT_EQ(10U, array2.size()); | 263 EXPECT_EQ(10U, array2.size()); |
| 264 for (size_t i = 0; i < array2.size(); ++i) { | 264 for (size_t i = 0; i < array2.size(); ++i) { |
| 265 char c = 'A' + static_cast<char>(i); | 265 char c = 'A' + static_cast<char>(i); |
| 266 EXPECT_EQ(String(&c, 1), array2[i]); | 266 EXPECT_EQ(String(&c, 1), array2[i]); |
| 267 } | 267 } |
| 268 } | 268 } |
| 269 | 269 |
| 270 TEST_F(ArrayTest, Resize_Copyable) { | 270 TEST_F(ArrayTest, Resize_Copyable) { |
| 271 ASSERT_EQ(0u, CopyableType::num_instances()); | 271 ASSERT_EQ(0u, CopyableType::num_instances()); |
| 272 mojo::Array<CopyableType> array(3); | 272 auto array = mojo::Array<CopyableType>::New(3); |
| 273 std::vector<CopyableType*> value_ptrs; | 273 std::vector<CopyableType*> value_ptrs; |
| 274 value_ptrs.push_back(array[0].ptr()); | 274 value_ptrs.push_back(array[0].ptr()); |
| 275 value_ptrs.push_back(array[1].ptr()); | 275 value_ptrs.push_back(array[1].ptr()); |
| 276 | 276 |
| 277 for (size_t i = 0; i < array.size(); i++) | 277 for (size_t i = 0; i < array.size(); i++) |
| 278 array[i].ResetCopied(); | 278 array[i].ResetCopied(); |
| 279 | 279 |
| 280 array.resize(2); | 280 array.resize(2); |
| 281 ASSERT_EQ(2u, array.size()); | 281 ASSERT_EQ(2u, array.size()); |
| 282 EXPECT_EQ(array.size(), CopyableType::num_instances()); | 282 EXPECT_EQ(array.size(), CopyableType::num_instances()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 array.reset(); | 314 array.reset(); |
| 315 EXPECT_EQ(0u, CopyableType::num_instances()); | 315 EXPECT_EQ(0u, CopyableType::num_instances()); |
| 316 EXPECT_FALSE(array); | 316 EXPECT_FALSE(array); |
| 317 array.resize(0); | 317 array.resize(0); |
| 318 EXPECT_EQ(0u, CopyableType::num_instances()); | 318 EXPECT_EQ(0u, CopyableType::num_instances()); |
| 319 EXPECT_TRUE(array); | 319 EXPECT_TRUE(array); |
| 320 } | 320 } |
| 321 | 321 |
| 322 TEST_F(ArrayTest, Resize_MoveOnly) { | 322 TEST_F(ArrayTest, Resize_MoveOnly) { |
| 323 ASSERT_EQ(0u, MoveOnlyType::num_instances()); | 323 ASSERT_EQ(0u, MoveOnlyType::num_instances()); |
| 324 mojo::Array<MoveOnlyType> array(3); | 324 auto array = mojo::Array<MoveOnlyType>::New(3); |
| 325 std::vector<MoveOnlyType*> value_ptrs; | 325 std::vector<MoveOnlyType*> value_ptrs; |
| 326 value_ptrs.push_back(array[0].ptr()); | 326 value_ptrs.push_back(array[0].ptr()); |
| 327 value_ptrs.push_back(array[1].ptr()); | 327 value_ptrs.push_back(array[1].ptr()); |
| 328 | 328 |
| 329 for (size_t i = 0; i < array.size(); i++) | 329 for (size_t i = 0; i < array.size(); i++) |
| 330 EXPECT_FALSE(array[i].moved()); | 330 EXPECT_FALSE(array[i].moved()); |
| 331 | 331 |
| 332 array.resize(2); | 332 array.resize(2); |
| 333 ASSERT_EQ(2u, array.size()); | 333 ASSERT_EQ(2u, array.size()); |
| 334 EXPECT_EQ(array.size(), MoveOnlyType::num_instances()); | 334 EXPECT_EQ(array.size(), MoveOnlyType::num_instances()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 array.reset(); | 366 array.reset(); |
| 367 EXPECT_EQ(0u, MoveOnlyType::num_instances()); | 367 EXPECT_EQ(0u, MoveOnlyType::num_instances()); |
| 368 EXPECT_FALSE(array); | 368 EXPECT_FALSE(array); |
| 369 array.resize(0); | 369 array.resize(0); |
| 370 EXPECT_EQ(0u, MoveOnlyType::num_instances()); | 370 EXPECT_EQ(0u, MoveOnlyType::num_instances()); |
| 371 EXPECT_TRUE(array); | 371 EXPECT_TRUE(array); |
| 372 } | 372 } |
| 373 | 373 |
| 374 TEST_F(ArrayTest, PushBack_Copyable) { | 374 TEST_F(ArrayTest, PushBack_Copyable) { |
| 375 ASSERT_EQ(0u, CopyableType::num_instances()); | 375 ASSERT_EQ(0u, CopyableType::num_instances()); |
| 376 mojo::Array<CopyableType> array(2); | 376 auto array = mojo::Array<CopyableType>::New(2); |
| 377 array.reset(); | 377 array.reset(); |
| 378 std::vector<CopyableType*> value_ptrs; | 378 std::vector<CopyableType*> value_ptrs; |
| 379 size_t capacity = array.storage().capacity(); | 379 size_t capacity = array.storage().capacity(); |
| 380 for (size_t i = 0; i < capacity; i++) { | 380 for (size_t i = 0; i < capacity; i++) { |
| 381 CopyableType value; | 381 CopyableType value; |
| 382 value_ptrs.push_back(value.ptr()); | 382 value_ptrs.push_back(value.ptr()); |
| 383 array.push_back(value); | 383 array.push_back(value); |
| 384 ASSERT_EQ(i + 1, array.size()); | 384 ASSERT_EQ(i + 1, array.size()); |
| 385 ASSERT_EQ(i + 1, value_ptrs.size()); | 385 ASSERT_EQ(i + 1, value_ptrs.size()); |
| 386 EXPECT_EQ(array.size() + 1, CopyableType::num_instances()); | 386 EXPECT_EQ(array.size() + 1, CopyableType::num_instances()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 401 for (size_t i = 0; i < array.size(); i++) { | 401 for (size_t i = 0; i < array.size(); i++) { |
| 402 EXPECT_TRUE(array[i].copied()); | 402 EXPECT_TRUE(array[i].copied()); |
| 403 EXPECT_EQ(value_ptrs[i], array[i].ptr()); | 403 EXPECT_EQ(value_ptrs[i], array[i].ptr()); |
| 404 } | 404 } |
| 405 array.reset(); | 405 array.reset(); |
| 406 EXPECT_EQ(0u, CopyableType::num_instances()); | 406 EXPECT_EQ(0u, CopyableType::num_instances()); |
| 407 } | 407 } |
| 408 | 408 |
| 409 TEST_F(ArrayTest, PushBack_MoveOnly) { | 409 TEST_F(ArrayTest, PushBack_MoveOnly) { |
| 410 ASSERT_EQ(0u, MoveOnlyType::num_instances()); | 410 ASSERT_EQ(0u, MoveOnlyType::num_instances()); |
| 411 mojo::Array<MoveOnlyType> array(2); | 411 auto array = mojo::Array<MoveOnlyType>::New(2); |
| 412 array.reset(); | 412 array.reset(); |
| 413 std::vector<MoveOnlyType*> value_ptrs; | 413 std::vector<MoveOnlyType*> value_ptrs; |
| 414 size_t capacity = array.storage().capacity(); | 414 size_t capacity = array.storage().capacity(); |
| 415 for (size_t i = 0; i < capacity; i++) { | 415 for (size_t i = 0; i < capacity; i++) { |
| 416 MoveOnlyType value; | 416 MoveOnlyType value; |
| 417 value_ptrs.push_back(value.ptr()); | 417 value_ptrs.push_back(value.ptr()); |
| 418 array.push_back(value.Pass()); | 418 array.push_back(value.Pass()); |
| 419 ASSERT_EQ(i + 1, array.size()); | 419 ASSERT_EQ(i + 1, array.size()); |
| 420 ASSERT_EQ(i + 1, value_ptrs.size()); | 420 ASSERT_EQ(i + 1, value_ptrs.size()); |
| 421 EXPECT_EQ(array.size() + 1, MoveOnlyType::num_instances()); | 421 EXPECT_EQ(array.size() + 1, MoveOnlyType::num_instances()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 { | 486 { |
| 487 SCOPED_TRACE("Array iterator bidirectionality test."); | 487 SCOPED_TRACE("Array iterator bidirectionality test."); |
| 488 ExpectBidiIteratorConcept(arr.begin(), arr.end(), values); | 488 ExpectBidiIteratorConcept(arr.begin(), arr.end(), values); |
| 489 ExpectBidiMutableIteratorConcept(arr.begin(), arr.end(), values); | 489 ExpectBidiMutableIteratorConcept(arr.begin(), arr.end(), values); |
| 490 } | 490 } |
| 491 } | 491 } |
| 492 | 492 |
| 493 } // namespace | 493 } // namespace |
| 494 } // namespace test | 494 } // namespace test |
| 495 } // namespace mojo | 495 } // namespace mojo |
| OLD | NEW |