Skip to content

Commit abe0df1

Browse files
authored
[Feat] 2주차 과제
[Feat] 2주차 과제
2 parents 701e724 + 228a6fe commit abe0df1

File tree

5 files changed

+282
-1
lines changed

5 files changed

+282
-1
lines changed

sopt-37th-Assignment/sopt-37th-Assignment.xcodeproj/project.pbxproj

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,18 @@
1111
33ED6F252EB093AE0023190D /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 33ED6F242EB093AE0023190D /* Then */; };
1212
/* End PBXBuildFile section */
1313

14+
/* Begin PBXContainerItemProxy section */
15+
3326EE1E2EBE0E0500668ECC /* PBXContainerItemProxy */ = {
16+
isa = PBXContainerItemProxy;
17+
containerPortal = 33ED6E912EB088070023190D /* Project object */;
18+
proxyType = 1;
19+
remoteGlobalIDString = 33ED6E982EB088070023190D;
20+
remoteInfo = "sopt-37th-Assignment";
21+
};
22+
/* End PBXContainerItemProxy section */
23+
1424
/* Begin PBXFileReference section */
25+
3326EE1A2EBE0E0500668ECC /* sopt-37th-AssignmentTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "sopt-37th-AssignmentTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
1526
33ED6E992EB088070023190D /* sopt-37th-Assignment.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "sopt-37th-Assignment.app"; sourceTree = BUILT_PRODUCTS_DIR; };
1627
/* End PBXFileReference section */
1728

@@ -26,6 +37,11 @@
2637
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
2738

2839
/* Begin PBXFileSystemSynchronizedRootGroup section */
40+
3326EE1B2EBE0E0500668ECC /* sopt-37th-AssignmentTests */ = {
41+
isa = PBXFileSystemSynchronizedRootGroup;
42+
path = "sopt-37th-AssignmentTests";
43+
sourceTree = "<group>";
44+
};
2945
33ED6E9B2EB088070023190D /* sopt-37th-Assignment */ = {
3046
isa = PBXFileSystemSynchronizedRootGroup;
3147
exceptions = (
@@ -37,6 +53,13 @@
3753
/* End PBXFileSystemSynchronizedRootGroup section */
3854

3955
/* Begin PBXFrameworksBuildPhase section */
56+
3326EE172EBE0E0500668ECC /* Frameworks */ = {
57+
isa = PBXFrameworksBuildPhase;
58+
buildActionMask = 2147483647;
59+
files = (
60+
);
61+
runOnlyForDeploymentPostprocessing = 0;
62+
};
4063
33ED6E962EB088070023190D /* Frameworks */ = {
4164
isa = PBXFrameworksBuildPhase;
4265
buildActionMask = 2147483647;
@@ -53,6 +76,7 @@
5376
isa = PBXGroup;
5477
children = (
5578
33ED6E9B2EB088070023190D /* sopt-37th-Assignment */,
79+
3326EE1B2EBE0E0500668ECC /* sopt-37th-AssignmentTests */,
5680
33ED6E9A2EB088070023190D /* Products */,
5781
);
5882
sourceTree = "<group>";
@@ -61,13 +85,37 @@
6185
isa = PBXGroup;
6286
children = (
6387
33ED6E992EB088070023190D /* sopt-37th-Assignment.app */,
88+
3326EE1A2EBE0E0500668ECC /* sopt-37th-AssignmentTests.xctest */,
6489
);
6590
name = Products;
6691
sourceTree = "<group>";
6792
};
6893
/* End PBXGroup section */
6994

7095
/* Begin PBXNativeTarget section */
96+
3326EE192EBE0E0500668ECC /* sopt-37th-AssignmentTests */ = {
97+
isa = PBXNativeTarget;
98+
buildConfigurationList = 3326EE202EBE0E0500668ECC /* Build configuration list for PBXNativeTarget "sopt-37th-AssignmentTests" */;
99+
buildPhases = (
100+
3326EE162EBE0E0500668ECC /* Sources */,
101+
3326EE172EBE0E0500668ECC /* Frameworks */,
102+
3326EE182EBE0E0500668ECC /* Resources */,
103+
);
104+
buildRules = (
105+
);
106+
dependencies = (
107+
3326EE1F2EBE0E0500668ECC /* PBXTargetDependency */,
108+
);
109+
fileSystemSynchronizedGroups = (
110+
3326EE1B2EBE0E0500668ECC /* sopt-37th-AssignmentTests */,
111+
);
112+
name = "sopt-37th-AssignmentTests";
113+
packageProductDependencies = (
114+
);
115+
productName = "sopt-37th-AssignmentTests";
116+
productReference = 3326EE1A2EBE0E0500668ECC /* sopt-37th-AssignmentTests.xctest */;
117+
productType = "com.apple.product-type.bundle.unit-test";
118+
};
71119
33ED6E982EB088070023190D /* sopt-37th-Assignment */ = {
72120
isa = PBXNativeTarget;
73121
buildConfigurationList = 33ED6EAC2EB0880A0023190D /* Build configuration list for PBXNativeTarget "sopt-37th-Assignment" */;
@@ -102,6 +150,10 @@
102150
LastSwiftUpdateCheck = 1640;
103151
LastUpgradeCheck = 1640;
104152
TargetAttributes = {
153+
3326EE192EBE0E0500668ECC = {
154+
CreatedOnToolsVersion = 16.4;
155+
TestTargetID = 33ED6E982EB088070023190D;
156+
};
105157
33ED6E982EB088070023190D = {
106158
CreatedOnToolsVersion = 16.4;
107159
};
@@ -126,11 +178,19 @@
126178
projectRoot = "";
127179
targets = (
128180
33ED6E982EB088070023190D /* sopt-37th-Assignment */,
181+
3326EE192EBE0E0500668ECC /* sopt-37th-AssignmentTests */,
129182
);
130183
};
131184
/* End PBXProject section */
132185

133186
/* Begin PBXResourcesBuildPhase section */
187+
3326EE182EBE0E0500668ECC /* Resources */ = {
188+
isa = PBXResourcesBuildPhase;
189+
buildActionMask = 2147483647;
190+
files = (
191+
);
192+
runOnlyForDeploymentPostprocessing = 0;
193+
};
134194
33ED6E972EB088070023190D /* Resources */ = {
135195
isa = PBXResourcesBuildPhase;
136196
buildActionMask = 2147483647;
@@ -141,6 +201,13 @@
141201
/* End PBXResourcesBuildPhase section */
142202

143203
/* Begin PBXSourcesBuildPhase section */
204+
3326EE162EBE0E0500668ECC /* Sources */ = {
205+
isa = PBXSourcesBuildPhase;
206+
buildActionMask = 2147483647;
207+
files = (
208+
);
209+
runOnlyForDeploymentPostprocessing = 0;
210+
};
144211
33ED6E952EB088070023190D /* Sources */ = {
145212
isa = PBXSourcesBuildPhase;
146213
buildActionMask = 2147483647;
@@ -150,7 +217,49 @@
150217
};
151218
/* End PBXSourcesBuildPhase section */
152219

220+
/* Begin PBXTargetDependency section */
221+
3326EE1F2EBE0E0500668ECC /* PBXTargetDependency */ = {
222+
isa = PBXTargetDependency;
223+
target = 33ED6E982EB088070023190D /* sopt-37th-Assignment */;
224+
targetProxy = 3326EE1E2EBE0E0500668ECC /* PBXContainerItemProxy */;
225+
};
226+
/* End PBXTargetDependency section */
227+
153228
/* Begin XCBuildConfiguration section */
229+
3326EE212EBE0E0500668ECC /* Debug */ = {
230+
isa = XCBuildConfiguration;
231+
buildSettings = {
232+
BUNDLE_LOADER = "$(TEST_HOST)";
233+
CODE_SIGN_STYLE = Automatic;
234+
CURRENT_PROJECT_VERSION = 1;
235+
GENERATE_INFOPLIST_FILE = YES;
236+
MARKETING_VERSION = 1.0;
237+
PRODUCT_BUNDLE_IDENTIFIER = "yeonnies.sopt-37th-AssignmentTests";
238+
PRODUCT_NAME = "$(TARGET_NAME)";
239+
SWIFT_EMIT_LOC_STRINGS = NO;
240+
SWIFT_VERSION = 5.0;
241+
TARGETED_DEVICE_FAMILY = "1,2";
242+
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sopt-37th-Assignment.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sopt-37th-Assignment";
243+
};
244+
name = Debug;
245+
};
246+
3326EE222EBE0E0500668ECC /* Release */ = {
247+
isa = XCBuildConfiguration;
248+
buildSettings = {
249+
BUNDLE_LOADER = "$(TEST_HOST)";
250+
CODE_SIGN_STYLE = Automatic;
251+
CURRENT_PROJECT_VERSION = 1;
252+
GENERATE_INFOPLIST_FILE = YES;
253+
MARKETING_VERSION = 1.0;
254+
PRODUCT_BUNDLE_IDENTIFIER = "yeonnies.sopt-37th-AssignmentTests";
255+
PRODUCT_NAME = "$(TARGET_NAME)";
256+
SWIFT_EMIT_LOC_STRINGS = NO;
257+
SWIFT_VERSION = 5.0;
258+
TARGETED_DEVICE_FAMILY = "1,2";
259+
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sopt-37th-Assignment.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sopt-37th-Assignment";
260+
};
261+
name = Release;
262+
};
154263
33ED6EAD2EB0880A0023190D /* Debug */ = {
155264
isa = XCBuildConfiguration;
156265
buildSettings = {
@@ -325,6 +434,15 @@
325434
/* End XCBuildConfiguration section */
326435

327436
/* Begin XCConfigurationList section */
437+
3326EE202EBE0E0500668ECC /* Build configuration list for PBXNativeTarget "sopt-37th-AssignmentTests" */ = {
438+
isa = XCConfigurationList;
439+
buildConfigurations = (
440+
3326EE212EBE0E0500668ECC /* Debug */,
441+
3326EE222EBE0E0500668ECC /* Release */,
442+
);
443+
defaultConfigurationIsVisible = 0;
444+
defaultConfigurationName = Release;
445+
};
328446
33ED6E942EB088070023190D /* Build configuration list for PBXProject "sopt-37th-Assignment" */ = {
329447
isa = XCConfigurationList;
330448
buildConfigurations = (
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Scheme
3+
LastUpgradeVersion = "1640"
4+
version = "1.7">
5+
<BuildAction
6+
parallelizeBuildables = "YES"
7+
buildImplicitDependencies = "YES"
8+
buildArchitectures = "Automatic">
9+
<BuildActionEntries>
10+
<BuildActionEntry
11+
buildForTesting = "YES"
12+
buildForRunning = "YES"
13+
buildForProfiling = "YES"
14+
buildForArchiving = "YES"
15+
buildForAnalyzing = "YES">
16+
<BuildableReference
17+
BuildableIdentifier = "primary"
18+
BlueprintIdentifier = "33ED6E982EB088070023190D"
19+
BuildableName = "sopt-37th-Assignment.app"
20+
BlueprintName = "sopt-37th-Assignment"
21+
ReferencedContainer = "container:sopt-37th-Assignment.xcodeproj">
22+
</BuildableReference>
23+
</BuildActionEntry>
24+
</BuildActionEntries>
25+
</BuildAction>
26+
<TestAction
27+
buildConfiguration = "Debug"
28+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
29+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
30+
shouldUseLaunchSchemeArgsEnv = "YES"
31+
shouldAutocreateTestPlan = "YES">
32+
<Testables>
33+
<TestableReference
34+
skipped = "NO"
35+
parallelizable = "YES">
36+
<BuildableReference
37+
BuildableIdentifier = "primary"
38+
BlueprintIdentifier = "3326EE192EBE0E0500668ECC"
39+
BuildableName = "sopt-37th-AssignmentTests.xctest"
40+
BlueprintName = "sopt-37th-AssignmentTests"
41+
ReferencedContainer = "container:sopt-37th-Assignment.xcodeproj">
42+
</BuildableReference>
43+
</TestableReference>
44+
</Testables>
45+
</TestAction>
46+
<LaunchAction
47+
buildConfiguration = "Debug"
48+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
49+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
50+
launchStyle = "0"
51+
useCustomWorkingDirectory = "NO"
52+
ignoresPersistentStateOnLaunch = "NO"
53+
debugDocumentVersioning = "YES"
54+
debugServiceExtension = "internal"
55+
allowLocationSimulation = "YES">
56+
<BuildableProductRunnable
57+
runnableDebuggingMode = "0">
58+
<BuildableReference
59+
BuildableIdentifier = "primary"
60+
BlueprintIdentifier = "33ED6E982EB088070023190D"
61+
BuildableName = "sopt-37th-Assignment.app"
62+
BlueprintName = "sopt-37th-Assignment"
63+
ReferencedContainer = "container:sopt-37th-Assignment.xcodeproj">
64+
</BuildableReference>
65+
</BuildableProductRunnable>
66+
</LaunchAction>
67+
<ProfileAction
68+
buildConfiguration = "Release"
69+
shouldUseLaunchSchemeArgsEnv = "YES"
70+
savedToolIdentifier = ""
71+
useCustomWorkingDirectory = "NO"
72+
debugDocumentVersioning = "YES">
73+
<BuildableProductRunnable
74+
runnableDebuggingMode = "0">
75+
<BuildableReference
76+
BuildableIdentifier = "primary"
77+
BlueprintIdentifier = "33ED6E982EB088070023190D"
78+
BuildableName = "sopt-37th-Assignment.app"
79+
BlueprintName = "sopt-37th-Assignment"
80+
ReferencedContainer = "container:sopt-37th-Assignment.xcodeproj">
81+
</BuildableReference>
82+
</BuildableProductRunnable>
83+
</ProfileAction>
84+
<AnalyzeAction
85+
buildConfiguration = "Debug">
86+
</AnalyzeAction>
87+
<ArchiveAction
88+
buildConfiguration = "Release"
89+
revealArchiveInOrganizer = "YES">
90+
</ArchiveAction>
91+
</Scheme>

sopt-37th-Assignment/sopt-37th-Assignment/Presentation/LoginViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import SnapKit
1212

1313
final class LoginViewController: BaseUIViewController {
1414
private let navigationBar = BaeminNavigationBar(title: "이메일 또는 아이디로 계속")
15-
private lazy var idTextField = BaeminIdTextField()
15+
lazy var idTextField = BaeminIdTextField()
1616
private lazy var passwordTextField = BaeminPasswordTextField()
1717

1818
private lazy var loginButton = BaeminButton().then {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// LoginValidationTests.swift
3+
// sopt-37th-Assignment
4+
//
5+
// Created by 김나연 on 11/15/25.
6+
//
7+
8+
9+
import XCTest
10+
@testable import sopt_37th_Assignment
11+
12+
final class LoginValidationTests: XCTestCase {
13+
14+
var sut: LoginViewController!
15+
16+
override func setUp() {
17+
super.setUp()
18+
sut = LoginViewController()
19+
}
20+
21+
override func tearDown() {
22+
sut = nil
23+
super.tearDown()
24+
}
25+
26+
func test_validEmail() {
27+
// Given
28+
sut.loadViewIfNeeded()
29+
sut.idTextField.textField.text = "test@example.com"
30+
31+
// When
32+
let input = sut.idTextField.textField.text ?? ""
33+
34+
// Then
35+
XCTAssertTrue(input.isValidEmail)
36+
}
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// sopt_37th_AssignmentTests.swift
3+
// sopt-37th-AssignmentTests
4+
//
5+
// Created by 김나연 on 11/7/25.
6+
//
7+
8+
import XCTest
9+
10+
final class sopt_37th_AssignmentTests: XCTestCase {
11+
12+
override func setUpWithError() throws {
13+
// Put setup code here. This method is called before the invocation of each test method in the class.
14+
}
15+
16+
override func tearDownWithError() throws {
17+
// Put teardown code here. This method is called after the invocation of each test method in the class.
18+
}
19+
20+
func testExample() throws {
21+
// This is an example of a functional test case.
22+
// Use XCTAssert and related functions to verify your tests produce the correct results.
23+
// Any test you write for XCTest can be annotated as throws and async.
24+
// Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
25+
// Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
26+
}
27+
28+
func testPerformanceExample() throws {
29+
// This is an example of a performance test case.
30+
measure {
31+
// Put the code you want to measure the time of here.
32+
}
33+
}
34+
35+
}

0 commit comments

Comments
 (0)