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