From 11928c145a9255b65d8c1623ead14e1d79545edd Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Tue, 18 Feb 2025 07:37:33 +0100 Subject: [PATCH 1/9] feat: don't add the curves which don't have speedData --- .../test/train_journey_table_test.dart | 19 +++++++++++++++++++ das_client/ios/Podfile.lock | 14 +++++++------- .../train_journey/widgets/train_journey.dart | 7 ++++++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index 89264daf..b8bbd413 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -24,6 +24,25 @@ import '../util/test_utils.dart'; void main() { group('train journey table test', () { + testWidgets('test not find any curves without speed', (tester) async { + + //TODO implement test + + await prepareAndStartApp(tester); + + // load train journey by filling out train selection page + await loadTrainJourney(tester, trainNumber: 'T7'); + + final scrollableFinder = find.byType(ListView); + expect(scrollableFinder, findsOneWidget); + + final baliseMultiLevelCrossing = findDASTableRowByText('(2 ${l10n.p_train_journey_table_level_crossing})'); + expect(baliseMultiLevelCrossing, findsOneWidget); + + final baliseIcon = find.descendant(of: baliseMultiLevelCrossing, matching: find.byKey(BaliseRow.baliseIconKey)); + expect(baliseIcon, findsOneWidget); + }); + testWidgets('check if update sent is correct', (tester) async { // Load app widget. await prepareAndStartApp(tester); diff --git a/das_client/ios/Podfile.lock b/das_client/ios/Podfile.lock index a708fd75..22699ef0 100644 --- a/das_client/ios/Podfile.lock +++ b/das_client/ios/Podfile.lock @@ -57,14 +57,14 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa - device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_appauth: aef998cfbcc307dff7f2fbe1f59a50323748dc25 - flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 - isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073 - package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + flutter_appauth: 273bf736e38f7d85000b1a9ac15ace5800c277f2 + flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e + isar_flutter_libs: 9fc2cfb928c539e1b76c481ba5d143d556d94920 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 PODFILE CHECKSUM: d9dad56c0cd0b4fd8b4fe3034a53fd42a0b990f6 diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index 0fc3735a..72b891ce 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -91,7 +91,12 @@ class TrainJourney extends StatelessWidget { final rows = journey.data.groupBaliseAndLeveLCrossings(settings.expandedGroups); final groupedRows = - rows.whereType().map((it) => it.groupedElements).expand((it) => it).toList(); + rows.whereType().map((it) => it.groupedElements).expand((it) => it).where((it) { + if (it.type == Datatype.curvePoint && it.speedData == null) { + return false; + } + return true; + }).toList(); return List.generate(rows.length, (index) { final rowData = rows[index]; From 53f467594a3df101833350e1d98fdf5f71d730b8 Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Mon, 3 Mar 2025 08:48:58 +0100 Subject: [PATCH 2/9] chore: merge main and current pr together --- das_client/integration_test/test/train_journey_table_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index 819f40a1..f5955388 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -30,7 +30,7 @@ void main() { group('train journey table test', () { testWidgets('test not find any curves without speed', (tester) async { - //TODO implement test + //TODO implement test and test if finally all is merged together. await prepareAndStartApp(tester); From 9b64164f8b9c698c7753db8bcce38200011451a2 Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Tue, 4 Mar 2025 14:39:14 +0100 Subject: [PATCH 3/9] update: finally found out the logic needed for this task and it successfully works. Still need to write tests. --- .../train_journey/widgets/train_journey.dart | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index 009b39d0..74e0849a 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -104,15 +104,31 @@ class TrainJourney extends StatelessWidget { } List _rows(BuildContext context, Journey journey, TrainJourneySettings settings) { - final rows = journey.data.groupBaliseAndLeveLCrossings(settings.expandedGroups); + settings.selectedBreakSeries != null + ? '${settings.selectedBreakSeries!.trainSeries.name}${settings.selectedBreakSeries!.breakSeries}' + : '${journey.metadata.breakSeries?.trainSeries.name ?? '?'}${journey.metadata.breakSeries?.breakSeries ?? '?'}'; + + final curveExceptions = journey.data + .where((it) => + it.type == Datatype.curvePoint && + (it.localSpeedData == null || + it.localSpeedData!.speedsFor( + settings.selectedBreakSeries != null + ? settings.selectedBreakSeries?.trainSeries + : journey.metadata.breakSeries!.trainSeries, + settings.selectedBreakSeries != null + ? settings.selectedBreakSeries?.breakSeries + : journey.metadata.breakSeries!.breakSeries) == + null)) + .toList(); + + final rows = journey.data + .where((it) => !curveExceptions.contains(it)) + .toList() + .groupBaliseAndLeveLCrossings(settings.expandedGroups); final groupedRows = - rows.whereType().map((it) => it.groupedElements).expand((it) => it).where((it) { - if (it.type == Datatype.curvePoint && it.speedData == null) { - return false; - } - return true; - }).toList(); + rows.whereType().map((it) => it.groupedElements).expand((it) => it).toList(); return List.generate(rows.length, (index) { final rowData = rows[index]; From 59abe989f969d44122fb9d72d38b5e714728f6c1 Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Fri, 7 Mar 2025 10:42:12 +0100 Subject: [PATCH 4/9] feat: added tests they work on my mqttTopicPrefix but will fail on dev because the SFERA needs to be merged to dev to return correct values --- .../test/train_journey_table_test.dart | 65 ++++++++++++++----- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index f5955388..c250a080 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -28,23 +28,55 @@ import '../util/test_utils.dart'; void main() { group('train journey table test', () { - testWidgets('test not find any curves without speed', (tester) async { + testWidgets('test find one curve is found when breakingSeries A50 is chosen', (tester) async { + await prepareAndStartApp(tester); + + // load train journey by filling out train selection page + await loadTrainJourney(tester, trainNumber: 'T5'); + + // check if the default breakseries is chosen. + final defaultBreakingSeriesHeaderCell = find.byKey(TrainJourney.breakingSeriesHeaderKey); + expect(defaultBreakingSeriesHeaderCell, findsOneWidget); + expect(find.descendant(of: defaultBreakingSeriesHeaderCell, matching: find.text('R115')), findsNWidgets(1)); + + // change breakseries to A50 + await _selectBreakSeries(tester, breakSeries: 'A50'); + + // check if the breakseries A50 is chosen. + final breakingSeriesHeaderCell = find.byKey(TrainJourney.breakingSeriesHeaderKey); + expect(breakingSeriesHeaderCell, findsOneWidget); + expect(find.descendant(of: breakingSeriesHeaderCell, matching: find.text('A50')), findsNWidgets(1)); - //TODO implement test and test if finally all is merged together. + final scrollableFinder = find.byType(ListView); + expect(scrollableFinder, findsOneWidget); + + final curveName = findDASTableRowByText(l10n.p_train_journey_table_curve_type_curve); + expect(curveName, findsOneWidget); + + final curveIcon = find.descendant(of: curveName, matching: find.byKey(CurvePointRow.curvePointIconKey)); + expect(curveIcon, findsOneWidget); + await disconnect(tester); + }); + + testWidgets('test find two curves when breakingSeries R115 is chosen', (tester) async { await prepareAndStartApp(tester); // load train journey by filling out train selection page - await loadTrainJourney(tester, trainNumber: 'T7'); + await loadTrainJourney(tester, trainNumber: 'T5'); final scrollableFinder = find.byType(ListView); expect(scrollableFinder, findsOneWidget); - final baliseMultiLevelCrossing = findDASTableRowByText('(2 ${l10n.p_train_journey_table_level_crossing})'); - expect(baliseMultiLevelCrossing, findsOneWidget); + final breakingSeriesHeaderCell = find.byKey(TrainJourney.breakingSeriesHeaderKey); + expect(breakingSeriesHeaderCell, findsOneWidget); + expect(find.descendant(of: breakingSeriesHeaderCell, matching: find.text('R115')), findsNWidgets(1)); - final baliseIcon = find.descendant(of: baliseMultiLevelCrossing, matching: find.byKey(BaliseRow.baliseIconKey)); - expect(baliseIcon, findsOneWidget); + final curveName = findDASTableRowByText(l10n.p_train_journey_table_curve_type_curve); + expect(curveName, findsAtLeast(2)); + + final curveIcon = find.descendant(of: curveName, matching: find.byKey(CurvePointRow.curvePointIconKey)); + expect(curveIcon, findsAtLeast(2)); await disconnect(tester); }); @@ -315,7 +347,6 @@ void main() { 'Genève': '60', 'New Line Speed A Missing': '60', '42.5': '44', // 2. Curve - '40.5': null, // 3. Curve 'Gland': '60', }; @@ -323,13 +354,13 @@ void main() { final tableRow = findDASTableRowByText(entry.key); expect(tableRow, findsOneWidget); - if (entry.value != null) { - final speedText = find.descendant(of: tableRow, matching: find.text(entry.value!)); + //if (entry.value != null) { + final speedText = find.descendant(of: tableRow, matching: find.text(entry.value)); expect(speedText, findsOneWidget); - } else { + /*} else { final textWidgets = find.descendant(of: tableRow, matching: find.byWidgetPredicate((it) => it is Text)); expect(textWidgets, findsNWidgets(2)); // KM and Kurve text widgets - } + }*/ } await disconnect(tester); @@ -353,8 +384,6 @@ void main() { 'New Line Speed All': '90', 'Genève': 'XX', 'New Line Speed A Missing': 'XX', - '42.5': 'XX', // 2. Curve - '40.5': null, // 3. Curve 'Gland': '90', }; @@ -362,13 +391,13 @@ void main() { final tableRow = findDASTableRowByText(entry.key); expect(tableRow, findsOneWidget); - if (entry.value != null) { - final speedText = find.descendant(of: tableRow, matching: find.text(entry.value!)); + //if (entry.value != null) { + final speedText = find.descendant(of: tableRow, matching: find.text(entry.value)); expect(speedText, findsOneWidget); - } else { + /*} else { final textWidgets = find.descendant(of: tableRow, matching: find.byWidgetPredicate((it) => it is Text)); expect(textWidgets, findsNWidgets(2)); // KM and Kurve text widgets - } + }*/ } await disconnect(tester); From 48d1643023030b21e1f9031bba5b78ce7ae0a3aa Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Fri, 7 Mar 2025 10:49:50 +0100 Subject: [PATCH 5/9] update: change the curves in T9999 to always show no matter the breakseries --- .../T9999_mixed_journey/SFERA_SP_T9999_1.xml | 6 +++++- .../T9999_mixed_journey/SFERA_SP_T9999_2.xml | 6 +++++- .../T9999_mixed_journey/SFERA_SP_T9999_3.xml | 12 ++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_1.xml b/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_1.xml index 17871998..ade1a0e0 100644 --- a/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_1.xml +++ b/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_1.xml @@ -32,7 +32,11 @@ diff --git a/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_2.xml b/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_2.xml index 5d6a000b..9155c222 100644 --- a/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_2.xml +++ b/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_2.xml @@ -31,7 +31,11 @@ diff --git a/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_3.xml b/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_3.xml index c7975b5e..7e75adbf 100644 --- a/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_3.xml +++ b/sfera_mock/src/main/resources/static_sfera_resources/T9999_mixed_journey/SFERA_SP_T9999_3.xml @@ -26,7 +26,11 @@ @@ -38,7 +42,11 @@ From 5dcbb2850fab987b34a15ed76a945b6a4fd5dce9 Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Fri, 7 Mar 2025 11:32:08 +0100 Subject: [PATCH 6/9] update: added comments and refactored --- .../test/train_journey_table_test.dart | 29 +++++++++---------- das_client/ios/Podfile.lock | 16 +++++----- .../train_journey/widgets/train_journey.dart | 4 --- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index 37fca596..04fb228a 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -1,3 +1,6 @@ +import 'package:battery_plus/battery_plus.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/header/battery_status.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/header/header.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/balise_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart'; @@ -14,10 +17,13 @@ import 'package:das_client/app/pages/journey/train_journey/widgets/table/whistle import 'package:das_client/app/pages/journey/train_journey/widgets/train_journey.dart'; import 'package:das_client/app/pages/profile/profile_page.dart'; import 'package:das_client/app/widgets/table/das_table.dart'; +import 'package:das_client/di.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; import '../app_test.dart'; +import '../mocks/battery_mock.dart'; import '../util/test_utils.dart'; void main() { @@ -62,6 +68,7 @@ void main() { final scrollableFinder = find.byType(ListView); expect(scrollableFinder, findsOneWidget); + // find and check if the default breakseries is chosen final breakingSeriesHeaderCell = find.byKey(TrainJourney.breakingSeriesHeaderKey); expect(breakingSeriesHeaderCell, findsOneWidget); expect(find.descendant(of: breakingSeriesHeaderCell, matching: find.text('R115')), findsNWidgets(1)); @@ -71,7 +78,7 @@ void main() { final curveIcon = find.descendant(of: curveName, matching: find.byKey(CurvePointRow.curvePointIconKey)); expect(curveIcon, findsAtLeast(2)); - + await disconnect(tester); }); @@ -348,13 +355,8 @@ void main() { final tableRow = findDASTableRowByText(entry.key); expect(tableRow, findsOneWidget); - //if (entry.value != null) { - final speedText = find.descendant(of: tableRow, matching: find.text(entry.value)); - expect(speedText, findsOneWidget); - /*} else { - final textWidgets = find.descendant(of: tableRow, matching: find.byWidgetPredicate((it) => it is Text)); - expect(textWidgets, findsNWidgets(2)); // KM and Kurve text widgets - }*/ + final speedText = find.descendant(of: tableRow, matching: find.text(entry.value)); + expect(speedText, findsOneWidget); } await disconnect(tester); @@ -385,13 +387,8 @@ void main() { final tableRow = findDASTableRowByText(entry.key); expect(tableRow, findsOneWidget); - //if (entry.value != null) { - final speedText = find.descendant(of: tableRow, matching: find.text(entry.value)); - expect(speedText, findsOneWidget); - /*} else { - final textWidgets = find.descendant(of: tableRow, matching: find.byWidgetPredicate((it) => it is Text)); - expect(textWidgets, findsNWidgets(2)); // KM and Kurve text widgets - }*/ + final speedText = find.descendant(of: tableRow, matching: find.text(entry.value)); + expect(speedText, findsOneWidget); } await disconnect(tester); @@ -1133,7 +1130,7 @@ Future _selectBreakSeries(WidgetTester tester, {required String breakSerie // Open break series bottom sheet await tapElement(tester, find.byKey(TrainJourney.breakingSeriesHeaderKey)); - // Check if the bottom sheeet is opened + // Check if the bottom sheet is opened expect(find.text(l10n.p_train_journey_break_series), findsOneWidget); await tapElement(tester, find.text(breakSeries)); diff --git a/das_client/ios/Podfile.lock b/das_client/ios/Podfile.lock index fa014430..ab36ae7a 100644 --- a/das_client/ios/Podfile.lock +++ b/das_client/ios/Podfile.lock @@ -62,15 +62,15 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa - battery_plus: 34f72fa2afeeea83bbae306c72a25828d3ec727a - device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 + battery_plus: b42253f6d2dde71712f8c36fef456d99121c5977 + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_appauth: aef998cfbcc307dff7f2fbe1f59a50323748dc25 - flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 - isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073 - package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + flutter_appauth: 273bf736e38f7d85000b1a9ac15ace5800c277f2 + flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e + isar_flutter_libs: 9fc2cfb928c539e1b76c481ba5d143d556d94920 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index e4fc08b6..8593356b 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -104,10 +104,6 @@ class TrainJourney extends StatelessWidget { } List _rows(BuildContext context, Journey journey, TrainJourneySettings settings) { - settings.selectedBreakSeries != null - ? '${settings.selectedBreakSeries!.trainSeries.name}${settings.selectedBreakSeries!.breakSeries}' - : '${journey.metadata.breakSeries?.trainSeries.name ?? '?'}${journey.metadata.breakSeries?.breakSeries ?? '?'}'; - final curveExceptions = journey.data .where((it) => it.type == Datatype.curvePoint && From 5622fd5b0c53adc8c636e4611030e0003422969b Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Mon, 10 Mar 2025 14:33:57 +0100 Subject: [PATCH 7/9] update: refactored the mentioned points --- .../test/train_journey_table_test.dart | 61 +------------------ .../train_journey/widgets/train_journey.dart | 50 ++++++++------- .../model/journey/base_data_extension.dart | 6 +- 3 files changed, 29 insertions(+), 88 deletions(-) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index 04fb228a..ed6c8c6b 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -1,5 +1,3 @@ -import 'package:battery_plus/battery_plus.dart'; -import 'package:das_client/app/pages/journey/train_journey/widgets/header/battery_status.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/header/header.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/balise_row.dart'; @@ -17,13 +15,11 @@ import 'package:das_client/app/pages/journey/train_journey/widgets/table/whistle import 'package:das_client/app/pages/journey/train_journey/widgets/train_journey.dart'; import 'package:das_client/app/pages/profile/profile_page.dart'; import 'package:das_client/app/widgets/table/das_table.dart'; -import 'package:das_client/di.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; import '../app_test.dart'; -import '../mocks/battery_mock.dart'; import '../util/test_utils.dart'; void main() { @@ -34,11 +30,6 @@ void main() { // load train journey by filling out train selection page await loadTrainJourney(tester, trainNumber: 'T5'); - // check if the default breakseries is chosen. - final defaultBreakingSeriesHeaderCell = find.byKey(TrainJourney.breakingSeriesHeaderKey); - expect(defaultBreakingSeriesHeaderCell, findsOneWidget); - expect(find.descendant(of: defaultBreakingSeriesHeaderCell, matching: find.text('R115')), findsNWidgets(1)); - // change breakseries to A50 await _selectBreakSeries(tester, breakSeries: 'A50'); @@ -74,58 +65,10 @@ void main() { expect(find.descendant(of: breakingSeriesHeaderCell, matching: find.text('R115')), findsNWidgets(1)); final curveName = findDASTableRowByText(l10n.p_train_journey_table_curve_type_curve); - expect(curveName, findsAtLeast(2)); + expect(curveName, findsExactly(2)); final curveIcon = find.descendant(of: curveName, matching: find.byKey(CurvePointRow.curvePointIconKey)); - expect(curveIcon, findsAtLeast(2)); - - await disconnect(tester); - }); - - testWidgets('test battery over 15% and not show icon', (tester) async { - await prepareAndStartApp(tester); - - // Set Battery to a mocked version - final battery = DI.get() as BatteryMock; - - // Set current Battery-Level to 80 % so it is over 15% - battery.currentBatteryLevel = 80; - - // load train journey by filling out train selection page - await loadTrainJourney(tester, trainNumber: 'T7'); - - // Find the header and check if it is existent - final headerFinder = find.byType(Header); - expect(headerFinder, findsOneWidget); - - expect(battery.currentBatteryLevel, 80); - - final batteryIcon = find.descendant(of: headerFinder, matching: find.byKey(BatteryStatus.batteryLevelLowIconKey)); - expect(batteryIcon, findsNothing); - - await disconnect(tester); - }); - - testWidgets('test battery under 15% and show icon', (tester) async { - await prepareAndStartApp(tester); - - // Set Battery to a mocked version - final battery = DI.get() as BatteryMock; - - // Set current Battery-Level to 10% so it is under 15% - battery.currentBatteryLevel = 10; - - // load train journey by filling out train selection page - await loadTrainJourney(tester, trainNumber: 'T7'); - - // Find the header and check if it is existent - final headerFinder = find.byType(Header); - expect(headerFinder, findsOneWidget); - - expect(battery.currentBatteryLevel, 10); - - final batteryIcon = find.descendant(of: headerFinder, matching: find.byKey(BatteryStatus.batteryLevelLowIconKey)); - expect(batteryIcon, findsOneWidget); + expect(curveIcon, findsExactly(2)); await disconnect(tester); }); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index 8593356b..522b95bf 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -29,6 +29,7 @@ import 'package:das_client/app/widgets/table/das_table_column.dart'; import 'package:das_client/model/journey/additional_speed_restriction_data.dart'; import 'package:das_client/model/journey/balise.dart'; import 'package:das_client/model/journey/balise_level_crossing_group.dart'; +import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/base_data_extension.dart'; import 'package:das_client/model/journey/break_series.dart'; import 'package:das_client/model/journey/cab_signaling.dart'; @@ -41,6 +42,7 @@ import 'package:das_client/model/journey/protection_section.dart'; import 'package:das_client/model/journey/service_point.dart'; import 'package:das_client/model/journey/signal.dart'; import 'package:das_client/model/journey/speed_change.dart'; +import 'package:das_client/model/journey/train_series.dart'; import 'package:das_client/model/journey/tram_area.dart'; import 'package:das_client/model/journey/whistles.dart'; import 'package:flutter/material.dart'; @@ -87,7 +89,9 @@ class TrainJourney extends StatelessWidget { context.trainJourneyCubit.automaticAdvancementController.updateRenderedRows(tableRows); final marginAdjustment = - Platform.isIOS ? tableRows.lastWhereOrNull((it) => it.isSticky)?.height ?? BaseRowBuilder.rowHeight : 0.0; + Platform.isIOS ? tableRows + .lastWhereOrNull((it) => it.isSticky) + ?.height ?? BaseRowBuilder.rowHeight : 0.0; return Padding( padding: const EdgeInsets.symmetric(horizontal: sbbDefaultSpacing * 0.5), @@ -104,26 +108,14 @@ class TrainJourney extends StatelessWidget { } List _rows(BuildContext context, Journey journey, TrainJourneySettings settings) { - final curveExceptions = journey.data - .where((it) => - it.type == Datatype.curvePoint && - (it.localSpeedData == null || - it.localSpeedData!.speedsFor( - settings.selectedBreakSeries != null - ? settings.selectedBreakSeries?.trainSeries - : journey.metadata.breakSeries!.trainSeries, - settings.selectedBreakSeries != null - ? settings.selectedBreakSeries?.breakSeries - : journey.metadata.breakSeries!.breakSeries) == - null)) - .toList(); + final currentTrainSeries = settings.selectedBreakSeries?.trainSeries ?? journey.metadata.breakSeries?.trainSeries; + final currentBreakSeries = settings.selectedBreakSeries?.breakSeries ?? journey.metadata.breakSeries?.breakSeries; final rows = journey.data - .where((it) => !curveExceptions.contains(it)) - .toList() + .whereNot((it) => _isCurvePointWithoutSpeed(it, currentTrainSeries, currentBreakSeries)) .groupBaliseAndLeveLCrossings(settings.expandedGroups); - final groupedRows = + final groupedRows = rows.whereType().map((it) => it.groupedElements).expand((it) => it).toList(); return List.generate(rows.length, (index) { @@ -259,8 +251,8 @@ class TrainJourney extends StatelessWidget { ]; } - void _onBaliseLevelCrossingGroupTap( - BuildContext context, BaliseLevelCrossingGroup group, TrainJourneySettings settings) { + void _onBaliseLevelCrossingGroupTap(BuildContext context, BaliseLevelCrossingGroup group, + TrainJourneySettings settings) { final trainJourneyCubit = context.trainJourneyCubit; final newList = List.from(settings.expandedGroups); @@ -277,16 +269,22 @@ class TrainJourney extends StatelessWidget { final trainJourneyCubit = context.trainJourneyCubit; showSBBModalSheet( - context: context, - title: context.l10n.p_train_journey_break_series, - constraints: BoxConstraints(), - child: BreakSeriesSelection( - availableBreakSeries: journey.metadata.availableBreakSeries, - selectedBreakSeries: settings.selectedBreakSeries ?? journey.metadata.breakSeries)) + context: context, + title: context.l10n.p_train_journey_break_series, + constraints: BoxConstraints(), + child: BreakSeriesSelection( + availableBreakSeries: journey.metadata.availableBreakSeries, + selectedBreakSeries: settings.selectedBreakSeries ?? journey.metadata.breakSeries)) .then( - (newValue) => { + (newValue) => + { if (newValue != null) {trainJourneyCubit.updateBreakSeries(newValue)} }, ); } + + bool _isCurvePointWithoutSpeed(BaseData data, TrainSeries? trainSeries, int? breakSeries) { + return data.type == Datatype.curvePoint && + data.localSpeedData?.speedsFor(trainSeries, breakSeries) == null; + } } diff --git a/das_client/lib/model/journey/base_data_extension.dart b/das_client/lib/model/journey/base_data_extension.dart index c7db6f37..5ee9be94 100644 --- a/das_client/lib/model/journey/base_data_extension.dart +++ b/das_client/lib/model/journey/base_data_extension.dart @@ -2,12 +2,12 @@ import 'package:das_client/model/journey/balise_level_crossing_group.dart'; import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; -extension BaseDataExtension on List { +extension BaseDataExtension on Iterable { List groupBaliseAndLeveLCrossings(List expandedGroups) { final List resultList = []; for (int i = 0; i < length; i++) { - final currentElement = this[i]; + final currentElement = toList()[i]; if (!currentElement.canGroup) { // Just add elements to the result that are unable to be grouped resultList.add(currentElement); @@ -17,7 +17,7 @@ extension BaseDataExtension on List { final groupedElements = [currentElement]; // check the next elements if they can be grouped with the currentElement. for (int j = i + 1; j < length; j++) { - final nextElement = this[j]; + final nextElement = toList()[j]; if (nextElement.canGroup && currentElement.canGroupWith(nextElement)) { groupedElements.add(nextElement); } else { From a5c0f0342fba66dffc291b97db9e2fa63b40379b Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Tue, 11 Mar 2025 07:36:15 +0100 Subject: [PATCH 8/9] update: refactored the last mentioned points --- .../test/train_journey_table_test.dart | 30 ------------------- .../train_journey/widgets/train_journey.dart | 13 ++++---- .../model/journey/base_data_extension.dart | 4 +-- 3 files changed, 8 insertions(+), 39 deletions(-) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index ed6c8c6b..7aae38ee 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -1,4 +1,3 @@ -import 'package:das_client/app/pages/journey/train_journey/widgets/header/header.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/balise_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart'; @@ -17,7 +16,6 @@ import 'package:das_client/app/pages/profile/profile_page.dart'; import 'package:das_client/app/widgets/table/das_table.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; import '../app_test.dart'; import '../util/test_utils.dart'; @@ -73,34 +71,6 @@ void main() { await disconnect(tester); }); - testWidgets('check if update sent is correct', (tester) async { - // Load app widget. - await prepareAndStartApp(tester); - - // Select the correct train number - final trainNumberText = findTextFieldByLabel(l10n.p_train_selection_trainnumber_description); - expect(trainNumberText, findsOneWidget); - - await enterText(tester, trainNumberText, 'T9999'); - - // Log into the journey - final primaryButton = find.byWidgetPredicate((widget) => widget is SBBPrimaryButton).first; - await tester.tap(primaryButton); - - // Wait for train journey to load - await tester.pumpAndSettle(); - - // Find the header and check if it is existent - final headerFinder = find.byType(Header); - expect(headerFinder, findsOneWidget); - - await waitUntilNotExists(tester, find.descendant(of: headerFinder, matching: find.text('+00:00'))); - - expect(find.descendant(of: headerFinder, matching: find.text('+00:30')), findsOneWidget); - - await disconnect(tester); - }); - testWidgets('test balise multiple level crossings', (tester) async { await prepareAndStartApp(tester); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index 522b95bf..34a5bb2d 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -42,7 +42,6 @@ import 'package:das_client/model/journey/protection_section.dart'; import 'package:das_client/model/journey/service_point.dart'; import 'package:das_client/model/journey/signal.dart'; import 'package:das_client/model/journey/speed_change.dart'; -import 'package:das_client/model/journey/train_series.dart'; import 'package:das_client/model/journey/tram_area.dart'; import 'package:das_client/model/journey/whistles.dart'; import 'package:flutter/material.dart'; @@ -108,11 +107,8 @@ class TrainJourney extends StatelessWidget { } List _rows(BuildContext context, Journey journey, TrainJourneySettings settings) { - final currentTrainSeries = settings.selectedBreakSeries?.trainSeries ?? journey.metadata.breakSeries?.trainSeries; - final currentBreakSeries = settings.selectedBreakSeries?.breakSeries ?? journey.metadata.breakSeries?.breakSeries; - final rows = journey.data - .whereNot((it) => _isCurvePointWithoutSpeed(it, currentTrainSeries, currentBreakSeries)) + .whereNot((it) => _isCurvePointWithoutSpeed(it, journey, settings)) .groupBaliseAndLeveLCrossings(settings.expandedGroups); final groupedRows = @@ -283,8 +279,11 @@ class TrainJourney extends StatelessWidget { ); } - bool _isCurvePointWithoutSpeed(BaseData data, TrainSeries? trainSeries, int? breakSeries) { + bool _isCurvePointWithoutSpeed(BaseData data, Journey journey, TrainJourneySettings settings) { + final currentTrainSeries = settings.selectedBreakSeries?.trainSeries ?? journey.metadata.breakSeries?.trainSeries; + final currentBreakSeries = settings.selectedBreakSeries?.breakSeries ?? journey.metadata.breakSeries?.breakSeries; + return data.type == Datatype.curvePoint && - data.localSpeedData?.speedsFor(trainSeries, breakSeries) == null; + data.localSpeedData?.speedsFor(currentTrainSeries, currentBreakSeries) == null; } } diff --git a/das_client/lib/model/journey/base_data_extension.dart b/das_client/lib/model/journey/base_data_extension.dart index 5ee9be94..b3399505 100644 --- a/das_client/lib/model/journey/base_data_extension.dart +++ b/das_client/lib/model/journey/base_data_extension.dart @@ -7,7 +7,7 @@ extension BaseDataExtension on Iterable { final List resultList = []; for (int i = 0; i < length; i++) { - final currentElement = toList()[i]; + final currentElement = elementAt(i); if (!currentElement.canGroup) { // Just add elements to the result that are unable to be grouped resultList.add(currentElement); @@ -17,7 +17,7 @@ extension BaseDataExtension on Iterable { final groupedElements = [currentElement]; // check the next elements if they can be grouped with the currentElement. for (int j = i + 1; j < length; j++) { - final nextElement = toList()[j]; + final nextElement = elementAt(j); if (nextElement.canGroup && currentElement.canGroupWith(nextElement)) { groupedElements.add(nextElement); } else { From 539132b04d2b0c7d89fb8b22031d055c9c951f04 Mon Sep 17 00:00:00 2001 From: "Raphael Schreiber (IT-PTR-CEN1-BDE22-Extern)" Date: Tue, 11 Mar 2025 09:45:40 +0100 Subject: [PATCH 9/9] update: refactored the line formation --- .../train_journey/widgets/train_journey.dart | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index 34a5bb2d..1c3f1e2f 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -88,9 +88,7 @@ class TrainJourney extends StatelessWidget { context.trainJourneyCubit.automaticAdvancementController.updateRenderedRows(tableRows); final marginAdjustment = - Platform.isIOS ? tableRows - .lastWhereOrNull((it) => it.isSticky) - ?.height ?? BaseRowBuilder.rowHeight : 0.0; + Platform.isIOS ? tableRows.lastWhereOrNull((it) => it.isSticky)?.height ?? BaseRowBuilder.rowHeight : 0.0; return Padding( padding: const EdgeInsets.symmetric(horizontal: sbbDefaultSpacing * 0.5), @@ -111,7 +109,7 @@ class TrainJourney extends StatelessWidget { .whereNot((it) => _isCurvePointWithoutSpeed(it, journey, settings)) .groupBaliseAndLeveLCrossings(settings.expandedGroups); - final groupedRows = + final groupedRows = rows.whereType().map((it) => it.groupedElements).expand((it) => it).toList(); return List.generate(rows.length, (index) { @@ -247,8 +245,8 @@ class TrainJourney extends StatelessWidget { ]; } - void _onBaliseLevelCrossingGroupTap(BuildContext context, BaliseLevelCrossingGroup group, - TrainJourneySettings settings) { + void _onBaliseLevelCrossingGroupTap( + BuildContext context, BaliseLevelCrossingGroup group, TrainJourneySettings settings) { final trainJourneyCubit = context.trainJourneyCubit; final newList = List.from(settings.expandedGroups); @@ -265,15 +263,14 @@ class TrainJourney extends StatelessWidget { final trainJourneyCubit = context.trainJourneyCubit; showSBBModalSheet( - context: context, - title: context.l10n.p_train_journey_break_series, - constraints: BoxConstraints(), - child: BreakSeriesSelection( - availableBreakSeries: journey.metadata.availableBreakSeries, - selectedBreakSeries: settings.selectedBreakSeries ?? journey.metadata.breakSeries)) + context: context, + title: context.l10n.p_train_journey_break_series, + constraints: BoxConstraints(), + child: BreakSeriesSelection( + availableBreakSeries: journey.metadata.availableBreakSeries, + selectedBreakSeries: settings.selectedBreakSeries ?? journey.metadata.breakSeries)) .then( - (newValue) => - { + (newValue) => { if (newValue != null) {trainJourneyCubit.updateBreakSeries(newValue)} }, );