109 lines
3.7 KiB
Dart
109 lines
3.7 KiB
Dart
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:forui/forui.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
import 'package:pj_supermarket_cloud/common/index.dart';
|
|
import 'package:pj_supermarket_cloud/pages/terminal/setting/widgets/setting_face.dart';
|
|
|
|
/// 验证人脸管理两个文字 Tab 的点击、选中语义和最小触控尺寸。
|
|
void main() {
|
|
tearDown(Get.reset);
|
|
|
|
testWidgets('点击低质量人脸Tab后更新选中状态和语义', (tester) async {
|
|
await tester.binding.setSurfaceSize(const Size(1920, 1080));
|
|
addTearDown(() => tester.binding.setSurfaceSize(null));
|
|
var selected = FaceManageTab.all;
|
|
|
|
await tester.pumpWidget(
|
|
ScreenUtilInit(
|
|
designSize: const Size(1920, 1080),
|
|
builder: (_, __) => MaterialApp(
|
|
home: FTheme(
|
|
data: FThemes.zinc.light,
|
|
child: Scaffold(
|
|
body: StatefulBuilder(
|
|
builder: (context, setState) => FaceManageTabBar(
|
|
selectedTab: selected,
|
|
onChanged: (value) => setState(() => selected = value),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.bySemanticsLabel('人脸管理 Tab,已选中'), findsOneWidget);
|
|
expect(find.bySemanticsLabel('低质量人脸 Tab'), findsOneWidget);
|
|
final lowQualityTab = find.bySemanticsLabel('低质量人脸 Tab');
|
|
expect(tester.getSize(lowQualityTab).height, greaterThanOrEqualTo(48));
|
|
|
|
await tester.tap(find.text('低质量人脸'));
|
|
await tester.pump();
|
|
|
|
expect(find.bySemanticsLabel('低质量人脸 Tab,已选中'), findsOneWidget);
|
|
expect(find.bySemanticsLabel('人脸管理 Tab'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('大量低质量人脸卡片完整展示且不发生布局溢出', (tester) async {
|
|
await tester.binding.setSurfaceSize(const Size(1920, 1080));
|
|
addTearDown(() => tester.binding.setSurfaceSize(null));
|
|
Get.put(AppControl());
|
|
final controller = Get.put<FaceManageController>(
|
|
_TestFaceManageController(),
|
|
);
|
|
controller.selectedTab.value = FaceManageTab.lowQuality;
|
|
controller.libraryQualityThreshold.value = 0.60;
|
|
controller.faceList.assignAll(
|
|
List.generate(
|
|
15,
|
|
(index) => FaceEntity(
|
|
userId: 'user-$index',
|
|
sampleId: 'sample-$index',
|
|
userName: '测试人员$index',
|
|
imagePath: '',
|
|
qualityScore: 0.58,
|
|
qualityStatus: 'detected',
|
|
),
|
|
),
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
ScreenUtilInit(
|
|
designSize: const Size(1920, 1080),
|
|
builder: (_, __) => GetMaterialApp(
|
|
home: FTheme(
|
|
data: FThemes.zinc.light,
|
|
child: Scaffold(
|
|
body: Builder(builder: settingFace),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
await tester.pump();
|
|
|
|
expect(tester.takeException(), isNull);
|
|
expect(find.text('原因:评分低于 0.60'), findsWidgets);
|
|
expect(find.text('低质量 0.58'), findsWidgets);
|
|
final hitTarget = find.byKey(
|
|
const ValueKey('low-quality-delete-hit-sample-0'),
|
|
);
|
|
final visualButton = find.byKey(
|
|
const ValueKey('low-quality-delete-visual-sample-0'),
|
|
);
|
|
expect(tester.getSize(hitTarget).height, greaterThanOrEqualTo(48));
|
|
expect(tester.getSize(visualButton), const Size(116, 32));
|
|
});
|
|
}
|
|
|
|
/// 禁用异步初始化,供网格布局测试直接注入稳定的本地人脸数据。
|
|
class _TestFaceManageController extends FaceManageController {
|
|
/// 测试只验证 Widget 布局,不启动设置、数据库和原生质量进度监听。
|
|
@override
|
|
// ignore: must_call_super
|
|
void onInit() {}
|
|
}
|