| #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)); |
| } |