• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <vector>
17 
18 #include "util/int_set.h"
19 
20 #include "util/tests/verifier_test.h"
21 
22 #include <gtest/gtest.h>
23 
24 namespace panda::verifier::test {
25 
TEST_F(VerifierTest,IntSetBase)26 TEST_F(VerifierTest, IntSetBase)
27 {
28     IntSet<size_t> iset;
29 
30     EXPECT_EQ(iset.Size(), 0);
31 
32     iset.Insert(5);
33 
34     EXPECT_EQ(iset.Size(), 1);
35     EXPECT_TRUE(iset.Contains(5));
36     EXPECT_FALSE(iset.Contains(3));
37 
38     std::vector<size_t> v {1, 5, 3};
39     iset.Insert(v.begin(), v.begin() + 2);
40 
41     EXPECT_EQ(iset.Size(), 2);
42     EXPECT_TRUE(iset.Contains(1));
43     EXPECT_TRUE(iset.Contains(5));
44     EXPECT_FALSE(iset.Contains(3));
45 
46     IntSet<size_t> iset1 = iset;
47     IntSet<size_t> iset2;
48     iset2.Insert(v.begin(), v.end());
49 
50     EXPECT_EQ(iset1.Size(), 2);
51     EXPECT_TRUE(iset1.Contains(1));
52     EXPECT_TRUE(iset1.Contains(5));
53     EXPECT_FALSE(iset1.Contains(3));
54 
55     EXPECT_EQ(iset2.Size(), 3);
56     EXPECT_TRUE(iset2.Contains(1));
57     EXPECT_TRUE(iset2.Contains(5));
58     EXPECT_TRUE(iset2.Contains(3));
59 
60     EXPECT_EQ(iset, iset1);
61     EXPECT_NE(iset, iset2);
62 }
63 
TEST_F(VerifierTest,IntSetInteraction)64 TEST_F(VerifierTest, IntSetInteraction)
65 {
66     std::vector<size_t> v {1, 5, 3};
67 
68     IntSet<size_t> iset1;
69     IntSet<size_t> iset2;
70     iset1.Insert(v.begin(), v.begin() + 2);
71     iset1.Insert(8);
72     iset2.Insert(v.begin(), v.end());
73 
74     EXPECT_NE(iset1, iset2);
75 
76     auto iset3 = iset1 & iset2;
77     auto iset4 = iset1 | iset2;
78     auto iset5 = iset1;
79     auto iset6 = iset2;
80     iset5 &= iset2;
81     iset6 |= iset1;
82 
83     EXPECT_EQ(iset3.Size(), 2);
84     EXPECT_TRUE(iset3.Contains(1));
85     EXPECT_TRUE(iset3.Contains(5));
86     EXPECT_FALSE(iset3.Contains(3));
87     EXPECT_FALSE(iset3.Contains(8));
88 
89     EXPECT_EQ(iset4.Size(), 4);
90     EXPECT_TRUE(iset4.Contains(1));
91     EXPECT_TRUE(iset4.Contains(5));
92     EXPECT_TRUE(iset4.Contains(3));
93     EXPECT_TRUE(iset4.Contains(8));
94 
95     EXPECT_EQ(iset3, iset5);
96     EXPECT_EQ(iset4, iset6);
97 
98     auto li = iset1.LazyIntersect(iset2);
99 
100     EXPECT_EQ(static_cast<size_t>(li()), 1U);
101     EXPECT_EQ(static_cast<size_t>(li()), 5U);
102     EXPECT_FALSE(static_cast<bool>(li()));
103 
104     EXPECT_EQ(iset3, iset5);
105 
106     int res = 0;
107     iset1.ForAll([&res](int x) {
108         res += x;
109         return true;
110     });
111 
112     EXPECT_EQ(res, 14);
113 
114     auto stream = iset1.AsStream();
115 
116     EXPECT_EQ(static_cast<size_t>(stream()), 1U);
117     EXPECT_EQ(static_cast<size_t>(stream()), 5U);
118     EXPECT_EQ(static_cast<size_t>(stream()), 8U);
119     EXPECT_FALSE(static_cast<bool>(stream()));
120 }
121 
122 }  // namespace panda::verifier::test