코드 주석을 이 저장소 기준으로 정리
This commit is contained in:
@@ -359,7 +359,7 @@ void main() {
|
||||
expect(snapshot.joined, isTrue);
|
||||
});
|
||||
|
||||
// 원장 B-08 · B-17 — 성운은 랭킹 모집단이 아니다. 끼면 정식 행성 번호가 밀린다.
|
||||
// 정책 원장 B-08 · B-17 — 성운은 랭킹 모집단이 아니다. 끼면 정식 행성 번호가 밀린다.
|
||||
test('Stage0 성운은 순위를 매기기 전에 빠지고 맨 바깥 궤도 자리에 선다', () async {
|
||||
final db = await _seed();
|
||||
await db.doc('fandoms/neb').set({
|
||||
@@ -374,7 +374,7 @@ void main() {
|
||||
expect(snapshot.planets.firstWhere((p) => p.id == 'neb').rankLabel, '-');
|
||||
});
|
||||
|
||||
// 원장 B-17 — 최근 7일 유효 활동이 없는 정식 행성(서버 rankingEligible: false)도 순위 밖이다.
|
||||
// 정책 원장 B-17 — 최근 7일 유효 활동이 없는 정식 행성(서버 rankingEligible: false)도 순위 밖이다.
|
||||
test('최근 7일 활동이 없는 행성은 순위 없이 바깥 궤도에 서고 Ranking View 중심이 되지 않는다', () async {
|
||||
final db = await _seed();
|
||||
await db.doc('fandoms/idle').set({
|
||||
|
||||
@@ -34,7 +34,7 @@ import 'package:flutter_test/flutter_test.dart';
|
||||
const _width = 375.0;
|
||||
const _padding = FakeViewPadding(top: 48 * 2, bottom: 34 * 2);
|
||||
|
||||
/// Figma 사본의 표본 문구(BTS_Hong · hon******@gmail.com …). 숫자는 원장 체계(C-18)로 담는다.
|
||||
/// Figma 사본의 표본 문구(BTS_Hong · hon******@gmail.com …). 숫자는 정책 원장 체계(C-18)로 담는다.
|
||||
class _FigmaMy extends SampleMyRepository {
|
||||
@override
|
||||
Future<MyProfile> profile() async => const MyProfile(
|
||||
|
||||
@@ -217,7 +217,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
group('Music Shake 보상 표시 (원장 B-24)', () {
|
||||
group('Music Shake 보상 표시 (정책 원장 B-24)', () {
|
||||
test('퀘스트 rewardPop 이 없으면 서버와 같은 운영값 musicShake.pop 을 기본액으로 적는다', () {
|
||||
const policy = {'stepsPop': 50, 'musicShake': {'pop': 1}};
|
||||
// 걸음 보상(stepsPop)을 빌려 쓰지 않는다.
|
||||
@@ -228,7 +228,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
group('걸음 보상 표시 (원장 B-26)', () {
|
||||
group('걸음 보상 표시 (정책 원장 B-26)', () {
|
||||
const policy = {
|
||||
'stepTiers': [
|
||||
{'steps': 5000, 'pop': 6},
|
||||
|
||||
@@ -492,7 +492,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
group('구독 공유 — 팬덤당 하나 (검수 D5)', () {
|
||||
group('구독 공유 — 팬덤당 하나', () {
|
||||
test('여러 화면이 같은 원본 하나를 나눠 쓴다', () async {
|
||||
// 화면마다 snapshots() 를 열면 한 팬덤에 리스너가 화면 수만큼 붙는다.
|
||||
var opened = 0;
|
||||
@@ -592,7 +592,7 @@ void main() {
|
||||
expect(LiveEventKind.of('무엇인가'), LiveEventKind.notice);
|
||||
});
|
||||
|
||||
test('마감이 지난 이클립스는 만료로 읽는다 (검수 D3)', () {
|
||||
test('마감이 지난 이클립스는 만료로 읽는다', () {
|
||||
final now = DateTime(2026, 9, 14, 12);
|
||||
expect(
|
||||
eclipseFixture(endsAt: now.subtract(const Duration(seconds: 1)))
|
||||
|
||||
@@ -270,7 +270,7 @@ void main() {
|
||||
reason: '한 프레임에 순간이동하면 「행성 간 이동감」이 없다');
|
||||
});
|
||||
|
||||
// 리뷰 M3 — HUD 위/아래 뒤집힘이 비행 중에 일어나면 카드가 행성을 가로질러
|
||||
// HUD 위/아래 뒤집힘이 비행 중에 일어나면 카드가 행성을 가로질러
|
||||
// 순간 이동한다. 선택 시점에 정한 방향을 전환이 끝날 때까지 붙들어야 한다.
|
||||
//
|
||||
// 표본 6행성은 어느 것도 화면 위쪽 끝에서 출발하지 않아 뒤집힘이 나지 않는다.
|
||||
@@ -328,7 +328,7 @@ void main() {
|
||||
expect(find.textContaining(RegExp(r'상위 \d+%')), findsNothing);
|
||||
});
|
||||
|
||||
// 리뷰 M2 — 행성이 뷰포트 밖이면 HUD 를 아예 그리지 않는다. 카드만 가장자리에
|
||||
// 행성이 뷰포트 밖이면 HUD 를 아예 그리지 않는다. 카드만 가장자리에
|
||||
// clamp 해 두면 어느 행성을 가리키는지 알 수 없고 연결선은 화면 밖에 그려진다.
|
||||
// 고른 행성은 카메라가 따라가므로(10/5) 확대·초점 이동으로도 화면 밖으로 밀리지 않는다.
|
||||
testWidgets('확대해도 고른 행성은 가운데에 남고 HUD 도 남는다', (tester) async {
|
||||
|
||||
@@ -169,7 +169,7 @@ void main() {
|
||||
eclipse: NoEclipseRepository(),
|
||||
));
|
||||
expect(find.text('TOTAL FPI : 284,310'), findsOneWidget);
|
||||
// 원장 B-15 검증 기준 — 화면에 마지막 갱신 시각 노출(서버 시각이 없으면 --:--).
|
||||
// 정책 원장 B-15 검증 기준 — 화면에 마지막 갱신 시각 노출(서버 시각이 없으면 --:--).
|
||||
expect(find.text('마지막 갱신 --:--'), findsOneWidget);
|
||||
expect(find.textContaining('30초'), findsNothing);
|
||||
// 개설자 이름은 서버에 없으면 그리지 않는다 — 시안 표본 이름을 박지 않는다.
|
||||
@@ -226,7 +226,7 @@ void main() {
|
||||
|
||||
testWidgets('이클립스가 발동 중이면 침식·방어 진행을 띄운다', (tester) async {
|
||||
// 스펙 B — 「집계 문서를 갤럭시·행성 상세 HUD 에서 실시간으로 표시한다」.
|
||||
// 침식은 TOTAL FPI 를 깎는 경로이므로(원장 B-55) 그 카드 위에 온다.
|
||||
// 침식은 TOTAL FPI 를 깎는 경로이므로(정책 원장 B-55) 그 카드 위에 온다.
|
||||
await _pumpTall(tester, PlanetDetailScreen(
|
||||
repository: const SamplePlanetRepository(),
|
||||
eclipse: SampleEclipseRepository(),
|
||||
|
||||
@@ -310,7 +310,7 @@ void main() {
|
||||
await tester.tap(find.widgetWithText(FilledButton, '보상받기'));
|
||||
await tester.pumpAndSettle();
|
||||
// 별첨 B B-28 — 배수형 철회. 추가분은 고정형 운영값(C-02 초기 10 기여 POP).
|
||||
// 원장 C-116 — 「+N 기여 POP」 표기.
|
||||
// 정책 원장 C-116 — 「+N 기여 POP」 표기.
|
||||
expect(find.text('+10 기여 POP'), findsOneWidget);
|
||||
expect(find.textContaining('배'), findsNothing);
|
||||
// 별첨1 ⑥ No-Force — 보지 않아도 기본 보상을 받는다.
|
||||
@@ -580,7 +580,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
group('일시 정지 · 이어하기 · 목록 보상받기 (원장 C-83 · 명세 518:88405)', () {
|
||||
group('일시 정지 · 이어하기 · 목록 보상받기 (정책 원장 C-83 · 명세 518:88405)', () {
|
||||
testWidgets('목록 「보상받기」는 상세를 거쳐 바로 수령 흐름(보상 안내 모달)을 연다', (tester) async {
|
||||
await pumpWide(tester, const QuestListScreen(repository: _sample));
|
||||
await tester.pump();
|
||||
|
||||
@@ -460,7 +460,7 @@ void main() {
|
||||
await tester.enterText(
|
||||
find.widgetWithText(TextField, '캠페인 설명을 작성해주세요.'), '스태프 응원',
|
||||
);
|
||||
// 원장 B-32 · B-59 — 목표는 입력이 아니라 상품 선택. C-14 — 권장 기간 자동 입력.
|
||||
// 정책 원장 B-32 · B-59 — 목표는 입력이 아니라 상품 선택. C-14 — 권장 기간 자동 입력.
|
||||
expect(find.widgetWithText(TextField, '목표 POP'), findsNothing);
|
||||
await tester.tap(find.text('커피차 서포트'));
|
||||
await tester.pump();
|
||||
|
||||
@@ -52,7 +52,7 @@ void main() {
|
||||
expect(clock.velocity, closeTo(GalaxyMotion.idleSpin, 1e-6));
|
||||
});
|
||||
|
||||
// 리뷰 H1 — onInteractionUpdate 가 focalPointDelta.dx 를 무조건 넘기면
|
||||
// onInteractionUpdate 가 focalPointDelta.dx 를 무조건 넘기면
|
||||
// 세로 드래그·핀치 줌이 각속도를 덮어써 궤도가 선다.
|
||||
test('세로 드래그·핀치 줌은 각속도를 바꾸지 않는다', () {
|
||||
final dragged = GalaxyClock();
|
||||
@@ -108,7 +108,7 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
// 리뷰 H2 — 기본 궤도 속도가 프로토타입의 1/4~1/5 이었다.
|
||||
// 기본 궤도 속도가 프로토타입의 1/4~1/5 이었다.
|
||||
// 프로토타입은 `time = Date.now()*0.0005` 에 `speed = 0.8/(rank+1)` 를 곱한다.
|
||||
test('기본 궤도 각속도가 프로토타입과 같다 — 0.4/(rank+1) rad/s', () {
|
||||
for (final rank in [2, 3, 6, 12]) {
|
||||
@@ -136,7 +136,7 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
// 원장 B-21 — 기본은 내 Primary 중심, Ranking View 는 FPI 상위 중심.
|
||||
// 정책 원장 B-21 — 기본은 내 Primary 중심, Ranking View 는 FPI 상위 중심.
|
||||
test('Ranking View 는 FPI 1위(성운 제외)를 가운데 두고 내 행성은 순위 궤도를 돈다', () {
|
||||
const snapshot = GalaxySnapshot(
|
||||
myPop: 0,
|
||||
@@ -173,7 +173,7 @@ void main() {
|
||||
expect(maxDy, lessThan(maxDx));
|
||||
});
|
||||
|
||||
// 리뷰 M4 — extent=900 에 간격 52 를 그대로 쓰면 8위부터 궤도가 맵 반쪽을
|
||||
// extent=900 에 간격 52 를 그대로 쓰면 8위부터 궤도가 맵 반쪽을
|
||||
// 넘어 Stack 에 잘리고, 반지름은 19위부터 음수가 된다.
|
||||
test('행성이 많아도 전부 맵 안에 남는다 — 6·30·100개', () {
|
||||
for (final n in [6, 30, 100]) {
|
||||
|
||||
@@ -42,7 +42,7 @@ Widget _app(LocaleController c, Widget home) => ListenableBuilder(
|
||||
void main() {
|
||||
setUp(() => SharedPreferences.setMockInitialValues({}));
|
||||
|
||||
group('지원 언어 (원장 B-76)', () {
|
||||
group('지원 언어 (정책 원장 B-76)', () {
|
||||
test('supportedLocales 가 정확히 ko · en · ja · zh-CN · es 다', () {
|
||||
expect(appLocales.map(localeTag).toList(), [
|
||||
'ko',
|
||||
|
||||
@@ -14,7 +14,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:in_app_purchase/in_app_purchase.dart';
|
||||
|
||||
/// 결제 경계 — 별첨 1 ⑥ 「영수증 서버검증 통과」 · 원장 B-02 · B-72.
|
||||
/// 결제 경계 — 별첨 1 ⑥ 「영수증 서버검증 통과」 · 정책 원장 B-02 · B-72.
|
||||
///
|
||||
/// 스토어와 서버는 대역이다. 보는 것은 두 가지다 — **서버가 받아들인 뒤에만 스토어에
|
||||
/// 구매 완료를 알리는가**, 그리고 MY 결제 내역이 서버 문서를 화면 상태로 옳게 옮기는가.
|
||||
|
||||
@@ -14,7 +14,7 @@ import 'package:flutter_test/flutter_test.dart';
|
||||
import 'eclipse_stubs.dart';
|
||||
|
||||
/// UX·FX v1.5 2차 약속분(10/8) — 진척현황 부록 B-3 1-2 · 4-2 · 4-3(퀘스트 완료 → 성공 햅틱 · 행성 반응),
|
||||
/// 1-4 · 8-6(Push ↔ 라이브 띠 중복 제어 · 알림 위계 · Push 탭 실제 화면 이동), 원장 C-78 단계 배정.
|
||||
/// 1-4 · 8-6(Push ↔ 라이브 띠 중복 제어 · 알림 위계 · Push 탭 실제 화면 이동), 정책 원장 C-78 단계 배정.
|
||||
void main() {
|
||||
group('C-78 단계 배정 — Push · 알림함 같은 표', () {
|
||||
test('위기 · 공동행동 · 성취 · 결과 · 그 밖', () {
|
||||
|
||||
@@ -630,7 +630,7 @@ service cloud.firestore {
|
||||
});
|
||||
});
|
||||
|
||||
group('진행 상태 저장 · 일시 정지 · 최신순 (원장 C-83 · 명세 518:88395)', () {
|
||||
group('진행 상태 저장 · 일시 정지 · 최신순 (정책 원장 C-83 · 명세 518:88395)', () {
|
||||
Future<FakeFirebaseFirestore> shakeSeed() async {
|
||||
final db = await _seed();
|
||||
await db.doc('quests/shake').set({
|
||||
|
||||
@@ -15,7 +15,7 @@ import 'package:fancake/core/theme/app_theme.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
/// 참여형 번역 — FR-I18N-02 · 원장 B-63 · E-TRN-01.
|
||||
/// 참여형 번역 — FR-I18N-02 · 정책 원장 B-63 · E-TRN-01.
|
||||
/// 화면에서는 댓글 영역의 「번역 댓글」이다(Figma `201:50554` · `540:19136`).
|
||||
void main() {
|
||||
const target = 'questions/q1';
|
||||
|
||||
Reference in New Issue
Block a user