From 3f1053dec77914aba3bdea60e912276a4b42bc14 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Thu, 25 Jun 2026 07:01:19 +0800 Subject: [PATCH] =?UTF-8?q?test(client):=20KPI=20=E5=8D=A1=E4=B8=89?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=20golden=EF=BC=88design-distill=20=E9=98=B6?= =?UTF-8?q?=E6=AE=B54=20Flutter=20=E4=BE=A7=E9=A6=96=E4=B8=AA=E8=BF=98?= =?UTF-8?q?=E5=8E=9F=E9=97=B8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test/theme/kpi_card_golden_test.dart:4 张 KPI 卡 × A/B/C 三主题 golden, 产出 goldens/kpi_strip_{a,b,c}.png。验证 KpiCard 还原原型 .kpi 结构/色调 (icon 芯片 info/blue/warn/alert 分档着色、alert 值取 accent、软底随主题换)。 更新基准:flutter test --update-goldens test/theme/kpi_card_golden_test.dart Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX --- client/test/theme/goldens/kpi_strip_a.png | Bin 0 -> 10433 bytes client/test/theme/goldens/kpi_strip_b.png | Bin 0 -> 10613 bytes client/test/theme/goldens/kpi_strip_c.png | Bin 0 -> 10734 bytes client/test/theme/kpi_card_golden_test.dart | 79 ++++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 client/test/theme/goldens/kpi_strip_a.png create mode 100644 client/test/theme/goldens/kpi_strip_b.png create mode 100644 client/test/theme/goldens/kpi_strip_c.png create mode 100644 client/test/theme/kpi_card_golden_test.dart diff --git a/client/test/theme/goldens/kpi_strip_a.png b/client/test/theme/goldens/kpi_strip_a.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd47396c4be0a90d03296661ca544400a5e4314 GIT binary patch literal 10433 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
!uS^&BpsTf_n`GR`;_p9wrTT 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 literal 0 HcmV?d00001 diff --git a/client/test/theme/goldens/kpi_strip_c.png b/client/test/theme/goldens/kpi_strip_c.png new file mode 100644 index 0000000000000000000000000000000000000000..beddce9b5dcde7b7210612bd9c6be46cf8f333c0 GIT binary patch literal 10734 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 literal 0 HcmV?d00001 diff --git a/client/test/theme/kpi_card_golden_test.dart b/client/test/theme/kpi_card_golden_test.dart new file mode 100644 index 0000000..036f6cd --- /dev/null +++ b/client/test/theme/kpi_card_golden_test.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:jiu_client/core/theme/themes.dart'; +import 'package:jiu_client/core/theme/app_tokens.g.dart'; +import 'package:jiu_client/widgets/kpi_card.dart'; + +/// design-distill 阶段4(Flutter 侧):KPI 卡组件 golden。 +/// 渲染库存列表的 4 张 KPI 卡 × 三主题,产出 png 供与原型 `.kpi` 并排目检。 +/// 更新基准:flutter test --update-goldens test/theme/kpi_card_golden_test.dart +void main() { + const cardW = 300.0; + Widget strip() => Padding( + padding: const EdgeInsets.all(12), + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + SizedBox( + width: cardW, + child: KpiCard( + title: '商品总数', + value: '1284', + icon: Icons.inventory_2, + tone: KpiTone.info, + delta: '种 · 点击清筛选')), + SizedBox(width: 12), + SizedBox( + width: cardW, + child: KpiCard( + title: '在库数量', + value: '18920', + icon: Icons.warehouse_outlined, + tone: KpiTone.blue, + delta: '件')), + SizedBox(width: 12), + SizedBox( + width: cardW, + child: KpiCard( + title: '库存预警', + value: '17', + icon: Icons.warning_amber, + tone: KpiTone.warn, + delta: '需补货')), + SizedBox(width: 12), + SizedBox( + width: cardW, + child: KpiCard( + title: '缺货商品', + value: '6', + icon: Icons.remove_shopping_cart, + tone: KpiTone.alert)), + ], + ), + ); + + for (final theme in ['a', 'b', 'c']) { + testWidgets('KPI strip golden · theme $theme', (tester) async { + tester.view.physicalSize = const Size(2560, 380); + tester.view.devicePixelRatio = 2.0; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + + await tester.pumpWidget(MaterialApp( + debugShowCheckedModeBanner: false, + theme: buildTheme(theme), + home: Scaffold( + backgroundColor: appTokensOf(theme).bg, + body: Align(alignment: Alignment.topCenter, child: strip()), + ), + )); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(MaterialApp), + matchesGoldenFile('goldens/kpi_strip_$theme.png'), + ); + }); + } +}