import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_application_1/enums.dart'; import 'package:flutter_application_1/pages/chart_page.dart'; import 'package:flutter_application_1/pages/milestone_page.dart'; import 'package:flutter_application_1/widgets/chart_widget.dart'; import 'package:flutter_application_1/widgets/error_widget.dart'; import 'package:flutter_application_1/widgets/input_widget.dart'; import 'package:flutter_application_1/widgets/interval_widget.dart'; import 'package:flutter_application_1/widgets/milestone_timeline_widget.dart'; import 'package:flutter_application_1/widgets/result_widget.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; void main() { group('InputWidget Tests', () { testWidgets('Displays label, tooltip, and input field', (WidgetTester tester) async { const label = 'Test Label'; const tooltipText = 'This is a tooltip'; const suffixText = 'suffix'; final controller = TextEditingController(); final focusNode = FocusNode(); await tester.pumpWidget( CupertinoApp( home: CupertinoPageScaffold( navigationBar: const CupertinoNavigationBar( middle: Text('Test InputWidget'), ), child: InputWidget( label: label, controller: controller, focusNode: focusNode, isValid: false, suffixText: suffixText, tooltipText: tooltipText, ), ), ), ); expect(find.text(label), findsOneWidget); expect(find.text(suffixText), findsOneWidget); expect(find.byType(CupertinoTextField), findsOneWidget); expect(find.byType(Tooltip), findsOneWidget); }); testWidgets('Displays validation icon correctly', (WidgetTester tester) async { final controller = TextEditingController(); final focusNode = FocusNode(); await tester.pumpWidget( CupertinoApp( home: InputWidget( label: 'Test Label', controller: controller, focusNode: focusNode, isValid: false, suffixText: 'suffix', tooltipText: 'This is a tooltip', ), ), ); expect(find.byIcon(CupertinoIcons.clear_circled_solid), findsOneWidget); expect(find.byIcon(CupertinoIcons.check_mark_circled_solid), findsNothing); await tester.pumpWidget( CupertinoApp( home: InputWidget( label: 'Test Label', controller: controller, focusNode: focusNode, isValid: true, suffixText: 'suffix', tooltipText: 'This is a tooltip', ), ), ); expect(find.byIcon(CupertinoIcons.check_mark_circled_solid), findsOneWidget); expect(find.byIcon(CupertinoIcons.clear_circled_solid), findsNothing); }); testWidgets('Text input updates controller', (WidgetTester tester) async { final controller = TextEditingController(); final focusNode = FocusNode(); await tester.pumpWidget( CupertinoApp( home: InputWidget( label: 'Test Label', controller: controller, focusNode: focusNode, isValid: false, suffixText: 'suffix', tooltipText: 'This is a tooltip', ), ), ); await tester.enterText(find.byType(CupertinoTextField), '12345'); expect(controller.text, '12345'); }); }); group('Interal Widget Tests', () { testWidgets('Initial state', (WidgetTester tester) async { const selectedInterval = 'jährlich'; await tester.pumpWidget( MaterialApp( home: Scaffold( body: IntervalWidget( selectedInterval: selectedInterval, onChanged: (newInterval) {}, ), ), ), ); expect(find.text('Ausschüttungsintervall'), findsOneWidget); expect(find.text(selectedInterval), findsOneWidget); expect(find.byIcon(Icons.keyboard_arrow_down), findsOneWidget); }); testWidgets('Tapping the button expands the dropdown', (WidgetTester tester) async { const selectedInterval = 'jährlich'; await tester.pumpWidget( MaterialApp( home: Scaffold( body: IntervalWidget( selectedInterval: selectedInterval, onChanged: (newInterval) { }, ), ), ), ); await tester.tap(find.byType(ElevatedButton)); await tester.pump(); expect(find.byType(ListTile), findsNWidgets(2)); expect(find.byIcon(CupertinoIcons.checkmark_alt), findsOneWidget); }); testWidgets('Selecting an interval updates the state', (WidgetTester tester) async { const selectedInterval = 'jährlich'; var currentInterval = selectedInterval; await tester.pumpWidget( MaterialApp( home: Scaffold( body: IntervalWidget( selectedInterval: selectedInterval, onChanged: (newInterval) { currentInterval = newInterval; }, ), ), ), ); await tester.tap(find.byType(ElevatedButton)); await tester.pump(); await tester.tap(find.text('monatlich')); await tester.pump(); expect(currentInterval, 'monatlich'); expect(find.byType(ListTile), findsNothing); expect(find.byIcon(Icons.keyboard_arrow_down), findsOneWidget); }); }); group('Chart Widget Tests', () { testWidgets('Displays chart correctly', (WidgetTester tester) async { final List lowerValues = [100, 200, 300, 400]; final List upperValues = [50, 150, 250, 350]; await tester.pumpWidget( MaterialApp( home: Scaffold( body: StackedColumnChart( lowerValues: lowerValues, upperValues: upperValues, ), ), ), ); expect(find.byType(SfCartesianChart), findsOneWidget); expect(find.text('Einzahlungen'), findsOneWidget); expect(find.text('Zinsen'), findsOneWidget); expect(find.byType(CategoryAxis), findsOneWidget); expect(find.byType(NumericAxis), findsOneWidget); expect(find.text('Einzahlungen'), findsOneWidget); expect(find.text('Zinsen'), findsOneWidget); await tester.pumpAndSettle(); }); }); group('Milestone Timeline Widget Tests', () { testWidgets('Milestone timeline displays correctly', (WidgetTester tester) async { final List> milestones = [ {'value': 100.0, 'emoji': '😊', 'text': 'First milestone'}, {'value': 200.0, 'emoji': '😃', 'text': 'Second milestone'}, {'value': 300.0, 'emoji': '😁', 'text': 'Third milestone'}, ]; const double totalInterest = 250.0; await tester.pumpWidget( CupertinoApp( home: Material( child: MilestoneTimeline( milestones: milestones, totalInterest: totalInterest, ), ), ), ); expect(find.text('First milestone'), findsOneWidget); expect(find.text('Second milestone'), findsOneWidget); expect(find.text('Third milestone'), findsOneWidget); expect(find.byIcon(CupertinoIcons.check_mark_circled_solid), findsNWidgets(2)); expect(find.byIcon(CupertinoIcons.circle_fill), findsOneWidget); }); }); group('Result Widget Tests', () { testWidgets('Displays result values correctly', (WidgetTester tester) async { const compoundInterest = '1000'; const investedMoney = '500'; const time = '5'; const monthlySavingsRate = '100'; const interestRate = '5'; const payoutInterval = PayoutInterval.monthly; final List investedMoneyList = [100, 200, 300, 400, 500]; final List compoundInterestList = [100, 200, 300, 400, 1000]; await tester.pumpWidget( MaterialApp( home: Material( child: ResultWidget( compoundInterest: compoundInterest, investedMoney: investedMoney, time: time, monthlySavingsRate: monthlySavingsRate, interestRate: interestRate, payoutInterval: payoutInterval, investedMoneyList: investedMoneyList, compoundInterestList: compoundInterestList, ), ), ), ); expect(find.text('Endkapital:'), findsOneWidget); expect(find.text('$compoundInterest€'), findsOneWidget); expect(find.text('Einzahlungen:'), findsOneWidget); expect(find.text('$investedMoney€'), findsOneWidget); expect(find.text('Erhaltene Zinsen:'), findsOneWidget); expect(find.text('${double.parse(compoundInterest) + double.parse(investedMoney)}€'), findsOneWidget); }); testWidgets('Navigates to ChartPage on "Grafik" button press', (WidgetTester tester) async { final List investedMoneyList = [100, 200, 300, 400, 500]; final List compoundInterestList = [100, 200, 300, 400, 1000]; await tester.pumpWidget( MaterialApp( home: Material( child: ResultWidget( compoundInterest: '1000', investedMoney: '500', time: '5', monthlySavingsRate: '100', interestRate: '5', payoutInterval: PayoutInterval.monthly, investedMoneyList: investedMoneyList, compoundInterestList: compoundInterestList, ), ), ), ); await tester.tap(find.text('Grafik')); await tester.pumpAndSettle(); expect(find.byType(ChartPage), findsOneWidget); }); testWidgets('Navigates to MilestonePage on "Meilensteine" button press', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: Material( child: ResultWidget( compoundInterest: '1000', investedMoney: '500', time: '5', monthlySavingsRate: '100', interestRate: '5', payoutInterval: PayoutInterval.monthly, investedMoneyList: [], compoundInterestList: [], ), ), ), ); await tester.tap(find.text('Meilensteine')); await tester.pumpAndSettle(); expect(find.byType(MilestonePage), findsOneWidget); }); }); group('Error Widget Tests', () { testWidgets('Displays error message correctly', (WidgetTester tester) async { const String errorMessage = 'This is an error message'; await tester.pumpWidget( const CupertinoApp( home: Material( child: ErrWidget( errorMessage: errorMessage, ), ), ), ); expect(find.byIcon(CupertinoIcons.exclamationmark_circle_fill), findsOneWidget); expect(find.text(errorMessage), findsOneWidget); }); }); }