| // Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/lib/containers/cpp/array_view.h" | |
| #include <gtest/gtest.h> | |
| namespace containers { | |
| TEST(ArrayView, Basic) { | |
| const int kValues[6] = {1, 2, 3, 4, 5, 6}; | |
| array_view<int> default_constructed; | |
| EXPECT_EQ(0u, default_constructed.size()); | |
| EXPECT_TRUE(default_constructed.empty()); | |
| array_view<int> iter_constucted_empty(std::begin(kValues), std::begin(kValues)); | |
| EXPECT_EQ(0u, iter_constucted_empty.size()); | |
| EXPECT_TRUE(iter_constucted_empty.empty()); | |
| array_view<int> iter_constucted_6(std::begin(kValues), std::end(kValues)); | |
| EXPECT_EQ(6u, iter_constucted_6.size()); | |
| EXPECT_FALSE(iter_constucted_6.empty()); | |
| EXPECT_EQ(1, iter_constucted_6[0]); | |
| EXPECT_EQ(2, iter_constucted_6[1]); | |
| EXPECT_EQ(3, iter_constucted_6[2]); | |
| EXPECT_EQ(4, iter_constucted_6[3]); | |
| EXPECT_EQ(5, iter_constucted_6[4]); | |
| EXPECT_EQ(6, iter_constucted_6[5]); | |
| EXPECT_EQ(1, iter_constucted_6.front()); | |
| EXPECT_EQ(6, iter_constucted_6.back()); | |
| array_view<int> size_constructed(kValues, std::size(kValues)); | |
| EXPECT_EQ(6u, iter_constucted_6.size()); | |
| EXPECT_FALSE(iter_constucted_6.empty()); | |
| EXPECT_EQ(1, iter_constucted_6[0]); | |
| EXPECT_EQ(6, iter_constucted_6[5]); | |
| std::vector<int> empty_vect; | |
| array_view<int> empty(empty_vect); | |
| EXPECT_TRUE(empty.empty()); | |
| std::vector<int> nonempty_vect{1, 2}; | |
| array_view<int> nonempty(nonempty_vect); | |
| EXPECT_EQ(2u, nonempty.size()); | |
| EXPECT_FALSE(nonempty.empty()); | |
| EXPECT_EQ(1, nonempty[0]); | |
| EXPECT_EQ(2, nonempty[1]); | |
| } | |
| TEST(ArrayView, Iterators) { | |
| const int kValues[4] = {1, 2, 3, 4}; | |
| array_view<int> view(std::begin(kValues), std::end(kValues)); | |
| // Range-based for loop. | |
| int expected_value = 1; | |
| for (auto i : view) { | |
| EXPECT_EQ(expected_value, i); | |
| expected_value++; | |
| } | |
| EXPECT_EQ(5, expected_value); | |
| // Reverse iterators. | |
| expected_value = 4; | |
| for (auto iter = view.rbegin(); iter != view.rend(); ++iter) { | |
| EXPECT_EQ(expected_value, *iter); | |
| expected_value--; | |
| } | |
| EXPECT_EQ(0, expected_value); | |
| } | |
| TEST(ArrayView, SubView) { | |
| const int kValues[5] = {1, 2, 3, 4, 5}; | |
| array_view<int> source(std::begin(kValues), std::end(kValues)); | |
| // Both arguments implicit. | |
| array_view<int> full_sub = source.subview(); | |
| EXPECT_EQ(5u, full_sub.size()); | |
| EXPECT_EQ(1, full_sub[0]); | |
| EXPECT_EQ(5, full_sub[4]); | |
| // Implicit end. | |
| array_view<int> implicit_sub = source.subview(2); | |
| EXPECT_EQ(3u, implicit_sub.size()); | |
| EXPECT_EQ(3, implicit_sub[0]); | |
| EXPECT_EQ(5, implicit_sub[2]); | |
| // Explicit end. | |
| array_view<int> explicit_sub = source.subview(1, 3); | |
| EXPECT_EQ(3u, explicit_sub.size()); | |
| EXPECT_EQ(2, explicit_sub[0]); | |
| EXPECT_EQ(4, explicit_sub[2]); | |
| // End matching real end. | |
| array_view<int> matching_sub = source.subview(2, 3); | |
| EXPECT_EQ(3u, matching_sub.size()); | |
| EXPECT_EQ(3, matching_sub[0]); | |
| EXPECT_EQ(5, matching_sub[2]); | |
| // Size past the end. | |
| array_view<int> overflow_sub = source.subview(3, 9); | |
| EXPECT_EQ(2u, overflow_sub.size()); | |
| EXPECT_EQ(4, overflow_sub[0]); | |
| EXPECT_EQ(5, overflow_sub[1]); | |
| // Source equals the end. | |
| array_view<int> source_equals_sub = source.subview(5, 9); | |
| EXPECT_EQ(true, source_equals_sub.empty()); | |
| // Source equals the end. | |
| array_view<int> source_past_sub = source.subview(9, 2); | |
| EXPECT_EQ(true, source_past_sub.empty()); | |
| } | |
| } // namespace containers |