2026-04-02 18:31:21 +00:00
|
|
|
import 'dart:async';
|
2026-04-06 14:43:56 +00:00
|
|
|
import 'dart:math';
|
2026-04-02 18:31:21 +00:00
|
|
|
|
|
|
|
|
import 'package:d4rt_formulas/defaults/default_corpus.dart';
|
2026-04-06 14:43:56 +00:00
|
|
|
import 'package:flutter/services.dart';
|
2026-04-02 18:31:21 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
|
import 'package:d4rt_formulas/main.dart';
|
|
|
|
|
import 'package:d4rt_formulas/corpus.dart';
|
|
|
|
|
import 'package:d4rt_formulas/formula_models.dart';
|
|
|
|
|
import 'package:d4rt_formulas/database/database_service.dart';
|
|
|
|
|
import 'package:d4rt_formulas/service_locator.dart';
|
|
|
|
|
import 'package:get_it/get_it.dart';
|
2026-04-06 14:43:56 +00:00
|
|
|
import 'package:d4rt_formulas/set_utils.dart';
|
|
|
|
|
import 'package:d4rt_formulas/database/formulas_database.dart';
|
|
|
|
|
import 'package:d4rt_formulas/ai/import_from_text_screen.dart';
|
|
|
|
|
import 'package:d4rt_formulas/ai/import_preview_screen.dart';
|
2026-04-02 18:31:21 +00:00
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
2026-04-06 14:43:56 +00:00
|
|
|
setUpAll(() {
|
|
|
|
|
// Ensure the database is initialized once for all tests
|
|
|
|
|
setupLocator();
|
|
|
|
|
});
|
|
|
|
|
|
2026-04-02 18:31:21 +00:00
|
|
|
testWidgets('selects first formula and opens editor from AppBar', (WidgetTester tester) async {
|
2026-04-06 14:43:56 +00:00
|
|
|
// Reset GetIt to allow fresh corpus registration
|
|
|
|
|
if (GetIt.instance.isRegistered<Corpus>()) {
|
|
|
|
|
GetIt.instance.unregister<Corpus>();
|
|
|
|
|
}
|
|
|
|
|
GetIt.instance.unregister<FormulasDatabase>();
|
|
|
|
|
setupLocator();
|
|
|
|
|
|
2026-04-02 18:31:21 +00:00
|
|
|
// Build the app
|
|
|
|
|
var corpus = await createDefaultCorpus();
|
|
|
|
|
var corpusCompleter = Completer<Corpus>();
|
|
|
|
|
corpusCompleter.complete(corpus);
|
|
|
|
|
var app = MyApp(corpusCompleter.future);
|
|
|
|
|
await tester.pumpWidget(app);
|
|
|
|
|
await tester.pump();
|
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 10));
|
|
|
|
|
|
|
|
|
|
// Verify FormulaList is shown
|
|
|
|
|
expect(find.byType(ListView), findsOneWidget);
|
|
|
|
|
|
|
|
|
|
// Find and tap the first formula in the list
|
|
|
|
|
final formulaTile = find.byType(ListTile).first;
|
|
|
|
|
expect(formulaTile, findsOneWidget);
|
|
|
|
|
await tester.tap(formulaTile);
|
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Find and tap the edit icon in the AppBar
|
|
|
|
|
final editIcon = find.byIcon(Icons.edit);
|
|
|
|
|
expect(editIcon, findsOneWidget);
|
|
|
|
|
await tester.tap(editIcon);
|
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
|
|
|
|
|
|
// Verify FormulaEditor is shown
|
|
|
|
|
expect(find.text('Edit Formula'), findsOneWidget);
|
|
|
|
|
});
|
2026-04-06 14:43:56 +00:00
|
|
|
|
|
|
|
|
testWidgets('share first formula to clipboard and import it', (WidgetTester tester) async {
|
|
|
|
|
tester.view.physicalSize = const Size(1200, 800);
|
|
|
|
|
tester.view.devicePixelRatio = 1.0;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Reset GetIt to allow fresh corpus registration
|
|
|
|
|
if (GetIt.instance.isRegistered<Corpus>()) {
|
|
|
|
|
GetIt.instance.unregister<Corpus>();
|
|
|
|
|
}
|
|
|
|
|
GetIt.instance.unregister<FormulasDatabase>();
|
|
|
|
|
setupLocator();
|
|
|
|
|
|
|
|
|
|
print('DEBUG: Building app...');
|
|
|
|
|
var corpus = await createDefaultCorpus();
|
|
|
|
|
var corpusCompleter = Completer<Corpus>();
|
|
|
|
|
corpusCompleter.complete(corpus);
|
|
|
|
|
var app = MyApp(corpusCompleter.future);
|
|
|
|
|
await tester.pumpWidget(app);
|
|
|
|
|
await tester.pump();
|
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 10));
|
|
|
|
|
print('DEBUG: App built and settled');
|
|
|
|
|
|
|
|
|
|
final firstFormulaTile = find.byType(ListTile).first;
|
|
|
|
|
expect(firstFormulaTile, findsOneWidget);
|
|
|
|
|
|
2026-05-11 09:43:18 +00:00
|
|
|
await tester.tap(firstFormulaTile);
|
|
|
|
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
2026-04-06 14:43:56 +00:00
|
|
|
await tester.pump(const Duration(seconds: 1));
|
|
|
|
|
|
2026-05-11 09:43:18 +00:00
|
|
|
final shareButton = find.byIcon(Icons.share);
|
2026-04-06 14:43:56 +00:00
|
|
|
|
|
|
|
|
await tester.tap(shareButton);
|
|
|
|
|
await tester.pumpAndSettle();
|
2026-05-11 09:43:18 +00:00
|
|
|
print('DEBUG: Tapped share button');
|
2026-04-06 14:43:56 +00:00
|
|
|
|
|
|
|
|
await tester.tap(find.text('Copy to clipboard'));
|
|
|
|
|
await tester.pump(const Duration(seconds: 1));
|
2026-05-11 09:43:18 +00:00
|
|
|
print('DEBUG: Tapped copy to clipboard');
|
2026-04-06 14:43:56 +00:00
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
tester.view.resetPhysicalSize();
|
|
|
|
|
}
|
|
|
|
|
});
|
2026-04-02 18:31:21 +00:00
|
|
|
}
|