about summary refs log tree commit diff homepage
path: root/unittests/Expr
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-05-21 04:36:41 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-05-21 04:36:41 +0000
commit6f290d8f9e9d7faac295cb51fc96884a18f4ded4 (patch)
tree46e7d426abc0c9f06ac472ac6f7f9e661b5d78cb /unittests/Expr
parenta55960edd4dcd7535526de8d2277642522aa0209 (diff)
downloadklee-6f290d8f9e9d7faac295cb51fc96884a18f4ded4.tar.gz
Initial KLEE checkin.
 - Lots more tweaks, documentation, and web page content is needed,
   but this should compile & work on OS X & Linux.


git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@72205 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Expr')
-rw-r--r--unittests/Expr/ExprTest.cpp112
-rw-r--r--unittests/Expr/Makefile11
2 files changed, 123 insertions, 0 deletions
diff --git a/unittests/Expr/ExprTest.cpp b/unittests/Expr/ExprTest.cpp
new file mode 100644
index 00000000..9220c53e
--- /dev/null
+++ b/unittests/Expr/ExprTest.cpp
@@ -0,0 +1,112 @@
+//===-- ExprTest.cpp ------------------------------------------------------===//
+//
+//                     The KLEE Symbolic Virtual Machine
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "gtest/gtest.h"
+
+#include "klee/Expr.h"
+
+using namespace klee;
+
+namespace {
+
+ref<Expr> getConstant(int value, Expr::Width width) {
+  int64_t ext = value;
+  uint64_t trunc = ext & (((uint64_t) -1LL) >> (64 - width));
+  return ConstantExpr::create(trunc, width);
+}
+
+TEST(ExprTest, BasicConstruction) {
+  EXPECT_EQ(ref<Expr>(0, 32),
+            SubExpr::create(ref<Expr>(10, 32),
+                            ref<Expr>(10, 32)));
+}
+
+TEST(ExprTest, ConcatExtract) {
+  Array *array = new Array(0, 1, 256);
+  ref<Expr> read8 = Expr::createTempRead(array, 8);
+  Array *array2 = new Array(0, 2, 256);
+  ref<Expr> read8_2 = Expr::createTempRead(array2, 8);
+  ref<Expr> c100 = getConstant(100, 8);
+
+  ref<Expr> concat1 = ConcatExpr::create4(read8, read8, c100, read8_2);
+  EXPECT_EQ(2U, concat1.getNumKids());
+  EXPECT_EQ(2U, concat1.getKid(1).getNumKids());
+  EXPECT_EQ(2U, concat1.getKid(1).getKid(1).getNumKids());
+
+  ref<Expr> extract1 = ExtractExpr::create(concat1, 8, 16);
+  EXPECT_EQ(Expr::Concat, extract1.getKind());
+  EXPECT_EQ(read8, extract1.getKid(0));
+  EXPECT_EQ(c100, extract1.getKid(1));
+
+  ref<Expr> extract2 = ExtractExpr::create(concat1, 6, 26);
+  EXPECT_EQ( Expr::Concat, extract2.getKind());
+  EXPECT_EQ( read8, extract2.getKid(0));
+  EXPECT_EQ( Expr::Concat, extract2.getKid(1).getKind());
+  EXPECT_EQ( read8, extract2.getKid(1).getKid(0));
+  EXPECT_EQ( Expr::Concat, extract2.getKid(1).getKid(1).getKind());
+  EXPECT_EQ( c100, extract2.getKid(1).getKid(1).getKid(0));
+  EXPECT_EQ( Expr::Extract, extract2.getKid(1).getKid(1).getKid(1).getKind());
+  
+  ref<Expr> extract3 = ExtractExpr::create(concat1, 24, 1);
+  EXPECT_EQ(Expr::Extract, extract3.getKind());
+
+  ref<Expr> extract4 = ExtractExpr::create(concat1, 27, 2);
+  EXPECT_EQ(Expr::Extract, extract4.getKind());
+  const ExtractExpr* tmp = dyn_ref_cast<ExtractExpr>(extract4);
+  EXPECT_EQ(3U, tmp->offset);
+  EXPECT_EQ(2U, tmp->getWidth());
+
+  ref<Expr> extract5 = ExtractExpr::create(concat1, 17, 5);
+  EXPECT_EQ(Expr::Extract, extract5.getKind());
+
+  ref<Expr> extract6 = ExtractExpr::create(concat1, 3, 26);
+  EXPECT_EQ(Expr::Concat, extract6.getKind());
+  EXPECT_EQ(Expr::Extract, extract6.getKid(0).getKind());
+  EXPECT_EQ(Expr::Concat, extract6.getKid(1).getKind());
+  EXPECT_EQ(read8, extract6.getKid(1).getKid(0));
+  EXPECT_EQ(Expr::Concat, extract6.getKid(1).getKid(1).getKind());
+  EXPECT_EQ(c100, extract6.getKid(1).getKid(1).getKid(0));
+  EXPECT_EQ(Expr::Extract, extract6.getKid(1).getKid(1).getKid(1).getKind());
+
+  ref<Expr> concat10 = ConcatExpr::create4(read8, c100, c100, read8);    
+  ref<Expr> extract10 = ExtractExpr::create(concat10, 8, 16);
+  EXPECT_EQ(Expr::Constant, extract10.getKind());
+}
+
+TEST(ExprTest, ExtractConcat) {
+  Array *array = new Array(0, 3, 256);
+  ref<Expr> read64 = Expr::createTempRead(array, 64);
+
+  Array *array2 = new Array(0, 4, 256);
+  ref<Expr> read8_2 = Expr::createTempRead(array2, 8);
+  
+  ref<Expr> extract1 = ExtractExpr::create(read64, 36, 4);
+  ref<Expr> extract2 = ExtractExpr::create(read64, 32, 4);
+  
+  ref<Expr> extract3 = ExtractExpr::create(read64, 12, 3);
+  ref<Expr> extract4 = ExtractExpr::create(read64, 10, 2);
+  ref<Expr> extract5 = ExtractExpr::create(read64, 2, 8);
+   
+  ref<Expr> kids1[6] = { extract1, extract2,
+			 read8_2,
+			 extract3, extract4, extract5 };
+  ref<Expr> concat1 = ConcatExpr::createN(6, kids1);
+  EXPECT_EQ(29U, concat1.getWidth());
+  
+  ref<Expr> extract6 = ExtractExpr::create(read8_2, 2, 5);
+  ref<Expr> extract7 = ExtractExpr::create(read8_2, 1, 1);
+  
+  ref<Expr> kids2[3] = { extract1, extract6, extract7 };
+  ref<Expr> concat2 = ConcatExpr::createN(3, kids2);
+  EXPECT_EQ(10U, concat2.getWidth());
+  EXPECT_EQ(Expr::Extract, concat2.getKid(0).getKind());
+  EXPECT_EQ(Expr::Extract, concat2.getKid(1).getKind());
+}
+
+}
diff --git a/unittests/Expr/Makefile b/unittests/Expr/Makefile
new file mode 100644
index 00000000..14945b1a
--- /dev/null
+++ b/unittests/Expr/Makefile
@@ -0,0 +1,11 @@
+##===- unittests/Expr/Makefile -----------------------------*- Makefile -*-===##
+
+LEVEL := ../..
+TESTNAME := Expr
+USEDLIBS := kleaverExpr.a kleeBasic.a
+LINK_COMPONENTS := support
+
+include $(LEVEL)/Makefile.config
+include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
+
+LIBS += -lstp