Skip to content

MinuteDialTests: trivial 테스트, snapStep=0 미검증, shortestDelta 직접 테스트 불가 #16

@seu11ee

Description

@seu11ee

문제

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 입력 테스트는 제거하거나 의도 주석 추가

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions