diff --git a/Makefile b/Makefile index cfb4c1258ed..5987b88f773 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ else OPTIONAL_DIRS := examples projects bindings endif -EXTRA_DIST := test llvm.spec include win32 Xcode +EXTRA_DIST := test unittests llvm.spec include win32 Xcode include $(LEVEL)/Makefile.config @@ -54,6 +54,11 @@ ifeq ($(MAKECMDGOALS),tools-only) OPTIONAL_DIRS := endif +ifeq ($(MAKECMDGOALS),unittests) + DIRS := $(filter-out tools runtime docs, $(DIRS)) utils unittests + OPTIONAL_DIRS := +endif + # Don't install utils, examples, or projects they are only used to # build LLVM. ifeq ($(MAKECMDGOALS),install) @@ -111,6 +116,7 @@ dist-hook:: tools-only: all libs-only: all install-libs: install +unittests: all #------------------------------------------------------------------------ # Make sure the generated headers are up-to-date. This must be kept in diff --git a/unittests/ADT/DenseMapTest.cpp b/unittests/ADT/DenseMapTest.cpp new file mode 100644 index 00000000000..dff0aff9b3e --- /dev/null +++ b/unittests/ADT/DenseMapTest.cpp @@ -0,0 +1,167 @@ +//===- llvm/unittest/ADT/DenseMapMap.cpp - DenseMap 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/DenseMap.h" + +using namespace llvm; + +namespace { + +// Test fixture +class DenseMapTest : public testing::Test { +protected: + DenseMap uintMap; + DenseMap uintPtrMap; + uint32_t dummyInt; +}; + +// Empty map tests +TEST_F(DenseMapTest, EmptyIntMapTest) { + // Size tests + EXPECT_EQ(0u, uintMap.size()); + EXPECT_TRUE(uintMap.empty()); + + // Iterator tests + EXPECT_TRUE(uintMap.begin() == uintMap.end()); + + // Lookup tests + EXPECT_FALSE(uintMap.count(0u)); + EXPECT_TRUE(uintMap.find(0u) == uintMap.end()); + EXPECT_EQ(0u, uintMap.lookup(0u)); +} + +// Empty map tests for pointer map +TEST_F(DenseMapTest, EmptyPtrMapTest) { + // Size tests + EXPECT_EQ(0u, uintPtrMap.size()); + EXPECT_TRUE(uintPtrMap.empty()); + + // Iterator tests + EXPECT_TRUE(uintPtrMap.begin() == uintPtrMap.end()); + + // Lookup tests + EXPECT_FALSE(uintPtrMap.count(&dummyInt)); + EXPECT_TRUE(uintPtrMap.find(&dummyInt) == uintPtrMap.begin()); + EXPECT_EQ(0, uintPtrMap.lookup(&dummyInt)); +} + +// Constant map tests +TEST_F(DenseMapTest, ConstEmptyMapTest) { + const DenseMap & constUintMap = uintMap; + const DenseMap & constUintPtrMap = uintPtrMap; + EXPECT_EQ(0u, constUintMap.size()); + EXPECT_EQ(0u, constUintPtrMap.size()); + EXPECT_TRUE(constUintMap.empty()); + EXPECT_TRUE(constUintPtrMap.empty()); + EXPECT_TRUE(constUintMap.begin() == constUintMap.end()); + EXPECT_TRUE(constUintPtrMap.begin() == constUintPtrMap.end()); +} + +// A map with a single entry +TEST_F(DenseMapTest, SingleEntryMapTest) { + uintMap[0] = 1; + + // Size tests + EXPECT_EQ(1u, uintMap.size()); + EXPECT_FALSE(uintMap.begin() == uintMap.end()); + EXPECT_FALSE(uintMap.empty()); + + // Iterator tests + DenseMap::iterator it = uintMap.begin(); + EXPECT_EQ(0u, it->first); + EXPECT_EQ(1u, it->second); + ++it; + EXPECT_TRUE(it == uintMap.end()); + + // Lookup tests + EXPECT_TRUE(uintMap.count(0u)); + EXPECT_TRUE(uintMap.find(0u) == uintMap.begin()); + EXPECT_EQ(1u, uintMap.lookup(0u)); + EXPECT_EQ(1u, uintMap[0]); +} + +// Test clear() method +TEST_F(DenseMapTest, ClearTest) { + uintMap[0] = 1; + uintMap.clear(); + + EXPECT_EQ(0u, uintMap.size()); + EXPECT_TRUE(uintMap.empty()); + EXPECT_TRUE(uintMap.begin() == uintMap.end()); +} + +// Test erase(iterator) method +TEST_F(DenseMapTest, EraseTest) { + uintMap[0] = 1; + uintMap.erase(uintMap.begin()); + + EXPECT_EQ(0u, uintMap.size()); + EXPECT_TRUE(uintMap.empty()); + EXPECT_TRUE(uintMap.begin() == uintMap.end()); +} + +// Test erase(value) method +TEST_F(DenseMapTest, EraseTest2) { + uintMap[0] = 1; + uintMap.erase(0); + + EXPECT_EQ(0u, uintMap.size()); + EXPECT_TRUE(uintMap.empty()); + EXPECT_TRUE(uintMap.begin() == uintMap.end()); +} + +// Test insert() method +TEST_F(DenseMapTest, InsertTest) { + uintMap.insert(std::make_pair(0u, 1u)); + EXPECT_EQ(1u, uintMap.size()); + EXPECT_EQ(1u, uintMap[0]); +} + +// Test copy constructor method +TEST_F(DenseMapTest, AssignmentTest) { + uintMap[0] = 1; + DenseMap copyMap(uintMap); + + EXPECT_EQ(1u, copyMap.size()); + EXPECT_EQ(1u, copyMap[0]); +} + +// Test assignment operator method +TEST_F(DenseMapTest, CopyConstructorTest) { + uintMap[0] = 1; + DenseMap copyMap = uintMap; + + EXPECT_EQ(1u, copyMap.size()); + EXPECT_EQ(1u, copyMap[0]); +} + +// A more complex iteration test +TEST_F(DenseMapTest, IterationTest) { + bool visited[100]; + + // Insert 100 numbers into the map + for (int i = 0; i < 100; ++i) { + visited[i] = false; + uintMap[i] = 3; + } + + // Iterate over all numbers and mark each one found. + for (DenseMap::iterator it = uintMap.begin(); + it != uintMap.end(); ++it) { + visited[it->first] = true; + } + + // Ensure every number was visited. + for (int i = 0; i < 100; ++i) { + EXPECT_EQ(true, visited[i]); + } +} + +} diff --git a/unittests/ADT/Makefile b/unittests/ADT/Makefile new file mode 100644 index 00000000000..c56b9517049 --- /dev/null +++ b/unittests/ADT/Makefile @@ -0,0 +1,15 @@ +##===- unittests/ADT/Makefile ------------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../.. +TESTNAME = ADT +LINK_COMPONENTS := core support + +include $(LEVEL)/Makefile.config +include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest diff --git a/unittests/Makefile b/unittests/Makefile new file mode 100644 index 00000000000..43592a1e5ea --- /dev/null +++ b/unittests/Makefile @@ -0,0 +1,20 @@ +##===- unittests/Makefile ----------------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = .. +include $(LEVEL)/Makefile.config + +LIBRARYNAME = UnitTestMain +BUILD_ARCHIVE = 1 +CPP.Flags += -I$(LLVM_SRC_ROOT)/utils/unittest/googletest/include/ +CPP.Flags += -Wno-variadic-macros + +PARALLEL_DIRS = ADT + +include $(LEVEL)/Makefile.common diff --git a/unittests/Makefile.unittest b/unittests/Makefile.unittest new file mode 100644 index 00000000000..259e297cef7 --- /dev/null +++ b/unittests/Makefile.unittest @@ -0,0 +1,36 @@ +##===- unittests/Makefile.unittest -------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +# +# This file is included by all of the unit test makefiles. +# +##===----------------------------------------------------------------------===## + +# Set up variables for building a unit test. +ifdef TESTNAME + +LLVMUnitTestDir := $(LLVM_OBJ_ROOT)/$(BuildMode)/unittests +LLVMUnitTestExe := $(LLVMUnitTestDir)/$(TESTNAME)Tests$(EXEEXT) + +include $(LEVEL)/Makefile.common + +CPP.Flags += -I$(LLVM_SRC_ROOT)/utils/unittest/googletest/include/ +CPP.Flags += -Wno-variadic-macros +LD.Flags += -lGoogleTest -lUnitTestMain + +$(LLVMUnitTestExe): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths) + $(Echo) Linking $(BuildMode) unit test $(TESTNAME) $(StripWarnMsg) + $(Verb) $(LTLink) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \ + $(LLVMLibsOptions) $(ExtraLibs) $(TOOLLINKOPTSB) $(LIBS) + $(Echo) ======= Finished Linking $(BuildMode) Unit test $(TESTNAME) \ + $(StripWarnMsg) + +all:: $(LLVMUnitTestExe) + $(LLVMUnitTestExe) + +endif diff --git a/unittests/TestMain.cpp b/unittests/TestMain.cpp new file mode 100644 index 00000000000..095076b23ec --- /dev/null +++ b/unittests/TestMain.cpp @@ -0,0 +1,15 @@ +//===--- unittests/TestMain.cpp - unittest driver -------------------------===// +// +// 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" + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/utils/mkpatch b/utils/mkpatch index c8df21c9ec9..d256d98f6f3 100755 --- a/utils/mkpatch +++ b/utils/mkpatch @@ -24,7 +24,7 @@ svn diff -x -u >> "$NAME".patch.raw 2>&1 \ autoconf docs utils include lib/System lib/Support lib/VMCore lib/AsmParser \ lib/Bitcode lib/Analysis lib/Transforms lib/CodeGen lib/Target \ lib/ExecutionEngine lib/Debugger lib/Linker \ - tools test runtime projects examples win32 Xcode + tools test unittests runtime projects examples win32 Xcode echo "mkpatch: Removing cruft from the patch file" sed -e '/^[?] .*/d' -e '/^cvs diff: Diffing/d' "$NAME".patch.raw | awk '\