From 7fc96fd9fb4b705a1c342116195677c01057baa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20S=C3=A1nchez?= Date: Wed, 14 Jan 2026 11:30:28 -0500 Subject: [PATCH 1/5] Make `EssentialFeed` and `EssentialFeedTests` targets support macOS and iOS since they're platform-independent (can run on any platform!) --- EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj index bbe7118..b191cc9 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj +++ b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj @@ -737,6 +737,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.essentialdeveloper.EssentialFeed; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; @@ -767,6 +768,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.essentialdeveloper.EssentialFeed; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; }; name = Release; }; @@ -787,6 +789,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.essentialdeveloper.EssentialFeedTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; @@ -809,6 +812,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.essentialdeveloper.EssentialFeedTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_VERSION = 5.0; }; name = Release; From 6fa6f1c509cf3b7914fbce3fd294e6ea66977019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20S=C3=A1nchez?= Date: Wed, 14 Jan 2026 11:46:08 -0500 Subject: [PATCH 2/5] Make `EssentialFeedAPIEndToEndTests` target support macOS and iOS since it's platform-independent (can run on any platform!) --- .../EssentialFeed.xcodeproj/project.pbxproj | 4 +++ .../EssentialFeedAPIEndToEndTests.xcscheme | 9 +++-- .../EssentialFeedAPIEndToEndTests.xctestplan | 35 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 EssentialFeed/EssentialFeedAPIEndToEndTests.xctestplan diff --git a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj index b191cc9..928f7e3 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj +++ b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj @@ -89,6 +89,7 @@ 23883FA82EFF12CE00C80E74 /* RemoteFeedItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteFeedItem.swift; sourceTree = ""; }; 23883FAA2EFF15E600C80E74 /* LocalFeedImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalFeedImage.swift; sourceTree = ""; }; 23C094932EFF3F8700F26432 /* LoadFeedFromCacheUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFeedFromCacheUseCaseTests.swift; sourceTree = ""; }; + 23D3DB072F17FF4D00262C1D /* EssentialFeedAPIEndToEndTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = file; path = EssentialFeedAPIEndToEndTests.xctestplan; sourceTree = ""; }; 23FBD0742EECD0B3005E9351 /* LoadFeedFromRemoteUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFeedFromRemoteUseCaseTests.swift; sourceTree = ""; }; 23FBD0772EF05F5C005E9351 /* URLSessionHTTPClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionHTTPClientTests.swift; sourceTree = ""; }; 23FBD0BA2EF0F595005E9351 /* XCTestCase+MemoryLeakTracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+MemoryLeakTracking.swift"; sourceTree = ""; }; @@ -156,6 +157,7 @@ 080EDEE721B6DA7E00813479 = { isa = PBXGroup; children = ( + 23D3DB072F17FF4D00262C1D /* EssentialFeedAPIEndToEndTests.xctestplan */, 23FDEB352F083D3A004D2CD0 /* EssentialFeedCacheIntegrationTests.xctestplan */, 23FBD0D42EF1C5FE005E9351 /* CI.xctestplan */, 080EDEF321B6DA7E00813479 /* EssentialFeed */, @@ -832,6 +834,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.peter.EssentialFeedAPIEndToEndTests; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; @@ -855,6 +858,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.peter.EssentialFeedAPIEndToEndTests; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; diff --git a/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeedAPIEndToEndTests.xcscheme b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeedAPIEndToEndTests.xcscheme index b7c3555..f1d078b 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeedAPIEndToEndTests.xcscheme +++ b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeedAPIEndToEndTests.xcscheme @@ -11,8 +11,13 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES" - shouldAutocreateTestPlan = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES"> + + + + Date: Wed, 14 Jan 2026 11:51:42 -0500 Subject: [PATCH 3/5] Make `EssentialFeedCacheIntegrationTests` target support macOS and iOS since it's platform-independent (can run on any platform!) --- EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj | 2 ++ .../EssentialFeedCacheIntegrationTests.xctestplan | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj index 928f7e3..bcdac2d 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj +++ b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj @@ -881,6 +881,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.peter.EssentialFeedCacheIntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; @@ -904,6 +905,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.peter.EssentialFeedCacheIntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator"; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; diff --git a/EssentialFeed/EssentialFeedCacheIntegrationTests.xctestplan b/EssentialFeed/EssentialFeedCacheIntegrationTests.xctestplan index 01fd431..cfe4e47 100644 --- a/EssentialFeed/EssentialFeedCacheIntegrationTests.xctestplan +++ b/EssentialFeed/EssentialFeedCacheIntegrationTests.xctestplan @@ -9,6 +9,15 @@ } ], "defaultOptions" : { + "codeCoverage" : { + "targets" : [ + { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "080EDEF021B6DA7E00813479", + "name" : "EssentialFeed" + } + ] + }, "performanceAntipatternCheckerEnabled" : true, "testExecutionOrdering" : "random" }, From ece53f05daae1eaf2068372033959cf42df56a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20S=C3=A1nchez?= Date: Wed, 14 Jan 2026 15:17:18 -0500 Subject: [PATCH 4/5] Add `EssentialFeediOS` framework (prod and test) targets for iOS platform-specific components --- .../EssentialFeed.xcodeproj/project.pbxproj | 287 +++++++++++++++++- .../xcschemes/EssentialFeediOS.xcscheme | 85 ++++++ .../EssentialFeediOS.xctestplan | 35 +++ 3 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeediOS.xcscheme create mode 100644 EssentialFeed/EssentialFeediOSTests/EssentialFeediOS.xctestplan diff --git a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj index bcdac2d..c317e27 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj +++ b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 23883FA92EFF12CE00C80E74 /* RemoteFeedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23883FA82EFF12CE00C80E74 /* RemoteFeedItem.swift */; }; 23883FAB2EFF15E600C80E74 /* LocalFeedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23883FAA2EFF15E600C80E74 /* LocalFeedImage.swift */; }; 23C094942EFF3F8C00F26432 /* LoadFeedFromCacheUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23C094932EFF3F8700F26432 /* LoadFeedFromCacheUseCaseTests.swift */; }; + 23F5D6E32F182DE900AC7D9F /* EssentialFeediOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23F5D6DA2F182DE800AC7D9F /* EssentialFeediOS.framework */; }; 23FBD0762EECD0B3005E9351 /* LoadFeedFromRemoteUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FBD0742EECD0B3005E9351 /* LoadFeedFromRemoteUseCaseTests.swift */; }; 23FBD0782EF05F5C005E9351 /* URLSessionHTTPClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FBD0772EF05F5C005E9351 /* URLSessionHTTPClientTests.swift */; }; 23FBD0BB2EF0F595005E9351 /* XCTestCase+MemoryLeakTracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FBD0BA2EF0F595005E9351 /* XCTestCase+MemoryLeakTracking.swift */; }; @@ -58,6 +59,13 @@ remoteGlobalIDString = 080EDEF021B6DA7E00813479; remoteInfo = EssentialFeed; }; + 23F5D6E42F182DE900AC7D9F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 080EDEE821B6DA7E00813479 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 23F5D6D92F182DE800AC7D9F; + remoteInfo = EssentialFeediOS; + }; 23FBD0CB2EF1BDE2005E9351 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 080EDEE821B6DA7E00813479 /* Project object */; @@ -89,7 +97,10 @@ 23883FA82EFF12CE00C80E74 /* RemoteFeedItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteFeedItem.swift; sourceTree = ""; }; 23883FAA2EFF15E600C80E74 /* LocalFeedImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalFeedImage.swift; sourceTree = ""; }; 23C094932EFF3F8700F26432 /* LoadFeedFromCacheUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFeedFromCacheUseCaseTests.swift; sourceTree = ""; }; - 23D3DB072F17FF4D00262C1D /* EssentialFeedAPIEndToEndTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = file; path = EssentialFeedAPIEndToEndTests.xctestplan; sourceTree = ""; }; + 23D3DB072F17FF4D00262C1D /* EssentialFeedAPIEndToEndTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = EssentialFeedAPIEndToEndTests.xctestplan; sourceTree = ""; }; + 23F5D6DA2F182DE800AC7D9F /* EssentialFeediOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EssentialFeediOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 23F5D6E22F182DE900AC7D9F /* EssentialFeediOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EssentialFeediOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 23F5D6F12F182FC900AC7D9F /* EssentialFeediOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = EssentialFeediOS.xctestplan; sourceTree = ""; }; 23FBD0742EECD0B3005E9351 /* LoadFeedFromRemoteUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFeedFromRemoteUseCaseTests.swift; sourceTree = ""; }; 23FBD0772EF05F5C005E9351 /* URLSessionHTTPClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionHTTPClientTests.swift; sourceTree = ""; }; 23FBD0BA2EF0F595005E9351 /* XCTestCase+MemoryLeakTracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+MemoryLeakTracking.swift"; sourceTree = ""; }; @@ -135,6 +146,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 23F5D6D72F182DE800AC7D9F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 23F5D6DF2F182DE900AC7D9F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 23F5D6E32F182DE900AC7D9F /* EssentialFeediOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 23FBD0C32EF1BDE2005E9351 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -164,6 +190,8 @@ 080EDEFE21B6DA7E00813479 /* EssentialFeedTests */, 23FBD0D12EF1BDE9005E9351 /* EssentialFeedAPIEndToEndTests */, 23FDEB372F089193004D2CD0 /* EssentialFeedCacheIntegrationTests */, + 23F5D6F02F182E5600AC7D9F /* EssentialFeediOS */, + 23F5D6EF2F182E5600AC7D9F /* EssentialFeediOSTests */, 080EDEF221B6DA7E00813479 /* Products */, ); sourceTree = ""; @@ -175,6 +203,8 @@ 080EDEFA21B6DA7E00813479 /* EssentialFeedTests.xctest */, 23FBD0C62EF1BDE2005E9351 /* EssentialFeedAPIEndToEndTests.xctest */, 23FDEB2B2F083D06004D2CD0 /* EssentialFeedCacheIntegrationTests.xctest */, + 23F5D6DA2F182DE800AC7D9F /* EssentialFeediOS.framework */, + 23F5D6E22F182DE900AC7D9F /* EssentialFeediOSTests.xctest */, ); name = Products; sourceTree = ""; @@ -234,6 +264,21 @@ path = "Feed Cache"; sourceTree = ""; }; + 23F5D6EF2F182E5600AC7D9F /* EssentialFeediOSTests */ = { + isa = PBXGroup; + children = ( + 23F5D6F12F182FC900AC7D9F /* EssentialFeediOS.xctestplan */, + ); + path = EssentialFeediOSTests; + sourceTree = ""; + }; + 23F5D6F02F182E5600AC7D9F /* EssentialFeediOS */ = { + isa = PBXGroup; + children = ( + ); + path = EssentialFeediOS; + sourceTree = ""; + }; 23FBD0752EECD0B3005E9351 /* Feed API */ = { isa = PBXGroup; children = ( @@ -332,6 +377,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 23F5D6D52F182DE800AC7D9F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -371,6 +423,46 @@ productReference = 080EDEFA21B6DA7E00813479 /* EssentialFeedTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 23F5D6D92F182DE800AC7D9F /* EssentialFeediOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 23F5D6ED2F182DE900AC7D9F /* Build configuration list for PBXNativeTarget "EssentialFeediOS" */; + buildPhases = ( + 23F5D6D52F182DE800AC7D9F /* Headers */, + 23F5D6D62F182DE800AC7D9F /* Sources */, + 23F5D6D72F182DE800AC7D9F /* Frameworks */, + 23F5D6D82F182DE800AC7D9F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = EssentialFeediOS; + packageProductDependencies = ( + ); + productName = EssentialFeediOS; + productReference = 23F5D6DA2F182DE800AC7D9F /* EssentialFeediOS.framework */; + productType = "com.apple.product-type.framework"; + }; + 23F5D6E12F182DE900AC7D9F /* EssentialFeediOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 23F5D6EE2F182DE900AC7D9F /* Build configuration list for PBXNativeTarget "EssentialFeediOSTests" */; + buildPhases = ( + 23F5D6DE2F182DE900AC7D9F /* Sources */, + 23F5D6DF2F182DE900AC7D9F /* Frameworks */, + 23F5D6E02F182DE900AC7D9F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 23F5D6E52F182DE900AC7D9F /* PBXTargetDependency */, + ); + name = EssentialFeediOSTests; + packageProductDependencies = ( + ); + productName = EssentialFeediOSTests; + productReference = 23F5D6E22F182DE900AC7D9F /* EssentialFeediOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 23FBD0C52EF1BDE2005E9351 /* EssentialFeedAPIEndToEndTests */ = { isa = PBXNativeTarget; buildConfigurationList = 23FBD0CD2EF1BDE2005E9351 /* Build configuration list for PBXNativeTarget "EssentialFeedAPIEndToEndTests" */; @@ -430,6 +522,12 @@ CreatedOnToolsVersion = 10.1; LastSwiftMigration = 1540; }; + 23F5D6D92F182DE800AC7D9F = { + CreatedOnToolsVersion = 26.0.1; + }; + 23F5D6E12F182DE900AC7D9F = { + CreatedOnToolsVersion = 26.0.1; + }; 23FBD0C52EF1BDE2005E9351 = { CreatedOnToolsVersion = 26.0.1; }; @@ -455,6 +553,8 @@ 080EDEF921B6DA7E00813479 /* EssentialFeedTests */, 23FBD0C52EF1BDE2005E9351 /* EssentialFeedAPIEndToEndTests */, 23FDEB2A2F083D06004D2CD0 /* EssentialFeedCacheIntegrationTests */, + 23F5D6D92F182DE800AC7D9F /* EssentialFeediOS */, + 23F5D6E12F182DE900AC7D9F /* EssentialFeediOSTests */, ); }; /* End PBXProject section */ @@ -474,6 +574,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 23F5D6D82F182DE800AC7D9F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 23F5D6E02F182DE900AC7D9F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 23FBD0C42EF1BDE2005E9351 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -536,6 +650,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 23F5D6D62F182DE800AC7D9F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 23F5D6DE2F182DE900AC7D9F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 23FBD0C22EF1BDE2005E9351 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -565,6 +693,11 @@ target = 080EDEF021B6DA7E00813479 /* EssentialFeed */; targetProxy = 080EDEFC21B6DA7E00813479 /* PBXContainerItemProxy */; }; + 23F5D6E52F182DE900AC7D9F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 23F5D6D92F182DE800AC7D9F /* EssentialFeediOS */; + targetProxy = 23F5D6E42F182DE900AC7D9F /* PBXContainerItemProxy */; + }; 23FBD0CC2EF1BDE2005E9351 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 080EDEF021B6DA7E00813479 /* EssentialFeed */; @@ -819,6 +952,140 @@ }; name = Release; }; + 23F5D6E92F182DE900AC7D9F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = YLLF7E9854; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.dapeter.EssentialFeediOS; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 23F5D6EA2F182DE900AC7D9F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = YLLF7E9854; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.dapeter.EssentialFeediOS; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 23F5D6EB2F182DE900AC7D9F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = YLLF7E9854; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dapeter.EssentialFeediOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 23F5D6EC2F182DE900AC7D9F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = YLLF7E9854; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dapeter.EssentialFeediOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 23FBD0CE2EF1BDE2005E9351 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -943,6 +1210,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 23F5D6ED2F182DE900AC7D9F /* Build configuration list for PBXNativeTarget "EssentialFeediOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 23F5D6E92F182DE900AC7D9F /* Debug */, + 23F5D6EA2F182DE900AC7D9F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 23F5D6EE2F182DE900AC7D9F /* Build configuration list for PBXNativeTarget "EssentialFeediOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 23F5D6EB2F182DE900AC7D9F /* Debug */, + 23F5D6EC2F182DE900AC7D9F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 23FBD0CD2EF1BDE2005E9351 /* Build configuration list for PBXNativeTarget "EssentialFeedAPIEndToEndTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeediOS.xcscheme b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeediOS.xcscheme new file mode 100644 index 0000000..65187f2 --- /dev/null +++ b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/EssentialFeediOS.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EssentialFeed/EssentialFeediOSTests/EssentialFeediOS.xctestplan b/EssentialFeed/EssentialFeediOSTests/EssentialFeediOS.xctestplan new file mode 100644 index 0000000..194ee61 --- /dev/null +++ b/EssentialFeed/EssentialFeediOSTests/EssentialFeediOS.xctestplan @@ -0,0 +1,35 @@ +{ + "configurations" : [ + { + "id" : "169EF862-3095-408C-B6F9-456CF2C65301", + "name" : "Test Scheme Action", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : { + "targets" : [ + { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "23F5D6D92F182DE800AC7D9F", + "name" : "EssentialFeediOS" + } + ] + }, + "performanceAntipatternCheckerEnabled" : true, + "testExecutionOrdering" : "random" + }, + "testTargets" : [ + { + "parallelizable" : true, + "target" : { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "23F5D6E12F182DE900AC7D9F", + "name" : "EssentialFeediOSTests" + } + } + ], + "version" : 1 +} From 32176030c5636eef0e6089223679142724f3510b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20S=C3=A1nchez?= Date: Wed, 14 Jan 2026 15:46:55 -0500 Subject: [PATCH 5/5] Add separate CI schemes for macOS and iOS as we now have an iOS-specific target that should not be tested on macOS. Create and rename CI testplans for each scheme --- .github/workflows/CI-iOS.yml | 31 ++++++++ .github/workflows/CI-macOS.yml | 2 +- .../EssentialFeed.xcodeproj/project.pbxproj | 10 +-- .../xcshareddata/xcschemes/CI_iOS.xcscheme | 72 +++++++++++++++++++ .../{CI.xcscheme => CI_macOS.xcscheme} | 2 +- .../CI_macOS.xctestplan} | 0 .../EssentialFeedAPIEndToEndTests.xctestplan | 0 ...entialFeedCacheIntegrationTests.xctestplan | 0 .../EssentialFeediOS/CI_iOS.xctestplan | 59 +++++++++++++++ 9 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/CI-iOS.yml create mode 100644 EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_iOS.xcscheme rename EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/{CI.xcscheme => CI_macOS.xcscheme} (97%) rename EssentialFeed/{CI.xctestplan => EssentialFeed/CI_macOS.xctestplan} (100%) rename EssentialFeed/{ => EssentialFeedAPIEndToEndTests}/EssentialFeedAPIEndToEndTests.xctestplan (100%) rename EssentialFeed/{ => EssentialFeedCacheIntegrationTests}/EssentialFeedCacheIntegrationTests.xctestplan (100%) create mode 100644 EssentialFeed/EssentialFeediOS/CI_iOS.xctestplan diff --git a/.github/workflows/CI-iOS.yml b/.github/workflows/CI-iOS.yml new file mode 100644 index 0000000..0e4cd87 --- /dev/null +++ b/.github/workflows/CI-iOS.yml @@ -0,0 +1,31 @@ + +name: CI-iOS + +# Controls when the action will run. +# Triggers the workflow on pull request events but only for the master branch. +on: + pull_request: + branches: [ master ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build-and-test" + build-and-test: + # The type of runner that the job will run on + runs-on: macos-26-xlarge + + timeout-minutes: 8 + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Select Xcode + run: sudo xcode-select -switch /Applications/Xcode_26.1.1.app + + - name: Xcode version + run: /usr/bin/xcodebuild -version + + - name: Build and Test + run: xcodebuild clean build test -project EssentialFeed/EssentialFeed.xcodeproj -scheme "CI_iOS" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -sdk iphonesimulator -destination "platform=iOS Simulator,OS=26.1,name=iPhone 17 Pro" ONLY_ACTIVE_ARCH=YES \ No newline at end of file diff --git a/.github/workflows/CI-macOS.yml b/.github/workflows/CI-macOS.yml index e263a9a..269bc02 100644 --- a/.github/workflows/CI-macOS.yml +++ b/.github/workflows/CI-macOS.yml @@ -28,4 +28,4 @@ jobs: run: /usr/bin/xcodebuild -version - name: Build and Test - run: xcodebuild clean build test -project EssentialFeed/EssentialFeed.xcodeproj -scheme "CI" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -sdk macosx -destination "platform=macOS" -enableThreadSanitizer YES ONLY_ACTIVE_ARCH=YES \ No newline at end of file + run: xcodebuild clean build test -project EssentialFeed/EssentialFeed.xcodeproj -scheme "CI_macOS" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -sdk macosx -destination "platform=macOS" -enableThreadSanitizer YES ONLY_ACTIVE_ARCH=YES \ No newline at end of file diff --git a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj index c317e27..8077629 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj +++ b/EssentialFeed/EssentialFeed.xcodeproj/project.pbxproj @@ -101,13 +101,14 @@ 23F5D6DA2F182DE800AC7D9F /* EssentialFeediOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EssentialFeediOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 23F5D6E22F182DE900AC7D9F /* EssentialFeediOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EssentialFeediOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 23F5D6F12F182FC900AC7D9F /* EssentialFeediOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = EssentialFeediOS.xctestplan; sourceTree = ""; }; + 23F5D6FA2F18345C00AC7D9F /* CI_iOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CI_iOS.xctestplan; sourceTree = ""; }; 23FBD0742EECD0B3005E9351 /* LoadFeedFromRemoteUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadFeedFromRemoteUseCaseTests.swift; sourceTree = ""; }; 23FBD0772EF05F5C005E9351 /* URLSessionHTTPClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionHTTPClientTests.swift; sourceTree = ""; }; 23FBD0BA2EF0F595005E9351 /* XCTestCase+MemoryLeakTracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+MemoryLeakTracking.swift"; sourceTree = ""; }; 23FBD0BC2EF1B022005E9351 /* URLSessionHTTPClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionHTTPClient.swift; sourceTree = ""; }; 23FBD0C62EF1BDE2005E9351 /* EssentialFeedAPIEndToEndTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EssentialFeedAPIEndToEndTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 23FBD0D02EF1BDE9005E9351 /* EssentialFeedAPIEndToEndTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EssentialFeedAPIEndToEndTests.swift; sourceTree = ""; }; - 23FBD0D42EF1C5FE005E9351 /* CI.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CI.xctestplan; sourceTree = ""; }; + 23FBD0D42EF1C5FE005E9351 /* CI_macOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CI_macOS.xctestplan; sourceTree = ""; }; 23FBD0DB2EFAE83A005E9351 /* CacheFeedUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheFeedUseCaseTests.swift; sourceTree = ""; }; 23FDEAFA2EFF40EE004D2CD0 /* FeedCacheSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedCacheSpy.swift; sourceTree = ""; }; 23FDEAFC2F0056CA004D2CD0 /* ValidateFeedCacheUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidateFeedCacheUseCaseTests.swift; sourceTree = ""; }; @@ -183,9 +184,6 @@ 080EDEE721B6DA7E00813479 = { isa = PBXGroup; children = ( - 23D3DB072F17FF4D00262C1D /* EssentialFeedAPIEndToEndTests.xctestplan */, - 23FDEB352F083D3A004D2CD0 /* EssentialFeedCacheIntegrationTests.xctestplan */, - 23FBD0D42EF1C5FE005E9351 /* CI.xctestplan */, 080EDEF321B6DA7E00813479 /* EssentialFeed */, 080EDEFE21B6DA7E00813479 /* EssentialFeedTests */, 23FBD0D12EF1BDE9005E9351 /* EssentialFeedAPIEndToEndTests */, @@ -212,6 +210,7 @@ 080EDEF321B6DA7E00813479 /* EssentialFeed */ = { isa = PBXGroup; children = ( + 23FBD0D42EF1C5FE005E9351 /* CI_macOS.xctestplan */, 23883FA32EFC50A400C80E74 /* Feed Cache */, 231DA90A2D28B38D00A50156 /* Feed API */, 080EDEF521B6DA7E00813479 /* Info.plist */, @@ -275,6 +274,7 @@ 23F5D6F02F182E5600AC7D9F /* EssentialFeediOS */ = { isa = PBXGroup; children = ( + 23F5D6FA2F18345C00AC7D9F /* CI_iOS.xctestplan */, ); path = EssentialFeediOS; sourceTree = ""; @@ -300,6 +300,7 @@ 23FBD0D12EF1BDE9005E9351 /* EssentialFeedAPIEndToEndTests */ = { isa = PBXGroup; children = ( + 23D3DB072F17FF4D00262C1D /* EssentialFeedAPIEndToEndTests.xctestplan */, 23FBD0D02EF1BDE9005E9351 /* EssentialFeedAPIEndToEndTests.swift */, ); path = EssentialFeedAPIEndToEndTests; @@ -362,6 +363,7 @@ 23FDEB372F089193004D2CD0 /* EssentialFeedCacheIntegrationTests */ = { isa = PBXGroup; children = ( + 23FDEB352F083D3A004D2CD0 /* EssentialFeedCacheIntegrationTests.xctestplan */, 23FDEB362F089193004D2CD0 /* EssentialFeedCacheIntegrationTests.swift */, ); path = EssentialFeedCacheIntegrationTests; diff --git a/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_iOS.xcscheme b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_iOS.xcscheme new file mode 100644 index 0000000..0cbde9a --- /dev/null +++ b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_iOS.xcscheme @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI.xcscheme b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_macOS.xcscheme similarity index 97% rename from EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI.xcscheme rename to EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_macOS.xcscheme index a050f0c..2c51ca5 100644 --- a/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI.xcscheme +++ b/EssentialFeed/EssentialFeed.xcodeproj/xcshareddata/xcschemes/CI_macOS.xcscheme @@ -30,7 +30,7 @@ shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/EssentialFeed/CI.xctestplan b/EssentialFeed/EssentialFeed/CI_macOS.xctestplan similarity index 100% rename from EssentialFeed/CI.xctestplan rename to EssentialFeed/EssentialFeed/CI_macOS.xctestplan diff --git a/EssentialFeed/EssentialFeedAPIEndToEndTests.xctestplan b/EssentialFeed/EssentialFeedAPIEndToEndTests/EssentialFeedAPIEndToEndTests.xctestplan similarity index 100% rename from EssentialFeed/EssentialFeedAPIEndToEndTests.xctestplan rename to EssentialFeed/EssentialFeedAPIEndToEndTests/EssentialFeedAPIEndToEndTests.xctestplan diff --git a/EssentialFeed/EssentialFeedCacheIntegrationTests.xctestplan b/EssentialFeed/EssentialFeedCacheIntegrationTests/EssentialFeedCacheIntegrationTests.xctestplan similarity index 100% rename from EssentialFeed/EssentialFeedCacheIntegrationTests.xctestplan rename to EssentialFeed/EssentialFeedCacheIntegrationTests/EssentialFeedCacheIntegrationTests.xctestplan diff --git a/EssentialFeed/EssentialFeediOS/CI_iOS.xctestplan b/EssentialFeed/EssentialFeediOS/CI_iOS.xctestplan new file mode 100644 index 0000000..8c83c69 --- /dev/null +++ b/EssentialFeed/EssentialFeediOS/CI_iOS.xctestplan @@ -0,0 +1,59 @@ +{ + "configurations" : [ + { + "id" : "3AFDBF55-EF7B-42C3-91B4-53F281C75682", + "name" : "Configuration 1", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : { + "targets" : [ + { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "080EDEF021B6DA7E00813479", + "name" : "EssentialFeed" + }, + { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "23F5D6D92F182DE800AC7D9F", + "name" : "EssentialFeediOS" + } + ] + }, + "testExecutionOrdering" : "random" + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "23FDEB2A2F083D06004D2CD0", + "name" : "EssentialFeedCacheIntegrationTests" + } + }, + { + "target" : { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "080EDEF921B6DA7E00813479", + "name" : "EssentialFeedTests" + } + }, + { + "target" : { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "23FBD0C52EF1BDE2005E9351", + "name" : "EssentialFeedAPIEndToEndTests" + } + }, + { + "target" : { + "containerPath" : "container:EssentialFeed.xcodeproj", + "identifier" : "23F5D6E12F182DE900AC7D9F", + "name" : "EssentialFeediOSTests" + } + } + ], + "version" : 1 +}