//===- llvm/unittest/ADT/DenseSetTest.cpp - DenseSet unit tests --*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "gtest/gtest.h" #include "llvm/ADT/DenseSet.h" using namespace llvm; namespace { // Test fixture class DenseSetTest : public testing::Test { }; // Test hashing with a set of only two entries. TEST_F(DenseSetTest, DoubleEntrySetTest) { llvm::DenseSet<unsigned> set(2); set.insert(0); set.insert(1); // Original failure was an infinite loop in this call: EXPECT_EQ(0u, set.count(2)); } struct TestDenseSetInfo { static inline unsigned getEmptyKey() { return ~0; } static inline unsigned getTombstoneKey() { return ~0U - 1; } static unsigned getHashValue(const unsigned& Val) { return Val * 37U; } static unsigned getHashValue(const char* Val) { return (unsigned)(Val[0] - 'a') * 37U; } static bool isEqual(const unsigned& LHS, const unsigned& RHS) { return LHS == RHS; } static bool isEqual(const char* LHS, const unsigned& RHS) { return (unsigned)(LHS[0] - 'a') == RHS; } }; TEST(DenseSetCustomTest, FindAsTest) { DenseSet<unsigned, TestDenseSetInfo> set; set.insert(0); set.insert(1); set.insert(2); // Size tests EXPECT_EQ(3u, set.size()); // Normal lookup tests EXPECT_EQ(1u, set.count(1)); EXPECT_EQ(0u, *set.find(0)); EXPECT_EQ(1u, *set.find(1)); EXPECT_EQ(2u, *set.find(2)); EXPECT_TRUE(set.find(3) == set.end()); // find_as() tests EXPECT_EQ(0u, *set.find_as("a")); EXPECT_EQ(1u, *set.find_as("b")); EXPECT_EQ(2u, *set.find_as("c")); EXPECT_TRUE(set.find_as("d") == set.end()); } }