import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/core/picked_list.dart'; import 'package:jj_mkvmaker/ui/jj_chip.dart'; /// W 공용 위젯 약속 (JjChip · withPicked): 아이콘 칩은 고르면 그 자리에 ✓ 만 (그림 위에 체크가 겹치지 않음 - 62ba78d) · /// 아이콘 없는 칩은 Material 처음 꼴 · multi 는 켜고 끄기. 위젯 하나에 대해 한 번만 둔다 (설계 7-2) void main() { Future show(WidgetTester t, Widget chip) => t.pumpWidget(MaterialApp(home: Scaffold(body: Center(child: chip)))); testWidgets('아이콘 칩: 고르지 않으면 그림, 고르면 그 자리에 ✓ 만 (Material 체크 표는 끔)', (t) async { await show(t, JjChip(label: '세로 9:16', icon: Icons.crop_portrait, selected: false, onSelected: (_) {})); expect(find.byIcon(Icons.crop_portrait), findsOneWidget); expect(t.widget(find.byType(ChoiceChip)).showCheckmark, isFalse); await show(t, JjChip(label: '세로 9:16', icon: Icons.crop_portrait, selected: true, onSelected: (_) {})); expect(find.byIcon(Icons.crop_portrait), findsNothing); expect(find.byIcon(Icons.check), findsOneWidget); }); testWidgets('아이콘 없는 칩: Material 처음 꼴 (체크 표 켬) · 하나 고르기는 ChoiceChip, 여럿은 FilterChip', (t) async { await show(t, JjChip(label: '큰 폴더', selected: true, onSelected: (_) {})); expect(t.widget(find.byType(ChoiceChip)).showCheckmark, isTrue); bool? got; await show(t, JjChip(multi: true, label: 'mp4', selected: false, onSelected: (v) => got = v)); expect(find.byType(FilterChip), findsOneWidget); await t.tap(find.text('mp4')); expect(got, isTrue); }); testWidgets('누름 알림이 없으면 누를 수 없음', (t) async { await show(t, const JjChip(label: '채우기', selected: false, onSelected: null)); expect(t.widget(find.byType(ChoiceChip)).onSelected, isNull); }); test('withPicked: 켜면 끝에 하나 (이미 있으면 끝으로), 끄면 빼기, 원래 목록은 그대로', () { final list = ['jpg', 'png']; expect(withPicked(list, 'gif', true), ['jpg', 'png', 'gif']); expect(withPicked(list, 'jpg', true), ['png', 'jpg']); expect(withPicked(list, 'jpg', false), ['png']); expect(withPicked(list, 'bmp', false), ['jpg', 'png']); expect(list, ['jpg', 'png']); }); }