Basic application setup #1

Merged
javier merged 6 commits from app/setup into main 2026-02-08 20:20:12 +00:00
13 changed files with 234 additions and 98 deletions
+55
View File
@@ -0,0 +1,55 @@
# Xcode
# General
.DS_Store
.AppleDouble
.LSOverride
# Build generated
build/
DerivedData/
*.o
*.obj
# Xcode
xcuserdata/
*.xcuserstate
*.xcscmblueprint
*.xccheckout
*.xcdebugger
*.hmap
*.ipa
*.dSYM
*.dSYM.zip
# Workspace settings (shared by team) - keep these under version control if desired
# Uncomment to keep WorkspaceSettings
# !xcshareddata/WorkspaceSettings.xcsettings
# Xcode project user files
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
# Swift Package Manager
/.build/
/.swiftpm/
Package.resolved
# Environment files
.env
.env.*
# Archive / export
*.xcarchive
# Ignore Swift PM artifact indexes
/.build/checkouts/
# macOS
.DS_Store
+76
View File
@@ -0,0 +1,76 @@
{
"fileScopedDeclarationPrivacy": {
"accessLevel": "private"
},
"indentBlankLines": false,
"indentConditionalCompilationBlocks": false,
"indentSwitchCaseLabels": true,
"indentation": {
"spaces": 4
},
"lineBreakAroundMultilineExpressionChainComponents": true,
"lineBreakBeforeControlFlowKeywords": true,
"lineBreakBeforeEachArgument": true,
"lineBreakBeforeEachGenericRequirement": false,
"lineBreakBetweenDeclarationAttributes": true,
"lineLength": 120,
"maximumBlankLines": 1,
"multilineTrailingCommaBehavior": "keptAsWritten",
"multiElementCollectionTrailingCommas": true,
"noAssignmentInExpressions" : {
"allowedFunctions" : [
"XCTAssertNoThrow"
]
},
"orderedImports": {
"includeConditionalImports": true,
"shouldGroupImports": true
},
"prioritizeKeepingFunctionOutputTogether": true,
"reflowMultilineStringLiterals": "always",
"respectsExistingLineBreaks": true,
"rules": {
"AllPublicDeclarationsHaveDocumentation": true,
"AlwaysUseLiteralForEmptyCollectionInit": true,
"AlwaysUseLowerCamelCase": true,
"AmbiguousTrailingClosureOverload": false,
"AvoidRetroactiveConformances": true,
"BeginDocumentationCommentWithOneLineSummary": true,
"DoNotUseSemicolons": true,
"DontRepeatTypeInStaticProperties": true,
"FullyIndirectEnum": true,
"IdentifiersMustBeASCII": true,
"NeverForceUnwrap": true,
"NeverUseForceTry": true,
"NeverUseImplicitlyUnwrappedOptionals": true,
"NoAccessLevelOnExtensionDeclarations": false,
"NoAssignmentInExpressions": true,
"NoBlockComments": true,
"NoCasesWithOnlyFallthrough": true,
"NoEmptyLinesOpeningClosingBraces": false,
"NoEmptyTrailingClosureParentheses": true,
"NoLabelsInCasePatterns": true,
"NoLeadingUnderscores": true,
"NoParensAroundConditions": true,
"NoPlaygroundLiterals": true,
"NoVoidReturnOnFunctionSignature": true,
"OneCasePerLine": true,
"OneVariableDeclarationPerLine": true,
"OnlyOneTrailingClosureArgument": true,
"OrderedImports" : true,
"ReturnVoidInsteadOfEmptyTuple": true,
"TypeNamesShouldBeCapitalized": true,
"UseEarlyExits": true,
"UseExplicitNilCheckInConditions": true,
"UseLetInEveryBoundCaseVariable": true,
"UseShorthandTypeNames": true,
"UseSynthesizedInitializer": true,
"UseTripleSlashForDocumentationComments": true,
"UseWhereClausesInForLoops": true,
"ValidateDocumentationComments": true
},
"spacesAroundRangeFormationOperators": true,
"spacesBeforeEndOfLineComments" : 2,
"tabWidth": 4,
"version": 1
}
@@ -1,17 +1,18 @@
import SwiftUI
import SwiftData import SwiftData
import SwiftUI
@main @main
struct TodosApp: App { struct TodosApp: App {
var sharedModelContainer: ModelContainer = { var sharedModelContainer: ModelContainer = {
let schema = Schema([ let schema = Schema([
Item.self, Item.self
]) ])
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
do { do {
return try ModelContainer(for: schema, configurations: [modelConfiguration]) return try ModelContainer(for: schema, configurations: [modelConfiguration])
} catch { }
catch {
fatalError("Could not create ModelContainer: \(error)") fatalError("Could not create ModelContainer: \(error)")
} }
}() }()
@@ -4,7 +4,7 @@ import SwiftData
@Model @Model
final class Item { final class Item {
var timestamp: Date var timestamp: Date
init(timestamp: Date) { init(timestamp: Date) {
self.timestamp = timestamp self.timestamp = timestamp
} }
@@ -1,9 +1,13 @@
import SwiftUI
import SwiftData import SwiftData
import SwiftUI
struct ContentView: View { struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item] @Environment(\.modelContext)
private var modelContext
@Query
private var items: [Item]
var body: some View { var body: some View {
NavigationSplitView { NavigationSplitView {
@@ -17,15 +21,15 @@ struct ContentView: View {
} }
.onDelete(perform: deleteItems) .onDelete(perform: deleteItems)
} }
#if os(macOS) #if os(macOS)
.navigationSplitViewColumnWidth(min: 180, ideal: 200) .navigationSplitViewColumnWidth(min: 180, ideal: 200)
#endif #endif
.toolbar { .toolbar {
#if os(iOS) #if os(iOS)
ToolbarItem(placement: .navigationBarTrailing) { ToolbarItem(placement: .navigationBarTrailing) {
EditButton() EditButton()
} }
#endif #endif
ToolbarItem { ToolbarItem {
Button(action: addItem) { Button(action: addItem) {
Label("Add Item", systemImage: "plus") Label("Add Item", systemImage: "plus")
+16
View File
@@ -0,0 +1,16 @@
# TODOS
A simple, small but complete todo app created for a technical interview with [Bol](https://www.bol.com), built using [SwiftUI](https://developer.apple.com/swiftui/).
In a nutshell, this basic app should allow a user to either create, update, and/or delete tasks; as well as being able to mark tasks as completed.
Given the requirements, the app should comply to the following criteria:
* each task should have a title, optional description, due date, and a flag indicating if it’s completed.
* tasks should be grouped visually by their due date, such as Today, Upcoming, or Past.
* users should also be able to reorder tasks within a group using drag and drop functionality.
* data should be saved and loaded asynchronously, and the UI should remain responsive while these operations take place.
* should be possible to simulate delays with built-in tools if needed.
Furthermore, the app is required to be built using SwiftUI with a clear structure that separates concerns. Any architectural style can be used, but the reasoning should be visible in how the code is organized.
It is expected that the app is modular and maintainable, so the source code must reflects this requirement. It is optional to include testable parts and anything extra that might improve the app.
+68 -84
View File
@@ -3,9 +3,14 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 77; objectVersion = 90;
objects = { objects = {
/* Begin PBXBuildFile section */
0296B3232F3903E6001C3BDB /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 0296B3222F3903E6001C3BDB /* README.md */; };
0296B3272F390E1A001C3BDB /* .swift-format in Resources */ = {isa = PBXBuildFile; fileRef = 0296B3262F390E1A001C3BDB /* .swift-format */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
0296B3002F38F8F7001C3BDB /* PBXContainerItemProxy */ = { 0296B3002F38F8F7001C3BDB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
@@ -27,22 +32,24 @@
0296B2F02F38F8F7001C3BDB /* Todos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todos.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0296B2F02F38F8F7001C3BDB /* Todos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todos.app; sourceTree = BUILT_PRODUCTS_DIR; };
0296B2FF2F38F8F7001C3BDB /* TodosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TodosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0296B2FF2F38F8F7001C3BDB /* TodosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TodosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
0296B3092F38F8F7001C3BDB /* TodosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TodosUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0296B3092F38F8F7001C3BDB /* TodosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TodosUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
0296B3222F3903E6001C3BDB /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
0296B3262F390E1A001C3BDB /* .swift-format */ = {isa = PBXFileReference; lastKnownFileType = text; path = ".swift-format"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFileSystemSynchronizedRootGroup section */
0296B2F22F38F8F7001C3BDB /* Todos */ = { 0296B2F22F38F8F7001C3BDB /* App */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
path = Todos; path = App;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
0296B3022F38F8F7001C3BDB /* TodosTests */ = { 0296B3022F38F8F7001C3BDB /* UnitTests */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
path = TodosTests; path = UnitTests;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
0296B30C2F38F8F7001C3BDB /* TodosUITests */ = { 0296B30C2F38F8F7001C3BDB /* UITests */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
path = TodosUITests; path = UITests;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
/* End PBXFileSystemSynchronizedRootGroup section */ /* End PBXFileSystemSynchronizedRootGroup section */
@@ -50,24 +57,18 @@
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
0296B2ED2F38F8F7001C3BDB /* Frameworks */ = { 0296B2ED2F38F8F7001C3BDB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
0296B2FC2F38F8F7001C3BDB /* Frameworks */ = { 0296B2FC2F38F8F7001C3BDB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
0296B3062F38F8F7001C3BDB /* Frameworks */ = { 0296B3062F38F8F7001C3BDB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
@@ -75,9 +76,11 @@
0296B2E72F38F8F7001C3BDB = { 0296B2E72F38F8F7001C3BDB = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
0296B2F22F38F8F7001C3BDB /* Todos */, 0296B3262F390E1A001C3BDB /* .swift-format */,
0296B3022F38F8F7001C3BDB /* TodosTests */, 0296B3222F3903E6001C3BDB /* README.md */,
0296B30C2F38F8F7001C3BDB /* TodosUITests */, 0296B2F22F38F8F7001C3BDB /* App */,
0296B3022F38F8F7001C3BDB /* UnitTests */,
0296B30C2F38F8F7001C3BDB /* UITests */,
0296B2F12F38F8F7001C3BDB /* Products */, 0296B2F12F38F8F7001C3BDB /* Products */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
@@ -105,14 +108,10 @@
); );
buildRules = ( buildRules = (
); );
dependencies = (
);
fileSystemSynchronizedGroups = ( fileSystemSynchronizedGroups = (
0296B2F22F38F8F7001C3BDB /* Todos */, 0296B2F22F38F8F7001C3BDB /* App */,
); );
name = Todos; name = Todos;
packageProductDependencies = (
);
productName = Todos; productName = Todos;
productReference = 0296B2F02F38F8F7001C3BDB /* Todos.app */; productReference = 0296B2F02F38F8F7001C3BDB /* Todos.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
@@ -131,11 +130,9 @@
0296B3012F38F8F7001C3BDB /* PBXTargetDependency */, 0296B3012F38F8F7001C3BDB /* PBXTargetDependency */,
); );
fileSystemSynchronizedGroups = ( fileSystemSynchronizedGroups = (
0296B3022F38F8F7001C3BDB /* TodosTests */, 0296B3022F38F8F7001C3BDB /* UnitTests */,
); );
name = TodosTests; name = TodosTests;
packageProductDependencies = (
);
productName = TodosTests; productName = TodosTests;
productReference = 0296B2FF2F38F8F7001C3BDB /* TodosTests.xctest */; productReference = 0296B2FF2F38F8F7001C3BDB /* TodosTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test"; productType = "com.apple.product-type.bundle.unit-test";
@@ -154,11 +151,9 @@
0296B30B2F38F8F7001C3BDB /* PBXTargetDependency */, 0296B30B2F38F8F7001C3BDB /* PBXTargetDependency */,
); );
fileSystemSynchronizedGroups = ( fileSystemSynchronizedGroups = (
0296B30C2F38F8F7001C3BDB /* TodosUITests */, 0296B30C2F38F8F7001C3BDB /* UITests */,
); );
name = TodosUITests; name = TodosUITests;
packageProductDependencies = (
);
productName = TodosUITests; productName = TodosUITests;
productReference = 0296B3092F38F8F7001C3BDB /* TodosUITests.xctest */; productReference = 0296B3092F38F8F7001C3BDB /* TodosUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing"; productType = "com.apple.product-type.bundle.ui-testing";
@@ -172,6 +167,7 @@
BuildIndependentTargetsInParallel = 1; BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 2630; LastSwiftUpdateCheck = 2630;
LastUpgradeCheck = 2630; LastUpgradeCheck = 2630;
ORGANIZATIONNAME = "Röck+Cöde VoF";
TargetAttributes = { TargetAttributes = {
0296B2EF2F38F8F7001C3BDB = { 0296B2EF2F38F8F7001C3BDB = {
CreatedOnToolsVersion = 26.3; CreatedOnToolsVersion = 26.3;
@@ -195,7 +191,7 @@
); );
mainGroup = 0296B2E72F38F8F7001C3BDB; mainGroup = 0296B2E72F38F8F7001C3BDB;
minimizedProjectReferenceProxies = 1; minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77; preferredProjectObjectVersion = 90;
productRefGroup = 0296B2F12F38F8F7001C3BDB /* Products */; productRefGroup = 0296B2F12F38F8F7001C3BDB /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
@@ -210,48 +206,38 @@
/* Begin PBXResourcesBuildPhase section */ /* Begin PBXResourcesBuildPhase section */
0296B2EE2F38F8F7001C3BDB /* Resources */ = { 0296B2EE2F38F8F7001C3BDB /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
0296B3232F3903E6001C3BDB /* README.md in Resources */,
0296B3272F390E1A001C3BDB /* .swift-format in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
0296B2FD2F38F8F7001C3BDB /* Resources */ = { 0296B2FD2F38F8F7001C3BDB /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
0296B3072F38F8F7001C3BDB /* Resources */ = { 0296B3072F38F8F7001C3BDB /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
0296B2EC2F38F8F7001C3BDB /* Sources */ = { 0296B2EC2F38F8F7001C3BDB /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
0296B2FB2F38F8F7001C3BDB /* Sources */ = { 0296B2FB2F38F8F7001C3BDB /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
0296B3052F38F8F7001C3BDB /* Sources */ = { 0296B3052F38F8F7001C3BDB /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = ( files = (
); );
runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
@@ -269,7 +255,7 @@
/* End PBXTargetDependency section */ /* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
0296B3112F38F8F7001C3BDB /* Debug */ = { 0296B3112F38F8F7001C3BDB /* Debug configuration for PBXProject "Todos" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
@@ -331,7 +317,7 @@
}; };
name = Debug; name = Debug;
}; };
0296B3122F38F8F7001C3BDB /* Release */ = { 0296B3122F38F8F7001C3BDB /* Release configuration for PBXProject "Todos" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
@@ -385,7 +371,7 @@
}; };
name = Release; name = Release;
}; };
0296B3142F38F8F7001C3BDB /* Debug */ = { 0296B3142F38F8F7001C3BDB /* Debug configuration for PBXNativeTarget "Todos" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -398,6 +384,7 @@
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
ENABLE_USER_SELECTED_FILES = readonly; ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
@@ -408,12 +395,12 @@
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 26.2; MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.app.Todos"; PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.todos.app";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES; REGISTER_APP_GROUPS = YES;
SDKROOT = auto; SDKROOT = auto;
@@ -425,11 +412,11 @@
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7"; TARGETED_DEVICE_FAMILY = "1,2,7";
XROS_DEPLOYMENT_TARGET = 26.2; XROS_DEPLOYMENT_TARGET = 26.0;
}; };
name = Debug; name = Debug;
}; };
0296B3152F38F8F7001C3BDB /* Release */ = { 0296B3152F38F8F7001C3BDB /* Release configuration for PBXNativeTarget "Todos" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -442,6 +429,7 @@
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
ENABLE_USER_SELECTED_FILES = readonly; ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
@@ -452,12 +440,12 @@
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 26.2; MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.app.Todos"; PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.todos.app";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES; REGISTER_APP_GROUPS = YES;
SDKROOT = auto; SDKROOT = auto;
@@ -469,11 +457,11 @@
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7"; TARGETED_DEVICE_FAMILY = "1,2,7";
XROS_DEPLOYMENT_TARGET = 26.2; XROS_DEPLOYMENT_TARGET = 26.0;
}; };
name = Release; name = Release;
}; };
0296B3172F38F8F7001C3BDB /* Debug */ = { 0296B3172F38F8F7001C3BDB /* Debug configuration for PBXNativeTarget "TodosTests" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
@@ -481,10 +469,10 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 7FMNM89WKG; DEVELOPMENT_TEAM = 7FMNM89WKG;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.2; MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.app.TodosTests"; PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.todos.app.unit-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto; SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
@@ -495,11 +483,11 @@
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7"; TARGETED_DEVICE_FAMILY = "1,2,7";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Todos.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Todos"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Todos.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Todos";
XROS_DEPLOYMENT_TARGET = 26.2; XROS_DEPLOYMENT_TARGET = 26.0;
}; };
name = Debug; name = Debug;
}; };
0296B3182F38F8F7001C3BDB /* Release */ = { 0296B3182F38F8F7001C3BDB /* Release configuration for PBXNativeTarget "TodosTests" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
@@ -507,10 +495,10 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 7FMNM89WKG; DEVELOPMENT_TEAM = 7FMNM89WKG;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.2; MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.app.TodosTests"; PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.todos.app.unit-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto; SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
@@ -521,21 +509,21 @@
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7"; TARGETED_DEVICE_FAMILY = "1,2,7";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Todos.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Todos"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Todos.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Todos";
XROS_DEPLOYMENT_TARGET = 26.2; XROS_DEPLOYMENT_TARGET = 26.0;
}; };
name = Release; name = Release;
}; };
0296B31A2F38F8F7001C3BDB /* Debug */ = { 0296B31A2F38F8F7001C3BDB /* Debug configuration for PBXNativeTarget "TodosUITests" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 7FMNM89WKG; DEVELOPMENT_TEAM = 7FMNM89WKG;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.2; MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.app.TodosUITests"; PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.todos.app.ui-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto; SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
@@ -546,21 +534,21 @@
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7"; TARGETED_DEVICE_FAMILY = "1,2,7";
TEST_TARGET_NAME = Todos; TEST_TARGET_NAME = Todos;
XROS_DEPLOYMENT_TARGET = 26.2; XROS_DEPLOYMENT_TARGET = 26.0;
}; };
name = Debug; name = Debug;
}; };
0296B31B2F38F8F7001C3BDB /* Release */ = { 0296B31B2F38F8F7001C3BDB /* Release configuration for PBXNativeTarget "TodosUITests" */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 7FMNM89WKG; DEVELOPMENT_TEAM = 7FMNM89WKG;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MACOSX_DEPLOYMENT_TARGET = 26.2; MACOSX_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.app.TodosUITests"; PRODUCT_BUNDLE_IDENTIFIER = "com.rock-n-code.assignment.todos.app.ui-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto; SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
@@ -571,7 +559,7 @@
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7"; TARGETED_DEVICE_FAMILY = "1,2,7";
TEST_TARGET_NAME = Todos; TEST_TARGET_NAME = Todos;
XROS_DEPLOYMENT_TARGET = 26.2; XROS_DEPLOYMENT_TARGET = 26.0;
}; };
name = Release; name = Release;
}; };
@@ -581,37 +569,33 @@
0296B2EB2F38F8F7001C3BDB /* Build configuration list for PBXProject "Todos" */ = { 0296B2EB2F38F8F7001C3BDB /* Build configuration list for PBXProject "Todos" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
0296B3112F38F8F7001C3BDB /* Debug */, 0296B3112F38F8F7001C3BDB /* Debug configuration for PBXProject "Todos" */,
0296B3122F38F8F7001C3BDB /* Release */, 0296B3122F38F8F7001C3BDB /* Release configuration for PBXProject "Todos" */,
); );
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
0296B3132F38F8F7001C3BDB /* Build configuration list for PBXNativeTarget "Todos" */ = { 0296B3132F38F8F7001C3BDB /* Build configuration list for PBXNativeTarget "Todos" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
0296B3142F38F8F7001C3BDB /* Debug */, 0296B3142F38F8F7001C3BDB /* Debug configuration for PBXNativeTarget "Todos" */,
0296B3152F38F8F7001C3BDB /* Release */, 0296B3152F38F8F7001C3BDB /* Release configuration for PBXNativeTarget "Todos" */,
); );
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
0296B3162F38F8F7001C3BDB /* Build configuration list for PBXNativeTarget "TodosTests" */ = { 0296B3162F38F8F7001C3BDB /* Build configuration list for PBXNativeTarget "TodosTests" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
0296B3172F38F8F7001C3BDB /* Debug */, 0296B3172F38F8F7001C3BDB /* Debug configuration for PBXNativeTarget "TodosTests" */,
0296B3182F38F8F7001C3BDB /* Release */, 0296B3182F38F8F7001C3BDB /* Release configuration for PBXNativeTarget "TodosTests" */,
); );
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
0296B3192F38F8F7001C3BDB /* Build configuration list for PBXNativeTarget "TodosUITests" */ = { 0296B3192F38F8F7001C3BDB /* Build configuration list for PBXNativeTarget "TodosUITests" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
0296B31A2F38F8F7001C3BDB /* Debug */, 0296B31A2F38F8F7001C3BDB /* Debug configuration for PBXNativeTarget "TodosUITests" */,
0296B31B2F38F8F7001C3BDB /* Release */, 0296B31B2F38F8F7001C3BDB /* Release configuration for PBXNativeTarget "TodosUITests" */,
); );
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
/* End XCConfigurationList section */ /* End XCConfigurationList section */
@@ -23,5 +23,5 @@ final class TodosUITestsLaunchTests: XCTestCase {
attachment.lifetime = .keepAlways attachment.lifetime = .keepAlways
add(attachment) add(attachment)
} }
}
}
@@ -2,8 +2,8 @@ import Testing
struct TodosTests { struct TodosTests {
@Test func example() async throws { @Test
func example() async throws {
// Write your test here and use APIs like `#expect(...)` to check expected conditions. // Write your test here and use APIs like `#expect(...)` to check expected conditions.
} }
} }