Skip to content

Commit 9456663

Browse files
committed
Add initial batch of Fixture tests
- Adds a suite of tests for testing mixed target support. These tests also demonstrate the various ways a mixed target can be structured. - Commit some implementation fixes for issues surfaced when developing the tests. - Add TODOs for outstanding work items.
1 parent 28a527c commit 9456663

File tree

107 files changed

+1357
-8
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+1357
-8
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#import <Foundation/Foundation.h>
2+
3+
// All three import statements should be supported.
4+
#import "Driver.h"
5+
#import "Public/Driver.h"
6+
#import "MixedTargetWithCustomPaths/Sources/Public/Driver.h"
7+
8+
@implementation Driver
9+
@end
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import Foundation
2+
3+
// This type is Objective-C compatible and used in `OldCar`.
4+
@objc public class Engine: NSObject {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Foundation
2+
3+
public class NewCar {
4+
// `Engine` is defined in Swift.
5+
var engine: Engine? = nil
6+
// The following types are defined in Objective-C.
7+
var driver: Driver? = nil
8+
var transmission: Transmission? = nil
9+
var hasStickShift: Bool {
10+
return transmission != nil && transmission!.transmissionKind == .manual
11+
}
12+
13+
public init() {}
14+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#import <Foundation/Foundation.h>
2+
3+
// All three import statements should be supported.
4+
#import "OldCar.h"
5+
#import "Public/OldCar.h"
6+
#import "MixedTargetWithCustomPaths/Sources/Public/OldCar.h"
7+
8+
9+
// Import the Swift half of the module.
10+
#import "MixedTargetWithCustomPaths-Swift.h"
11+
12+
// Both import statements should be supported.
13+
#import "Transmission.h"
14+
#import "MixedTargetWithCustomPaths/Sources/Transmission.h"
15+
16+
@interface OldCar ()
17+
@property(nonatomic) Transmission *transmission;
18+
@end
19+
20+
@implementation OldCar
21+
@end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
3+
// This type is Swift compatible and used in `NewCar`.
4+
@interface Driver : NSObject
5+
@property(nonnull) NSString* name;
6+
@end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "Driver.h"
4+
5+
// The `Engine` type is declared in the Swift half of the module. Such types
6+
// must be forward declared in headers.
7+
@class Engine;
8+
9+
@interface OldCar : NSObject
10+
// `Engine` is defined in Swift.
11+
@property(nullable) Engine* engine;
12+
// `Driver` is defined in Objective-C.
13+
@property(nullable) Driver* driver;
14+
@end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#import <Foundation/Foundation.h>
2+
3+
typedef NS_ENUM(NSInteger, TransmissionKind) {
4+
TransmissionKindManual,
5+
TransmissionKindAutomatic
6+
};
7+
8+
@interface Transmission : NSObject
9+
@property (nonatomic, readonly, assign) TransmissionKind transmissionKind;
10+
@end
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#import <Foundation/Foundation.h>
2+
3+
// Both import statements should be supported.
4+
#import "Transmission.h"
5+
#import "MixedTargetWithCustomPaths/Sources/Transmission.h"
6+
7+
@implementation Transmission
8+
@end
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
// swift-tools-version: 5.7
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "MixedTargets",
7+
products: [
8+
.library(
9+
name: "BasicMixedTarget",
10+
targets: ["BasicMixedTarget"]
11+
),
12+
.library(
13+
name: "StaticallyLinkedBasicMixedTarget",
14+
type: .static,
15+
targets: ["BasicMixedTarget"]
16+
),
17+
.library(
18+
name: "DynamicallyLinkedBasicMixedTarget",
19+
type: .dynamic,
20+
targets: ["BasicMixedTarget"]
21+
)
22+
],
23+
dependencies: [],
24+
targets: [
25+
// MARK: - BasicMixedTarget
26+
.target(
27+
name: "BasicMixedTarget"
28+
),
29+
.testTarget(
30+
name: "BasicMixedTargetTests",
31+
dependencies: ["BasicMixedTarget"]
32+
),
33+
34+
// MARK: - MixedTargetWithResources
35+
.target(
36+
name: "MixedTargetWithResources",
37+
resources: [
38+
.process("foo.txt")
39+
]
40+
),
41+
.testTarget(
42+
name: "MixedTargetWithResourcesTests",
43+
dependencies: ["MixedTargetWithResources"]
44+
),
45+
46+
// MARK: - MixedTargetWithCustomModuleMap
47+
// TODO(ncooke3): Play around and try to break this target with a more
48+
// complex module map.
49+
.target(
50+
name: "MixedTargetWithCustomModuleMap"
51+
),
52+
53+
// MARK: - MixedTargetWithCustomModuleMapAndResources
54+
.target(
55+
name: "MixedTargetWithCustomModuleMapAndResources",
56+
resources: [
57+
.process("foo.txt")
58+
]
59+
),
60+
61+
// MARK: - MixedTargetWithC++
62+
.target(
63+
name: "MixedTargetWithCXX"
64+
),
65+
.testTarget(
66+
name: "MixedTargetWithCXXTests",
67+
dependencies: ["MixedTargetWithCXX"]
68+
),
69+
70+
// MARK: - MixedTargetWithC
71+
.target(
72+
name: "MixedTargetWithC"
73+
),
74+
.testTarget(
75+
name: "MixedTargetWithCTests",
76+
dependencies: ["MixedTargetWithC"]
77+
),
78+
79+
// MARK: - MixedTargetWithNonPublicHeaders
80+
.target(
81+
name: "MixedTargetWithNonPublicHeaders"
82+
),
83+
// This test target should fail to build. See
84+
// `testNonPublicHeadersAreNotVisibleFromOutsideOfTarget`.
85+
.testTarget(
86+
name: "MixedTargetWithNonPublicHeadersTests",
87+
dependencies: ["MixedTargetWithNonPublicHeaders"]
88+
),
89+
90+
// MARK: - MixedTargetWithCustomPaths
91+
.target(
92+
name: "MixedTargetWithCustomPaths",
93+
path: "MixedTargetWithCustomPaths/Sources",
94+
publicHeadersPath: "Public",
95+
cSettings: [
96+
.headerSearchPath("../../")
97+
]
98+
),
99+
100+
// MARK: - MixedTargetWithNestedPublicHeaders
101+
.target(
102+
name: "MixedTargetWithNestedPublicHeaders",
103+
publicHeadersPath: "Blah/Public"
104+
),
105+
106+
// MARK: - MixedTargetWithNoPublicObjectiveCHeaders
107+
// TODO(ncooke3): Re-enable when corresponding test is working.
108+
// .target(
109+
// name: "MixedTargetWithNoPublicObjectiveCHeaders"
110+
// ),
111+
112+
// MARK: - MixedTestTargetWithSharedTestUtilities
113+
.testTarget(
114+
name: "MixedTestTargetWithSharedUtilitiesTests"
115+
),
116+
117+
// MARK: - PrivateHeadersCanBeTestedViaHeaderSearchPathsTests
118+
.testTarget(
119+
name: "PrivateHeadersCanBeTestedViaHeaderSearchPathsTests",
120+
dependencies: ["MixedTargetWithNonPublicHeaders"],
121+
cSettings: [
122+
// Adding a header search path at the root of the package will
123+
// enable the Objective-C tests to import private headers.
124+
.headerSearchPath("../../")
125+
]
126+
),
127+
128+
// MARK: - MixedTargetsPublicHeadersAreIncludedInHeaderSearchPathsForObjcSource
129+
.target(
130+
name: "MixedTargetsPublicHeadersAreIncludedInHeaderSearchPathsForObjcSource"
131+
),
132+
133+
// MARK: - Targets for testing the integration of a mixed target
134+
.target(
135+
name: "ClangTargetDependsOnMixedTarget",
136+
dependencies: ["BasicMixedTarget"]
137+
),
138+
.target(
139+
name: "SwiftTargetDependsOnMixedTarget",
140+
dependencies: ["BasicMixedTarget"]
141+
),
142+
.target(
143+
name: "MixedTargetDependsOnMixedTarget",
144+
dependencies: ["BasicMixedTarget"]
145+
),
146+
.target(
147+
name: "MixedTargetDependsOnClangTarget",
148+
dependencies: ["ClangTarget"]
149+
),
150+
.target(
151+
name: "MixedTargetDependsOnSwiftTarget",
152+
dependencies: ["SwiftTarget"]
153+
),
154+
// The below two targets are used for testing the above targets.
155+
.target(name: "SwiftTarget"),
156+
.target(name: "ClangTarget")
157+
158+
]
159+
)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# BasicMixedTargets
2+
3+
A collection of targets to test SPM's support of mixed language targets.
4+
5+
## BasicMixedTarget
6+
Represents a simple mixed package where:
7+
- Swift half of the target used types from the Objective-C half of the module
8+
- Objective-C half of the target used types from the Swift half of the module
9+
10+
## MixedTargetWithResources
11+
Represents a simple mixed package with a bundled resource where:
12+
- resource can be accessed from an Swift context using `Bundle.module`
13+
- resource can be accessed from an Objective-C context using
14+
`SWIFTPM_MODULE_BUNDLE` macro
15+
16+
## MixedTargetWithCustomModuleMap
17+
- Represents a simple mixed package that contains a custom module map.
18+
19+
## MixedTargetWithCustomModuleMapAndResources
20+
- Represents a simple mixed package that contains a custom module map and
21+
a bundled resource.
22+
23+
TODO(ncooke3): Fill the rest of this out.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "include/Driver.h"
4+
5+
@implementation Driver
6+
@end
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import Foundation
2+
3+
// This type is Objective-C compatible and used in `OldCar`.
4+
@objc public class Engine: NSObject {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Foundation
2+
3+
public class NewCar {
4+
// `Engine` is defined in Swift.
5+
var engine: Engine? = nil
6+
// The following types are defined in Objective-C.
7+
var driver: Driver? = nil
8+
var transmission: Transmission? = nil
9+
var hasStickShift: Bool {
10+
return transmission != nil && transmission!.transmissionKind == .manual
11+
}
12+
13+
public init() {}
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "OldCar.h"
4+
#import "include/OldCar.h"
5+
6+
// Import the Swift half of the module.
7+
#import "BasicMixedTarget-Swift.h"
8+
9+
#import "Transmission.h"
10+
11+
@interface OldCar ()
12+
@property(nonatomic) Transmission *transmission;
13+
@end
14+
15+
@implementation OldCar
16+
@end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#import <Foundation/Foundation.h>
2+
3+
typedef NS_ENUM(NSInteger, TransmissionKind) {
4+
TransmissionKindManual,
5+
TransmissionKindAutomatic
6+
};
7+
8+
@interface Transmission : NSObject
9+
@property (nonatomic, readonly, assign) TransmissionKind transmissionKind;
10+
@end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "Transmission.h"
4+
5+
@implementation Transmission
6+
@end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
3+
// This type is Swift compatible and used in `NewCar`.
4+
@interface Driver : NSObject
5+
@property(nonnull) NSString* name;
6+
@end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "Driver.h"
4+
5+
// The `Engine` type is declared in the Swift half of the module. Such types
6+
// must be forward declared in headers.
7+
@class Engine;
8+
9+
@interface OldCar : NSObject
10+
// `Engine` is defined in Swift.
11+
@property(nullable) Engine* engine;
12+
// `Driver` is defined in Objective-C.
13+
@property(nullable) Driver* driver;
14+
@end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "include/Vessel.h"
4+
5+
@implementation Vessel
6+
@end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import <Foundation/Foundation.h>
2+
3+
@interface Vessel : NSObject
4+
@property (assign, getter=hasLifeJackets) BOOL lifeJackets;
5+
@end
6+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "include/JunkYard.h"
4+
5+
@import BasicMixedTarget;
6+
7+
@interface JunkYard ()
8+
// The below types come from the `BasicMixedTarget` module.
9+
@property(nullable) Engine *engine;
10+
@property(nullable) Driver *driver;
11+
@property(nullable) OldCar *oldCar;
12+
@end
13+
14+
@implementation JunkYard
15+
@end

0 commit comments

Comments
 (0)