fix: debounce resize and enlarge broadcast buffer for TUI resize stability
This commit is contained in:
91
desktop/integration_test/cd_resize_test.dart
Normal file
91
desktop/integration_test/cd_resize_test.dart
Normal file
@@ -0,0 +1,91 @@
|
||||
// 专项验证:cd 跨目录 + resize 后内容不重复。
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/foundation.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('cd 跨目录 + resize 内容完整性', (WidgetTester tester) async {
|
||||
await app.main();
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('CONNECT'));
|
||||
await tester.pump();
|
||||
|
||||
// 等待连接。
|
||||
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);
|
||||
|
||||
final engine = tester
|
||||
.state<TerminalViewState>(find.byType(TerminalView))
|
||||
.widget
|
||||
.engine;
|
||||
engine.initializeEmpty(24, 80);
|
||||
|
||||
void send(String s) =>
|
||||
engine.write(Uint8List.fromList(s.codeUnits));
|
||||
|
||||
String gridText() {
|
||||
final g = engine.gridForView;
|
||||
final sb = StringBuffer();
|
||||
for (var r = 0; r < g.rows; r++) {
|
||||
for (var c = 0; c < g.columns; c++) {
|
||||
final cp = g.codepointAt(r, c);
|
||||
sb.writeCharCode(cp == 0 ? 32 : cp);
|
||||
}
|
||||
sb.write('\n');
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
Future<bool> waitFor(bool Function(String) pred,
|
||||
{int secs = 6}) async {
|
||||
final end = DateTime.now().add(Duration(seconds: secs));
|
||||
while (DateTime.now().isBefore(end)) {
|
||||
await tester.pump(const Duration(milliseconds: 200));
|
||||
if (pred(gridText())) return true;
|
||||
}
|
||||
return pred(gridText());
|
||||
}
|
||||
|
||||
// ---- 1. cd 跨目录 ----
|
||||
final target = r'C:\Users\NianJiu\rttytest\subdir';
|
||||
send('cd $target\r\n');
|
||||
final cdOk = await waitFor((t) => t.contains('rttytest\\subdir'));
|
||||
debugPrint('cd 后 prompt 含目标目录: $cdOk');
|
||||
if (!cdOk) debugPrint('--- grid ---\n${gridText()}');
|
||||
expect(cdOk, isTrue, reason: 'cd 到绝对路径后 prompt 应显示新目录');
|
||||
|
||||
// ---- 2. resize 后内容不重复 ----
|
||||
// 记录 resize 前的非空行。
|
||||
send('dir\r\n');
|
||||
final beforeOk = await waitFor((t) => t.contains('subdir') && t.contains('dir'));
|
||||
debugPrint('dir 输出: $beforeOk');
|
||||
|
||||
// 连续 resize 数次(模拟窗口拖动),验证内容不产生重复/错乱。
|
||||
for (final (c, r) in [(100, 30), (120, 35), (90, 28), (110, 32)]) {
|
||||
engine.resize(columns: c, rows: r);
|
||||
await tester.pump(const Duration(milliseconds: 150));
|
||||
}
|
||||
engine.resize(columns: 100, rows: 30);
|
||||
await tester.pump(const Duration(milliseconds: 300));
|
||||
|
||||
// 重置引擎网格尺寸后,发送简单命令,验证仍能正常回显(无重复错乱)。
|
||||
send('echo RESIZE_OK\r\n');
|
||||
final ok = await waitFor((t) => t.contains('RESIZE_OK'));
|
||||
debugPrint('resize 后命令回显: $ok');
|
||||
expect(ok, isTrue, reason: 'resize 后命令应正常回显且无重复');
|
||||
|
||||
debugPrint('--- 最终 grid ---\n${gridText()}');
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user