117 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
//=== llvm/unittest/ADT/EquivalenceClassesTest.cpp - the structure tests --===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "llvm/ADT/EquivalenceClasses.h"
 | 
						|
#include "gtest/gtest.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
 | 
						|
TEST(EquivalenceClassesTest, NoMerges) {
 | 
						|
  EquivalenceClasses<int> EqClasses;
 | 
						|
  // Until we merged any sets, check that every element is only equivalent to
 | 
						|
  // itself.
 | 
						|
  for (int i = 0; i < 3; i++)
 | 
						|
    for (int j = 0; j < 3; j++)
 | 
						|
      if (i == j)
 | 
						|
        EXPECT_TRUE(EqClasses.isEquivalent(i, j));
 | 
						|
      else
 | 
						|
        EXPECT_FALSE(EqClasses.isEquivalent(i, j));
 | 
						|
}
 | 
						|
 | 
						|
TEST(EquivalenceClassesTest, SimpleMerge1) {
 | 
						|
  EquivalenceClasses<int> EqClasses;
 | 
						|
  // Check that once we merge (A, B), (B, C), (C, D), then all elements belong
 | 
						|
  // to one set.
 | 
						|
  EqClasses.unionSets(0, 1);
 | 
						|
  EqClasses.unionSets(1, 2);
 | 
						|
  EqClasses.unionSets(2, 3);
 | 
						|
  for (int i = 0; i < 4; ++i)
 | 
						|
    for (int j = 0; j < 4; ++j)
 | 
						|
      EXPECT_TRUE(EqClasses.isEquivalent(i, j));
 | 
						|
}
 | 
						|
 | 
						|
TEST(EquivalenceClassesTest, SimpleMerge2) {
 | 
						|
  EquivalenceClasses<int> EqClasses;
 | 
						|
  // Check that once we merge (A, B), (C, D), (A, C), then all elements belong
 | 
						|
  // to one set.
 | 
						|
  EqClasses.unionSets(0, 1);
 | 
						|
  EqClasses.unionSets(2, 3);
 | 
						|
  EqClasses.unionSets(0, 2);
 | 
						|
  for (int i = 0; i < 4; ++i)
 | 
						|
    for (int j = 0; j < 4; ++j)
 | 
						|
      EXPECT_TRUE(EqClasses.isEquivalent(i, j));
 | 
						|
}
 | 
						|
 | 
						|
TEST(EquivalenceClassesTest, TwoSets) {
 | 
						|
  EquivalenceClasses<int> EqClasses;
 | 
						|
  // Form sets of odd and even numbers, check that we split them into these
 | 
						|
  // two sets correcrly.
 | 
						|
  for (int i = 0; i < 30; i += 2)
 | 
						|
    EqClasses.unionSets(0, i);
 | 
						|
  for (int i = 1; i < 30; i += 2)
 | 
						|
    EqClasses.unionSets(1, i);
 | 
						|
 | 
						|
  for (int i = 0; i < 30; i++)
 | 
						|
    for (int j = 0; j < 30; j++)
 | 
						|
      if (i % 2 == j % 2)
 | 
						|
        EXPECT_TRUE(EqClasses.isEquivalent(i, j));
 | 
						|
      else
 | 
						|
        EXPECT_FALSE(EqClasses.isEquivalent(i, j));
 | 
						|
}
 | 
						|
 | 
						|
// Type-parameterized tests: Run the same test cases with different element
 | 
						|
// types.
 | 
						|
template <typename T> class ParameterizedTest : public testing::Test {};
 | 
						|
 | 
						|
TYPED_TEST_SUITE_P(ParameterizedTest);
 | 
						|
 | 
						|
TYPED_TEST_P(ParameterizedTest, MultipleSets) {
 | 
						|
  TypeParam EqClasses;
 | 
						|
  // Split numbers from [0, 100) into sets so that values in the same set have
 | 
						|
  // equal remainders (mod 17).
 | 
						|
  for (int i = 0; i < 100; i++)
 | 
						|
    EqClasses.unionSets(i % 17, i);
 | 
						|
 | 
						|
  for (int i = 0; i < 100; i++)
 | 
						|
    for (int j = 0; j < 100; j++)
 | 
						|
      if (i % 17 == j % 17)
 | 
						|
        EXPECT_TRUE(EqClasses.isEquivalent(i, j));
 | 
						|
      else
 | 
						|
        EXPECT_FALSE(EqClasses.isEquivalent(i, j));
 | 
						|
}
 | 
						|
 | 
						|
namespace {
 | 
						|
// A dummy struct for testing EquivalenceClasses with a comparator.
 | 
						|
struct TestStruct {
 | 
						|
  TestStruct(int value) : value(value) {}
 | 
						|
 | 
						|
  bool operator==(const TestStruct &other) const {
 | 
						|
    return value == other.value;
 | 
						|
  }
 | 
						|
 | 
						|
  int value;
 | 
						|
};
 | 
						|
// Comparator to be used in test case.
 | 
						|
struct TestStructComparator {
 | 
						|
  bool operator()(const TestStruct &lhs, const TestStruct &rhs) const {
 | 
						|
    return lhs.value < rhs.value;
 | 
						|
  }
 | 
						|
};
 | 
						|
} // namespace
 | 
						|
 | 
						|
REGISTER_TYPED_TEST_SUITE_P(ParameterizedTest, MultipleSets);
 | 
						|
using ParamTypes =
 | 
						|
    testing::Types<EquivalenceClasses<int>,
 | 
						|
                   EquivalenceClasses<TestStruct, TestStructComparator>>;
 | 
						|
INSTANTIATE_TYPED_TEST_SUITE_P(EquivalenceClassesTest, ParameterizedTest,
 | 
						|
                               ParamTypes, );
 | 
						|
 | 
						|
} // llvm
 |