-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathAvailabilityContextTests.cpp
124 lines (106 loc) · 5.49 KB
/
AvailabilityContextTests.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
//===--- AvailabilityContextTests.cpp - Tests for AvailabilityContext -----===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "TestContext.h"
#include "swift/AST/AvailabilityContext.h"
#include "llvm/TargetParser/Triple.h"
#include "gtest/gtest.h"
using namespace swift;
using namespace swift::unittest;
static llvm::VersionTuple getPlatformIntro(const AvailabilityContext &context) {
return context.getPlatformRange().getRawVersionRange().getLowerEndpoint();
}
static AvailabilityRange getAvailabilityRange(unsigned major, unsigned minor) {
return AvailabilityRange(llvm::VersionTuple(major, minor));
}
class AvailabilityContextTest : public ::testing::Test {
public:
const TestContext defaultTestContext{
llvm::Triple("x86_64", "apple", "macosx10.9")};
struct {
const AvailabilityDomain universal = AvailabilityDomain::forUniversal();
const AvailabilityDomain macOS =
AvailabilityDomain::forPlatform(PlatformKind::macOS);
const AvailabilityDomain macOSAppExt = AvailabilityDomain::forPlatform(
PlatformKind::macOSApplicationExtension);
} domains;
};
TEST_F(AvailabilityContextTest, PlatformRange) {
auto &ctx = defaultTestContext.Ctx;
auto macOS10_9 = AvailabilityContext::forDeploymentTarget(ctx);
EXPECT_EQ(getPlatformIntro(macOS10_9), llvm::VersionTuple(10, 9));
// Attempt to constrain the macOS version to >= 10.8. Since the context is
// already >= 10.9, this should have no effect.
auto macOS10_8 = macOS10_9;
macOS10_8.constrainWithPlatformRange(getAvailabilityRange(10, 8), ctx);
EXPECT_EQ(macOS10_8, macOS10_9);
// Attempt to constrain the macOS version to >= 10.9. Since the context is
// already >= 10.9, this should have no effect.
auto stillMacOS10_9 = macOS10_9;
stillMacOS10_9.constrainWithPlatformRange(getAvailabilityRange(10, 9), ctx);
EXPECT_EQ(stillMacOS10_9, macOS10_9);
// Constrain the macOS version to >= 10.10 instead. The resulting context
// should be a new context that is less available than the deployment target
// context (a.k.a. "contained by").
auto macOS10_10 = macOS10_9;
macOS10_10.constrainWithPlatformRange(getAvailabilityRange(10, 10), ctx);
EXPECT_EQ(getPlatformIntro(macOS10_10), llvm::VersionTuple(10, 10));
EXPECT_NE(macOS10_9, macOS10_10);
EXPECT_TRUE(macOS10_10.isContainedIn(macOS10_9));
EXPECT_FALSE(macOS10_9.isContainedIn(macOS10_10));
}
TEST_F(AvailabilityContextTest, UnavailableDomains) {
auto &ctx = defaultTestContext.Ctx;
auto macOS10_9 = AvailabilityContext::forDeploymentTarget(ctx);
EXPECT_FALSE(macOS10_9.isUnavailable());
EXPECT_FALSE(macOS10_9.containsUnavailableDomain(domains.macOS));
EXPECT_FALSE(macOS10_9.containsUnavailableDomain(domains.macOSAppExt));
EXPECT_FALSE(macOS10_9.containsUnavailableDomain(domains.universal));
// Constrain the deployment target context by adding unavailability on macOS.
// The resulting context should be a new context that is less available than
// the deployment target context (a.k.a. "contained by").
auto unavailableOnMacOS = macOS10_9;
unavailableOnMacOS.constrainWithUnavailableDomain(domains.macOS, ctx);
EXPECT_TRUE(unavailableOnMacOS.isUnavailable());
EXPECT_TRUE(unavailableOnMacOS.containsUnavailableDomain(domains.macOS));
EXPECT_TRUE(
unavailableOnMacOS.containsUnavailableDomain(domains.macOSAppExt));
EXPECT_FALSE(unavailableOnMacOS.containsUnavailableDomain(domains.universal));
EXPECT_NE(unavailableOnMacOS, macOS10_9);
EXPECT_TRUE(unavailableOnMacOS.isContainedIn(macOS10_9));
EXPECT_FALSE(macOS10_9.isContainedIn(unavailableOnMacOS));
// Constraining a context that is already unavailable on macOS by adding
// unavailability on macOS should have no effect.
auto stillUnavailableOnMacOS = unavailableOnMacOS;
stillUnavailableOnMacOS.constrainWithUnavailableDomain(domains.macOS, ctx);
EXPECT_EQ(unavailableOnMacOS, stillUnavailableOnMacOS);
// Constraining unavailability on macOS application extensions should also
// have no effect.
auto unavailableInAppExt = unavailableOnMacOS;
unavailableInAppExt.constrainWithUnavailableDomain(domains.macOSAppExt, ctx);
EXPECT_EQ(unavailableOnMacOS, unavailableInAppExt);
// FIXME: [availability] Test adding unavailability for an independent domain.
// Constraining the context to be universally unavailable should create a
// new context that contains the context that was unavailable on macOS only.
auto unavailableUniversally = unavailableOnMacOS;
unavailableUniversally.constrainWithUnavailableDomain(domains.universal, ctx);
EXPECT_TRUE(unavailableUniversally.isUnavailable());
EXPECT_TRUE(unavailableUniversally.containsUnavailableDomain(domains.macOS));
EXPECT_TRUE(
unavailableUniversally.containsUnavailableDomain(domains.macOSAppExt));
EXPECT_TRUE(
unavailableUniversally.containsUnavailableDomain(domains.universal));
EXPECT_NE(unavailableUniversally, unavailableOnMacOS);
EXPECT_TRUE(unavailableUniversally.isContainedIn(unavailableOnMacOS));
EXPECT_TRUE(unavailableUniversally.isContainedIn(macOS10_9));
EXPECT_FALSE(unavailableOnMacOS.isContainedIn(unavailableUniversally));
EXPECT_FALSE(macOS10_9.isContainedIn(unavailableUniversally));
}