From 3e4bacb7b939b1de98a2fb07115f638750637357 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 8 May 2026 00:05:39 +0300 Subject: Rewrite as Flutter app and rename to Quicklog Drop the Go/Fyne implementation and replace it with a native Flutter app targeting Android (primary) and Linux desktop (development). Rename quicklogger -> quicklog throughout (project, applicationId, MethodChannel, cache filename, AppBar title, Linux binary). Storage on Android moves to /Android/data/org.buetow.quicklog/files/ so MANAGE_EXTERNAL_STORAGE is no longer required. Share-intent receive is preserved via a Kotlin ShareActivity that writes shared text to the app cache, which Dart reads through a MethodChannel on app resume; MainActivity also accepts SEND directly so launchers that prefer the main target work. New since the Fyne version: an entry browser screen with read-only viewer and long-press delete. Cross-compiling to Android ARM from amd64 Linux no longer needs Docker / fyne-cross / NDK -- flutter build apk emits ARM binaries directly. Co-Authored-By: Claude Opus 4.7 --- test/home_screen_widget_test.dart | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 test/home_screen_widget_test.dart (limited to 'test/home_screen_widget_test.dart') diff --git a/test/home_screen_widget_test.dart b/test/home_screen_widget_test.dart new file mode 100644 index 0000000..c05d49b --- /dev/null +++ b/test/home_screen_widget_test.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:quicklog/screens/home_screen.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('character counter updates as user types', (tester) async { + SharedPreferences.setMockInitialValues({}); + await tester.pumpWidget(const MaterialApp(home: HomeScreen())); + await tester.pumpAndSettle(); + + expect(find.text('0 chars'), findsOneWidget); + + await tester.enterText(find.byType(TextField), 'hello'); + await tester.pump(); + expect(find.text('5 chars'), findsOneWidget); + }); + + testWidgets('Clear button empties the input', (tester) async { + SharedPreferences.setMockInitialValues({}); + await tester.pumpWidget(const MaterialApp(home: HomeScreen())); + await tester.pumpAndSettle(); + + await tester.enterText(find.byType(TextField), 'something'); + await tester.pump(); + expect(find.text('9 chars'), findsOneWidget); + + await tester.tap(find.text('Clear')); + await tester.pump(); + expect(find.text('0 chars'), findsOneWidget); + }); + + testWidgets('Log text button is rendered and enabled', (tester) async { + SharedPreferences.setMockInitialValues({}); + await tester.pumpWidget(const MaterialApp(home: HomeScreen())); + await tester.pumpAndSettle(); + + final btn = find.widgetWithText(FilledButton, 'Log text'); + expect(btn, findsOneWidget); + expect(tester.widget(btn).enabled, isTrue); + }); +} -- cgit v1.2.3