1 // Copyright 2022 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "gn/immutable_vector.h"
6 #include "util/test/test.h"
7
8 #include <set>
9 #include <vector>
10
TEST(ImmutableVector,CreationDestruction)11 TEST(ImmutableVector, CreationDestruction) {
12 ImmutableVector<int> empty;
13 EXPECT_TRUE(empty.empty());
14 EXPECT_EQ(0u, empty.size());
15
16 ImmutableVector<int> vec1 = {100, 42};
17 EXPECT_FALSE(vec1.empty());
18 EXPECT_EQ(2u, vec1.size());
19 EXPECT_EQ(100, vec1.front());
20 EXPECT_EQ(42, vec1.back());
21 EXPECT_EQ(100, vec1[0]);
22 EXPECT_EQ(42, vec1[1]);
23 EXPECT_TRUE(vec1.begin());
24 EXPECT_TRUE(vec1.end());
25 EXPECT_NE(vec1.begin(), vec1.end());
26 EXPECT_EQ(vec1.begin() + 2, vec1.end());
27
28 std::vector<int> input;
29 input.push_back(100);
30 input.push_back(42);
31 input.push_back(-12);
32 ImmutableVector<int> vec2(input);
33 EXPECT_FALSE(vec2.empty());
34 EXPECT_EQ(3u, vec2.size());
35 EXPECT_EQ(100, vec2.front());
36 EXPECT_EQ(100, vec2[0]);
37 EXPECT_EQ(42, vec2[1]);
38 EXPECT_EQ(-12, vec2[2]);
39 EXPECT_NE(vec2.begin(), &input[0]);
40 EXPECT_NE(vec2.end(), &input[0] + 3);
41 }
42
TEST(ImmutableVetor,InPlaceConstruction)43 TEST(ImmutableVetor, InPlaceConstruction) {
44 size_t count = 0;
45 auto count_producer = [&count]() { return count++; };
46 ImmutableVector<int> vec(count_producer, 5u);
47 EXPECT_EQ(5u, vec.size());
48 EXPECT_EQ(0, vec[0]);
49 EXPECT_EQ(1, vec[1]);
50 EXPECT_EQ(2, vec[2]);
51 EXPECT_EQ(3, vec[3]);
52 EXPECT_EQ(4, vec[4]);
53 }
54
TEST(ImmutableVector,CopyAndMoveOperations)55 TEST(ImmutableVector, CopyAndMoveOperations) {
56 ImmutableVector<int> vec1 = {1, 2, 3, 4};
57 ImmutableVector<int> vec2 = vec1;
58 ImmutableVector<int> vec3 = std::move(vec1);
59
60 EXPECT_TRUE(vec1.empty());
61 EXPECT_EQ(4u, vec2.size());
62 EXPECT_EQ(4u, vec3.size());
63 EXPECT_NE(vec2.begin(), vec3.begin());
64 EXPECT_NE(vec2.end(), vec3.end());
65 EXPECT_TRUE(std::equal(vec2.begin(), vec2.end(), vec3.begin(), vec3.end()));
66 }
67
TEST(ImmutableVectorView,Creation)68 TEST(ImmutableVectorView, Creation) {
69 ImmutableVector<int> vec1 = {1, 3, 5, 7};
70 ImmutableVectorView<int> view1 = vec1;
71 ImmutableVectorView<int> view2(view1);
72
73 EXPECT_EQ(vec1.size(), view1.size());
74 EXPECT_EQ(vec1.size(), view2.size());
75
76 EXPECT_EQ(vec1.begin(), view1.begin());
77 EXPECT_EQ(vec1.end(), view1.end());
78
79 EXPECT_EQ(vec1.begin(), view2.begin());
80 EXPECT_EQ(vec1.end(), view2.end());
81 }
82