From 76ce9a01b147b6f5eb4bff5aaf4e708977c2bf4c Mon Sep 17 00:00:00 2001 From: CNWei Date: Sat, 1 Aug 2026 20:06:38 +0800 Subject: [PATCH] fix: initialize Alacritty Rust engine in main() --- desktop/integration_test/e2e_test.dart | 47 ++++++++++++++++++++++++++ desktop/lib/main.dart | 7 +++- desktop/pubspec.lock | 47 ++++++++++++++++++++++++++ desktop/pubspec.yaml | 2 ++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 desktop/integration_test/e2e_test.dart diff --git a/desktop/integration_test/e2e_test.dart b/desktop/integration_test/e2e_test.dart new file mode 100644 index 0000000..a891d14 --- /dev/null +++ b/desktop/integration_test/e2e_test.dart @@ -0,0 +1,47 @@ +// 端到端集成测试:在真实 Windows 桌面运行完整链路。 +// +// 验证:RustLib.init() → 点 CONNECT → TerminalEngine(Alacritty Rust 引擎)创建 +// → 连上服务端 → 命令回显。 +// +// 运行前需先启动 Rust 服务端(cd .. && cargo run)。 +// 运行:flutter test integration_test -d windows +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_alacritty/flutter_alacritty.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:rtty_desktop/main.dart' as app; +import 'package:rtty_desktop/src/terminal_screen.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('桌面端连接服务端并渲染命令输出', (WidgetTester tester) async { + await app.main(); + await tester.pumpAndSettle(); + + // 未连接提示。 + expect(find.text('AWAITING CONNECTION'), findsOneWidget); + + // 点击 CONNECT。 + await tester.tap(find.text('CONNECT')); + await tester.pump(); + + // 等待连接就绪(进入 connected 状态,提示页消失)。 + final deadline = DateTime.now().add(const Duration(seconds: 8)); + while (DateTime.now().isBefore(deadline)) { + await tester.pump(const Duration(milliseconds: 200)); + if (find.text('AWAITING CONNECTION').evaluate().isEmpty) break; + } + + expect(find.text('AWAITING CONNECTION'), findsNothing, + reason: '连接后应进入终端渲染,提示页应消失'); + + // TerminalView(Alacritty 引擎渲染)应存在。 + expect(find.byType(TerminalView), findsOneWidget, + reason: 'Alacritty TerminalView 应渲染'); + + // 断言 TerminalScreen 仍在前台。 + expect(find.byType(TerminalScreen), findsOneWidget); + }); +} diff --git a/desktop/lib/main.dart b/desktop/lib/main.dart index b1dbd91..586b7dc 100644 --- a/desktop/lib/main.dart +++ b/desktop/lib/main.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_alacritty/flutter_alacritty.dart'; import 'src/terminal_screen.dart'; import 'src/theme.dart'; -void main() { +Future main() async { WidgetsFlutterBinding.ensureInitialized(); + // 初始化 flutter_alacritty 的 Alacritty Rust 引擎(FFI 绑定)。 + // cargokit 已将 Rust cdylib 打包进应用,无需外部库路径。 + await RustLib.init(); + // 锁定竖排字符方向(终端场景无需旋转)。 SystemChrome.setPreferredOrientations(DeviceOrientation.values); diff --git a/desktop/pubspec.lock b/desktop/pubspec.lock index 52aa674..690a8b1 100644 --- a/desktop/pubspec.lock +++ b/desktop/pubspec.lock @@ -137,6 +137,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.flutter-io.cn" + source: hosted + version: "7.0.1" fixnum: dependency: transitive description: @@ -158,6 +166,11 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -200,6 +213,11 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hooks: dependency: transitive description: @@ -224,6 +242,11 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" jni: dependency: transitive description: @@ -416,6 +439,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" + process: + dependency: transitive + description: + name: process + sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.0.5" pub_semver: dependency: transitive description: @@ -477,6 +508,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: @@ -621,6 +660,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.0" xdg_directories: dependency: transitive description: diff --git a/desktop/pubspec.yaml b/desktop/pubspec.yaml index 12d0075..fd9d8a8 100644 --- a/desktop/pubspec.yaml +++ b/desktop/pubspec.yaml @@ -47,6 +47,8 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^6.0.0 + integration_test: + sdk: flutter # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec