On some keymaps the R key resolves to a different logical key (observed on a Turkish remote-desktop setup: the R key arrives as logical T), so the Ctrl+R shortcut never fired even though the key events reached the app. The shortcut now matches PhysicalKeyboardKey.keyR as well; a regression test covers the wrong-layout case.
94 lines
3.3 KiB
Dart
94 lines
3.3 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:image/image.dart' as img;
|
|
import 'package:imajviewer/shortcuts/app_shortcuts.dart';
|
|
import 'package:imajviewer/widgets/image_canvas.dart';
|
|
|
|
/// Aynalama uygulandiginda render zincirinde negatif x olcekli bir Transform bulunur.
|
|
bool _mirrored(WidgetTester tester) => tester
|
|
.widgetList<Transform>(find.byType(Transform))
|
|
.any((t) => t.transform.entry(0, 0) < 0);
|
|
|
|
Future<void> _pressCtrlR(WidgetTester tester) async {
|
|
await tester.sendKeyDownEvent(LogicalKeyboardKey.controlLeft);
|
|
await tester.sendKeyDownEvent(LogicalKeyboardKey.keyR);
|
|
await tester.pump();
|
|
await tester.sendKeyUpEvent(LogicalKeyboardKey.keyR);
|
|
await tester.sendKeyUpEvent(LogicalKeyboardKey.controlLeft);
|
|
await tester.pump();
|
|
await tester.pump();
|
|
}
|
|
|
|
Future<void> _pressCtrlRWrongLayout(WidgetTester tester) async {
|
|
await tester.sendKeyDownEvent(LogicalKeyboardKey.controlLeft);
|
|
await tester.sendKeyDownEvent(LogicalKeyboardKey.keyT,
|
|
physicalKey: PhysicalKeyboardKey.keyR);
|
|
await tester.pump();
|
|
await tester.sendKeyUpEvent(LogicalKeyboardKey.keyT,
|
|
physicalKey: PhysicalKeyboardKey.keyR);
|
|
await tester.sendKeyUpEvent(LogicalKeyboardKey.controlLeft);
|
|
await tester.pump();
|
|
await tester.pump();
|
|
}
|
|
|
|
Widget _app(GlobalKey<ImageCanvasState> key, String path, double w, double h) {
|
|
return MaterialApp(
|
|
home: AppShortcuts(
|
|
onFlipH: () => key.currentState?.toggleFlipH(),
|
|
child: SizedBox(width: w, height: h, child: ImageCanvas(key: key, filePath: path)),
|
|
),
|
|
);
|
|
}
|
|
|
|
void main() {
|
|
late Directory tmp;
|
|
late String pngPath;
|
|
|
|
setUpAll(() {
|
|
tmp = Directory.systemTemp.createTempSync('flip_test');
|
|
pngPath = '${tmp.path}/a.png';
|
|
File(pngPath).writeAsBytesSync(img.encodePng(img.Image(width: 4, height: 2))!);
|
|
});
|
|
|
|
tearDownAll(() => tmp.deleteSync(recursive: true));
|
|
|
|
testWidgets('Ctrl+R yatay aynalamayi acar, tekrar basinca kapatir', (tester) async {
|
|
final key = GlobalKey<ImageCanvasState>();
|
|
await tester.pumpWidget(_app(key, pngPath, 400, 300));
|
|
await tester.pump();
|
|
|
|
expect(_mirrored(tester), isFalse, reason: 'baslangicta aynalama olmamali');
|
|
|
|
await _pressCtrlR(tester);
|
|
expect(_mirrored(tester), isTrue, reason: 'Ctrl+R sonrasi aynalama acik olmali');
|
|
|
|
await _pressCtrlR(tester);
|
|
expect(_mirrored(tester), isFalse, reason: 'ikinci Ctrl+R sonrasi eski haline donmeli');
|
|
});
|
|
|
|
testWidgets('Ctrl+R crop-save parametrelerine aynalamayi tasir', (tester) async {
|
|
final key = GlobalKey<ImageCanvasState>();
|
|
await tester.pumpWidget(_app(key, pngPath, 100, 50));
|
|
await tester.pump();
|
|
await _pressCtrlR(tester);
|
|
final vp = key.currentState!.cropViewParams(4, 2);
|
|
expect(vp?.flipH, isTrue, reason: 'crop-save aynalamayi almali');
|
|
});
|
|
|
|
testWidgets('fiziksel R tusu mantiksal T olarak gelse de Ctrl+R calisir', (tester) async {
|
|
final key = GlobalKey<ImageCanvasState>();
|
|
await tester.pumpWidget(_app(key, pngPath, 400, 300));
|
|
await tester.pump();
|
|
|
|
await _pressCtrlRWrongLayout(tester);
|
|
expect(_mirrored(tester), isTrue,
|
|
reason: 'klavye haritasi R tusunu T olarak cozse bile aynalama acilmali');
|
|
|
|
await _pressCtrlRWrongLayout(tester);
|
|
expect(_mirrored(tester), isFalse, reason: 'tekrar basinca geri donmeli');
|
|
});
|
|
}
|