blob: 6ae33c28bca9836f0e9ab3176b11db3ab84c0ef0 [file] [log] [blame]
#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(clang::VersionTuple(10, 10));
VersionRange GreaterThanEqual10_9 =
VersionRange::allGTE(clang::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));
}