summaryrefslogtreecommitdiff
path: root/test/gtest/lattices.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/gtest/lattices.cpp')
-rw-r--r--test/gtest/lattices.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/test/gtest/lattices.cpp b/test/gtest/lattices.cpp
index 81706e58e..49288fe85 100644
--- a/test/gtest/lattices.cpp
+++ b/test/gtest/lattices.cpp
@@ -20,6 +20,7 @@
#include "analysis/lattices/int.h"
#include "analysis/lattices/inverted.h"
#include "analysis/lattices/lift.h"
+#include "analysis/lattices/shared.h"
#include "analysis/lattices/tuple.h"
#include "analysis/lattices/valtype.h"
#include "analysis/lattices/vector.h"
@@ -546,3 +547,110 @@ TEST(ValTypeLattice, Meet) {
Type(HeapType::array, Nullable),
Type(HeapType::eq, Nullable));
}
+
+TEST(SharedLattice, GetBottom) {
+ analysis::Shared<analysis::UInt32> shared{analysis::UInt32{}};
+ EXPECT_EQ(*shared.getBottom(), 0u);
+}
+
+TEST(SharedLattice, Compare) {
+ analysis::Shared<analysis::UInt32> shared{analysis::UInt32{}};
+
+ auto zero = shared.getBottom();
+
+ auto one = shared.getBottom();
+ shared.join(one, 1);
+
+ // This join will not change the value.
+ auto uno = one;
+ shared.join(uno, 1);
+
+ auto two = shared.getBottom();
+ shared.join(two, 2);
+
+ EXPECT_EQ(shared.compare(zero, zero), analysis::EQUAL);
+ EXPECT_EQ(shared.compare(zero, one), analysis::LESS);
+ EXPECT_EQ(shared.compare(zero, uno), analysis::LESS);
+ EXPECT_EQ(shared.compare(zero, two), analysis::LESS);
+
+ EXPECT_EQ(shared.compare(one, zero), analysis::GREATER);
+ EXPECT_EQ(shared.compare(one, one), analysis::EQUAL);
+ EXPECT_EQ(shared.compare(one, uno), analysis::EQUAL);
+ EXPECT_EQ(shared.compare(one, two), analysis::LESS);
+
+ EXPECT_EQ(shared.compare(two, zero), analysis::GREATER);
+ EXPECT_EQ(shared.compare(two, one), analysis::GREATER);
+ EXPECT_EQ(shared.compare(two, uno), analysis::GREATER);
+ EXPECT_EQ(shared.compare(two, two), analysis::EQUAL);
+
+ EXPECT_EQ(*zero, 2u);
+ EXPECT_EQ(*one, 2u);
+ EXPECT_EQ(*uno, 2u);
+ EXPECT_EQ(*two, 2u);
+}
+
+TEST(SharedLattice, Join) {
+ analysis::Shared<analysis::UInt32> shared{analysis::UInt32{}};
+
+ auto zero = shared.getBottom();
+
+ auto one = shared.getBottom();
+ shared.join(one, 1);
+
+ auto two = shared.getBottom();
+ shared.join(two, 2);
+
+ {
+ auto elem = zero;
+ EXPECT_FALSE(shared.join(elem, zero));
+ EXPECT_EQ(elem, zero);
+ }
+
+ {
+ auto elem = zero;
+ EXPECT_TRUE(shared.join(elem, one));
+ EXPECT_EQ(elem, one);
+ }
+
+ {
+ auto elem = zero;
+ EXPECT_TRUE(shared.join(elem, two));
+ EXPECT_EQ(elem, two);
+ }
+
+ {
+ auto elem = one;
+ EXPECT_FALSE(shared.join(elem, zero));
+ EXPECT_EQ(elem, one);
+ }
+
+ {
+ auto elem = one;
+ EXPECT_FALSE(shared.join(elem, one));
+ EXPECT_EQ(elem, one);
+ }
+
+ {
+ auto elem = one;
+ EXPECT_TRUE(shared.join(elem, two));
+ EXPECT_EQ(elem, two);
+ }
+
+ {
+ auto elem = two;
+ EXPECT_FALSE(shared.join(elem, zero));
+ EXPECT_EQ(elem, two);
+ }
+
+ {
+ auto elem = two;
+ EXPECT_FALSE(shared.join(elem, one));
+ EXPECT_EQ(elem, two);
+ }
+
+ {
+ auto elem = two;
+ EXPECT_FALSE(shared.join(elem, two));
+ EXPECT_EQ(elem, two);
+ }
+}