import 'package:dsh_workbench/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); const channel = MethodChannel('dsh.workbench/gecko/42'); final calls = []; var canGoBack = true; final systemCalls = []; setUp(() { calls.clear(); systemCalls.clear(); canGoBack = true; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (call) async { calls.add(call.method); return call.method == 'goBack' ? canGoBack : null; }); TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(SystemChannels.platform, (call) async { systemCalls.add(call.method); return null; }); }); tearDown(() { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, null); TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(SystemChannels.platform, null); }); Future emit(String method, [Object? value]) async { await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .handlePlatformMessage( channel.name, const StandardMethodCodec().encodeMethodCall( MethodCall(method, value), ), (_) {}, ); } testWidgets('返回键优先回退 Gecko 历史,之后退出应用', (tester) async { await tester.pumpWidget(const DshApp()); tester.widget(find.byType(AndroidView)).onPlatformViewCreated!( 42, ); await tester.pump(); final pop = tester.widget( find.byWidgetPredicate((w) => w is PopScope), ); pop.onPopInvokedWithResult!(false, null); await tester.pump(); expect(calls.last, 'goBack'); expect(systemCalls, isNot(contains('SystemNavigator.pop'))); canGoBack = false; pop.onPopInvokedWithResult!(false, null); await tester.pump(); expect(systemCalls, contains('SystemNavigator.pop')); await tester.pumpWidget(const SizedBox()); }); testWidgets('Gecko 页面事件、错误及重试通过独立通道连接', (tester) async { await tester.pumpWidget(const DshApp()); final view = tester.widget(find.byType(AndroidView)); expect(view.viewType, 'dsh.workbench/gecko'); view.onPlatformViewCreated!(42); await tester.pump(); expect(calls, ['load']); expect(find.text('正在加载…'), findsOneWidget); await emit('onPageFinished'); await tester.pump(); expect(find.text('正在加载…'), findsNothing); await emit('onLoadError', '连接已断开'); await tester.pump(); expect(find.text('连接已断开'), findsOneWidget); await tester.tap(find.text('重试')); await tester.pump(); expect(calls.last, 'reload'); expect(find.text('正在加载…'), findsOneWidget); await emit('onPageStarted'); await emit('onPageFinished'); await emit('onDownloadError', '空间不足'); await tester.pump(); expect(find.text('下载失败:空间不足'), findsOneWidget); await tester.pumpWidget(const SizedBox()); await emit('onPageStarted'); expect(tester.takeException(), isNull); }); }