From 943a3635fb994115b91e8dd159cb3ad6977f54f1 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Wed, 7 Jul 2021 00:48:05 +0300 Subject: [PATCH] Initial commit --- AutoCat2.xcodeproj/project.pbxproj | 988 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/xcschememanagement.plist | 24 + AutoCat2Tests/SettingsTests.swift | 67 ++ AutoCat2Tests/SettingsTests.swift.plist | Bin 0 -> 75 bytes .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 148 +++ Shared/Assets.xcassets/Contents.json | 6 + .../AutoCat2.xcdatamodeld/.xccurrentversion | 8 + .../Shared.xcdatamodel/contents | 9 + Shared/AutoCat2App.swift | 20 + Shared/ContentView.swift | 18 + Shared/Extensions/CocoaError.swift | 62 ++ Shared/Models/Settings.swift | 74 ++ Shared/Models/User.swift | 13 + Shared/Persistence.swift | 55 + Shared/Utils/Api.swift | 8 + Shared/ViewModels/AuthVM.swift | 7 + Shared/Views/AuthView.swift | 37 + Tests iOS/Tests_iOS.swift | 21 + Tests macOS/Tests_macOS.swift | 42 + 22 files changed, 1633 insertions(+) create mode 100644 AutoCat2.xcodeproj/project.pbxproj create mode 100644 AutoCat2.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AutoCat2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AutoCat2.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 AutoCat2Tests/SettingsTests.swift create mode 100644 AutoCat2Tests/SettingsTests.swift.plist create mode 100644 Shared/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Shared/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Shared/Assets.xcassets/Contents.json create mode 100644 Shared/AutoCat2.xcdatamodeld/.xccurrentversion create mode 100644 Shared/AutoCat2.xcdatamodeld/Shared.xcdatamodel/contents create mode 100644 Shared/AutoCat2App.swift create mode 100644 Shared/ContentView.swift create mode 100644 Shared/Extensions/CocoaError.swift create mode 100644 Shared/Models/Settings.swift create mode 100644 Shared/Models/User.swift create mode 100644 Shared/Persistence.swift create mode 100644 Shared/Utils/Api.swift create mode 100644 Shared/ViewModels/AuthVM.swift create mode 100644 Shared/Views/AuthView.swift create mode 100644 Tests iOS/Tests_iOS.swift create mode 100644 Tests macOS/Tests_macOS.swift diff --git a/AutoCat2.xcodeproj/project.pbxproj b/AutoCat2.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8ae1f96 --- /dev/null +++ b/AutoCat2.xcodeproj/project.pbxproj @@ -0,0 +1,988 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 7A40D5932691C6D8009B0BC4 /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5922691C6D8009B0BC4 /* Tests_iOS.swift */; }; + 7A40D59D2691C6D8009B0BC4 /* Tests_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D59C2691C6D8009B0BC4 /* Tests_macOS.swift */; }; + 7A40D59E2691C6D8009B0BC4 /* AutoCat2.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5792691C6D7009B0BC4 /* AutoCat2.xcdatamodeld */; }; + 7A40D59F2691C6D8009B0BC4 /* AutoCat2.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5792691C6D7009B0BC4 /* AutoCat2.xcdatamodeld */; }; + 7A40D5A02691C6D8009B0BC4 /* AutoCat2App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D57B2691C6D7009B0BC4 /* AutoCat2App.swift */; }; + 7A40D5A12691C6D8009B0BC4 /* AutoCat2App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D57B2691C6D7009B0BC4 /* AutoCat2App.swift */; }; + 7A40D5A22691C6D8009B0BC4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D57C2691C6D7009B0BC4 /* ContentView.swift */; }; + 7A40D5A32691C6D8009B0BC4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D57C2691C6D7009B0BC4 /* ContentView.swift */; }; + 7A40D5A42691C6D8009B0BC4 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D57D2691C6D7009B0BC4 /* Persistence.swift */; }; + 7A40D5A52691C6D8009B0BC4 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D57D2691C6D7009B0BC4 /* Persistence.swift */; }; + 7A40D5A62691C6D8009B0BC4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A40D57E2691C6D7009B0BC4 /* Assets.xcassets */; }; + 7A40D5A72691C6D8009B0BC4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A40D57E2691C6D7009B0BC4 /* Assets.xcassets */; }; + 7A40D5E126924AEC009B0BC4 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5E026924AEC009B0BC4 /* User.swift */; }; + 7A40D5E326924B09009B0BC4 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5E226924B09009B0BC4 /* Settings.swift */; }; + 7A40D5E426924B09009B0BC4 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5E226924B09009B0BC4 /* Settings.swift */; }; + 7A40D5E526924B0C009B0BC4 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5E026924AEC009B0BC4 /* User.swift */; }; + 7A40D5E926938BEC009B0BC4 /* AuthView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5E826938BEC009B0BC4 /* AuthView.swift */; }; + 7A40D5EA26938BEC009B0BC4 /* AuthView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5E826938BEC009B0BC4 /* AuthView.swift */; }; + 7A40D5ED2693A1EA009B0BC4 /* AuthVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5EC2693A1EA009B0BC4 /* AuthVM.swift */; }; + 7A40D5EE2693A1EA009B0BC4 /* AuthVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5EC2693A1EA009B0BC4 /* AuthVM.swift */; }; + 7A40D5F62693A63A009B0BC4 /* SettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5F52693A63A009B0BC4 /* SettingsTests.swift */; }; + 7A40D5FE2693A91F009B0BC4 /* CocoaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5FD2693A91F009B0BC4 /* CocoaError.swift */; }; + 7A40D5FF2693A91F009B0BC4 /* CocoaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D5FD2693A91F009B0BC4 /* CocoaError.swift */; }; + 7A40D6022694FF5D009B0BC4 /* Api.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D6012694FF5D009B0BC4 /* Api.swift */; }; + 7A40D6032694FF5D009B0BC4 /* Api.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A40D6012694FF5D009B0BC4 /* Api.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 7A40D58F2691C6D8009B0BC4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7A40D5742691C6D6009B0BC4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7A40D5822691C6D8009B0BC4; + remoteInfo = "AutoCat2 (iOS)"; + }; + 7A40D5992691C6D8009B0BC4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7A40D5742691C6D6009B0BC4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7A40D5882691C6D8009B0BC4; + remoteInfo = "AutoCat2 (macOS)"; + }; + 7A40D5F72693A63A009B0BC4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7A40D5742691C6D6009B0BC4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7A40D5822691C6D8009B0BC4; + remoteInfo = "AutoCat2 (iOS)"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 7A40D5D52691C7D3009B0BC4 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5DE2691C7EB009B0BC4 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 7A40D57A2691C6D7009B0BC4 /* Shared.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Shared.xcdatamodel; sourceTree = ""; }; + 7A40D57B2691C6D7009B0BC4 /* AutoCat2App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCat2App.swift; sourceTree = ""; }; + 7A40D57C2691C6D7009B0BC4 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 7A40D57D2691C6D7009B0BC4 /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; + 7A40D57E2691C6D7009B0BC4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7A40D5832691C6D8009B0BC4 /* AutoCat2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoCat2.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A40D5892691C6D8009B0BC4 /* AutoCat2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoCat2.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A40D58E2691C6D8009B0BC4 /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A40D5922691C6D8009B0BC4 /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; }; + 7A40D5982691C6D8009B0BC4 /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A40D59C2691C6D8009B0BC4 /* Tests_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOS.swift; sourceTree = ""; }; + 7A40D5E026924AEC009B0BC4 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; }; + 7A40D5E226924B09009B0BC4 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; + 7A40D5E826938BEC009B0BC4 /* AuthView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthView.swift; sourceTree = ""; }; + 7A40D5EC2693A1EA009B0BC4 /* AuthVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthVM.swift; sourceTree = ""; }; + 7A40D5F32693A63A009B0BC4 /* AutoCat2Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AutoCat2Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A40D5F52693A63A009B0BC4 /* SettingsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsTests.swift; sourceTree = ""; }; + 7A40D5FD2693A91F009B0BC4 /* CocoaError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CocoaError.swift; sourceTree = ""; }; + 7A40D6012694FF5D009B0BC4 /* Api.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Api.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7A40D5802691C6D8009B0BC4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5862691C6D8009B0BC4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D58B2691C6D8009B0BC4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5952691C6D8009B0BC4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5F02693A63A009B0BC4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7A40D5732691C6D6009B0BC4 = { + isa = PBXGroup; + children = ( + 7A40D5782691C6D7009B0BC4 /* Shared */, + 7A40D5912691C6D8009B0BC4 /* Tests iOS */, + 7A40D59B2691C6D8009B0BC4 /* Tests macOS */, + 7A40D5F42693A63A009B0BC4 /* AutoCat2Tests */, + 7A40D5842691C6D8009B0BC4 /* Products */, + 7A40D5D92691C7EB009B0BC4 /* Frameworks */, + ); + sourceTree = ""; + }; + 7A40D5782691C6D7009B0BC4 /* Shared */ = { + isa = PBXGroup; + children = ( + 7A40D6002694FF4C009B0BC4 /* Utils */, + 7A40D5FC2693A90F009B0BC4 /* Extensions */, + 7A40D5EB2693A1C3009B0BC4 /* ViewModels */, + 7A40D5E726938BC8009B0BC4 /* Views */, + 7A40D5E626924BAA009B0BC4 /* Property Wrappers */, + 7A40D5DF26924ADE009B0BC4 /* Models */, + 7A40D57B2691C6D7009B0BC4 /* AutoCat2App.swift */, + 7A40D57C2691C6D7009B0BC4 /* ContentView.swift */, + 7A40D57D2691C6D7009B0BC4 /* Persistence.swift */, + 7A40D57E2691C6D7009B0BC4 /* Assets.xcassets */, + 7A40D5792691C6D7009B0BC4 /* AutoCat2.xcdatamodeld */, + ); + path = Shared; + sourceTree = ""; + }; + 7A40D5842691C6D8009B0BC4 /* Products */ = { + isa = PBXGroup; + children = ( + 7A40D5832691C6D8009B0BC4 /* AutoCat2.app */, + 7A40D5892691C6D8009B0BC4 /* AutoCat2.app */, + 7A40D58E2691C6D8009B0BC4 /* Tests iOS.xctest */, + 7A40D5982691C6D8009B0BC4 /* Tests macOS.xctest */, + 7A40D5F32693A63A009B0BC4 /* AutoCat2Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 7A40D5912691C6D8009B0BC4 /* Tests iOS */ = { + isa = PBXGroup; + children = ( + 7A40D5922691C6D8009B0BC4 /* Tests_iOS.swift */, + ); + path = "Tests iOS"; + sourceTree = ""; + }; + 7A40D59B2691C6D8009B0BC4 /* Tests macOS */ = { + isa = PBXGroup; + children = ( + 7A40D59C2691C6D8009B0BC4 /* Tests_macOS.swift */, + ); + path = "Tests macOS"; + sourceTree = ""; + }; + 7A40D5D92691C7EB009B0BC4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 7A40D5DF26924ADE009B0BC4 /* Models */ = { + isa = PBXGroup; + children = ( + 7A40D5E026924AEC009B0BC4 /* User.swift */, + 7A40D5E226924B09009B0BC4 /* Settings.swift */, + ); + path = Models; + sourceTree = ""; + }; + 7A40D5E626924BAA009B0BC4 /* Property Wrappers */ = { + isa = PBXGroup; + children = ( + ); + path = "Property Wrappers"; + sourceTree = ""; + }; + 7A40D5E726938BC8009B0BC4 /* Views */ = { + isa = PBXGroup; + children = ( + 7A40D5E826938BEC009B0BC4 /* AuthView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 7A40D5EB2693A1C3009B0BC4 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 7A40D5EC2693A1EA009B0BC4 /* AuthVM.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 7A40D5F42693A63A009B0BC4 /* AutoCat2Tests */ = { + isa = PBXGroup; + children = ( + 7A40D5F52693A63A009B0BC4 /* SettingsTests.swift */, + ); + path = AutoCat2Tests; + sourceTree = ""; + }; + 7A40D5FC2693A90F009B0BC4 /* Extensions */ = { + isa = PBXGroup; + children = ( + 7A40D5FD2693A91F009B0BC4 /* CocoaError.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 7A40D6002694FF4C009B0BC4 /* Utils */ = { + isa = PBXGroup; + children = ( + 7A40D6012694FF5D009B0BC4 /* Api.swift */, + ); + path = Utils; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7A40D5822691C6D8009B0BC4 /* AutoCat2 (iOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A40D5AA2691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "AutoCat2 (iOS)" */; + buildPhases = ( + 7A40D57F2691C6D8009B0BC4 /* Sources */, + 7A40D5802691C6D8009B0BC4 /* Frameworks */, + 7A40D5812691C6D8009B0BC4 /* Resources */, + 7A40D5D52691C7D3009B0BC4 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "AutoCat2 (iOS)"; + productName = "AutoCat2 (iOS)"; + productReference = 7A40D5832691C6D8009B0BC4 /* AutoCat2.app */; + productType = "com.apple.product-type.application"; + }; + 7A40D5882691C6D8009B0BC4 /* AutoCat2 (macOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A40D5AD2691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "AutoCat2 (macOS)" */; + buildPhases = ( + 7A40D5852691C6D8009B0BC4 /* Sources */, + 7A40D5862691C6D8009B0BC4 /* Frameworks */, + 7A40D5872691C6D8009B0BC4 /* Resources */, + 7A40D5DE2691C7EB009B0BC4 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "AutoCat2 (macOS)"; + productName = "AutoCat2 (macOS)"; + productReference = 7A40D5892691C6D8009B0BC4 /* AutoCat2.app */; + productType = "com.apple.product-type.application"; + }; + 7A40D58D2691C6D8009B0BC4 /* Tests iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A40D5B02691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "Tests iOS" */; + buildPhases = ( + 7A40D58A2691C6D8009B0BC4 /* Sources */, + 7A40D58B2691C6D8009B0BC4 /* Frameworks */, + 7A40D58C2691C6D8009B0BC4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7A40D5902691C6D8009B0BC4 /* PBXTargetDependency */, + ); + name = "Tests iOS"; + productName = "Tests iOS"; + productReference = 7A40D58E2691C6D8009B0BC4 /* Tests iOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 7A40D5972691C6D8009B0BC4 /* Tests macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A40D5B32691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "Tests macOS" */; + buildPhases = ( + 7A40D5942691C6D8009B0BC4 /* Sources */, + 7A40D5952691C6D8009B0BC4 /* Frameworks */, + 7A40D5962691C6D8009B0BC4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7A40D59A2691C6D8009B0BC4 /* PBXTargetDependency */, + ); + name = "Tests macOS"; + productName = "Tests macOS"; + productReference = 7A40D5982691C6D8009B0BC4 /* Tests macOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 7A40D5F22693A63A009B0BC4 /* AutoCat2Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A40D5F92693A63A009B0BC4 /* Build configuration list for PBXNativeTarget "AutoCat2Tests" */; + buildPhases = ( + 7A40D5EF2693A63A009B0BC4 /* Sources */, + 7A40D5F02693A63A009B0BC4 /* Frameworks */, + 7A40D5F12693A63A009B0BC4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7A40D5F82693A63A009B0BC4 /* PBXTargetDependency */, + ); + name = AutoCat2Tests; + productName = AutoCat2Tests; + productReference = 7A40D5F32693A63A009B0BC4 /* AutoCat2Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7A40D5742691C6D6009B0BC4 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1300; + LastUpgradeCheck = 1300; + TargetAttributes = { + 7A40D5822691C6D8009B0BC4 = { + CreatedOnToolsVersion = 13.0; + }; + 7A40D5882691C6D8009B0BC4 = { + CreatedOnToolsVersion = 13.0; + }; + 7A40D58D2691C6D8009B0BC4 = { + CreatedOnToolsVersion = 13.0; + TestTargetID = 7A40D5822691C6D8009B0BC4; + }; + 7A40D5972691C6D8009B0BC4 = { + CreatedOnToolsVersion = 13.0; + TestTargetID = 7A40D5882691C6D8009B0BC4; + }; + 7A40D5F22693A63A009B0BC4 = { + CreatedOnToolsVersion = 13.0; + TestTargetID = 7A40D5822691C6D8009B0BC4; + }; + }; + }; + buildConfigurationList = 7A40D5772691C6D6009B0BC4 /* Build configuration list for PBXProject "AutoCat2" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7A40D5732691C6D6009B0BC4; + productRefGroup = 7A40D5842691C6D8009B0BC4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7A40D5822691C6D8009B0BC4 /* AutoCat2 (iOS) */, + 7A40D5882691C6D8009B0BC4 /* AutoCat2 (macOS) */, + 7A40D58D2691C6D8009B0BC4 /* Tests iOS */, + 7A40D5972691C6D8009B0BC4 /* Tests macOS */, + 7A40D5F22693A63A009B0BC4 /* AutoCat2Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7A40D5812691C6D8009B0BC4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D5A62691C6D8009B0BC4 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5872691C6D8009B0BC4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D5A72691C6D8009B0BC4 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D58C2691C6D8009B0BC4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5962691C6D8009B0BC4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5F12693A63A009B0BC4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7A40D57F2691C6D8009B0BC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D5E926938BEC009B0BC4 /* AuthView.swift in Sources */, + 7A40D5E326924B09009B0BC4 /* Settings.swift in Sources */, + 7A40D5A02691C6D8009B0BC4 /* AutoCat2App.swift in Sources */, + 7A40D5A42691C6D8009B0BC4 /* Persistence.swift in Sources */, + 7A40D5ED2693A1EA009B0BC4 /* AuthVM.swift in Sources */, + 7A40D59E2691C6D8009B0BC4 /* AutoCat2.xcdatamodeld in Sources */, + 7A40D5E126924AEC009B0BC4 /* User.swift in Sources */, + 7A40D5FE2693A91F009B0BC4 /* CocoaError.swift in Sources */, + 7A40D6022694FF5D009B0BC4 /* Api.swift in Sources */, + 7A40D5A22691C6D8009B0BC4 /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5852691C6D8009B0BC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D5EA26938BEC009B0BC4 /* AuthView.swift in Sources */, + 7A40D5A12691C6D8009B0BC4 /* AutoCat2App.swift in Sources */, + 7A40D5A52691C6D8009B0BC4 /* Persistence.swift in Sources */, + 7A40D5E526924B0C009B0BC4 /* User.swift in Sources */, + 7A40D5EE2693A1EA009B0BC4 /* AuthVM.swift in Sources */, + 7A40D59F2691C6D8009B0BC4 /* AutoCat2.xcdatamodeld in Sources */, + 7A40D5A32691C6D8009B0BC4 /* ContentView.swift in Sources */, + 7A40D5FF2693A91F009B0BC4 /* CocoaError.swift in Sources */, + 7A40D6032694FF5D009B0BC4 /* Api.swift in Sources */, + 7A40D5E426924B09009B0BC4 /* Settings.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D58A2691C6D8009B0BC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D5932691C6D8009B0BC4 /* Tests_iOS.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5942691C6D8009B0BC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D59D2691C6D8009B0BC4 /* Tests_macOS.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A40D5EF2693A63A009B0BC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A40D5F62693A63A009B0BC4 /* SettingsTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 7A40D5902691C6D8009B0BC4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7A40D5822691C6D8009B0BC4 /* AutoCat2 (iOS) */; + targetProxy = 7A40D58F2691C6D8009B0BC4 /* PBXContainerItemProxy */; + }; + 7A40D59A2691C6D8009B0BC4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7A40D5882691C6D8009B0BC4 /* AutoCat2 (macOS) */; + targetProxy = 7A40D5992691C6D8009B0BC4 /* PBXContainerItemProxy */; + }; + 7A40D5F82693A63A009B0BC4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7A40D5822691C6D8009B0BC4 /* AutoCat2 (iOS) */; + targetProxy = 7A40D5F72693A63A009B0BC4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 7A40D5A82691C6D8009B0BC4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7A40D5A92691C6D8009B0BC4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 7A40D5AB2691C6D8009B0BC4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCat2; + PRODUCT_NAME = AutoCat2; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7A40D5AC2691C6D8009B0BC4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCat2; + PRODUCT_NAME = AutoCat2; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7A40D5AE2691C6D8009B0BC4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCat2; + PRODUCT_NAME = AutoCat2; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 7A40D5AF2691C6D8009B0BC4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCat2; + PRODUCT_NAME = AutoCat2; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 7A40D5B12691C6D8009B0BC4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "pro.aliencat.Tests-iOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "AutoCat2 (iOS)"; + }; + name = Debug; + }; + 7A40D5B22691C6D8009B0BC4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "pro.aliencat.Tests-iOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "AutoCat2 (iOS)"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7A40D5B42691C6D8009B0BC4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "pro.aliencat.Tests-macOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = "AutoCat2 (macOS)"; + }; + name = Debug; + }; + 7A40D5B52691C6D8009B0BC4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "pro.aliencat.Tests-macOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = "AutoCat2 (macOS)"; + }; + name = Release; + }; + 7A40D5FA2693A63A009B0BC4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCat2Tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AutoCat2.app/AutoCat2"; + }; + name = Debug; + }; + 7A40D5FB2693A63A009B0BC4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCat2Tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AutoCat2.app/AutoCat2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7A40D5772691C6D6009B0BC4 /* Build configuration list for PBXProject "AutoCat2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7A40D5A82691C6D8009B0BC4 /* Debug */, + 7A40D5A92691C6D8009B0BC4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7A40D5AA2691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "AutoCat2 (iOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7A40D5AB2691C6D8009B0BC4 /* Debug */, + 7A40D5AC2691C6D8009B0BC4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7A40D5AD2691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "AutoCat2 (macOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7A40D5AE2691C6D8009B0BC4 /* Debug */, + 7A40D5AF2691C6D8009B0BC4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7A40D5B02691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "Tests iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7A40D5B12691C6D8009B0BC4 /* Debug */, + 7A40D5B22691C6D8009B0BC4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7A40D5B32691C6D8009B0BC4 /* Build configuration list for PBXNativeTarget "Tests macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7A40D5B42691C6D8009B0BC4 /* Debug */, + 7A40D5B52691C6D8009B0BC4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7A40D5F92693A63A009B0BC4 /* Build configuration list for PBXNativeTarget "AutoCat2Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7A40D5FA2693A63A009B0BC4 /* Debug */, + 7A40D5FB2693A63A009B0BC4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 7A40D5792691C6D7009B0BC4 /* AutoCat2.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 7A40D57A2691C6D7009B0BC4 /* Shared.xcdatamodel */, + ); + currentVersion = 7A40D57A2691C6D7009B0BC4 /* Shared.xcdatamodel */; + path = AutoCat2.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 7A40D5742691C6D6009B0BC4 /* Project object */; +} diff --git a/AutoCat2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AutoCat2.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/AutoCat2.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AutoCat2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AutoCat2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AutoCat2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AutoCat2.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist b/AutoCat2.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..6d7bf61 --- /dev/null +++ b/AutoCat2.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,24 @@ + + + + + SchemeUserState + + AutoCat2 (iOS).xcscheme_^#shared#^_ + + orderHint + 0 + + AutoCat2 (macOS).xcscheme_^#shared#^_ + + orderHint + 1 + + AutoCatCore.xcscheme_^#shared#^_ + + orderHint + 2 + + + + diff --git a/AutoCat2Tests/SettingsTests.swift b/AutoCat2Tests/SettingsTests.swift new file mode 100644 index 0000000..0d0fa0e --- /dev/null +++ b/AutoCat2Tests/SettingsTests.swift @@ -0,0 +1,67 @@ +import XCTest +import AutoCat2 + +class SettingsTests: XCTestCase { + + private var settings: Settings! + + override func setUpWithError() throws { + guard let userDefaults = UserDefaults(suiteName: #file) else { + throw CocoaError.error("Failed to create UserDefaults") + } + userDefaults.removePersistentDomain(forName: #file) + self.settings = Settings(defaults: userDefaults) + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testAlternativeOrder() { + XCTAssert(self.settings.recognizeAlternativeOrder == false, "recognizeAlternativeOrder: wrong default value") + self.settings.recognizeAlternativeOrder = true + XCTAssert(self.settings.recognizeAlternativeOrder == true, "recognizeAlternativeOrder: failed to change value") + } + + func testShortenedNumbers() { + XCTAssert(self.settings.recognizeShortenedNumbers == false, "recognizeShortenedNumbers: wrong default value") + self.settings.recognizeShortenedNumbers = true + XCTAssert(self.settings.recognizeShortenedNumbers == true, "recognizeShortenedNumbers: failed to change value") + } + + func testDefaultRegion() { + XCTAssert(self.settings.defaultRegion == "161", "defaultRegion: wrong default value") + self.settings.defaultRegion = "761" + XCTAssert(self.settings.defaultRegion == "761", "defaultRegion: failed to change value") + } + + func testRecordBeep() { + XCTAssert(self.settings.recordBeep == false, "recordBeep: wrong default value") + self.settings.recordBeep = true + XCTAssert(self.settings.recordBeep == true, "recordBeep: failed to change value") + } + + func testDebugInfo() { + XCTAssert(self.settings.showDebugInfo == false, "showDebugInfo: wrong default value") + self.settings.showDebugInfo = true + XCTAssert(self.settings.showDebugInfo == true, "showDebugInfo: failed to change value") + } + + func testDefaultUser() { + XCTAssert(self.settings.user.email.isEmpty, "Default user email is not empty") + XCTAssert(self.settings.user.token.isEmpty, "Default user token is not empty") + XCTAssert(self.settings.user.firebaseIdToken == nil, "Default user firebase ID token is not nil") + XCTAssert(self.settings.user.firebaseRefreshToken == nil, "Default user firebase refresh token is not nil") + } + + func testSaveUser() { + self.settings.user.token = "TestToken" + XCTAssert(self.settings.user.token == "TestToken", "Failed to save user token to settings") + + self.settings.user.firebaseIdToken = "TestFirebaseToken" + XCTAssert(self.settings.user.firebaseIdToken == "TestFirebaseToken", "Failed to save user firebaseIdToken to settings") + + self.settings.user.firebaseRefreshToken = "TestResreshToken" + XCTAssert(self.settings.user.firebaseRefreshToken == "TestResreshToken", "Failed to save user firebaseRefreshToken to settings") + } +} diff --git a/AutoCat2Tests/SettingsTests.swift.plist b/AutoCat2Tests/SettingsTests.swift.plist new file mode 100644 index 0000000000000000000000000000000000000000..4ac7f85ce3e4a8565c26b179b0ab744b64563b92 GIT binary patch literal 75 zcmYc)$jK}&F)+Bu$P_OiS(KWbpPrXll^UFpUsRHsmzv^NnwykbRLsf2t + + + + _XCCurrentVersionName + Shared.xcdatamodel + + diff --git a/Shared/AutoCat2.xcdatamodeld/Shared.xcdatamodel/contents b/Shared/AutoCat2.xcdatamodeld/Shared.xcdatamodel/contents new file mode 100644 index 0000000..e8d6ec8 --- /dev/null +++ b/Shared/AutoCat2.xcdatamodeld/Shared.xcdatamodel/contents @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Shared/AutoCat2App.swift b/Shared/AutoCat2App.swift new file mode 100644 index 0000000..e02f4f2 --- /dev/null +++ b/Shared/AutoCat2App.swift @@ -0,0 +1,20 @@ +// +// AutoCat2App.swift +// Shared +// +// Created by Selim Mustafaev on 04.07.2021. +// + +import SwiftUI + +@main +struct AutoCat2App: App { + let persistenceController = PersistenceController.shared + + var body: some Scene { + WindowGroup { + ContentView() + .environment(\.managedObjectContext, persistenceController.container.viewContext) + } + } +} diff --git a/Shared/ContentView.swift b/Shared/ContentView.swift new file mode 100644 index 0000000..7024e5f --- /dev/null +++ b/Shared/ContentView.swift @@ -0,0 +1,18 @@ +import SwiftUI +import CoreData + +struct ContentView: View { + var body: some View { + if Settings.shared.user.token.isEmpty { + AuthView(login: "", password: "") + } else { + EmptyView() + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/Shared/Extensions/CocoaError.swift b/Shared/Extensions/CocoaError.swift new file mode 100644 index 0000000..91a5c9e --- /dev/null +++ b/Shared/Extensions/CocoaError.swift @@ -0,0 +1,62 @@ +import CoreLocation + +extension NSError { + public var displayMessage: (title: String, body: String) { + if let description = self.userInfo[NSLocalizedDescriptionKey] as? String { + return (title: "Error", body: description) + } else if let failure = self.userInfo[NSLocalizedFailureErrorKey] as? String, let reason = self.localizedFailureReason { + if let recovery = self.localizedRecoverySuggestion { + return (title: failure, body: reason + "\n" + recovery) + } else { + return (title: failure, body: reason) + } + } else { + return (title: "Error", body: "") + } + } +} + +extension CocoaError { + public static func error(_ description: String) -> NSError { + return error(Code(rawValue: 0), userInfo: [NSLocalizedDescriptionKey: description], url: nil) as NSError + } + + public static func error(_ error: String, reason: String, suggestion: String? = nil) -> NSError { + var info = [ + NSLocalizedFailureErrorKey: error, + NSLocalizedFailureReasonErrorKey: reason + ] + + if let suggestion = suggestion { + info[NSLocalizedRecoverySuggestionErrorKey] = suggestion + } + + return self.error(Code(rawValue: 0), userInfo: info, url: nil) as NSError + } +} + +extension CLError.Code: CustomStringConvertible { + public var description: String { + switch self { + case .locationUnknown: return "Location unknown" + case .denied: return "Access denied" + case .network: return "general, network-related error" + case .headingFailure: return "heading could not be determined" + case .regionMonitoringDenied: return "Location region monitoring has been denied" + case .regionMonitoringSetupDelayed: return "CL could not immediately initialize region monitoring" + case .regionMonitoringResponseDelayed: return "While events for this fence will be delivered, delivery will not occur immediately" + case .geocodeFoundNoResult: return "A geocode request yielded no result" + case .geocodeFoundPartialResult: return "A geocode request yielded a partial result" + case .geocodeCanceled: return "A geocode request was cancelled" + case .deferredFailed: return "Deferred mode failed" + case .deferredNotUpdatingLocation: return "Deferred mode failed because location updates disabled or paused" + case .deferredAccuracyTooLow: return "Deferred mode not supported for the requested accuracy" + case .deferredDistanceFiltered: return "Deferred mode does not support distance filters" + case .deferredCanceled: return "Deferred mode request canceled a previous request" + case .rangingUnavailable: return "Ranging cannot be performed" + case .rangingFailure: return "General ranging failure" + case .promptDeclined: return "Authorization request not presented to user" + default: return "Unknown location error (\(self.rawValue)" + } + } +} diff --git a/Shared/Models/Settings.swift b/Shared/Models/Settings.swift new file mode 100644 index 0000000..b4757f5 --- /dev/null +++ b/Shared/Models/Settings.swift @@ -0,0 +1,74 @@ +import Foundation + +public class Settings { + private var defaults: UserDefaults + public static let shared = Settings() + + public var user: User { + didSet { + if let json = try? JSONEncoder().encode(self.user) { + self.defaults.set(json, forKey: "user") + self.defaults.synchronize() + } + } + } + + public var recognizeAlternativeOrder: Bool = false { + didSet { + self.defaults.set(self.recognizeAlternativeOrder, forKey: "recognizeAlternativeOrder") + self.defaults.synchronize() + } + } + + public var recognizeShortenedNumbers: Bool = false { + didSet { + self.defaults.set(self.recognizeShortenedNumbers, forKey: "recognizeShortenedNumbers") + self.defaults.synchronize() + } + } + + public var defaultRegion: String = "" { + didSet { + self.defaults.set(self.defaultRegion, forKey: "defaultRegion") + self.defaults.synchronize() + } + } + + public var recordBeep: Bool = false { + didSet { + self.defaults.set(self.recordBeep, forKey: "recordBeep") + self.defaults.synchronize() + } + } + + public var showDebugInfo: Bool = false { + didSet { + self.defaults.set(self.showDebugInfo, forKey: "showDebugInfo") + self.defaults.synchronize() + } + } + + public init(defaults: UserDefaults = .standard) { + self.defaults = defaults + + self.defaults.register(defaults: [ + "recognizeAlternativeOrder": false, + "recognizeShortenedNumbers": false, + "defaultRegion": "161", + "recordBeep": false, + "showDebugInfo": false + ]) + + self.recognizeAlternativeOrder = self.defaults.bool(forKey: "recognizeAlternativeOrder") + self.recognizeShortenedNumbers = self.defaults.bool(forKey: "recognizeShortenedNumbers") + self.defaultRegion = self.defaults.string(forKey: "defaultRegion") ?? "161" + self.recordBeep = self.defaults.bool(forKey: "recordBeep") + self.showDebugInfo = self.defaults.bool(forKey: "showDebugInfo") + + if let data = self.defaults.data(forKey: "user") { + self.user = (try? JSONDecoder().decode(User.self, from: data)) ?? User() + } else { + self.user = User() + } + } +} diff --git a/Shared/Models/User.swift b/Shared/Models/User.swift new file mode 100644 index 0000000..68f4508 --- /dev/null +++ b/Shared/Models/User.swift @@ -0,0 +1,13 @@ +import Foundation + +public struct User: Codable { + public let email: String + public var token: String + public var firebaseIdToken: String? + public var firebaseRefreshToken: String? + + public init() { + self.email = "" + self.token = "" + } +} diff --git a/Shared/Persistence.swift b/Shared/Persistence.swift new file mode 100644 index 0000000..526f5e1 --- /dev/null +++ b/Shared/Persistence.swift @@ -0,0 +1,55 @@ +// +// Persistence.swift +// Shared +// +// Created by Selim Mustafaev on 04.07.2021. +// + +import CoreData + +struct PersistenceController { + static let shared = PersistenceController() + + static var preview: PersistenceController = { + let result = PersistenceController(inMemory: true) + let viewContext = result.container.viewContext + for _ in 0..<10 { + let newItem = Item(context: viewContext) + newItem.timestamp = Date() + } + do { + try viewContext.save() + } catch { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + } + return result + }() + + let container: NSPersistentCloudKitContainer + + init(inMemory: Bool = false) { + container = NSPersistentCloudKitContainer(name: "AutoCat2") + if inMemory { + container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null") + } + container.loadPersistentStores(completionHandler: { (storeDescription, error) in + if let error = error as NSError? { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + + /* + Typical reasons for an error here include: + * The parent directory does not exist, cannot be created, or disallows writing. + * The persistent store is not accessible, due to permissions or data protection when the device is locked. + * The device is out of space. + * The store could not be migrated to the current model version. + Check the error message to determine what the actual problem was. + */ + fatalError("Unresolved error \(error), \(error.userInfo)") + } + }) + } +} diff --git a/Shared/Utils/Api.swift b/Shared/Utils/Api.swift new file mode 100644 index 0000000..d96a2e0 --- /dev/null +++ b/Shared/Utils/Api.swift @@ -0,0 +1,8 @@ +// +// Api.swift +// AutoCat2 +// +// Created by Selim Mustafaev on 07.07.2021. +// + +import Foundation diff --git a/Shared/ViewModels/AuthVM.swift b/Shared/ViewModels/AuthVM.swift new file mode 100644 index 0000000..d1fe531 --- /dev/null +++ b/Shared/ViewModels/AuthVM.swift @@ -0,0 +1,7 @@ +import Foundation + +public class AuthVM: ObservableObject { + public func login(user: String, password: String) async throws { + + } +} diff --git a/Shared/Views/AuthView.swift b/Shared/Views/AuthView.swift new file mode 100644 index 0000000..86045a6 --- /dev/null +++ b/Shared/Views/AuthView.swift @@ -0,0 +1,37 @@ +import SwiftUI + +struct AuthView: View { + @ObservedObject var viewModel = AuthVM() + + @State var login: String + @State var password: String + + var body: some View { + VStack(alignment: .center, spacing: 16) { + Spacer() + TextField("Login", text: $login) + SecureField("Password", text: $password) + Button("Login") { + async { + try await self.viewModel.login(user: self.login, password: self.password) + } + } + Spacer() + } + .buttonStyle(.bordered) + .textFieldStyle(.roundedBorder) + .padding(20) + } +} + +struct AuthView_Previews: PreviewProvider { + static var previews: some View { + Group { + AuthView(login: "", password: "") + .previewDevice("iPhone 8") + AuthView(login: "", password: "") + .preferredColorScheme(.dark) + .previewDevice("iPhone 8") + } + } +} diff --git a/Tests iOS/Tests_iOS.swift b/Tests iOS/Tests_iOS.swift new file mode 100644 index 0000000..f46c9b9 --- /dev/null +++ b/Tests iOS/Tests_iOS.swift @@ -0,0 +1,21 @@ +import XCTest + +class Tests_iOS: XCTestCase { + + override func setUpWithError() throws { + continueAfterFailure = false + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } +} diff --git a/Tests macOS/Tests_macOS.swift b/Tests macOS/Tests_macOS.swift new file mode 100644 index 0000000..c8e41f7 --- /dev/null +++ b/Tests macOS/Tests_macOS.swift @@ -0,0 +1,42 @@ +// +// Tests_macOS.swift +// Tests macOS +// +// Created by Selim Mustafaev on 04.07.2021. +// + +import XCTest + +class Tests_macOS: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +}