forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVersionRangeLattice.cpp
127 lines (100 loc) · 4.29 KB
/
VersionRangeLattice.cpp
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(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));
}