import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patbond_flutter/core/theme/app_theme.dart'; import 'package:patbond_flutter/core/widgets/pet_avatar.dart'; void main() { Future pump(WidgetTester tester, Widget child) { return tester.pumpWidget( MaterialApp( home: Scaffold(body: Center(child: child)), ), ); } testWidgets('四档尺寸与规格一致(96/64/44/32)', (tester) async { expect(PetAvatarSize.xl.dimension, 96); expect(PetAvatarSize.lg.dimension, 64); expect(PetAvatarSize.md.dimension, 44); expect(PetAvatarSize.sm.dimension, 32); await pump(tester, const PetAvatar(size: PetAvatarSize.xl)); final size = tester.getSize(find.byType(PetAvatar)); expect(size.width, 96); expect(size.height, 96); }); testWidgets('无 url 渲染本地占位形态(ADR-010:pets 图标)', (tester) async { await pump(tester, const PetAvatar(size: PetAvatarSize.lg)); final icon = tester.widget(find.byIcon(Icons.pets)); expect(icon.color, AppColors.muted); expect(find.byType(Image), findsNothing); }); testWidgets('xl 档编辑徽标为 primaryStrong 底白图标(无障碍修订)', (tester) async { await pump( tester, const PetAvatar(size: PetAvatarSize.xl, showEditBadge: true), ); final badgeIcon = tester.widget(find.byIcon(Icons.edit)); expect(badgeIcon.color, Colors.white); final badge = tester.widget( find.ancestor( of: find.byIcon(Icons.edit), matching: find.byType(Container), ), ); final decoration = badge.decoration as BoxDecoration; expect(decoration.color, AppColors.primaryStrong); }); testWidgets('sm/md 档不渲染编辑徽标', (tester) async { await pump( tester, const PetAvatar(size: PetAvatarSize.sm, showEditBadge: true), ); expect(find.byIcon(Icons.edit), findsNothing); }); testWidgets('onTap 生效且禁用态不响应', (tester) async { var taps = 0; await pump(tester, PetAvatar(size: PetAvatarSize.lg, onTap: () => taps++)); await tester.tap(find.byType(PetAvatar)); expect(taps, 1); await pump( tester, PetAvatar(size: PetAvatarSize.lg, enabled: false, onTap: () => taps++), ); await tester.tap(find.byType(PetAvatar)); expect(taps, 1); }); }