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(find.byType(Transform)) .any((t) => t.transform.entry(0, 0) < 0); Future _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 _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 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(); 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(); 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(); 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'); }); }