1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/flat_set.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include <random>
20*6dbdd20aSAndroid Build Coastguard Worker #include <set>
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Worker using testing::ElementsAre;
25*6dbdd20aSAndroid Build Coastguard Worker using testing::ElementsAreArray;
26*6dbdd20aSAndroid Build Coastguard Worker
27*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
28*6dbdd20aSAndroid Build Coastguard Worker namespace base {
29*6dbdd20aSAndroid Build Coastguard Worker namespace {
30*6dbdd20aSAndroid Build Coastguard Worker
TEST(FlatSetTest,InsertAndLookup)31*6dbdd20aSAndroid Build Coastguard Worker TEST(FlatSetTest, InsertAndLookup) {
32*6dbdd20aSAndroid Build Coastguard Worker FlatSet<long> flat_set;
33*6dbdd20aSAndroid Build Coastguard Worker for (int i = 0; i < 3; i++) {
34*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.empty());
35*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.size(), 0u);
36*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.begin(), flat_set.end());
37*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(flat_set.count(42));
38*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.find(42), flat_set.end());
39*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.find(42), flat_set.begin());
40*6dbdd20aSAndroid Build Coastguard Worker
41*6dbdd20aSAndroid Build Coastguard Worker auto it_and_inserted = flat_set.insert(1);
42*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(it_and_inserted.first, flat_set.find(1));
43*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(it_and_inserted.second);
44*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(flat_set.empty());
45*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.size(), 1u);
46*6dbdd20aSAndroid Build Coastguard Worker {
47*6dbdd20aSAndroid Build Coastguard Worker auto it = flat_set.find(1);
48*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(it, flat_set.begin());
49*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(it, flat_set.end());
50*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(*it, 1);
51*6dbdd20aSAndroid Build Coastguard Worker }
52*6dbdd20aSAndroid Build Coastguard Worker
53*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.count(1));
54*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(flat_set.begin(), flat_set.end());
55*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(std::distance(flat_set.begin(), flat_set.end()), 1);
56*6dbdd20aSAndroid Build Coastguard Worker
57*6dbdd20aSAndroid Build Coastguard Worker it_and_inserted = flat_set.insert(1);
58*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(it_and_inserted.first, flat_set.find(1));
59*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(it_and_inserted.second);
60*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.size(), 1u);
61*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.count(1));
62*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(flat_set.count(0));
63*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(flat_set.count(-1));
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.erase(1));
66*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(flat_set.count(1));
67*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.size(), 0u);
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.insert(7).second);
70*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.insert(-4).second);
71*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.insert(11).second);
72*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.insert(-13).second);
73*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.count(7));
74*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.count(-4));
75*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.count(11));
76*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.count(-13));
77*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(flat_set, ElementsAre(-13, -4, 7, 11));
78*6dbdd20aSAndroid Build Coastguard Worker
79*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.erase(-4));
80*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(flat_set.erase(7));
81*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(flat_set, ElementsAre(-13, 11));
82*6dbdd20aSAndroid Build Coastguard Worker
83*6dbdd20aSAndroid Build Coastguard Worker flat_set.clear();
84*6dbdd20aSAndroid Build Coastguard Worker }
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Worker // Test that the initializer-ctor dedupes entries.
87*6dbdd20aSAndroid Build Coastguard Worker flat_set = FlatSet<long>({1, 2, 1, 2, 3});
88*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_set.size(), 3u);
89*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(flat_set, ElementsAre(1, 2, 3));
90*6dbdd20aSAndroid Build Coastguard Worker }
91*6dbdd20aSAndroid Build Coastguard Worker
TEST(FlatSetTest,GoldenTest)92*6dbdd20aSAndroid Build Coastguard Worker TEST(FlatSetTest, GoldenTest) {
93*6dbdd20aSAndroid Build Coastguard Worker FlatSet<int> flat_set;
94*6dbdd20aSAndroid Build Coastguard Worker std::set<int> gold_set;
95*6dbdd20aSAndroid Build Coastguard Worker static std::minstd_rand rng(0);
96*6dbdd20aSAndroid Build Coastguard Worker std::uniform_int_distribution<int> int_dist(-200, 200);
97*6dbdd20aSAndroid Build Coastguard Worker
98*6dbdd20aSAndroid Build Coastguard Worker for (int i = 0; i < 10000; i++) {
99*6dbdd20aSAndroid Build Coastguard Worker const int val = int_dist(rng);
100*6dbdd20aSAndroid Build Coastguard Worker if (i % 3) {
101*6dbdd20aSAndroid Build Coastguard Worker auto flat_result = flat_set.insert(val);
102*6dbdd20aSAndroid Build Coastguard Worker auto gold_result = gold_set.insert(val);
103*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_result.first, flat_set.find(val));
104*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(gold_result.first, gold_set.find(val));
105*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(flat_result.second, gold_result.second);
106*6dbdd20aSAndroid Build Coastguard Worker } else {
107*6dbdd20aSAndroid Build Coastguard Worker flat_set.erase(val);
108*6dbdd20aSAndroid Build Coastguard Worker gold_set.erase(val);
109*6dbdd20aSAndroid Build Coastguard Worker }
110*6dbdd20aSAndroid Build Coastguard Worker ASSERT_EQ(flat_set.size(), gold_set.size());
111*6dbdd20aSAndroid Build Coastguard Worker }
112*6dbdd20aSAndroid Build Coastguard Worker
113*6dbdd20aSAndroid Build Coastguard Worker EXPECT_THAT(flat_set, ElementsAreArray(gold_set));
114*6dbdd20aSAndroid Build Coastguard Worker }
115*6dbdd20aSAndroid Build Coastguard Worker
116*6dbdd20aSAndroid Build Coastguard Worker } // namespace
117*6dbdd20aSAndroid Build Coastguard Worker } // namespace base
118*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
119