-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
문제
1. 의미없는 테스트 (항상 통과)
`test_snapToStep_zero_returnsZero`: `floor(0 / snapStep) * snapStep = 0`은 입력이 0이면 항상 0입니다. 구현과 무관하게 통과합니다.
`test_snapToStep_exactMultiple_unchanged`: exact multiple을 floor로 내림하면 자기 자신인 건 수학적으로 자명합니다. 부동소수점 오차 검증 목적이라면 의도를 주석으로 명시해야 합니다.
2. snapStep = 0 전달 시 NaN 반환 미검증
func snapToStep(_ rotation: Double) -> Double {
floor(rotation / snapStep) * snapStep // snapStep = 0이면 NaN
}`makeDial(snapStep: 0.0)`으로 생성 후 `snapToStep`을 호출하면 `NaN`이 반환됩니다. guard나 테스트가 없어 호출자가 NaN을 받을 경우 뷰 렌더링이 망가집니다.
3. shortestDelta wrap-around 로직 직접 테스트 불가
`shortestDelta`는 MinuteDial 내 가장 복잡한 로직(0°/360° 경계 wrap-around 처리)인데 `private`으로 선언되어 단위 테스트가 불가능합니다.
// 현재: private → 테스트 불가
private func shortestDelta(_ from: Double, _ to: Double) -> Double { ... }현재 `test_pointToAngle_result_alwaysNonNegative`의 grid loop가 간접적으로 커버하지만, 350° → 10° wrap-around처럼 실제로 버그가 생기기 쉬운 케이스는 검증하지 못합니다.
왜 문제인가
- snapStep=0은 외부에서 주입 가능한 값이므로 방어 코드 없이 NaN이 angle Binding으로 전파되면 타이머 전체 각도 상태가 깨집니다.
- shortestDelta에 버그가 생겨도 현재 테스트로는 감지하기 어렵습니다.
해결 방향
- `snapToStep`: snapStep ≤ 0 guard 추가 + 테스트
- `shortestDelta`: `private` → `internal`로 변경하고 wrap-around 케이스 직접 테스트 추가
- e.g., (350°, 10°) → delta = +20° (not -340°)
- e.g., (10°, 350°) → delta = -20° (not +340°)
- 0 입력 테스트는 제거하거나 의도 주석 추가
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels