Files
pangolin/client/test/flutter_test_config.dart
T
wangjia c4eb92fc2d feat(ds-flow): Phase 4.2/4.3/4.5 — CJK golden 字体 + timer 泄漏修复 + 基线重生成
4.5 harness/资源修复:UpdateNotifier 初始延迟由不可取消的 Future.delayed 改为
可取消 Timer,onDispose 一并取消——修 golden 整屏挂载时 pending-timer 泄漏
(生产也受益,provider dispose 不再悬挂 timer)。

4.2 CJK 测试字体:拷生产子集 NotoSansSC-Regular-subset.otf 进 test/fonts/ +
flutter_test_config 注册(family 'Noto Sans SC'),golden 中文真渲染不出豆腐块。

顺带修 tablet_pages_golden_test 既存编译错(6 语言改动遗留):localeProvider
override 返回值 AppLang → 改返回 LocaleNotifier 子类 _FixedLocale(钉死语言态)。

4.3 权威 Linux 容器(ghcr.io/cirruslabs/flutter)重生成全量 golden 基线:
34 tests All passed,32 张 PNG 更新(CJK 真字 + 暖阴影 + tablet zh/en 矩阵)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 01:27:09 +08:00

42 lines
1.9 KiB
Dart

// flutter_test_config.dart — 全测试前置(Flutter 自动应用于 test/ 下所有测试)。
//
// 启用 PangolinFonts.useBundled,并用 FontLoader 注册 test/fonts/ 的真实字体,
// 让 widget/golden 测试用真字体渲染、且不触发 google_fonts 运行时拉取(避免抛异常)。
import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pangolin_vpn/pangolin_theme.dart';
Future<void> testExecutable(FutureOr<void> Function() testMain) async {
TestWidgetsFlutterBinding.ensureInitialized();
PangolinFonts.useBundled = true;
await _load('Sora', const ['test/fonts/Sora-Regular.ttf', 'test/fonts/Sora-SemiBold.ttf', 'test/fonts/Sora-Bold.ttf']);
await _load('Manrope', const [
'test/fonts/Manrope-Regular.ttf',
'test/fonts/Manrope-Medium.ttf',
'test/fonts/Manrope-SemiBold.ttf',
'test/fonts/Manrope-Bold.ttf',
]);
await _load('JetBrains Mono', const ['test/fonts/JetBrainsMono-Regular.ttf']);
// Noto Sans SC 子集(= 生产打包同一 client/fonts/ 子集):golden 中文用真字体渲染,
// 不出豆腐块、与真机一致(family 须匹配 PangolinFonts.cjk = 'Noto Sans SC')。
await _load('Noto Sans SC', const ['test/fonts/NotoSansSC-Regular-subset.otf']);
// Lucide 图标字体(family 须带 package 前缀以匹配 PangolinIcons 的 fontPackage)。
await _load('packages/lucide_icons/Lucide', const ['packages/lucide_icons_patched/fonts/lucide.ttf']);
await testMain();
}
Future<void> _load(String family, List<String> paths) async {
final loader = FontLoader(family);
for (final p in paths) {
final file = File(p);
if (file.existsSync()) {
final bytes = file.readAsBytesSync();
loader.addFont(Future.value(ByteData.view(bytes.buffer, bytes.offsetInBytes, bytes.lengthInBytes)));
}
}
await loader.load();
}