Partially added icloud support for console logo. Added iCloud utilities and tests

This commit is contained in:
2021-05-18 11:46:37 +02:00
parent bcf3098bfe
commit 0c40187409
16 changed files with 430 additions and 61 deletions

View File

@@ -39,9 +39,12 @@
B98CBBDB264E98DE00B1B7AC /* Console+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CBBD8264E98DD00B1B7AC /* Console+CoreDataProperties.swift */; }; B98CBBDB264E98DE00B1B7AC /* Console+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CBBD8264E98DD00B1B7AC /* Console+CoreDataProperties.swift */; };
B98CBBDC264E98DE00B1B7AC /* GameSeries+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CBBD9264E98DD00B1B7AC /* GameSeries+CoreDataClass.swift */; }; B98CBBDC264E98DE00B1B7AC /* GameSeries+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CBBD9264E98DD00B1B7AC /* GameSeries+CoreDataClass.swift */; };
B98CBBDD264E98F300B1B7AC /* Console+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F922D1352F0029BFAD /* Console+CoreDataClass.swift */; }; B98CBBDD264E98F300B1B7AC /* Console+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F922D1352F0029BFAD /* Console+CoreDataClass.swift */; };
B98CBBE3265045AC00B1B7AC /* URLExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CBBE2265045AC00B1B7AC /* URLExtension.swift */; };
B98CBBEB2652B75F00B1B7AC /* ZockerhoehleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CBBEA2652B75F00B1B7AC /* ZockerhoehleTests.swift */; };
B9A0550122F8C22D0054D9A0 /* GameSeriesAllView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A0550022F8C22D0054D9A0 /* GameSeriesAllView.swift */; }; B9A0550122F8C22D0054D9A0 /* GameSeriesAllView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A0550022F8C22D0054D9A0 /* GameSeriesAllView.swift */; };
B9A0550322F8C2740054D9A0 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A0550222F8C2740054D9A0 /* MainView.swift */; }; B9A0550322F8C2740054D9A0 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A0550222F8C2740054D9A0 /* MainView.swift */; };
B9A0550522F8CB400054D9A0 /* GameSeriesLibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A0550422F8CB400054D9A0 /* GameSeriesLibraryView.swift */; }; B9A0550522F8CB400054D9A0 /* GameSeriesLibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A0550422F8CB400054D9A0 /* GameSeriesLibraryView.swift */; };
B9BCCEB92653BDEA005F46D6 /* ICloudManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9BCCEB82653BDEA005F46D6 /* ICloudManager.swift */; };
B9BCF4CA2168ACB600ECBAAC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */; }; B9BCF4CA2168ACB600ECBAAC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */; };
B9D2C6F722E98ED800797F67 /* AccessoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9D2C6F622E98ED800797F67 /* AccessoryViewModel.swift */; }; B9D2C6F722E98ED800797F67 /* AccessoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9D2C6F622E98ED800797F67 /* AccessoryViewModel.swift */; };
B9E2A079233B69D400EAEB14 /* GameSeriesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E2A078233B69D400EAEB14 /* GameSeriesViewModel.swift */; }; B9E2A079233B69D400EAEB14 /* GameSeriesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E2A078233B69D400EAEB14 /* GameSeriesViewModel.swift */; };
@@ -58,6 +61,16 @@
B9F44AE922F4655600FC6B29 /* AccessoryStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9F44AE822F4655600FC6B29 /* AccessoryStore.swift */; }; B9F44AE922F4655600FC6B29 /* AccessoryStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9F44AE822F4655600FC6B29 /* AccessoryStore.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
B98CBBED2652B75F00B1B7AC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = B93C1B9121496BFD0014FD6E /* Project object */;
proxyType = 1;
remoteGlobalIDString = B93C1B9821496BFD0014FD6E;
remoteInfo = Zockerhoehle;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
B983997A233A0295002F9946 /* Embed Watch Content */ = { B983997A233A0295002F9946 /* Embed Watch Content */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
@@ -108,9 +121,14 @@
B98CBBD7264E98DD00B1B7AC /* GameSeries+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GameSeries+CoreDataProperties.swift"; sourceTree = "<group>"; }; B98CBBD7264E98DD00B1B7AC /* GameSeries+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GameSeries+CoreDataProperties.swift"; sourceTree = "<group>"; };
B98CBBD8264E98DD00B1B7AC /* Console+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Console+CoreDataProperties.swift"; sourceTree = "<group>"; }; B98CBBD8264E98DD00B1B7AC /* Console+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Console+CoreDataProperties.swift"; sourceTree = "<group>"; };
B98CBBD9264E98DD00B1B7AC /* GameSeries+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GameSeries+CoreDataClass.swift"; sourceTree = "<group>"; }; B98CBBD9264E98DD00B1B7AC /* GameSeries+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GameSeries+CoreDataClass.swift"; sourceTree = "<group>"; };
B98CBBE2265045AC00B1B7AC /* URLExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLExtension.swift; sourceTree = "<group>"; };
B98CBBE82652B75F00B1B7AC /* ZockerhoehleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZockerhoehleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
B98CBBEA2652B75F00B1B7AC /* ZockerhoehleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZockerhoehleTests.swift; sourceTree = "<group>"; };
B98CBBEC2652B75F00B1B7AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B9A0550022F8C22D0054D9A0 /* GameSeriesAllView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSeriesAllView.swift; sourceTree = "<group>"; }; B9A0550022F8C22D0054D9A0 /* GameSeriesAllView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSeriesAllView.swift; sourceTree = "<group>"; };
B9A0550222F8C2740054D9A0 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; }; B9A0550222F8C2740054D9A0 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; };
B9A0550422F8CB400054D9A0 /* GameSeriesLibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSeriesLibraryView.swift; sourceTree = "<group>"; }; B9A0550422F8CB400054D9A0 /* GameSeriesLibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSeriesLibraryView.swift; sourceTree = "<group>"; };
B9BCCEB82653BDEA005F46D6 /* ICloudManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ICloudManager.swift; sourceTree = "<group>"; };
B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; }; B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
B9D2C6F622E98ED800797F67 /* AccessoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessoryViewModel.swift; sourceTree = "<group>"; }; B9D2C6F622E98ED800797F67 /* AccessoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessoryViewModel.swift; sourceTree = "<group>"; };
B9E2A078233B69D400EAEB14 /* GameSeriesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSeriesViewModel.swift; sourceTree = "<group>"; }; B9E2A078233B69D400EAEB14 /* GameSeriesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameSeriesViewModel.swift; sourceTree = "<group>"; };
@@ -137,6 +155,13 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
B98CBBE52652B75F00B1B7AC /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
@@ -175,6 +200,7 @@
B98B2FAB232C0F8C00606DC4 /* ImagePicker.swift */, B98B2FAB232C0F8C00606DC4 /* ImagePicker.swift */,
B9EC09812383F94B004BC9AB /* LibraryExport.swift */, B9EC09812383F94B004BC9AB /* LibraryExport.swift */,
B90E03EA238557D900E79643 /* LibraryImport.swift */, B90E03EA238557D900E79643 /* LibraryImport.swift */,
B98CBBE2265045AC00B1B7AC /* URLExtension.swift */,
); );
path = Utils; path = Utils;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -183,6 +209,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B93C1B9B21496BFD0014FD6E /* Zockerhoehle */, B93C1B9B21496BFD0014FD6E /* Zockerhoehle */,
B98CBBE92652B75F00B1B7AC /* ZockerhoehleTests */,
B93C1B9A21496BFD0014FD6E /* Products */, B93C1B9A21496BFD0014FD6E /* Products */,
B90B64A12235909900E54BA3 /* Frameworks */, B90B64A12235909900E54BA3 /* Frameworks */,
B94CB53522D3708F0029BFAD /* Zockerhoehle copy-Info.plist */, B94CB53522D3708F0029BFAD /* Zockerhoehle copy-Info.plist */,
@@ -193,6 +220,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B93C1B9921496BFD0014FD6E /* Zockerhoehle.app */, B93C1B9921496BFD0014FD6E /* Zockerhoehle.app */,
B98CBBE82652B75F00B1B7AC /* ZockerhoehleTests.xctest */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -209,6 +237,7 @@
B9F44ABD22F31DEF00FC6B29 /* SceneDelegate.swift */, B9F44ABD22F31DEF00FC6B29 /* SceneDelegate.swift */,
B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */, B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */,
B98A735F22C1738800FB3410 /* CDManager.swift */, B98A735F22C1738800FB3410 /* CDManager.swift */,
B9BCCEB82653BDEA005F46D6 /* ICloudManager.swift */,
B93C1BA321496BFE0014FD6E /* Assets.xcassets */, B93C1BA321496BFE0014FD6E /* Assets.xcassets */,
B93C1BA821496BFE0014FD6E /* Info.plist */, B93C1BA821496BFE0014FD6E /* Info.plist */,
B98A731722BA9E4600FB3410 /* Zockerhoehle.xcdatamodeld */, B98A731722BA9E4600FB3410 /* Zockerhoehle.xcdatamodeld */,
@@ -254,6 +283,15 @@
path = CDModel; path = CDModel;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
B98CBBE92652B75F00B1B7AC /* ZockerhoehleTests */ = {
isa = PBXGroup;
children = (
B98CBBEA2652B75F00B1B7AC /* ZockerhoehleTests.swift */,
B98CBBEC2652B75F00B1B7AC /* Info.plist */,
);
path = ZockerhoehleTests;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@@ -280,13 +318,31 @@
productReference = B93C1B9921496BFD0014FD6E /* Zockerhoehle.app */; productReference = B93C1B9921496BFD0014FD6E /* Zockerhoehle.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
}; };
B98CBBE72652B75F00B1B7AC /* ZockerhoehleTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = B98CBBF12652B75F00B1B7AC /* Build configuration list for PBXNativeTarget "ZockerhoehleTests" */;
buildPhases = (
B98CBBE42652B75F00B1B7AC /* Sources */,
B98CBBE52652B75F00B1B7AC /* Frameworks */,
B98CBBE62652B75F00B1B7AC /* Resources */,
);
buildRules = (
);
dependencies = (
B98CBBEE2652B75F00B1B7AC /* PBXTargetDependency */,
);
name = ZockerhoehleTests;
productName = ZockerhoehleTests;
productReference = B98CBBE82652B75F00B1B7AC /* ZockerhoehleTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
/* Begin PBXProject section */ /* Begin PBXProject section */
B93C1B9121496BFD0014FD6E /* Project object */ = { B93C1B9121496BFD0014FD6E /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 1100; LastSwiftUpdateCheck = 1250;
LastUpgradeCheck = 1250; LastUpgradeCheck = 1250;
ORGANIZATIONNAME = "Julian-Steffen Müller"; ORGANIZATIONNAME = "Julian-Steffen Müller";
TargetAttributes = { TargetAttributes = {
@@ -294,6 +350,10 @@
CreatedOnToolsVersion = 9.4.1; CreatedOnToolsVersion = 9.4.1;
LastSwiftMigration = 1020; LastSwiftMigration = 1020;
}; };
B98CBBE72652B75F00B1B7AC = {
CreatedOnToolsVersion = 12.5;
TestTargetID = B93C1B9821496BFD0014FD6E;
};
}; };
}; };
buildConfigurationList = B93C1B9421496BFD0014FD6E /* Build configuration list for PBXProject "Zockerhoehle" */; buildConfigurationList = B93C1B9421496BFD0014FD6E /* Build configuration list for PBXProject "Zockerhoehle" */;
@@ -314,6 +374,7 @@
projectRoot = ""; projectRoot = "";
targets = ( targets = (
B93C1B9821496BFD0014FD6E /* Zockerhoehle */, B93C1B9821496BFD0014FD6E /* Zockerhoehle */,
B98CBBE72652B75F00B1B7AC /* ZockerhoehleTests */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@@ -328,6 +389,13 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
B98CBBE62652B75F00B1B7AC /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
@@ -361,6 +429,7 @@
B98B2FAA2328DF3400606DC4 /* GameSeriesStore.swift in Sources */, B98B2FAA2328DF3400606DC4 /* GameSeriesStore.swift in Sources */,
B9839991233A0E16002F9946 /* GameSeriesCover+CoreDataProperties.swift in Sources */, B9839991233A0E16002F9946 /* GameSeriesCover+CoreDataProperties.swift in Sources */,
B983998C233A0BC9002F9946 /* Cover+CoreDataClass.swift in Sources */, B983998C233A0BC9002F9946 /* Cover+CoreDataClass.swift in Sources */,
B98CBBE3265045AC00B1B7AC /* URLExtension.swift in Sources */,
B9839992233A0E19002F9946 /* GameSeriesCover+CoreDataClass.swift in Sources */, B9839992233A0E19002F9946 /* GameSeriesCover+CoreDataClass.swift in Sources */,
B94112E0233A4EF800159AE4 /* GamePickupsView.swift in Sources */, B94112E0233A4EF800159AE4 /* GamePickupsView.swift in Sources */,
B94112E2233B55B100159AE4 /* ConsoleViewModel.swift in Sources */, B94112E2233B55B100159AE4 /* ConsoleViewModel.swift in Sources */,
@@ -397,14 +466,31 @@
B98A736022C1738800FB3410 /* CDManager.swift in Sources */, B98A736022C1738800FB3410 /* CDManager.swift in Sources */,
B94CB50222D1352F0029BFAD /* Cover+CoreDataProperties.swift in Sources */, B94CB50222D1352F0029BFAD /* Cover+CoreDataProperties.swift in Sources */,
B9E2A07E233B6E4F00EAEB14 /* ConsoleAllView.swift in Sources */, B9E2A07E233B6E4F00EAEB14 /* ConsoleAllView.swift in Sources */,
B9BCCEB92653BDEA005F46D6 /* ICloudManager.swift in Sources */,
B9EC0987238555BF004BC9AB /* SettingsView.swift in Sources */, B9EC0987238555BF004BC9AB /* SettingsView.swift in Sources */,
B9F44AE522F418F600FC6B29 /* ConsoleStore.swift in Sources */, B9F44AE522F418F600FC6B29 /* ConsoleStore.swift in Sources */,
B9E2A079233B69D400EAEB14 /* GameSeriesViewModel.swift in Sources */, B9E2A079233B69D400EAEB14 /* GameSeriesViewModel.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
B98CBBE42652B75F00B1B7AC /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B98CBBEB2652B75F00B1B7AC /* ZockerhoehleTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
B98CBBEE2652B75F00B1B7AC /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = B93C1B9821496BFD0014FD6E /* Zockerhoehle */;
targetProxy = B98CBBED2652B75F00B1B7AC /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
B93C1BA921496BFE0014FD6E /* Debug */ = { B93C1BA921496BFE0014FD6E /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
@@ -537,6 +623,7 @@
"$(PROJECT_DIR)/Carthage/Build/iOS", "$(PROJECT_DIR)/Carthage/Build/iOS",
); );
INFOPLIST_FILE = Zockerhoehle/Info.plist; INFOPLIST_FILE = Zockerhoehle/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@@ -562,6 +649,7 @@
"$(PROJECT_DIR)/Carthage/Build/iOS", "$(PROJECT_DIR)/Carthage/Build/iOS",
); );
INFOPLIST_FILE = Zockerhoehle/Info.plist; INFOPLIST_FILE = Zockerhoehle/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@@ -574,6 +662,51 @@
}; };
name = Release; name = Release;
}; };
B98CBBEF2652B75F00B1B7AC /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 85J8CBD673;
INFOPLIST_FILE = ZockerhoehleTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.5;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = haus.mueller.ZockerhoehleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Zockerhoehle.app/Zockerhoehle";
};
name = Debug;
};
B98CBBF02652B75F00B1B7AC /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 85J8CBD673;
INFOPLIST_FILE = ZockerhoehleTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.5;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = haus.mueller.ZockerhoehleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Zockerhoehle.app/Zockerhoehle";
};
name = Release;
};
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
@@ -595,6 +728,15 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
B98CBBF12652B75F00B1B7AC /* Build configuration list for PBXNativeTarget "ZockerhoehleTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B98CBBEF2652B75F00B1B7AC /* Debug */,
B98CBBF02652B75F00B1B7AC /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */ /* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */

View File

@@ -23,6 +23,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
#endif #endif
print("disFinishLaunchung") print("disFinishLaunchung")
/*let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")//.appendingPathComponent("Zockerhoehle").appendingPathComponent("consoles")
if !FileManager.default.fileExists(atPath: url!.path, isDirectory: nil) {
do {
print("------------ \(url)")
try FileManager.default.createDirectory(at: url!, withIntermediateDirectories: true, attributes: nil)
}
catch {
print(error.localizedDescription)
}
}else {
let url2 = url?.appendingPathComponent("test23.txt")
FileManager.default.createFile(atPath: url2!.path, contents: nil, attributes: nil)
print("------------- \(url2)")
}*/
//FlockeWS.fetchEntries(for: GameCollection.consoleID) //FlockeWS.fetchEntries(for: GameCollection.consoleID)

View File

@@ -40,7 +40,7 @@ public class Console: NSManagedObject, Identifiable {
} }
} }
public static func sortConsoleByNewestGame(consoleA : Console, consoleB : Console) -> Bool { public static func compareConsolesByNewestGame(consoleA : Console, consoleB : Console) -> Bool {
guard let newestGameConsoleA = (consoleA.games!.allObjects as! [Game]).max(by:{ guard let newestGameConsoleA = (consoleA.games!.allObjects as! [Game]).max(by:{
Game.compareByCreationDate(gameA: $0, gameB: $1) Game.compareByCreationDate(gameA: $0, gameB: $1)
}) else { return false } }) else { return false }
@@ -72,6 +72,7 @@ extension Console : Encodable {
case accessories case accessories
case games case games
case logo case logo
case logo_icloud_path
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
@@ -81,7 +82,7 @@ extension Console : Encodable {
try container.encode(shortName ?? "", forKey: .shortName) try container.encode(shortName ?? "", forKey: .shortName)
try container.encode(generation, forKey: .generation) try container.encode(generation, forKey: .generation)
try container.encode(manufacturer ?? "", forKey: .manufacturer) try container.encode(manufacturer ?? "", forKey: .manufacturer)
try container.encode(logo_icloud_path ?? "", forKey: .logo_icloud_path)
var accessoryList : [String] = [] var accessoryList : [String] = []
for accessory in accessories! { for accessory in accessories! {
if let accessory = accessory as? Accessory { if let accessory = accessory as? Accessory {

View File

@@ -26,6 +26,7 @@ extension Console {
@NSManaged public var accessories: NSSet? @NSManaged public var accessories: NSSet?
@NSManaged public var games: NSSet? @NSManaged public var games: NSSet?
@NSManaged public var logo: Logo? @NSManaged public var logo: Logo?
@NSManaged public var logo_icloud_path : String?
} }

View File

@@ -0,0 +1,48 @@
//
// ICloudDriveManager.swift
// Zockerhoehle
//
// Created by Julian-Steffen Müller on 18.05.21.
// Copyright © 2021 Julian-Steffen Müller. All rights reserved.
//
import Foundation
import UIKit
class ICloudManager {
static let shared : ICloudManager = ICloudManager();
static let relative_seperator : [String] = ["iCloud~Zockerhoehle", "Documents"]
static public func relativePathFrom(url : URL) -> String? {
return url.relative_path_after(pathComponent: relative_seperator) ?? .none
}
static public func fileExists(at path : String?) -> Bool {
guard let path = path else { return false }
if let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent(path) {
return FileManager.default.fileExists(atPath: url.path)
}
return false;
}
static public func imageFrom(path : String?) -> UIImage? {
guard let path = path else { return .none }
do {
let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent(path)
let imageData = try Data(contentsOf: url!)
return UIImage(data: imageData)!
}catch {
return .none
}
}
private init() {
}
}

View File

@@ -2,6 +2,18 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.Zockerhoehle</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>Zockerhoehle</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>One</string>
</dict>
</dict>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
@@ -19,7 +31,7 @@
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0</string> <string>1.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1</string> <string>7</string>
<key>LSApplicationCategoryType</key> <key>LSApplicationCategoryType</key>
<string></string> <string></string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>

View File

@@ -25,9 +25,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, UIApplicationDelegate {
if let windowScene = scene as? UIWindowScene { if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene) let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: MainView() let contentView = MainView()
.environmentObject(self.gameSeriesStore) .environmentObject(self.gameSeriesStore)
.environmentObject(self.consolesStore)) .environmentObject(self.consolesStore)
.environment(\.managedObjectContext, CDManager.shared.viewContext)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window self.window = window
window.makeKeyAndVisible() window.makeKeyAndVisible()
} }

View File

@@ -0,0 +1,35 @@
//
// URLExtension.swift
// Zockerhoehle
//
// Created by Julian-Steffen Müller on 15.05.21.
// Copyright © 2021 Julian-Steffen Müller. All rights reserved.
//
import Foundation
extension URL {
/*
This function created
*/
func relative_path_after(pathComponent seperator_components : [String]) -> String? {
var seperators = seperator_components
var url = URL(string: "")
for path_component in pathComponents {
if seperators.count == 0 {
if url == .none {
url = URL(string: path_component)
}else {
url = url?.appendingPathComponent(path_component)
}
}else{
if seperators.first! == path_component {
seperators.removeFirst()
}
}
}
return url?.absoluteString ?? .none
}
}

View File

@@ -10,7 +10,7 @@ import SwiftUI
import Combine import Combine
class ConsoleViewModel : ObservableObject { class ConsoleViewModel : ObservableObject {
var objectWillChange = ObservableObjectPublisher() //var objectWillChange = ObservableObjectPublisher()
init(_ console: Console) { init(_ console: Console) {
self.console = console self.console = console
@@ -25,7 +25,7 @@ class ConsoleViewModel : ObservableObject {
} }
} }
var name : String { @Published var name : String {
didSet { didSet {
guard let console = console else { return } guard let console = console else { return }
console.name = name console.name = name

View File

@@ -12,18 +12,23 @@ import QGrid
struct ModalAddConsoleToLibrary : View { struct ModalAddConsoleToLibrary : View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@Environment(\.managedObjectContext) private var viewContext
@State var modalConsoleName : String = "" @State var modalConsoleName : String = ""
@State var modalConsoleLogoICloudPath : String? = .none
private func addConsoleToLibrary() { @State var isImporting : Bool = false
//TODO
} let defaultImage = UIImage()
var addButton : some View { var addButton : some View {
return Button(action: { return Button(action: {
addConsoleToLibrary() let console = Console(context: viewContext)
console.name = self.modalConsoleName
console.logo_icloud_path = self.modalConsoleLogoICloudPath
self.presentationMode.wrappedValue.dismiss()}, self.presentationMode.wrappedValue.dismiss()},
label: { Text("Add") }) label: { Text("Fertig") })
.disabled(self.modalConsoleName.trimmingCharacters(in: .whitespacesAndNewlines) == "" ) .disabled(self.modalConsoleName.trimmingCharacters(in: .whitespacesAndNewlines) == "" )
} }
@@ -31,40 +36,55 @@ struct ModalAddConsoleToLibrary : View {
NavigationView { NavigationView {
Form { Form {
TextField("Name", text: $modalConsoleName) TextField("Name", text: $modalConsoleName)
Image(uiImage: ICloudManager.imageFrom(path: self.modalConsoleLogoICloudPath) ?? defaultImage)
.resizable()
.scaledToFit()
Button(action: {
isImporting = true;
}, label: { Text("Bla")})
} }
.font(.caption) .font(.caption)
.navigationBarTitle(Text("New Console")) .navigationBarTitle(Text("Neue Konsole anlegen"))
.navigationBarItems(leading: Button(action: { self.presentationMode.wrappedValue.dismiss() }, .navigationBarItems(leading: Button(action: { self.presentationMode.wrappedValue.dismiss() },
label: {Text("Cancel")}), label: {Text("Abbrechen")}),
//Add Button is disabled if no name is entered //Add Button is disabled if no name is entered
trailing: addButton) trailing: addButton)
.navigationViewStyle(StackNavigationViewStyle()) .navigationViewStyle(StackNavigationViewStyle())
.fileImporter(
isPresented: $isImporting,
allowedContentTypes: [.jpeg, .png],
allowsMultipleSelection: false
) { result in
do {
let selectedFile : URL = try result.get().first!
//It seems that isUbiquitousItem checks if the file is contained in the Apps iCloud folder
if (FileManager.default.isUbiquitousItem(at: selectedFile)) {
self.modalConsoleLogoICloudPath = ICloudManager.relativePathFrom(url: selectedFile)
print("Selected Image in iCloud Path \(self.modalConsoleLogoICloudPath ?? "n/a")")
}else{
Alert(title: Text("Falscher Ordner"))
print("Außerhalb \(selectedFile.relativeString)")
}
}catch{
print("ConsoleAllView::ModalAddConsoleToLibrary Error getting result '\(result)'")
}
}
} }
} }
} }
struct ConsolesListView : View { struct ConsolesListView : View {
@EnvironmentObject var consoleStore : ConsoleStore @Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: Console.entity(), sortDescriptors: [NSSortDescriptor(key: "manufacturer", ascending: true), NSSortDescriptor(key: "generation", ascending: true), NSSortDescriptor(key: "name", ascending: true)])
var consoles: FetchedResults<Console>
@State var showAddConsoleToLibraryModal: Bool = false @State var showAddConsoleToLibraryModal: Bool = false
var body: some View { var body: some View {
/*List(consoleStore.consoles) {console in QGrid(consoles, columns: 4, columnsInLandscape: 6) {
NavigationLink(destination: ConsoleLibraryView(console: console)) {
HStack {
if console.logo?.image != nil {
Image(uiImage: console.logo!.image!).resizable().frame(width: 50.0, height: 50.0)
}else {
Image(systemName: "stop").resizable().frame(width: 50.0, height: 50.0)
}
VStack(alignment: .leading) {
Text("\(console.name)")
Text("Spiele: \(console.games.filter({($0 as! Game).inWishlist == false}).count), Zubehör: \(console.accessories.filter({($0 as! Accessory).inWishlist == false}).count)")
}
}
}
}*/
QGrid(consoleStore.consoles, columns: 4, columnsInLandscape: 6) {
GridCell(console: $0) GridCell(console: $0)
} }
.padding() .padding()
@@ -82,27 +102,28 @@ struct ConsolesListView : View {
} }
struct GridCell: View { struct GridCell: View {
var console: Console var console: Console
let defaultImage = UIImage()
var body: some View {
VStack() { var body: some View {
if console.logo?.image != nil { VStack() {
NavigationLink(destination: ConsoleLibraryView(console: console)) { if ICloudManager.fileExists(at: console.logo_icloud_path) {
VStack { NavigationLink(destination: ConsoleLibraryView(console: console)) {
Image(uiImage: (console.logo?.image)!) VStack {
.resizable() Image(uiImage: ICloudManager.imageFrom(path: console.logo_icloud_path) ?? defaultImage)
.scaledToFit() .resizable()
//.shadow(color: .primary, radius: 5) .scaledToFit()
.padding([.horizontal, .top], 7) //.shadow(color: .primary, radius: 5)
Text(console.shortName ?? console.name!).lineLimit(1) .padding([.horizontal, .top], 7)
Text(console.shortName ?? console.name!).lineLimit(1)
}
}.buttonStyle(PlainButtonStyle())
}else{
NavigationLink(destination: ConsoleLibraryView(console: console)) {
Text(console.shortName ?? console.name!)
} }
}.buttonStyle(PlainButtonStyle()) }
}else{
Text("mu")
} }
//
//Text(person.lastName).lineLimit(1)
} }
}
} }

View File

@@ -18,6 +18,6 @@ struct GamePickupsView: View {
} }
} }
.padding(.top) // Workaround, damit die Liste beim scrollen nicht unter der NavigationView angezeigt wird .padding(.top) // Workaround, damit die Liste beim scrollen nicht unter der NavigationView angezeigt wird
.navigationBarTitle(Text("Latest Pickups")) .navigationBarTitle(Text("Zuletzt gehortete Spiele"))
} }
} }

View File

@@ -34,22 +34,39 @@ struct OverviewHeader<Destination : View> : View {
} }
} }
struct EmptyCategory : View {
private var emptyMessage : String
init(_ emptyMessage: String) {
self.emptyMessage = emptyMessage
}
var body : some View {
HStack() {
Spacer()
Text("Keine Spiele in der Zockerhöhle!").frame(height: 75)
Spacer()
}
}
}
struct Overview: View { struct Overview: View {
@EnvironmentObject var consoleStore : ConsoleStore @EnvironmentObject var consoleStore : ConsoleStore
@ObservedObject var gameStore : GameStore = GameStore(sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false), NSSortDescriptor(key: "name", ascending: true)], fetchLimit: 10) @ObservedObject var gameStore : GameStore = GameStore(sortDescriptors: [NSSortDescriptor(key: "createdAt", ascending: false), NSSortDescriptor(key: "name", ascending: true)], fetchLimit: 10)
@EnvironmentObject var gameSeriesStore : GameSeriesStore @EnvironmentObject var gameSeriesStore : GameSeriesStore
@ObservedObject var featuredStore = FeaturedStore() @ObservedObject var featuredStore = FeaturedStore()
var ConsolesOverview : some View { var ConsolesOverview : some View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
OverviewHeader(title: "Aktivste Konsolen", destination: ConsolesListView()) OverviewHeader(title: "Aktivste Konsolen", destination: ConsolesListView())
if consoleStore.consoles.count == 0 { if consoleStore.consoles.count == 0 {
Text("No consoles") EmptyCategory("Keine Konsolen in der Zockerhöhle!")
}else{ }else{
ScrollView(.horizontal, showsIndicators: false) { ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .top, spacing: 0) { HStack(alignment: .top, spacing: 0) {
ForEach(consoleStore.consoles.sorted(by: { Console.sortConsoleByNewestGame(consoleA: $0, consoleB: $1)})) { console in ForEach(consoleStore.consoles.sorted(by: { Console.compareConsolesByNewestGame(consoleA: $0, consoleB: $1)})) { console in
NavigationLink(destination: ConsoleLibraryView(console: console)) { NavigationLink(destination: ConsoleLibraryView(console: console)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
Group { Group {
@@ -80,10 +97,10 @@ struct Overview: View {
var GamesOverview : some View { var GamesOverview : some View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
//TODO //TODO
OverviewHeader(title: "Latest Game Pickups", destination: GamePickupsView()) OverviewHeader(title: "Zuletzt gehortete Spiele", destination: GamePickupsView())
if gameStore.games.count == 0 { if gameStore.games.count == 0 {
Text("No Games") EmptyCategory("Keine Spiele in der Zockerhöhle")
}else { }else {
ScrollView(.horizontal, showsIndicators: false) { ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .top, spacing: 0) { HStack(alignment: .top, spacing: 0) {
@@ -121,7 +138,7 @@ struct Overview: View {
OverviewHeader(title: "Spielserien", destination: GameSeriesAllView()) OverviewHeader(title: "Spielserien", destination: GameSeriesAllView())
if gameSeriesStore.gameSeries.count == 0 { if gameSeriesStore.gameSeries.count == 0 {
Text("No game series") EmptyCategory("Keine Spieleserie angelegt!")
}else{ }else{
ScrollView(.horizontal, showsIndicators: false) { ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .top, spacing: 0) { HStack(alignment: .top, spacing: 0) {
@@ -177,7 +194,7 @@ struct Overview: View {
} }
}.buttonStyle(PlainButtonStyle()) }.buttonStyle(PlainButtonStyle())
}else { }else {
Text("No featured console") EmptyCategory("Nichts aktuelles :(")
} }
Spacer() Spacer()
} }

View File

@@ -11,6 +11,11 @@
<key>com.apple.developer.icloud-services</key> <key>com.apple.developer.icloud-services</key>
<array> <array>
<string>CloudKit</string> <string>CloudKit</string>
<string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>iCloud.Zockerhoehle</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View File

@@ -13,6 +13,7 @@
<entity name="Console" representedClassName="Console" syncable="YES"> <entity name="Console" representedClassName="Console" syncable="YES">
<attribute name="circumstances" optional="YES" attributeType="String"/> <attribute name="circumstances" optional="YES" attributeType="String"/>
<attribute name="generation" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/> <attribute name="generation" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
<attribute name="logo_icloud_path" optional="YES" attributeType="String"/>
<attribute name="manufacturer" optional="YES" attributeType="String"/> <attribute name="manufacturer" optional="YES" attributeType="String"/>
<attribute name="name" attributeType="String" defaultValueString=""/> <attribute name="name" attributeType="String" defaultValueString=""/>
<attribute name="shortName" optional="YES" attributeType="String"/> <attribute name="shortName" optional="YES" attributeType="String"/>
@@ -59,7 +60,7 @@
</entity> </entity>
<elements> <elements>
<element name="Accessory" positionX="-265.9140625" positionY="29.15625" width="128" height="149"/> <element name="Accessory" positionX="-265.9140625" positionY="29.15625" width="128" height="149"/>
<element name="Console" positionX="-535.7890625" positionY="56.03515625" width="128" height="164"/> <element name="Console" positionX="-535.7890625" positionY="56.03515625" width="128" height="179"/>
<element name="Cover" positionX="-66.69921875" positionY="223.48046875" width="128" height="59"/> <element name="Cover" positionX="-66.69921875" positionY="223.48046875" width="128" height="59"/>
<element name="Game" positionX="-288.828125" positionY="276.7421875" width="128" height="245"/> <element name="Game" positionX="-288.828125" positionY="276.7421875" width="128" height="245"/>
<element name="GameSeries" positionX="-686.828125" positionY="359.20703125" width="128" height="89"/> <element name="GameSeries" positionX="-686.828125" positionY="359.20703125" width="128" height="89"/>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View File

@@ -0,0 +1,45 @@
//
// ZockerhoehleTests.swift
// ZockerhoehleTests
//
// Created by Julian-Steffen Müller on 17.05.21.
// Copyright © 2021 Julian-Steffen Müller. All rights reserved.
//
import XCTest
@testable import Zockerhoehle
class ZockerhoehleTests: XCTestCase {
let icloud_drive_seperators : [String] = ["iCloud~Zockerhoehle", "Documents"]
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func test_url_icloud_split() throws {
// VALID FILES
let url_valid_file : URL = URL(string: "file:///private/var/mobile/Library/Mobile%20Documents/iCloud~Zockerhoehle/Documents/backup.json")!
let url_valid_file_in_subfolder : URL = URL(string: "file:///private/var/mobile/Library/Mobile%20Documents/iCloud~Zockerhoehle/Documents/consoles/ps4.png")!
XCTAssertEqual(url_valid_file.relative_path_after(pathComponent: icloud_drive_seperators), "backup.json")
XCTAssertEqual(url_valid_file_in_subfolder.relative_path_after(pathComponent: icloud_drive_seperators), "consoles/ps4.png")
//INVALID URL
let url_unvalid_url_2 : URL = URL(string: "http://mueller.haus")!
XCTAssertEqual(url_unvalid_url_2.relative_path_after(pathComponent: icloud_drive_seperators), .none)
// INVALID FILE
let url_unvalid_file : URL = URL(string: "file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/photo.jpg")!
XCTAssertEqual(url_unvalid_file.relative_path_after(pathComponent: icloud_drive_seperators), .none)
}
}