xref: /llvm-project/llvm/unittests/IR/ConstantRangeListTest.cpp (revision 9f10252c4ad7cffbbcf692fa9c953698f82ac4f5)
15ece35dfSHaopeng Liu //===- ConstantRangeListTest.cpp - ConstantRangeList tests ----------------===//
25ece35dfSHaopeng Liu //
35ece35dfSHaopeng Liu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ece35dfSHaopeng Liu // See https://llvm.org/LICENSE.txt for license information.
55ece35dfSHaopeng Liu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ece35dfSHaopeng Liu //
75ece35dfSHaopeng Liu //===----------------------------------------------------------------------===//
85ece35dfSHaopeng Liu 
95ece35dfSHaopeng Liu #include "llvm/IR/ConstantRangeList.h"
105ece35dfSHaopeng Liu #include "gtest/gtest.h"
115ece35dfSHaopeng Liu 
125ece35dfSHaopeng Liu using namespace llvm;
135ece35dfSHaopeng Liu 
145ece35dfSHaopeng Liu namespace {
155ece35dfSHaopeng Liu 
165ece35dfSHaopeng Liu using ConstantRangeListTest = ::testing::Test;
175ece35dfSHaopeng Liu 
TEST_F(ConstantRangeListTest,Basics)185ece35dfSHaopeng Liu TEST_F(ConstantRangeListTest, Basics) {
195ece35dfSHaopeng Liu   ConstantRangeList CRL1a;
205ece35dfSHaopeng Liu   CRL1a.insert(0, 12);
215ece35dfSHaopeng Liu   EXPECT_FALSE(CRL1a.empty());
225ece35dfSHaopeng Liu 
235ece35dfSHaopeng Liu   ConstantRangeList CRL1b;
245ece35dfSHaopeng Liu   CRL1b.insert(0, 4);
255ece35dfSHaopeng Liu   CRL1b.insert(4, 8);
265ece35dfSHaopeng Liu   CRL1b.insert(8, 12);
275ece35dfSHaopeng Liu   EXPECT_TRUE(CRL1a == CRL1b);
285ece35dfSHaopeng Liu 
295ece35dfSHaopeng Liu   ConstantRangeList CRL1c;
305ece35dfSHaopeng Liu   CRL1c.insert(0, 4);
315ece35dfSHaopeng Liu   CRL1c.insert(8, 12);
325ece35dfSHaopeng Liu   CRL1c.insert(4, 8);
335ece35dfSHaopeng Liu   EXPECT_TRUE(CRL1a == CRL1c);
345ece35dfSHaopeng Liu 
355ece35dfSHaopeng Liu   ConstantRangeList CRL2;
365ece35dfSHaopeng Liu   CRL2.insert(-4, 0);
375ece35dfSHaopeng Liu   CRL2.insert(8, 12);
385ece35dfSHaopeng Liu   EXPECT_TRUE(CRL1a != CRL2);
395ece35dfSHaopeng Liu }
405ece35dfSHaopeng Liu 
TEST_F(ConstantRangeListTest,getConstantRangeList)415ece35dfSHaopeng Liu TEST_F(ConstantRangeListTest, getConstantRangeList) {
425ece35dfSHaopeng Liu   SmallVector<ConstantRange, 2> Empty;
435ece35dfSHaopeng Liu   EXPECT_TRUE(ConstantRangeList::getConstantRangeList(Empty).has_value());
445ece35dfSHaopeng Liu 
455ece35dfSHaopeng Liu   SmallVector<ConstantRange, 2> Valid;
465ece35dfSHaopeng Liu   Valid.push_back(ConstantRange(APInt(64, 0, true), APInt(64, 4, true)));
475ece35dfSHaopeng Liu   Valid.push_back(ConstantRange(APInt(64, 8, true), APInt(64, 12, true)));
485ece35dfSHaopeng Liu   EXPECT_TRUE(ConstantRangeList::getConstantRangeList(Valid).has_value());
495ece35dfSHaopeng Liu 
505ece35dfSHaopeng Liu   SmallVector<ConstantRange, 2> Invalid1;
515ece35dfSHaopeng Liu   Invalid1.push_back(ConstantRange(APInt(64, 4, true), APInt(64, 0, true)));
525ece35dfSHaopeng Liu   EXPECT_EQ(ConstantRangeList::getConstantRangeList(Invalid1), std::nullopt);
535ece35dfSHaopeng Liu 
545ece35dfSHaopeng Liu   SmallVector<ConstantRange, 2> Invalid2;
555ece35dfSHaopeng Liu   Invalid2.push_back(ConstantRange(APInt(64, 0, true), APInt(64, 4, true)));
565ece35dfSHaopeng Liu   Invalid2.push_back(ConstantRange(APInt(64, 12, true), APInt(64, 8, true)));
575ece35dfSHaopeng Liu   EXPECT_EQ(ConstantRangeList::getConstantRangeList(Invalid2), std::nullopt);
585ece35dfSHaopeng Liu 
595ece35dfSHaopeng Liu   SmallVector<ConstantRange, 2> Invalid3;
605ece35dfSHaopeng Liu   Invalid3.push_back(ConstantRange(APInt(64, 0, true), APInt(64, 4, true)));
615ece35dfSHaopeng Liu   Invalid3.push_back(ConstantRange(APInt(64, 4, true), APInt(64, 8, true)));
625ece35dfSHaopeng Liu   EXPECT_EQ(ConstantRangeList::getConstantRangeList(Invalid3), std::nullopt);
635ece35dfSHaopeng Liu 
645ece35dfSHaopeng Liu   SmallVector<ConstantRange, 2> Invalid4;
655ece35dfSHaopeng Liu   Invalid4.push_back(ConstantRange(APInt(64, 0, true), APInt(64, 12, true)));
665ece35dfSHaopeng Liu   Invalid4.push_back(ConstantRange(APInt(64, 8, true), APInt(64, 16, true)));
675ece35dfSHaopeng Liu   EXPECT_EQ(ConstantRangeList::getConstantRangeList(Invalid4), std::nullopt);
685ece35dfSHaopeng Liu }
695ece35dfSHaopeng Liu 
TEST_F(ConstantRangeListTest,Insert)705ece35dfSHaopeng Liu TEST_F(ConstantRangeListTest, Insert) {
715ece35dfSHaopeng Liu   ConstantRangeList CRL;
725ece35dfSHaopeng Liu   CRL.insert(0, 4);
735ece35dfSHaopeng Liu   CRL.insert(8, 12);
745ece35dfSHaopeng Liu   // No overlap, left
755ece35dfSHaopeng Liu   CRL.insert(-8, -4);
765ece35dfSHaopeng Liu   // No overlap, right
775ece35dfSHaopeng Liu   CRL.insert(16, 20);
785ece35dfSHaopeng Liu   // No overlap, middle
795ece35dfSHaopeng Liu   CRL.insert(13, 15);
805ece35dfSHaopeng Liu   // Overlap with left
815ece35dfSHaopeng Liu   CRL.insert(-6, -2);
825ece35dfSHaopeng Liu   // Overlap with right
835ece35dfSHaopeng Liu   CRL.insert(5, 9);
845ece35dfSHaopeng Liu   // Overlap with left and right
855ece35dfSHaopeng Liu   CRL.insert(14, 18);
865ece35dfSHaopeng Liu   // Overlap cross ranges
875ece35dfSHaopeng Liu   CRL.insert(2, 14);
885ece35dfSHaopeng Liu   // An existing range
895ece35dfSHaopeng Liu   CRL.insert(0, 20);
905ece35dfSHaopeng Liu 
915ece35dfSHaopeng Liu   ConstantRangeList Expected;
925ece35dfSHaopeng Liu   Expected.insert(-8, -2);
935ece35dfSHaopeng Liu   Expected.insert(0, 20);
945ece35dfSHaopeng Liu   EXPECT_TRUE(CRL == Expected);
955ece35dfSHaopeng Liu }
965ece35dfSHaopeng Liu 
GetCRL(ArrayRef<std::pair<APInt,APInt>> Pairs)97e6c22169SHaopeng Liu ConstantRangeList GetCRL(ArrayRef<std::pair<APInt, APInt>> Pairs) {
98e6c22169SHaopeng Liu   SmallVector<ConstantRange, 2> Ranges;
99e6c22169SHaopeng Liu   for (auto &[Start, End] : Pairs)
100e6c22169SHaopeng Liu     Ranges.push_back(ConstantRange(Start, End));
101e6c22169SHaopeng Liu   return ConstantRangeList(Ranges);
102e6c22169SHaopeng Liu }
103e6c22169SHaopeng Liu 
TEST_F(ConstantRangeListTest,Subtract)104*9f10252cSHaopeng Liu TEST_F(ConstantRangeListTest, Subtract) {
105*9f10252cSHaopeng Liu   APInt AP0 = APInt(64, 0, /*isSigned=*/true);
106*9f10252cSHaopeng Liu   APInt AP2 = APInt(64, 2, /*isSigned=*/true);
107*9f10252cSHaopeng Liu   APInt AP3 = APInt(64, 3, /*isSigned=*/true);
108*9f10252cSHaopeng Liu   APInt AP4 = APInt(64, 4, /*isSigned=*/true);
109*9f10252cSHaopeng Liu   APInt AP8 = APInt(64, 8, /*isSigned=*/true);
110*9f10252cSHaopeng Liu   APInt AP10 = APInt(64, 10, /*isSigned=*/true);
111*9f10252cSHaopeng Liu   APInt AP11 = APInt(64, 11, /*isSigned=*/true);
112*9f10252cSHaopeng Liu   APInt AP12 = APInt(64, 12, /*isSigned=*/true);
113*9f10252cSHaopeng Liu   ConstantRangeList CRL = GetCRL({{AP0, AP4}, {AP8, AP12}});
114*9f10252cSHaopeng Liu 
115*9f10252cSHaopeng Liu   // Execute ConstantRangeList::subtract(ConstantRange) and check the result
116*9f10252cSHaopeng Liu   // is expected. Pass "CRL" by value so that subtract() does not affect the
117*9f10252cSHaopeng Liu   // argument in caller.
118*9f10252cSHaopeng Liu   auto SubtractAndCheck = [](ConstantRangeList CRL,
119*9f10252cSHaopeng Liu                              const std::pair<int64_t, int64_t> &Range,
120*9f10252cSHaopeng Liu                              const ConstantRangeList &ExpectedCRL) {
121*9f10252cSHaopeng Liu     CRL.subtract(ConstantRange(APInt(64, Range.first, /*isSigned=*/true),
122*9f10252cSHaopeng Liu                                APInt(64, Range.second, /*isSigned=*/true)));
123*9f10252cSHaopeng Liu     EXPECT_EQ(CRL, ExpectedCRL);
124*9f10252cSHaopeng Liu   };
125*9f10252cSHaopeng Liu 
126*9f10252cSHaopeng Liu   // No overlap
127*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {-4, 0}, CRL);
128*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {4, 8}, CRL);
129*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {12, 16}, CRL);
130*9f10252cSHaopeng Liu 
131*9f10252cSHaopeng Liu   // Overlap (left, right, or both)
132*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {-4, 2}, GetCRL({{AP2, AP4}, {AP8, AP12}}));
133*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {-4, 4}, GetCRL({{AP8, AP12}}));
134*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {-4, 8}, GetCRL({{AP8, AP12}}));
135*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {0, 2}, GetCRL({{AP2, AP4}, {AP8, AP12}}));
136*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {0, 4}, GetCRL({{AP8, AP12}}));
137*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {0, 8}, GetCRL({{AP8, AP12}}));
138*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {10, 12}, GetCRL({{AP0, AP4}, {AP8, AP10}}));
139*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {8, 12}, GetCRL({{AP0, AP4}}));
140*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {6, 12}, GetCRL({{AP0, AP4}}));
141*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {10, 16}, GetCRL({{AP0, AP4}, {AP8, AP10}}));
142*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {8, 16}, GetCRL({{AP0, AP4}}));
143*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {6, 16}, GetCRL({{AP0, AP4}}));
144*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {2, 10}, GetCRL({{AP0, AP2}, {AP10, AP12}}));
145*9f10252cSHaopeng Liu 
146*9f10252cSHaopeng Liu   // Subset
147*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {2, 3}, GetCRL({{AP0, AP2}, {AP3, AP4}, {AP8, AP12}}));
148*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {10, 11},
149*9f10252cSHaopeng Liu                    GetCRL({{AP0, AP4}, {AP8, AP10}, {AP11, AP12}}));
150*9f10252cSHaopeng Liu 
151*9f10252cSHaopeng Liu   // Superset
152*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {0, 12}, GetCRL({}));
153*9f10252cSHaopeng Liu   SubtractAndCheck(CRL, {-4, 16}, GetCRL({}));
154*9f10252cSHaopeng Liu }
155*9f10252cSHaopeng Liu 
TEST_F(ConstantRangeListTest,Union)156e6c22169SHaopeng Liu TEST_F(ConstantRangeListTest, Union) {
157e6c22169SHaopeng Liu   APInt APN4 = APInt(64, -4, /*isSigned=*/true);
158e6c22169SHaopeng Liu   APInt APN2 = APInt(64, -2, /*isSigned=*/true);
159e6c22169SHaopeng Liu   APInt AP0 = APInt(64, 0, /*isSigned=*/true);
160e6c22169SHaopeng Liu   APInt AP2 = APInt(64, 2, /*isSigned=*/true);
161e6c22169SHaopeng Liu   APInt AP4 = APInt(64, 4, /*isSigned=*/true);
162e6c22169SHaopeng Liu   APInt AP6 = APInt(64, 6, /*isSigned=*/true);
163e6c22169SHaopeng Liu   APInt AP7 = APInt(64, 7, /*isSigned=*/true);
164e6c22169SHaopeng Liu   APInt AP8 = APInt(64, 8, /*isSigned=*/true);
165e6c22169SHaopeng Liu   APInt AP10 = APInt(64, 10, /*isSigned=*/true);
166e6c22169SHaopeng Liu   APInt AP11 = APInt(64, 11, /*isSigned=*/true);
167e6c22169SHaopeng Liu   APInt AP12 = APInt(64, 12, /*isSigned=*/true);
168e6c22169SHaopeng Liu   APInt AP16 = APInt(64, 16, /*isSigned=*/true);
169e6c22169SHaopeng Liu   APInt AP18 = APInt(64, 18, /*isSigned=*/true);
170e6c22169SHaopeng Liu   ConstantRangeList CRL = GetCRL({{AP0, AP4}, {AP8, AP12}});
171e6c22169SHaopeng Liu 
172e6c22169SHaopeng Liu   // Union with a subset.
173e6c22169SHaopeng Liu   ConstantRangeList Empty;
174e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(Empty), CRL);
175e6c22169SHaopeng Liu   EXPECT_EQ(Empty.unionWith(CRL), CRL);
176e6c22169SHaopeng Liu 
177e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP0, AP2}})), CRL);
178e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP10, AP12}})), CRL);
179e6c22169SHaopeng Liu 
180e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP0, AP2}, {AP8, AP10}})), CRL);
181e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP0, AP2}, {AP10, AP12}})), CRL);
182e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP2, AP4}, {AP8, AP10}})), CRL);
183e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP2, AP4}, {AP10, AP12}})), CRL);
184e6c22169SHaopeng Liu 
185e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP0, AP4}, {AP8, AP10}, {AP11, AP12}})),
186e6c22169SHaopeng Liu             CRL);
187e6c22169SHaopeng Liu 
188e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(CRL), CRL);
189e6c22169SHaopeng Liu 
190e6c22169SHaopeng Liu   // Union with new ranges.
191e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{APN4, APN2}})),
192e6c22169SHaopeng Liu             GetCRL({{APN4, APN2}, {AP0, AP4}, {AP8, AP12}}));
193e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP6, AP7}})),
194e6c22169SHaopeng Liu             GetCRL({{AP0, AP4}, {AP6, AP7}, {AP8, AP12}}));
195e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP16, AP18}})),
196e6c22169SHaopeng Liu             GetCRL({{AP0, AP4}, {AP8, AP12}, {AP16, AP18}}));
197e6c22169SHaopeng Liu 
198e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{APN2, AP2}})),
199e6c22169SHaopeng Liu             GetCRL({{APN2, AP4}, {AP8, AP12}}));
200e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP2, AP6}})),
201e6c22169SHaopeng Liu             GetCRL({{AP0, AP6}, {AP8, AP12}}));
202e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP10, AP16}})),
203e6c22169SHaopeng Liu             GetCRL({{AP0, AP4}, {AP8, AP16}}));
204e6c22169SHaopeng Liu 
205e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{APN2, AP10}})), GetCRL({{APN2, AP12}}));
206e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP2, AP10}})), GetCRL({{AP0, AP12}}));
207e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{AP4, AP16}})), GetCRL({{AP0, AP16}}));
208e6c22169SHaopeng Liu   EXPECT_EQ(CRL.unionWith(GetCRL({{APN2, AP16}})), GetCRL({{APN2, AP16}}));
209e6c22169SHaopeng Liu }
210e6c22169SHaopeng Liu 
TEST_F(ConstantRangeListTest,Intersect)211e6c22169SHaopeng Liu TEST_F(ConstantRangeListTest, Intersect) {
212e6c22169SHaopeng Liu   APInt APN2 = APInt(64, -2, /*isSigned=*/true);
213e6c22169SHaopeng Liu   APInt AP0 = APInt(64, 0, /*isSigned=*/true);
214e6c22169SHaopeng Liu   APInt AP2 = APInt(64, 2, /*isSigned=*/true);
215e6c22169SHaopeng Liu   APInt AP4 = APInt(64, 4, /*isSigned=*/true);
216e6c22169SHaopeng Liu   APInt AP6 = APInt(64, 6, /*isSigned=*/true);
217e6c22169SHaopeng Liu   APInt AP7 = APInt(64, 7, /*isSigned=*/true);
218e6c22169SHaopeng Liu   APInt AP8 = APInt(64, 8, /*isSigned=*/true);
219e6c22169SHaopeng Liu   APInt AP10 = APInt(64, 10, /*isSigned=*/true);
220e6c22169SHaopeng Liu   APInt AP11 = APInt(64, 11, /*isSigned=*/true);
221e6c22169SHaopeng Liu   APInt AP12 = APInt(64, 12, /*isSigned=*/true);
222e6c22169SHaopeng Liu   APInt AP16 = APInt(64, 16, /*isSigned=*/true);
223e6c22169SHaopeng Liu   ConstantRangeList CRL = GetCRL({{AP0, AP4}, {AP8, AP12}});
224e6c22169SHaopeng Liu 
225e6c22169SHaopeng Liu   // No intersection.
226e6c22169SHaopeng Liu   ConstantRangeList Empty;
227e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(Empty), Empty);
228e6c22169SHaopeng Liu   EXPECT_EQ(Empty.intersectWith(CRL), Empty);
229e6c22169SHaopeng Liu 
230e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP0}})), Empty);
231e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP6, AP8}})), Empty);
232e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP12, AP16}})), Empty);
233e6c22169SHaopeng Liu 
234e6c22169SHaopeng Liu   // Single intersect range.
235e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP2}})), GetCRL({{AP0, AP2}}));
236e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP6}})), GetCRL({{AP0, AP4}}));
237e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP2, AP4}})), GetCRL({{AP2, AP4}}));
238e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP2, AP6}})), GetCRL({{AP2, AP4}}));
239e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP6, AP10}})), GetCRL({{AP8, AP10}}));
240e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP6, AP16}})), GetCRL({{AP8, AP12}}));
241e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP10, AP12}})), GetCRL({{AP10, AP12}}));
242e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP10, AP16}})), GetCRL({{AP10, AP12}}));
243e6c22169SHaopeng Liu 
244e6c22169SHaopeng Liu   // Multiple intersect ranges.
245e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP10}})),
246e6c22169SHaopeng Liu             GetCRL({{AP0, AP4}, {AP8, AP10}}));
247e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP16}})), CRL);
248e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP2, AP10}})),
249e6c22169SHaopeng Liu             GetCRL({{AP2, AP4}, {AP8, AP10}}));
250e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP2, AP16}})),
251e6c22169SHaopeng Liu             GetCRL({{AP2, AP4}, {AP8, AP12}}));
252e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP2}, {AP6, AP10}})),
253e6c22169SHaopeng Liu             GetCRL({{AP0, AP2}, {AP8, AP10}}));
254e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{AP2, AP6}, {AP10, AP16}})),
255e6c22169SHaopeng Liu             GetCRL({{AP2, AP4}, {AP10, AP12}}));
256e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(GetCRL({{APN2, AP2}, {AP7, AP10}, {AP11, AP16}})),
257e6c22169SHaopeng Liu             GetCRL({{AP0, AP2}, {AP8, AP10}, {AP11, AP12}}));
258e6c22169SHaopeng Liu   EXPECT_EQ(CRL.intersectWith(CRL), CRL);
259e6c22169SHaopeng Liu }
260e6c22169SHaopeng Liu 
2615ece35dfSHaopeng Liu } // anonymous namespace
262