docs(banner): Phase 2 검증과 테스트명 규칙을 기록한다

This commit is contained in:
2026-05-27 22:28:19 +09:00
parent 02f85f808d
commit 1ffcd16efa
3 changed files with 17 additions and 7 deletions

View File

@@ -61,7 +61,9 @@
```
참고:
- Kotlin backtick 테스트명은 한글 문장으로 작성하는 것을 기본으로 한다.
- Kotlin backtick 테스트명은 공백이 포함될 수 있으므로 전체 문자열을 인용한다.
- 한글 테스트명을 `--tests`로 실행할 때도 클래스명과 메서드명을 포함한 전체 문자열을 따옴표로 감싼다.
- 메서드 매칭이 불안정하면 클래스 단위로 먼저 실행한다.
### 2) 계측 테스트 클래스/메서드 타깃 실행

View File

@@ -35,6 +35,8 @@
### 5) 테스트 관례
- 단위 테스트는 `app/src/test`에 위치하며 클래스명은 `*Test`를 사용한다.
- 기본 스택은 JUnit4 + MockK/Mockito다.
- Kotlin 테스트 메서드는 backtick 함수명을 사용하고, 테스트 의도가 드러나도록 한글 문장으로 작성한다.
- 기존 영어 테스트명을 수정하지 않는 최소 변경 상황에서는 해당 테스트가 무엇을 검증하는지 한글 주석을 추가한다.
- 테스트 추가 시 단일 실행 명령 예시도 `docs/agent-guides/build-test-style.md`에 갱신한다.
### 6) 주석

View File

@@ -84,12 +84,12 @@
### Phase 2: 순수 Kotlin contract와 단위 테스트
- [ ] **Task 2.1: `BannerItem` 모델 추가**
- [x] **Task 2.1: `BannerItem` 모델 추가**
- 생성 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerItem.kt`
- 요구사항: `bannerId: String?`, `imageUrl: String`만 포함한다.
- 검증: 서버 DTO, 딥링크 타입, 외부 URL 타입을 모델에 포함하지 않는다.
- [ ] **Task 2.2: `BannerLayoutCalculatorTest` 작성**
- [x] **Task 2.2: `BannerLayoutCalculatorTest` 작성**
- 생성 파일: `app/src/test/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerLayoutCalculatorTest.kt`
- 테스트 항목:
- 화면 폭 `402dp`이면 item width/height는 `362dp`.
@@ -99,7 +99,7 @@
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.banner.BannerLayoutCalculatorTest"`
- 기대: 구현 전 실패, 구현 후 성공.
- [ ] **Task 2.3: `BannerLayoutCalculator` 구현**
- [x] **Task 2.3: `BannerLayoutCalculator` 구현**
- 생성 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerLayoutCalculator.kt`
- 요구사항:
- `screenWidthPx`, `density` 또는 dp 변환 가능한 입력을 받아 item width/height를 계산한다.
@@ -107,7 +107,7 @@
- item height는 item width와 동일하다.
- 검증: `BannerLayoutCalculatorTest`가 통과한다.
- [ ] **Task 2.4: `BannerCounterFormatterTest` 작성**
- [x] **Task 2.4: `BannerCounterFormatterTest` 작성**
- 생성 파일: `app/src/test/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerCounterFormatterTest.kt`
- 테스트 항목:
- current index `0`, count `20`이면 `01 / 20`.
@@ -116,12 +116,12 @@
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.banner.BannerCounterFormatterTest"`
- 기대: 구현 전 실패, 구현 후 성공.
- [ ] **Task 2.5: `BannerCounterFormatter` 구현**
- [x] **Task 2.5: `BannerCounterFormatter` 구현**
- 생성 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerCounterFormatter.kt`
- 요구사항: 현재 index는 0-based 입력을 받고 표시값은 1-based 두 자리 문자열로 변환한다.
- 검증: `BannerCounterFormatterTest`가 통과한다.
- [ ] **Task 2.6: `BannerStateTest` 작성**
- [x] **Task 2.6: `BannerStateTest` 작성**
- 생성 파일: `app/src/test/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerStateTest.kt`
- 테스트 항목:
- count 0은 `Hidden` 모드다.
@@ -133,7 +133,7 @@
- 실행: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.banner.BannerStateTest"`
- 기대: 구현 전 실패, 구현 후 성공.
- [ ] **Task 2.7: `BannerState` 구현**
- [x] **Task 2.7: `BannerState` 구현**
- 생성 파일: `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/banner/BannerState.kt`
- 요구사항: 표시 모드, 현재 index 보정, next/previous 계산을 Android view 의존성 없이 구현한다.
- 검증: `BannerStateTest`가 통과한다.
@@ -328,3 +328,9 @@
- 2026-05-27 Phase 1 패턴 확인: `AudioContentCardView``@JvmOverloads` custom view, `thumbnailView(): ImageView` 노출, `radius_14` outline clipping 패턴을 확인했다. `FeedAdapter``RecyclerView.Adapter`, click callback, image binding callback 패턴과 `FeedViewTest`의 Robolectric XML inflate test 패턴을 확인했다.
- 2026-05-27 Phase 1 리소스/의존성 확인: `colors.xml``white`, `gray_400`, `dimens.xml``spacing_8`, `spacing_14`, `spacing_20`, `radius_14`, `typography.xml``Typography.Body5` medium 14sp 토큰이 있음을 확인했다. `attrs.xml`은 현재 없어 Phase 3에서 생성 대상이다.
- 2026-05-27 Phase 1 구현 경계 확정: `app/build.gradle``androidx.recyclerview:recyclerview:1.4.0`, JUnit4, Robolectric 의존성이 이미 있으므로 신규 pager 의존성은 추가하지 않는다. 기존 `com.github.zhpanvip:bannerviewpager:3.5.7` 의존성은 존재하지만 이번 컴포넌트는 PRD/계획대로 래핑하거나 확장하지 않는다.
- 2026-05-27 Phase 2 진행: `BannerItem`, `BannerLayoutCalculator`, `BannerCounterFormatter`, `BannerState` 순수 Kotlin contract 파일과 `BannerLayoutCalculatorTest`, `BannerCounterFormatterTest`, `BannerStateTest` 단위 테스트 파일이 존재함을 확인했다.
- 2026-05-27 Phase 2 검증 준비: 순수 Kotlin contract 테스트는 `BannerLayoutCalculatorTest`, `BannerCounterFormatterTest`, `BannerStateTest` 범위로 실행했다.
- 2026-05-27 Phase 2 검증 완료: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.banner.BannerLayoutCalculatorTest" --tests "kr.co.vividnext.sodalive.v2.widget.banner.BannerCounterFormatterTest" --tests "kr.co.vividnext.sodalive.v2.widget.banner.BannerStateTest"` 실행 결과 `BUILD SUCCESSFUL`을 확인했다.
- 2026-05-27 RED: `BannerLayoutCalculatorTest`, `BannerCounterFormatterTest`, `BannerStateTest`는 최초 실행 시 `compileDebugUnitTestKotlin`에서 `BannerLayoutCalculator`, `BannerCounterFormatter`, `BannerState`, `BannerDisplayMode` 미해결 참조로 실패했다.
- 2026-05-27 GREEN: 순수 Kotlin contract 구현 후 대상 순수 테스트가 통과했다.
- 2026-05-27 LSP 진단: `kotlin-lsp`가 설치되어 있지 않아 Phase 2 Kotlin 파일의 LSP diagnostics는 사용할 수 없었다.