generated from ttipo/project-base
feat(flutter): 시안 기반 테마·폰트·아이콘과 공통 위젯 추가
Claude Design 시안(rup)을 옮기기 위한 공통 기반. - 색·크기·글꼴 토큰을 시안 styles.css 값 그대로 상수화하고 테마에 연결 - SUITE·충북대체·어비꿍꿍체 번들 (웹폰트만 배포되는 서체는 TTF 로 변환, 출처는 fonts/README.md) - 시안 아이콘 56종·전용 글리프를 Dart 로 옮긴 RupIcon - 눌림 축소(Pressable)·pill 버튼·시안 좌표 배치(DesignArtBox)·그림자 이미지 위젯 - CSS 키프레임처럼 구간마다 곡선을 적용하는 보간 유틸과 테스트 - go_router · flutter_svg · shared_preferences 의존성 추가 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
import 'package:flutter/animation.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:tma_app/core/utils/keyframes.dart';
|
||||
|
||||
void main() {
|
||||
group('segmentProgress', () {
|
||||
test('시작 전은 0, 끝난 뒤는 1 로 고정된다 (fill-mode: both)', () {
|
||||
expect(segmentProgress(0.1, 0.5, 1), 0);
|
||||
expect(segmentProgress(2, 0.5, 1), 1);
|
||||
});
|
||||
|
||||
test('구간 중간이면 경과 비율을 돌려준다', () {
|
||||
expect(segmentProgress(1, 0.5, 1), closeTo(0.5, 1e-9));
|
||||
});
|
||||
});
|
||||
|
||||
group('keyframeValue', () {
|
||||
const stops = [0.0, 0.5, 1.0];
|
||||
const values = [0.0, 10.0, 4.0];
|
||||
|
||||
test('키프레임 위치에서는 그 값을 그대로 돌려준다', () {
|
||||
expect(keyframeValue(0, stops, values), 0);
|
||||
expect(keyframeValue(0.5, stops, values), 10);
|
||||
expect(keyframeValue(1, stops, values), 4);
|
||||
});
|
||||
|
||||
test('구간 안에서는 선형 보간한다', () {
|
||||
expect(keyframeValue(0.25, stops, values), closeTo(5, 1e-9));
|
||||
expect(keyframeValue(0.75, stops, values), closeTo(7, 1e-9));
|
||||
});
|
||||
|
||||
test('곡선은 전체가 아니라 구간마다 적용된다', () {
|
||||
// 두 번째 구간의 시작점에서는 곡선과 무관하게 구간 시작 값이어야 한다
|
||||
expect(keyframeValue(0.5, stops, values, curve: Curves.easeIn), 10);
|
||||
// 구간 절반 지점 = 해당 구간 local 0.5 에 곡선 적용
|
||||
final expected = 10 + (4 - 10) * Curves.easeIn.transform(0.5);
|
||||
expect(keyframeValue(0.75, stops, values, curve: Curves.easeIn), closeTo(expected, 1e-9));
|
||||
});
|
||||
|
||||
test('범위를 벗어나면 양 끝 값으로 고정된다', () {
|
||||
expect(keyframeValue(-1, stops, values), 0);
|
||||
expect(keyframeValue(2, stops, values), 4);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user