blob: 18d0e6cf9ebff1b41548bd7661aa73eb1eb5c916 [file] [log] [blame]
Karl Wiberge2a83ee2015-10-26 19:51:29 +01001/*
2 * Copyright 2015 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#include <algorithm>
Alessio Bazzica858c4d72018-05-14 16:33:58 +020012#include <array>
Karl Wiberge2a83ee2015-10-26 19:51:29 +010013#include <string>
kwiberg529662a2017-09-04 05:43:17 -070014#include <utility>
Karl Wiberge2a83ee2015-10-26 19:51:29 +010015#include <vector>
16
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/array_view.h"
18#include "rtc_base/buffer.h"
19#include "rtc_base/checks.h"
20#include "rtc_base/gunit.h"
21#include "test/gmock.h"
Karl Wiberge2a83ee2015-10-26 19:51:29 +010022
23namespace rtc {
24
25namespace {
kwibergbd431722016-09-05 04:20:54 -070026
danilchapa28780e2016-11-18 01:46:23 -080027using ::testing::ElementsAre;
28using ::testing::IsEmpty;
29
Karl Wiberge2a83ee2015-10-26 19:51:29 +010030template <typename T>
Karl Wiberg30abc362019-02-04 13:07:18 +010031size_t Call(ArrayView<T> av) {
32 return av.size();
33}
34
35template <typename T, size_t N>
36void CallFixed(ArrayView<T, N> av) {}
kwibergbd431722016-09-05 04:20:54 -070037
Karl Wiberge2a83ee2015-10-26 19:51:29 +010038} // namespace
39
40TEST(ArrayViewTest, TestConstructFromPtrAndArray) {
41 char arr[] = "Arrr!";
42 const char carr[] = "Carrr!";
Karl Wiberg30abc362019-02-04 13:07:18 +010043 EXPECT_EQ(6u, Call<const char>(arr));
44 EXPECT_EQ(7u, Call<const char>(carr));
45 EXPECT_EQ(6u, Call<char>(arr));
Karl Wiberge2a83ee2015-10-26 19:51:29 +010046 // Call<char>(carr); // Compile error, because can't drop const.
47 // Call<int>(arr); // Compile error, because incompatible types.
48 ArrayView<int*> x;
49 EXPECT_EQ(0u, x.size());
50 EXPECT_EQ(nullptr, x.data());
51 ArrayView<char> y = arr;
52 EXPECT_EQ(6u, y.size());
53 EXPECT_EQ(arr, y.data());
kwibergbfc7f022017-03-02 12:33:50 -080054 ArrayView<char, 6> yf = arr;
55 static_assert(yf.size() == 6, "");
56 EXPECT_EQ(arr, yf.data());
Karl Wiberge2a83ee2015-10-26 19:51:29 +010057 ArrayView<const char> z(arr + 1, 3);
58 EXPECT_EQ(3u, z.size());
59 EXPECT_EQ(arr + 1, z.data());
kwibergbfc7f022017-03-02 12:33:50 -080060 ArrayView<const char, 3> zf(arr + 1, 3);
61 static_assert(zf.size() == 3, "");
62 EXPECT_EQ(arr + 1, zf.data());
Karl Wiberge2a83ee2015-10-26 19:51:29 +010063 ArrayView<const char> w(arr, 2);
64 EXPECT_EQ(2u, w.size());
65 EXPECT_EQ(arr, w.data());
kwibergbfc7f022017-03-02 12:33:50 -080066 ArrayView<const char, 2> wf(arr, 2);
67 static_assert(wf.size() == 2, "");
68 EXPECT_EQ(arr, wf.data());
Karl Wiberge2a83ee2015-10-26 19:51:29 +010069 ArrayView<char> q(arr, 0);
70 EXPECT_EQ(0u, q.size());
71 EXPECT_EQ(nullptr, q.data());
kwibergbfc7f022017-03-02 12:33:50 -080072 ArrayView<char, 0> qf(arr, 0);
73 static_assert(qf.size() == 0, "");
74 EXPECT_EQ(nullptr, qf.data());
Karl Wiberge2a83ee2015-10-26 19:51:29 +010075#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
76 // DCHECK error (nullptr with nonzero size).
77 EXPECT_DEATH(ArrayView<int>(static_cast<int*>(nullptr), 5), "");
78#endif
79 // These are compile errors, because incompatible types.
80 // ArrayView<int> m = arr;
81 // ArrayView<float> n(arr + 2, 2);
82}
83
kwibergbfc7f022017-03-02 12:33:50 -080084TEST(ArrayViewTest, TestCopyConstructorVariable) {
Karl Wiberge2a83ee2015-10-26 19:51:29 +010085 char arr[] = "Arrr!";
86 ArrayView<char> x = arr;
87 EXPECT_EQ(6u, x.size());
88 EXPECT_EQ(arr, x.data());
89 ArrayView<char> y = x; // Copy non-const -> non-const.
90 EXPECT_EQ(6u, y.size());
91 EXPECT_EQ(arr, y.data());
92 ArrayView<const char> z = x; // Copy non-const -> const.
93 EXPECT_EQ(6u, z.size());
94 EXPECT_EQ(arr, z.data());
95 ArrayView<const char> w = z; // Copy const -> const.
96 EXPECT_EQ(6u, w.size());
97 EXPECT_EQ(arr, w.data());
98 // ArrayView<char> v = z; // Compile error, because can't drop const.
99}
100
kwibergbfc7f022017-03-02 12:33:50 -0800101TEST(ArrayViewTest, TestCopyConstructorFixed) {
102 char arr[] = "Arrr!";
103 ArrayView<char, 6> x = arr;
104 static_assert(x.size() == 6, "");
105 EXPECT_EQ(arr, x.data());
106
107 // Copy fixed -> fixed.
108 ArrayView<char, 6> y = x; // Copy non-const -> non-const.
109 static_assert(y.size() == 6, "");
110 EXPECT_EQ(arr, y.data());
111 ArrayView<const char, 6> z = x; // Copy non-const -> const.
112 static_assert(z.size() == 6, "");
113 EXPECT_EQ(arr, z.data());
114 ArrayView<const char, 6> w = z; // Copy const -> const.
115 static_assert(w.size() == 6, "");
116 EXPECT_EQ(arr, w.data());
117 // ArrayView<char, 6> v = z; // Compile error, because can't drop const.
118
119 // Copy fixed -> variable.
120 ArrayView<char> yv = x; // Copy non-const -> non-const.
121 EXPECT_EQ(6u, yv.size());
122 EXPECT_EQ(arr, yv.data());
123 ArrayView<const char> zv = x; // Copy non-const -> const.
124 EXPECT_EQ(6u, zv.size());
125 EXPECT_EQ(arr, zv.data());
126 ArrayView<const char> wv = z; // Copy const -> const.
127 EXPECT_EQ(6u, wv.size());
128 EXPECT_EQ(arr, wv.data());
129 // ArrayView<char> vv = z; // Compile error, because can't drop const.
130}
131
132TEST(ArrayViewTest, TestCopyAssignmentVariable) {
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100133 char arr[] = "Arrr!";
134 ArrayView<char> x(arr);
135 EXPECT_EQ(6u, x.size());
136 EXPECT_EQ(arr, x.data());
137 ArrayView<char> y;
138 y = x; // Copy non-const -> non-const.
139 EXPECT_EQ(6u, y.size());
140 EXPECT_EQ(arr, y.data());
141 ArrayView<const char> z;
142 z = x; // Copy non-const -> const.
143 EXPECT_EQ(6u, z.size());
144 EXPECT_EQ(arr, z.data());
145 ArrayView<const char> w;
146 w = z; // Copy const -> const.
147 EXPECT_EQ(6u, w.size());
148 EXPECT_EQ(arr, w.data());
149 // ArrayView<char> v;
150 // v = z; // Compile error, because can't drop const.
151}
152
kwibergbfc7f022017-03-02 12:33:50 -0800153TEST(ArrayViewTest, TestCopyAssignmentFixed) {
154 char arr[] = "Arrr!";
155 char init[] = "Init!";
156 ArrayView<char, 6> x(arr);
157 EXPECT_EQ(arr, x.data());
158
159 // Copy fixed -> fixed.
160 ArrayView<char, 6> y(init);
161 y = x; // Copy non-const -> non-const.
162 EXPECT_EQ(arr, y.data());
163 ArrayView<const char, 6> z(init);
164 z = x; // Copy non-const -> const.
165 EXPECT_EQ(arr, z.data());
166 ArrayView<const char, 6> w(init);
167 w = z; // Copy const -> const.
168 EXPECT_EQ(arr, w.data());
169 // ArrayView<char, 6> v(init);
170 // v = z; // Compile error, because can't drop const.
171
172 // Copy fixed -> variable.
173 ArrayView<char> yv;
174 yv = x; // Copy non-const -> non-const.
175 EXPECT_EQ(6u, yv.size());
176 EXPECT_EQ(arr, yv.data());
177 ArrayView<const char> zv;
178 zv = x; // Copy non-const -> const.
179 EXPECT_EQ(6u, zv.size());
180 EXPECT_EQ(arr, zv.data());
181 ArrayView<const char> wv;
182 wv = z; // Copy const -> const.
183 EXPECT_EQ(6u, wv.size());
184 EXPECT_EQ(arr, wv.data());
185 // ArrayView<char> v;
186 // v = z; // Compile error, because can't drop const.
187}
188
Alessio Bazzica858c4d72018-05-14 16:33:58 +0200189TEST(ArrayViewTest, TestStdArray) {
Karl Wiberg30abc362019-02-04 13:07:18 +0100190 EXPECT_EQ(4u, Call<const int>(std::array<int, 4>{1, 2, 3, 4}));
191 CallFixed<const int, 3>(std::array<int, 3>{2, 3, 4});
Alessio Bazzica858c4d72018-05-14 16:33:58 +0200192 constexpr size_t size = 5;
193 std::array<float, size> arr{};
194 // Fixed size view.
195 rtc::ArrayView<float, size> arr_view_fixed(arr);
196 EXPECT_EQ(arr.data(), arr_view_fixed.data());
197 static_assert(size == arr_view_fixed.size(), "");
198 // Variable size view.
199 rtc::ArrayView<float> arr_view(arr);
200 EXPECT_EQ(arr.data(), arr_view.data());
201 EXPECT_EQ(size, arr_view.size());
202}
203
Alessio Bazzica28a325b2018-05-15 14:57:51 +0200204TEST(ArrayViewTest, TestConstStdArray) {
205 constexpr size_t size = 5;
206
207 constexpr std::array<float, size> constexpr_arr{};
208 rtc::ArrayView<const float, size> constexpr_arr_view(constexpr_arr);
209 EXPECT_EQ(constexpr_arr.data(), constexpr_arr_view.data());
210 static_assert(constexpr_arr.size() == constexpr_arr_view.size(), "");
211
212 const std::array<float, size> const_arr{};
213 rtc::ArrayView<const float, size> const_arr_view(const_arr);
214 EXPECT_EQ(const_arr.data(), const_arr_view.data());
215 static_assert(const_arr.size() == const_arr_view.size(), "");
216
217 std::array<float, size> non_const_arr{};
218 rtc::ArrayView<const float, size> non_const_arr_view(non_const_arr);
219 EXPECT_EQ(non_const_arr.data(), non_const_arr_view.data());
220 static_assert(non_const_arr.size() == non_const_arr_view.size(), "");
221}
222
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100223TEST(ArrayViewTest, TestStdVector) {
Karl Wiberg30abc362019-02-04 13:07:18 +0100224 EXPECT_EQ(3u, Call<const int>(std::vector<int>{4, 5, 6}));
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100225 std::vector<int> v;
226 v.push_back(3);
227 v.push_back(11);
Karl Wiberg30abc362019-02-04 13:07:18 +0100228 EXPECT_EQ(2u, Call<const int>(v));
229 EXPECT_EQ(2u, Call<int>(v));
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100230 // Call<unsigned int>(v); // Compile error, because incompatible types.
231 ArrayView<int> x = v;
232 EXPECT_EQ(2u, x.size());
233 EXPECT_EQ(v.data(), x.data());
234 ArrayView<const int> y;
235 y = v;
236 EXPECT_EQ(2u, y.size());
237 EXPECT_EQ(v.data(), y.data());
238 // ArrayView<double> d = v; // Compile error, because incompatible types.
239 const std::vector<int> cv;
Karl Wiberg30abc362019-02-04 13:07:18 +0100240 EXPECT_EQ(0u, Call<const int>(cv));
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100241 // Call<int>(cv); // Compile error, because can't drop const.
242 ArrayView<const int> z = cv;
243 EXPECT_EQ(0u, z.size());
244 EXPECT_EQ(nullptr, z.data());
245 // ArrayView<int> w = cv; // Compile error, because can't drop const.
246}
247
248TEST(ArrayViewTest, TestRtcBuffer) {
249 rtc::Buffer b = "so buffer";
Karl Wiberg30abc362019-02-04 13:07:18 +0100250 EXPECT_EQ(10u, Call<const uint8_t>(b));
251 EXPECT_EQ(10u, Call<uint8_t>(b));
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100252 // Call<int8_t>(b); // Compile error, because incompatible types.
253 ArrayView<uint8_t> x = b;
254 EXPECT_EQ(10u, x.size());
255 EXPECT_EQ(b.data(), x.data());
256 ArrayView<const uint8_t> y;
257 y = b;
258 EXPECT_EQ(10u, y.size());
259 EXPECT_EQ(b.data(), y.data());
260 // ArrayView<char> d = b; // Compile error, because incompatible types.
261 const rtc::Buffer cb = "very const";
Karl Wiberg30abc362019-02-04 13:07:18 +0100262 EXPECT_EQ(11u, Call<const uint8_t>(cb));
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100263 // Call<uint8_t>(cb); // Compile error, because can't drop const.
264 ArrayView<const uint8_t> z = cb;
265 EXPECT_EQ(11u, z.size());
266 EXPECT_EQ(cb.data(), z.data());
267 // ArrayView<uint8_t> w = cb; // Compile error, because can't drop const.
268}
269
kwibergbfc7f022017-03-02 12:33:50 -0800270TEST(ArrayViewTest, TestSwapVariable) {
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100271 const char arr[] = "Arrr!";
272 const char aye[] = "Aye, Cap'n!";
273 ArrayView<const char> x(arr);
274 EXPECT_EQ(6u, x.size());
275 EXPECT_EQ(arr, x.data());
276 ArrayView<const char> y(aye);
277 EXPECT_EQ(12u, y.size());
278 EXPECT_EQ(aye, y.data());
279 using std::swap;
280 swap(x, y);
281 EXPECT_EQ(12u, x.size());
282 EXPECT_EQ(aye, x.data());
283 EXPECT_EQ(6u, y.size());
284 EXPECT_EQ(arr, y.data());
285 // ArrayView<char> z;
286 // swap(x, z); // Compile error, because can't drop const.
287}
288
kwibergbfc7f022017-03-02 12:33:50 -0800289TEST(FixArrayViewTest, TestSwapFixed) {
290 const char arr[] = "Arr!";
291 char aye[] = "Aye!";
292 ArrayView<const char, 5> x(arr);
293 EXPECT_EQ(arr, x.data());
294 ArrayView<const char, 5> y(aye);
295 EXPECT_EQ(aye, y.data());
296 using std::swap;
297 swap(x, y);
298 EXPECT_EQ(aye, x.data());
299 EXPECT_EQ(arr, y.data());
300 // ArrayView<char, 5> z(aye);
301 // swap(x, z); // Compile error, because can't drop const.
302 // ArrayView<const char, 4> w(aye, 4);
303 // swap(x, w); // Compile error, because different sizes.
304}
305
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100306TEST(ArrayViewTest, TestIndexing) {
307 char arr[] = "abcdefg";
308 ArrayView<char> x(arr);
309 const ArrayView<char> y(arr);
kwibergbfc7f022017-03-02 12:33:50 -0800310 ArrayView<const char, 8> z(arr);
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100311 EXPECT_EQ(8u, x.size());
312 EXPECT_EQ(8u, y.size());
313 EXPECT_EQ(8u, z.size());
314 EXPECT_EQ('b', x[1]);
315 EXPECT_EQ('c', y[2]);
316 EXPECT_EQ('d', z[3]);
317 x[3] = 'X';
318 y[2] = 'Y';
319 // z[1] = 'Z'; // Compile error, because z's element type is const char.
320 EXPECT_EQ('b', x[1]);
321 EXPECT_EQ('Y', y[2]);
322 EXPECT_EQ('X', z[3]);
323#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
324 EXPECT_DEATH(z[8], ""); // DCHECK error (index out of bounds).
325#endif
326}
327
328TEST(ArrayViewTest, TestIterationEmpty) {
kwibergbfc7f022017-03-02 12:33:50 -0800329 // Variable-size.
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100330 ArrayView<std::vector<std::vector<std::vector<std::string>>>> av;
kwibergbfc7f022017-03-02 12:33:50 -0800331 EXPECT_EQ(av.begin(), av.end());
332 EXPECT_EQ(av.cbegin(), av.cend());
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100333 for (auto& e : av) {
334 EXPECT_TRUE(false);
335 EXPECT_EQ(42u, e.size()); // Dummy use of e to prevent unused var warning.
336 }
kwibergbfc7f022017-03-02 12:33:50 -0800337
338 // Fixed-size.
339 ArrayView<std::vector<std::vector<std::vector<std::string>>>, 0> af;
340 EXPECT_EQ(af.begin(), af.end());
341 EXPECT_EQ(af.cbegin(), af.cend());
342 for (auto& e : af) {
343 EXPECT_TRUE(false);
344 EXPECT_EQ(42u, e.size()); // Dummy use of e to prevent unused var warning.
345 }
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100346}
347
kwibergbfc7f022017-03-02 12:33:50 -0800348TEST(ArrayViewTest, TestIterationVariable) {
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100349 char arr[] = "Arrr!";
350 ArrayView<char> av(arr);
351 EXPECT_EQ('A', *av.begin());
352 EXPECT_EQ('A', *av.cbegin());
353 EXPECT_EQ('\0', *(av.end() - 1));
354 EXPECT_EQ('\0', *(av.cend() - 1));
355 char i = 0;
356 for (auto& e : av) {
357 EXPECT_EQ(arr + i, &e);
358 e = 's' + i;
359 ++i;
360 }
361 i = 0;
362 for (auto& e : ArrayView<const char>(av)) {
363 EXPECT_EQ(arr + i, &e);
364 // e = 'q' + i; // Compile error, because e is a const char&.
365 ++i;
366 }
367}
368
kwibergbfc7f022017-03-02 12:33:50 -0800369TEST(ArrayViewTest, TestIterationFixed) {
370 char arr[] = "Arrr!";
371 ArrayView<char, 6> av(arr);
372 EXPECT_EQ('A', *av.begin());
373 EXPECT_EQ('A', *av.cbegin());
374 EXPECT_EQ('\0', *(av.end() - 1));
375 EXPECT_EQ('\0', *(av.cend() - 1));
376 char i = 0;
377 for (auto& e : av) {
378 EXPECT_EQ(arr + i, &e);
379 e = 's' + i;
380 ++i;
381 }
382 i = 0;
383 for (auto& e : ArrayView<const char, 6>(av)) {
384 EXPECT_EQ(arr + i, &e);
385 // e = 'q' + i; // Compile error, because e is a const char&.
386 ++i;
387 }
388}
389
kwiberg288886b2015-11-06 01:21:35 -0800390TEST(ArrayViewTest, TestEmpty) {
391 EXPECT_TRUE(ArrayView<int>().empty());
392 const int a[] = {1, 2, 3};
393 EXPECT_FALSE(ArrayView<const int>(a).empty());
kwibergbfc7f022017-03-02 12:33:50 -0800394
395 static_assert(ArrayView<int, 0>::empty(), "");
396 static_assert(!ArrayView<int, 3>::empty(), "");
kwiberg288886b2015-11-06 01:21:35 -0800397}
398
399TEST(ArrayViewTest, TestCompare) {
400 int a[] = {1, 2, 3};
401 int b[] = {1, 2, 3};
kwibergbfc7f022017-03-02 12:33:50 -0800402
kwiberg288886b2015-11-06 01:21:35 -0800403 EXPECT_EQ(ArrayView<int>(a), ArrayView<int>(a));
kwibergbfc7f022017-03-02 12:33:50 -0800404 EXPECT_EQ((ArrayView<int, 3>(a)), (ArrayView<int, 3>(a)));
405 EXPECT_EQ(ArrayView<int>(a), (ArrayView<int, 3>(a)));
kwiberg288886b2015-11-06 01:21:35 -0800406 EXPECT_EQ(ArrayView<int>(), ArrayView<int>());
kwibergbfc7f022017-03-02 12:33:50 -0800407 EXPECT_EQ(ArrayView<int>(), ArrayView<int>(a, 0));
408 EXPECT_EQ(ArrayView<int>(a, 0), ArrayView<int>(b, 0));
409 EXPECT_EQ((ArrayView<int, 0>(a, 0)), ArrayView<int>());
410
kwiberg288886b2015-11-06 01:21:35 -0800411 EXPECT_NE(ArrayView<int>(a), ArrayView<int>(b));
kwibergbfc7f022017-03-02 12:33:50 -0800412 EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 3>(b)));
413 EXPECT_NE((ArrayView<int, 3>(a)), ArrayView<int>(b));
kwiberg288886b2015-11-06 01:21:35 -0800414 EXPECT_NE(ArrayView<int>(a), ArrayView<int>());
415 EXPECT_NE(ArrayView<int>(a), ArrayView<int>(a, 2));
kwibergbfc7f022017-03-02 12:33:50 -0800416 EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 2>(a, 2)));
kwiberg288886b2015-11-06 01:21:35 -0800417}
418
kwibergbfc7f022017-03-02 12:33:50 -0800419TEST(ArrayViewTest, TestSubViewVariable) {
danilchapa28780e2016-11-18 01:46:23 -0800420 int a[] = {1, 2, 3};
421 ArrayView<int> av(a);
422
423 EXPECT_EQ(av.subview(0), av);
424
425 EXPECT_THAT(av.subview(1), ElementsAre(2, 3));
426 EXPECT_THAT(av.subview(2), ElementsAre(3));
427 EXPECT_THAT(av.subview(3), IsEmpty());
428 EXPECT_THAT(av.subview(4), IsEmpty());
429
430 EXPECT_THAT(av.subview(1, 0), IsEmpty());
431 EXPECT_THAT(av.subview(1, 1), ElementsAre(2));
432 EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3));
433 EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3));
434}
435
kwibergbfc7f022017-03-02 12:33:50 -0800436TEST(ArrayViewTest, TestSubViewFixed) {
437 int a[] = {1, 2, 3};
438 ArrayView<int, 3> av(a);
439
440 EXPECT_EQ(av.subview(0), av);
441
442 EXPECT_THAT(av.subview(1), ElementsAre(2, 3));
443 EXPECT_THAT(av.subview(2), ElementsAre(3));
444 EXPECT_THAT(av.subview(3), IsEmpty());
445 EXPECT_THAT(av.subview(4), IsEmpty());
446
447 EXPECT_THAT(av.subview(1, 0), IsEmpty());
448 EXPECT_THAT(av.subview(1, 1), ElementsAre(2));
449 EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3));
450 EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3));
451}
452
Amit Hilbuche155dd02019-03-22 10:16:07 -0700453TEST(ArrayViewTest, TestReinterpretCastFixedSize) {
454 uint8_t bytes[] = {1, 2, 3};
455 ArrayView<uint8_t, 3> uint8_av(bytes);
456 ArrayView<int8_t, 3> int8_av = reinterpret_array_view<int8_t>(uint8_av);
457 EXPECT_EQ(int8_av.size(), uint8_av.size());
458 EXPECT_EQ(int8_av[0], 1);
459 EXPECT_EQ(int8_av[1], 2);
460 EXPECT_EQ(int8_av[2], 3);
461}
462
463TEST(ArrayViewTest, TestReinterpretCastVariableSize) {
464 std::vector<int8_t> v = {1, 2, 3};
465 ArrayView<int8_t> int8_av(v);
466 ArrayView<uint8_t> uint8_av = reinterpret_array_view<uint8_t>(int8_av);
467 EXPECT_EQ(int8_av.size(), uint8_av.size());
468 EXPECT_EQ(uint8_av[0], 1);
469 EXPECT_EQ(uint8_av[1], 2);
470 EXPECT_EQ(uint8_av[2], 3);
471}
Karl Wiberge2a83ee2015-10-26 19:51:29 +0100472} // namespace rtc