xref: /llvm-project/llvm/unittests/ADT/EquivalenceClassesTest.cpp (revision 7029a688c9048d02fc8a2da6d68b211e5611423a)
1f3c0aec9SMax Kazantsev //=== llvm/unittest/ADT/EquivalenceClassesTest.cpp - the structure tests --===//
2f3c0aec9SMax Kazantsev //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f3c0aec9SMax Kazantsev //
7f3c0aec9SMax Kazantsev //===----------------------------------------------------------------------===//
8f3c0aec9SMax Kazantsev 
9f3c0aec9SMax Kazantsev #include "llvm/ADT/EquivalenceClasses.h"
10f3c0aec9SMax Kazantsev #include "gtest/gtest.h"
11f3c0aec9SMax Kazantsev 
12f3c0aec9SMax Kazantsev using namespace llvm;
13f3c0aec9SMax Kazantsev 
14f3c0aec9SMax Kazantsev namespace llvm {
15f3c0aec9SMax Kazantsev 
TEST(EquivalenceClassesTest,NoMerges)16f3c0aec9SMax Kazantsev TEST(EquivalenceClassesTest, NoMerges) {
17f3c0aec9SMax Kazantsev   EquivalenceClasses<int> EqClasses;
18f3c0aec9SMax Kazantsev   // Until we merged any sets, check that every element is only equivalent to
19f3c0aec9SMax Kazantsev   // itself.
20f3c0aec9SMax Kazantsev   for (int i = 0; i < 3; i++)
21f3c0aec9SMax Kazantsev     for (int j = 0; j < 3; j++)
22f3c0aec9SMax Kazantsev       if (i == j)
23f3c0aec9SMax Kazantsev         EXPECT_TRUE(EqClasses.isEquivalent(i, j));
24f3c0aec9SMax Kazantsev       else
25f3c0aec9SMax Kazantsev         EXPECT_FALSE(EqClasses.isEquivalent(i, j));
26f3c0aec9SMax Kazantsev }
27f3c0aec9SMax Kazantsev 
TEST(EquivalenceClassesTest,SimpleMerge1)28f3c0aec9SMax Kazantsev TEST(EquivalenceClassesTest, SimpleMerge1) {
29f3c0aec9SMax Kazantsev   EquivalenceClasses<int> EqClasses;
30f3c0aec9SMax Kazantsev   // Check that once we merge (A, B), (B, C), (C, D), then all elements belong
31f3c0aec9SMax Kazantsev   // to one set.
32f3c0aec9SMax Kazantsev   EqClasses.unionSets(0, 1);
33f3c0aec9SMax Kazantsev   EqClasses.unionSets(1, 2);
34f3c0aec9SMax Kazantsev   EqClasses.unionSets(2, 3);
35f3c0aec9SMax Kazantsev   for (int i = 0; i < 4; ++i)
36f3c0aec9SMax Kazantsev     for (int j = 0; j < 4; ++j)
37f3c0aec9SMax Kazantsev       EXPECT_TRUE(EqClasses.isEquivalent(i, j));
38f3c0aec9SMax Kazantsev }
39f3c0aec9SMax Kazantsev 
TEST(EquivalenceClassesTest,SimpleMerge2)40f3c0aec9SMax Kazantsev TEST(EquivalenceClassesTest, SimpleMerge2) {
41f3c0aec9SMax Kazantsev   EquivalenceClasses<int> EqClasses;
42f3c0aec9SMax Kazantsev   // Check that once we merge (A, B), (C, D), (A, C), then all elements belong
43f3c0aec9SMax Kazantsev   // to one set.
44f3c0aec9SMax Kazantsev   EqClasses.unionSets(0, 1);
45f3c0aec9SMax Kazantsev   EqClasses.unionSets(2, 3);
46f3c0aec9SMax Kazantsev   EqClasses.unionSets(0, 2);
47f3c0aec9SMax Kazantsev   for (int i = 0; i < 4; ++i)
48f3c0aec9SMax Kazantsev     for (int j = 0; j < 4; ++j)
49f3c0aec9SMax Kazantsev       EXPECT_TRUE(EqClasses.isEquivalent(i, j));
50f3c0aec9SMax Kazantsev }
51f3c0aec9SMax Kazantsev 
TEST(EquivalenceClassesTest,TwoSets)52f3c0aec9SMax Kazantsev TEST(EquivalenceClassesTest, TwoSets) {
53f3c0aec9SMax Kazantsev   EquivalenceClasses<int> EqClasses;
54f3c0aec9SMax Kazantsev   // Form sets of odd and even numbers, check that we split them into these
55f3c0aec9SMax Kazantsev   // two sets correcrly.
56f3c0aec9SMax Kazantsev   for (int i = 0; i < 30; i += 2)
57f3c0aec9SMax Kazantsev     EqClasses.unionSets(0, i);
58f3c0aec9SMax Kazantsev   for (int i = 1; i < 30; i += 2)
59f3c0aec9SMax Kazantsev     EqClasses.unionSets(1, i);
60f3c0aec9SMax Kazantsev 
61f3c0aec9SMax Kazantsev   for (int i = 0; i < 30; i++)
62f3c0aec9SMax Kazantsev     for (int j = 0; j < 30; j++)
63f3c0aec9SMax Kazantsev       if (i % 2 == j % 2)
64f3c0aec9SMax Kazantsev         EXPECT_TRUE(EqClasses.isEquivalent(i, j));
65f3c0aec9SMax Kazantsev       else
66f3c0aec9SMax Kazantsev         EXPECT_FALSE(EqClasses.isEquivalent(i, j));
67f3c0aec9SMax Kazantsev }
68f3c0aec9SMax Kazantsev 
6906848397SMatthias Springer // Type-parameterized tests: Run the same test cases with different element
7006848397SMatthias Springer // types.
7106848397SMatthias Springer template <typename T> class ParameterizedTest : public testing::Test {};
7206848397SMatthias Springer 
7306848397SMatthias Springer TYPED_TEST_SUITE_P(ParameterizedTest);
7406848397SMatthias Springer 
TYPED_TEST_P(ParameterizedTest,MultipleSets)7506848397SMatthias Springer TYPED_TEST_P(ParameterizedTest, MultipleSets) {
7606848397SMatthias Springer   TypeParam EqClasses;
77f3c0aec9SMax Kazantsev   // Split numbers from [0, 100) into sets so that values in the same set have
78f3c0aec9SMax Kazantsev   // equal remainders (mod 17).
79f3c0aec9SMax Kazantsev   for (int i = 0; i < 100; i++)
80f3c0aec9SMax Kazantsev     EqClasses.unionSets(i % 17, i);
81f3c0aec9SMax Kazantsev 
82f3c0aec9SMax Kazantsev   for (int i = 0; i < 100; i++)
83f3c0aec9SMax Kazantsev     for (int j = 0; j < 100; j++)
84f3c0aec9SMax Kazantsev       if (i % 17 == j % 17)
85f3c0aec9SMax Kazantsev         EXPECT_TRUE(EqClasses.isEquivalent(i, j));
86f3c0aec9SMax Kazantsev       else
87f3c0aec9SMax Kazantsev         EXPECT_FALSE(EqClasses.isEquivalent(i, j));
88f3c0aec9SMax Kazantsev }
89f3c0aec9SMax Kazantsev 
9006848397SMatthias Springer namespace {
9106848397SMatthias Springer // A dummy struct for testing EquivalenceClasses with a comparator.
9206848397SMatthias Springer struct TestStruct {
TestStructllvm::__anon494d7ee70111::TestStruct9306848397SMatthias Springer   TestStruct(int value) : value(value) {}
9406848397SMatthias Springer 
operator ==llvm::__anon494d7ee70111::TestStruct9506848397SMatthias Springer   bool operator==(const TestStruct &other) const {
9606848397SMatthias Springer     return value == other.value;
9706848397SMatthias Springer   }
9806848397SMatthias Springer 
9906848397SMatthias Springer   int value;
10006848397SMatthias Springer };
10106848397SMatthias Springer // Comparator to be used in test case.
10206848397SMatthias Springer struct TestStructComparator {
operator ()llvm::__anon494d7ee70111::TestStructComparator10306848397SMatthias Springer   bool operator()(const TestStruct &lhs, const TestStruct &rhs) const {
10406848397SMatthias Springer     return lhs.value < rhs.value;
10506848397SMatthias Springer   }
10606848397SMatthias Springer };
10706848397SMatthias Springer } // namespace
10806848397SMatthias Springer 
10906848397SMatthias Springer REGISTER_TYPED_TEST_SUITE_P(ParameterizedTest, MultipleSets);
11006848397SMatthias Springer using ParamTypes =
11106848397SMatthias Springer     testing::Types<EquivalenceClasses<int>,
11206848397SMatthias Springer                    EquivalenceClasses<TestStruct, TestStructComparator>>;
11306848397SMatthias Springer INSTANTIATE_TYPED_TEST_SUITE_P(EquivalenceClassesTest, ParameterizedTest,
114*7029a688SMatthias Springer                                ParamTypes, );
11506848397SMatthias Springer 
116f3c0aec9SMax Kazantsev } // llvm
117