From 9c9cce8a3403cfab2875b4584bc27b61ff5c5ef3 Mon Sep 17 00:00:00 2001 From: soo127 Date: Thu, 6 Nov 2025 23:48:11 +0900 Subject: [PATCH] =?UTF-8?q?Setting:=202=EC=A3=BC=EC=B0=A8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 10244 bytes .../project.pbxproj | 596 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + LeeSangSu-sopt-assignment/AppDelegate.swift | 36 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 24 + LeeSangSu-sopt-assignment/Info.plist | 25 + LeeSangSu-sopt-assignment/SceneDelegate.swift | 52 ++ .../ViewController.swift | 19 + .../LeeSangSu_sopt_assignmentTests.swift | 17 + .../LeeSangSu_sopt_assignmentUITests.swift | 41 ++ ...Su_sopt_assignmentUITestsLaunchTests.swift | 33 + 15 files changed, 927 insertions(+) create mode 100644 .DS_Store create mode 100644 LeeSangSu-sopt-assignment.xcodeproj/project.pbxproj create mode 100644 LeeSangSu-sopt-assignment.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 LeeSangSu-sopt-assignment/AppDelegate.swift create mode 100644 LeeSangSu-sopt-assignment/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 LeeSangSu-sopt-assignment/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 LeeSangSu-sopt-assignment/Assets.xcassets/Contents.json create mode 100644 LeeSangSu-sopt-assignment/Base.lproj/LaunchScreen.storyboard create mode 100644 LeeSangSu-sopt-assignment/Base.lproj/Main.storyboard create mode 100644 LeeSangSu-sopt-assignment/Info.plist create mode 100644 LeeSangSu-sopt-assignment/SceneDelegate.swift create mode 100644 LeeSangSu-sopt-assignment/ViewController.swift create mode 100644 LeeSangSu-sopt-assignmentTests/LeeSangSu_sopt_assignmentTests.swift create mode 100644 LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITests.swift create mode 100644 LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITestsLaunchTests.swift diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ddc84114264f2b0a73286bb8175a6d61cf0d86c9 GIT binary patch literal 10244 zcmeHMTWl0n7(V~Bz!^qhsO2i-Ze5|ZEV3;(D+=4~HgajXZA;tbvdr!b?a1uRvNOAF zZL0N214`nH#tZsJ)CbfkiawEeK@;NxL83$>#>6LHG=dK%#{bNjZD@h01QJMQHs}23 z^8aV%|MvgR?0=RJ0*R8=L`awrLa{I@--XpRE;i4~RhQt8ut`9BLR4arev%?3vg|7D zU?4ysKp;RMKp;RMK;U*j0N>f{q7s)u9Uu@O5Fjv)0NWqJSeT6aa*RuF>%huO0Z>-s zuy$GG%NaZR2*fNu(ZiUHgl=fg}LW!#rzTyk>)+?;@aXYex=@a~Rw zVNabvoXemN5C{;s8UaR|1*C)M_(@I3-yLF;0&y{uSBZlk12cPz>LPH)l;TUqtmEF_oN2w!IZ1IB`2X4cd=fVZJXIjTg~n?^udf=+h$v? zYFK*FGcYtARd)9nmSzto?2@H9o^6UxP?3rmdH%@As^(ZU+`Oh`G#VahVeOSGR*#N~ zbWUXX+8vn#X5O+7ac9BbFvyHa&L6%p&rPS?#yzh}RXjgm@m!oPNi&q5-oEs%-5FUf zIrGV&}3f!LU{t!+iUi~#iHY_pWNaAtN+HFG6Y)>}<8Wjw*Pb4A-U zx7m*28n)Hf>*_-;n_~-2nCeYCcF}F~7V9-|eXdo*?yZyd%A3WWGWVDd z)=KNC*qgKSd346%V+kcmbD;6D;dS4@s zGn01BaP6Xp#+Euo>0?W^YMQR0(+lS>s8Lc%HB! zm&j%E7gWP^sD(wa80w(`9)M<80jpp&v_S`S!WKwF4m8*g{a``~$}j}O@FY9~&%z-% z3@^Yd@G2aI*Wnnv1Mk9n@CkehpTQS!8qUE_Z~=aXi*N}p!=HjE)Ch|NMYva}7aD{{ zVX3fASTAf4whL(?BMfjKgbFG5jQiv@gkcmnupJ>O{q0CNer-~Q9^0^S)8>xbmXzPm zWHh|HcFx>+;l+*1S3dM;>v*v8*sg^0l{E2~F@aAWGrZ`T9Mzn!Qm7lLqYqt=w(>Ma zae9_%*WD+DGfcEbwPMGWF)IoVSxn|K|d2_;K`TEPcB5X0EQ?!qp1{SE6!?gA>#N0s#U60s#U6 z0(UF|Rs6}r?EJs|`v3pmvHk@Q9v~1P@b3sfbuyJqpk5^_pKQX;+QV4(VPO~38{^V5 z!OA<1N9i5MV~3q9Heg}8{wapnj{9R{TzclH + + + + diff --git a/LeeSangSu-sopt-assignment/AppDelegate.swift b/LeeSangSu-sopt-assignment/AppDelegate.swift new file mode 100644 index 0000000..81c9baa --- /dev/null +++ b/LeeSangSu-sopt-assignment/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// LeeSangSu-sopt-assignment +// +// Created by 이상수 on 10/31/25. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/LeeSangSu-sopt-assignment/Assets.xcassets/AccentColor.colorset/Contents.json b/LeeSangSu-sopt-assignment/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/LeeSangSu-sopt-assignment/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LeeSangSu-sopt-assignment/Assets.xcassets/AppIcon.appiconset/Contents.json b/LeeSangSu-sopt-assignment/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/LeeSangSu-sopt-assignment/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LeeSangSu-sopt-assignment/Assets.xcassets/Contents.json b/LeeSangSu-sopt-assignment/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/LeeSangSu-sopt-assignment/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LeeSangSu-sopt-assignment/Base.lproj/LaunchScreen.storyboard b/LeeSangSu-sopt-assignment/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/LeeSangSu-sopt-assignment/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LeeSangSu-sopt-assignment/Base.lproj/Main.storyboard b/LeeSangSu-sopt-assignment/Base.lproj/Main.storyboard new file mode 100644 index 0000000..25a7638 --- /dev/null +++ b/LeeSangSu-sopt-assignment/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LeeSangSu-sopt-assignment/Info.plist b/LeeSangSu-sopt-assignment/Info.plist new file mode 100644 index 0000000..dd3c9af --- /dev/null +++ b/LeeSangSu-sopt-assignment/Info.plist @@ -0,0 +1,25 @@ + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + + diff --git a/LeeSangSu-sopt-assignment/SceneDelegate.swift b/LeeSangSu-sopt-assignment/SceneDelegate.swift new file mode 100644 index 0000000..c90c610 --- /dev/null +++ b/LeeSangSu-sopt-assignment/SceneDelegate.swift @@ -0,0 +1,52 @@ +// +// SceneDelegate.swift +// LeeSangSu-sopt-assignment +// +// Created by 이상수 on 10/31/25. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/LeeSangSu-sopt-assignment/ViewController.swift b/LeeSangSu-sopt-assignment/ViewController.swift new file mode 100644 index 0000000..4717df3 --- /dev/null +++ b/LeeSangSu-sopt-assignment/ViewController.swift @@ -0,0 +1,19 @@ +// +// ViewController.swift +// LeeSangSu-sopt-assignment +// +// Created by 이상수 on 10/31/25. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + + +} + diff --git a/LeeSangSu-sopt-assignmentTests/LeeSangSu_sopt_assignmentTests.swift b/LeeSangSu-sopt-assignmentTests/LeeSangSu_sopt_assignmentTests.swift new file mode 100644 index 0000000..58619bc --- /dev/null +++ b/LeeSangSu-sopt-assignmentTests/LeeSangSu_sopt_assignmentTests.swift @@ -0,0 +1,17 @@ +// +// LeeSangSu_sopt_assignmentTests.swift +// LeeSangSu-sopt-assignmentTests +// +// Created by 이상수 on 10/31/25. +// + +import Testing +@testable import LeeSangSu_sopt_assignment + +struct LeeSangSu_sopt_assignmentTests { + + @Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. + } + +} diff --git a/LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITests.swift b/LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITests.swift new file mode 100644 index 0000000..8be3475 --- /dev/null +++ b/LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITests.swift @@ -0,0 +1,41 @@ +// +// LeeSangSu_sopt_assignmentUITests.swift +// LeeSangSu-sopt-assignmentUITests +// +// Created by 이상수 on 10/31/25. +// + +import XCTest + +final class LeeSangSu_sopt_assignmentUITests: 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. + } + + @MainActor + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + @MainActor + func testLaunchPerformance() throws { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } +} diff --git a/LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITestsLaunchTests.swift b/LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITestsLaunchTests.swift new file mode 100644 index 0000000..45f59c8 --- /dev/null +++ b/LeeSangSu-sopt-assignmentUITests/LeeSangSu_sopt_assignmentUITestsLaunchTests.swift @@ -0,0 +1,33 @@ +// +// LeeSangSu_sopt_assignmentUITestsLaunchTests.swift +// LeeSangSu-sopt-assignmentUITests +// +// Created by 이상수 on 10/31/25. +// + +import XCTest + +final class LeeSangSu_sopt_assignmentUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + @MainActor + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +}