1 /*
2 * Copyright (c) 2022 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 "test/pc/e2e/analyzer/video/names_collection.h"
12
13 #include <string>
14 #include <vector>
15
16 #include "absl/types/optional.h"
17 #include "test/gmock.h"
18 #include "test/gtest.h"
19
20 namespace webrtc {
21 namespace {
22
23 using ::testing::Eq;
24 using ::testing::Ne;
25
TEST(NamesCollectionTest,NamesFromCtorHasUniqueIndexes)26 TEST(NamesCollectionTest, NamesFromCtorHasUniqueIndexes) {
27 NamesCollection collection(std::vector<std::string>{"alice", "bob"});
28
29 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(2)));
30 EXPECT_TRUE(collection.HasName("alice"));
31 EXPECT_THAT(collection.name(collection.index("alice")), Eq("alice"));
32
33 EXPECT_TRUE(collection.HasName("bob"));
34 EXPECT_THAT(collection.name(collection.index("bob")), Eq("bob"));
35
36 EXPECT_THAT(collection.index("bob"), Ne(collection.index("alice")));
37 }
38
TEST(NamesCollectionTest,AddedNamesHasIndexes)39 TEST(NamesCollectionTest, AddedNamesHasIndexes) {
40 NamesCollection collection(std::vector<std::string>{});
41 collection.AddIfAbsent("alice");
42
43 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
44 EXPECT_TRUE(collection.HasName("alice"));
45 EXPECT_THAT(collection.name(collection.index("alice")), Eq("alice"));
46 }
47
TEST(NamesCollectionTest,AddBobDoesNotChangeAliceIndex)48 TEST(NamesCollectionTest, AddBobDoesNotChangeAliceIndex) {
49 NamesCollection collection(std::vector<std::string>{"alice"});
50
51 size_t alice_index = collection.index("alice");
52
53 collection.AddIfAbsent("bob");
54
55 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(2)));
56 EXPECT_THAT(collection.index("alice"), Eq(alice_index));
57 EXPECT_THAT(collection.index("bob"), Ne(alice_index));
58 }
59
TEST(NamesCollectionTest,AddAliceSecondTimeDoesNotChangeIndex)60 TEST(NamesCollectionTest, AddAliceSecondTimeDoesNotChangeIndex) {
61 NamesCollection collection(std::vector<std::string>{"alice"});
62
63 size_t alice_index = collection.index("alice");
64
65 EXPECT_THAT(collection.AddIfAbsent("alice"), Eq(alice_index));
66
67 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
68 EXPECT_THAT(collection.index("alice"), Eq(alice_index));
69 }
70
TEST(NamesCollectionTest,RemoveRemovesFromCollectionButNotIndex)71 TEST(NamesCollectionTest, RemoveRemovesFromCollectionButNotIndex) {
72 NamesCollection collection(std::vector<std::string>{"alice", "bob"});
73
74 size_t bob_index = collection.index("bob");
75
76 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(2)));
77
78 EXPECT_THAT(collection.RemoveIfPresent("bob"),
79 Eq(absl::optional<size_t>(bob_index)));
80
81 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
82 EXPECT_FALSE(collection.HasName("bob"));
83
84 EXPECT_THAT(collection.index("bob"), Eq(bob_index));
85 EXPECT_THAT(collection.name(bob_index), Eq("bob"));
86 }
87
TEST(NamesCollectionTest,RemoveOfAliceDoesNotChangeBobIndex)88 TEST(NamesCollectionTest, RemoveOfAliceDoesNotChangeBobIndex) {
89 NamesCollection collection(std::vector<std::string>{"alice", "bob"});
90
91 size_t alice_index = collection.index("alice");
92 size_t bob_index = collection.index("bob");
93
94 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(2)));
95
96 EXPECT_THAT(collection.RemoveIfPresent("alice"),
97 Eq(absl::optional<size_t>(alice_index)));
98
99 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
100 EXPECT_THAT(collection.index("bob"), Eq(bob_index));
101 EXPECT_THAT(collection.name(bob_index), Eq("bob"));
102 }
103
TEST(NamesCollectionTest,RemoveSecondTimeHasNoEffect)104 TEST(NamesCollectionTest, RemoveSecondTimeHasNoEffect) {
105 NamesCollection collection(std::vector<std::string>{"bob"});
106
107 size_t bob_index = collection.index("bob");
108
109 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
110 EXPECT_THAT(collection.RemoveIfPresent("bob"),
111 Eq(absl::optional<size_t>(bob_index)));
112
113 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(0)));
114 EXPECT_THAT(collection.RemoveIfPresent("bob"), Eq(absl::nullopt));
115 }
116
TEST(NamesCollectionTest,RemoveOfNotExistingHasNoEffect)117 TEST(NamesCollectionTest, RemoveOfNotExistingHasNoEffect) {
118 NamesCollection collection(std::vector<std::string>{"bob"});
119
120 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
121 EXPECT_THAT(collection.RemoveIfPresent("alice"), Eq(absl::nullopt));
122 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
123 }
124
TEST(NamesCollectionTest,AddRemoveAddPreserveTheIndex)125 TEST(NamesCollectionTest, AddRemoveAddPreserveTheIndex) {
126 NamesCollection collection(std::vector<std::string>{});
127
128 size_t alice_index = collection.AddIfAbsent("alice");
129 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
130
131 EXPECT_THAT(collection.RemoveIfPresent("alice"),
132 Eq(absl::optional<size_t>(alice_index)));
133 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(0)));
134
135 EXPECT_THAT(collection.AddIfAbsent("alice"), Eq(alice_index));
136 EXPECT_THAT(collection.index("alice"), Eq(alice_index));
137 EXPECT_THAT(collection.size(), Eq(static_cast<size_t>(1)));
138 }
139
TEST(NamesCollectionTest,GetKnownSizeReturnsForRemovedNames)140 TEST(NamesCollectionTest, GetKnownSizeReturnsForRemovedNames) {
141 NamesCollection collection(std::vector<std::string>{});
142
143 size_t alice_index = collection.AddIfAbsent("alice");
144 EXPECT_THAT(collection.GetKnownSize(), Eq(static_cast<size_t>(1)));
145
146 EXPECT_THAT(collection.RemoveIfPresent("alice"),
147 Eq(absl::optional<size_t>(alice_index)));
148 EXPECT_THAT(collection.GetKnownSize(), Eq(static_cast<size_t>(1)));
149 }
150
151 } // namespace
152 } // namespace webrtc
153