From a755af2fcb2c203b6cba40ab8d3f5719f8a45fd2 Mon Sep 17 00:00:00 2001 From: Minji Kang Date: Mon, 13 Oct 2025 10:44:08 +0900 Subject: [PATCH] =?UTF-8?q?test:=20=EC=8B=A0=EA=B7=9C=EC=83=81=EC=9E=A5(<2?= =?UTF-8?q?4h)=20=EA=B7=9C=EC=B9=99=20=EB=B0=98=EC=98=81=ED=95=B4=20ChartV?= =?UTF-8?q?iewModel=20=EC=B6=95/=EC=8A=A4=ED=81=AC=EB=A1=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iCoTests/ChartViewModel_Axis_Tests.swift | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/AIProject/iCoTests/ChartViewModel_Axis_Tests.swift b/AIProject/iCoTests/ChartViewModel_Axis_Tests.swift index 6ec6b186..be23b60d 100644 --- a/AIProject/iCoTests/ChartViewModel_Axis_Tests.swift +++ b/AIProject/iCoTests/ChartViewModel_Axis_Tests.swift @@ -9,10 +9,11 @@ import XCTest @testable import iCo /// 차트 X축 도메인/초기 스크롤 시각 계산을 검증하는 테스트 -/// - 핵심: 상한은 "마지막 데이터 +5분"과 정확히 일치해야 하며, -/// 하한은 내부에서 Date()를 사용하는 특성상 (호출 시각 t0~t1) 사이의 -24h 범위여야 함. @MainActor final class ChartViewModel_Axis_Tests: XCTestCase { + /// 24h 미만(span < 24h)일 때: + /// - xAxisDomain == first...last + /// - scrollToTime == last func test_xAxisDomain_and_scrollToTime() { let base = Date() let last = base.addingTimeInterval(600) // +10분 @@ -20,7 +21,35 @@ final class ChartViewModel_Axis_Tests: XCTestCase { makePrice(last, 110, 111) ] let vm = ChartViewModel(coin: .init(id: "KRW-SOL", koreanName: "솔라나")) - + + let domain = vm.xAxisDomain(for: data) + + XCTAssertEqual(domain.lowerBound.timeIntervalSince1970, + base.timeIntervalSince1970, + accuracy: 1) + XCTAssertEqual(domain.upperBound.timeIntervalSince1970, + last.timeIntervalSince1970, + accuracy: 1) + XCTAssertEqual(vm.scrollToTime(for: data).timeIntervalSince1970, + last.timeIntervalSince1970, + accuracy: 1) + } + + /// 24h 이상(span ≥ 24h)일 때: + /// - xAxisDomain.lowerBound ≈ (now - 24h) + /// - xAxisDomain.upperBound == (last + 5m) + /// - scrollToTime == (last + 5m) + func test_xAxisDomain_and_scrollToTime_whenSpanIs24hOrMore() { + let base = Date() + // first = base, last = base + 24h + 10m ⇒ span ≥ 24h + let last = base.addingTimeInterval(24*60*60 + 10*60) + let data = [ + makePrice(base, 100, 100), + makePrice(last, 110, 111) + ] + + let vm = ChartViewModel(coin: .init(id: "KRW-SOL", koreanName: "솔라나")) + // 호출 전후 now 경계 캡처 let t0 = Date() let domain = vm.xAxisDomain(for: data) @@ -31,12 +60,14 @@ final class ChartViewModel_Axis_Tests: XCTestCase { let expectedUpper = last.addingTimeInterval(60 * 5) XCTAssert(domain.lowerBound >= expectedLowerMin && domain.lowerBound <= expectedLowerMax, - "lowerBound이 호출 시각 기준 24h 윈도우와 일치해야 함") - XCTAssertEqual(domain.upperBound.timeIntervalSince1970, expectedUpper.timeIntervalSince1970, accuracy: 1) - - // 초기 스크롤 지점은 마지막 데이터 +5분 + "lowerBound는 호출 시각(now) 기준 -24h 범위여야 함") + XCTAssertEqual(domain.upperBound.timeIntervalSince1970, + expectedUpper.timeIntervalSince1970, + accuracy: 1, + "upperBound는 last+5m 이어야 함") XCTAssertEqual(vm.scrollToTime(for: data).timeIntervalSince1970, expectedUpper.timeIntervalSince1970, - accuracy: 1) + accuracy: 1, + "scrollToTime은 24h 이상일 때 last+5m이어야 함") } }