1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
#include "swift/AST/TypeRefinementContext.h"
#include "gtest/gtest.h"
using namespace swift;
// A test fixture with version ranges
class VersionRangeLattice : public ::testing::Test {
public:
VersionRange All = VersionRange::all();
VersionRange GreaterThanEqual10_10 =
VersionRange::allGTE(llvm::VersionTuple(10, 10));
VersionRange GreaterThanEqual10_9 =
VersionRange::allGTE(llvm::VersionTuple(10, 9));
VersionRange Empty = VersionRange::empty();
VersionRange intersectRanges(VersionRange A, VersionRange B) {
A.intersectWith(B);
return A;
}
VersionRange unionRanges(VersionRange A, VersionRange B) {
A.unionWith(B);
return A;
}
bool equals(VersionRange A, VersionRange B) {
return A.isContainedIn(B) && B.isContainedIn(A);
}
bool intersectEquals(VersionRange A, VersionRange B, VersionRange Expected) {
VersionRange AMeetB = intersectRanges(A, B);
VersionRange BMeetA = intersectRanges(A, B);
return equals(AMeetB, Expected) && equals(BMeetA, Expected);
}
bool unionEquals(VersionRange A, VersionRange B, VersionRange Expected) {
VersionRange AJoinB = unionRanges(A, B);
VersionRange BJoinA = unionRanges(A, B);
return equals(AJoinB, Expected) && equals(BJoinA, Expected);
}
};
// Test that All acts like the top element in the lattice with respect to
// containment.
TEST_F(VersionRangeLattice, AllIsTopElement) {
EXPECT_TRUE(All.isContainedIn(All));
EXPECT_TRUE(GreaterThanEqual10_10.isContainedIn(All));
EXPECT_TRUE(Empty.isContainedIn(All));
EXPECT_FALSE(All.isContainedIn(GreaterThanEqual10_10));
EXPECT_FALSE(All.isContainedIn(Empty));
}
// Test that Empty acts like the bottom element in the lattice with respect to
// containment.
TEST_F(VersionRangeLattice, EmptyIsBottomElement) {
EXPECT_TRUE(Empty.isContainedIn(Empty));
EXPECT_TRUE(Empty.isContainedIn(All));
EXPECT_TRUE(Empty.isContainedIn(GreaterThanEqual10_10));
EXPECT_FALSE(GreaterThanEqual10_10.isContainedIn(Empty));
EXPECT_FALSE(GreaterThanEqual10_10.isContainedIn(Empty));
}
// Test containment for ranges with lower end points.
TEST_F(VersionRangeLattice, ContainmentClosedEndedPositiveInfinity) {
EXPECT_TRUE(GreaterThanEqual10_10.isContainedIn(GreaterThanEqual10_10));
EXPECT_TRUE(GreaterThanEqual10_10.isContainedIn(GreaterThanEqual10_9));
EXPECT_TRUE(Empty.isContainedIn(GreaterThanEqual10_9));
EXPECT_FALSE(GreaterThanEqual10_9.isContainedIn(GreaterThanEqual10_10));
}
// Test that All acts like the top element in the lattice with respect to
// intersection.
TEST_F(VersionRangeLattice, MeetWithAll) {
EXPECT_TRUE(intersectEquals(All, All, All));
EXPECT_TRUE(intersectEquals(GreaterThanEqual10_10, All,
GreaterThanEqual10_10));
EXPECT_TRUE(intersectEquals(Empty, All, Empty));
}
// Test that All acts like the top element in the lattice with respect to
// union.
TEST_F(VersionRangeLattice, JoinWithAll) {
EXPECT_TRUE(unionEquals(All, All, All));
EXPECT_TRUE(unionEquals(GreaterThanEqual10_10, All, All));
EXPECT_TRUE(unionEquals(Empty, All, All));
}
// Test that Empty acts like the bottom element in the lattice with respect to
// intersection.
TEST_F(VersionRangeLattice, MeetWithEmpty) {
EXPECT_TRUE(intersectEquals(GreaterThanEqual10_10, Empty, Empty));
EXPECT_TRUE(intersectEquals(Empty, Empty, Empty));
}
// Test that Empty acts like the bottom element in the lattice with respect to
// union.
TEST_F(VersionRangeLattice, JoinWithEmpty) {
EXPECT_TRUE(unionEquals(GreaterThanEqual10_10, Empty, GreaterThanEqual10_10));
EXPECT_TRUE(unionEquals(Empty, Empty, Empty));
}
// Test intersection for ranges with lower end points.
TEST_F(VersionRangeLattice, MeetWithClosedEndedPositiveInfinity) {
EXPECT_TRUE(intersectEquals(GreaterThanEqual10_10, GreaterThanEqual10_10,
GreaterThanEqual10_10));
EXPECT_TRUE(intersectEquals(GreaterThanEqual10_10, GreaterThanEqual10_9,
GreaterThanEqual10_10));
}
// Test union for ranges with lower end points.
TEST_F(VersionRangeLattice, JoinWithClosedEndedPositiveInfinity) {
EXPECT_TRUE(unionEquals(GreaterThanEqual10_10, GreaterThanEqual10_10,
GreaterThanEqual10_10));
EXPECT_TRUE(unionEquals(GreaterThanEqual10_10, GreaterThanEqual10_9,
GreaterThanEqual10_9));
}
|