Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: curves and km-board without speed data (#478) #656

Merged
merged 12 commits into from
Mar 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 54 additions & 18 deletions das_client/integration_test/test/train_journey_table_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,55 @@ import '../util/test_utils.dart';

void main() {
group('train journey table test', () {
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');

// 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));

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: 'T5');

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));

final curveName = findDASTableRowByText(l10n.p_train_journey_table_curve_type_curve);
expect(curveName, findsExactly(2));

final curveIcon = find.descendant(of: curveName, matching: find.byKey(CurvePointRow.curvePointIconKey));
expect(curveIcon, findsExactly(2));

await disconnect(tester);
});

testWidgets('test balise multiple level crossings', (tester) async {
await prepareAndStartApp(tester);

Expand Down Expand Up @@ -212,21 +261,15 @@ void main() {
'Genève': '60',
'New Line Speed A Missing': '60',
'42.5': '44', // 2. Curve
'40.5': null, // 3. Curve
'Gland': '60',
};

for (final entry in expectedSpeeds.entries) {
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);
Expand All @@ -250,22 +293,15 @@ 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',
};

for (final entry in expectedSpeeds.entries) {
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);
Expand Down Expand Up @@ -1007,7 +1043,7 @@ Future<void> _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));

Expand Down
16 changes: 8 additions & 8 deletions das_client/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -104,7 +105,9 @@ class TrainJourney extends StatelessWidget {
}

List<BaseRowBuilder> _rows(BuildContext context, Journey journey, TrainJourneySettings settings) {
final rows = journey.data.groupBaliseAndLeveLCrossings(settings.expandedGroups);
final rows = journey.data
.whereNot((it) => _isCurvePointWithoutSpeed(it, journey, settings))
.groupBaliseAndLeveLCrossings(settings.expandedGroups);

final groupedRows =
rows.whereType<BaliseLevelCrossingGroup>().map((it) => it.groupedElements).expand((it) => it).toList();
Expand Down Expand Up @@ -272,4 +275,12 @@ class TrainJourney extends StatelessWidget {
},
);
}

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(currentTrainSeries, currentBreakSeries) == null;
}
}
6 changes: 3 additions & 3 deletions das_client/lib/model/journey/base_data_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<BaseData> {
extension BaseDataExtension on Iterable<BaseData> {
List<BaseData> groupBaliseAndLeveLCrossings(List<int> expandedGroups) {
final List<BaseData> resultList = [];

for (int i = 0; i < length; i++) {
final currentElement = this[i];
final currentElement = elementAt(i);
if (!currentElement.canGroup) {
// Just add elements to the result that are unable to be grouped
resultList.add(currentElement);
Expand All @@ -17,7 +17,7 @@ extension BaseDataExtension on List<BaseData> {
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 = elementAt(j);
if (nextElement.canGroup && currentElement.canGroupWith(nextElement)) {
groupedElements.add(nextElement);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,11 @@
<NetworkSpecificParameter name="curvePointType" value="begin"/>
<NetworkSpecificParameter name="curveType" value="curve"/>
<NetworkSpecificParameter name="xmlCurveSpeed" value="
&lt;curveSpeed text=&quot;Kurve 1&quot; comment=&quot;Kurve 1&quot;&gt;
&lt;curveSpeed text=&quot;Kurve 1&quot; comment=&quot;Kurve 1 comment&quot;&gt;
&lt;speeds&gt;
&lt;v trainSeries=&quot;R&quot; speed=&quot;44&quot;/&gt;
&lt;v trainSeries=&quot;A&quot; speed=&quot;55&quot;/&gt;
&lt;/speeds&gt;
&lt;/curveSpeed&gt;
"/>
</NetworkSpecificPoint>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@
<!-- 'curve' (begins on the line and ends on the line or a station or a halt) -->
<NetworkSpecificParameter name="curveType" value="curve"/>
<NetworkSpecificParameter name="xmlCurveSpeed" value="
&lt;curveSpeed text=&quot;Kurve 1&quot; comment=&quot;Kurve 1&quot;&gt;
&lt;curveSpeed text=&quot;Kurve 1&quot; comment=&quot;Kurve 1 after comment&quot;&gt;
&lt;speeds&gt;
&lt;v trainSeries=&quot;R&quot; speed=&quot;44&quot;/&gt;
&lt;v trainSeries=&quot;A&quot; speed=&quot;55&quot;/&gt;
&lt;/speeds&gt;
&lt;/curveSpeed&gt;
"/>
</NetworkSpecificPoint>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@
<!-- 'stationExitCurve' (begins in a station) -->
<NetworkSpecificParameter name="curveType" value="stationExitCurve"/>
<NetworkSpecificParameter name="xmlCurveSpeed" value="
&lt;curveSpeed text=&quot;Kurve 1&quot; comment=&quot;Kurve 2&quot;&gt;
&lt;curveSpeed text=&quot;Kurve 5&quot; comment=&quot;Kurve 5 after stop&quot;&gt;
&lt;speeds&gt;
&lt;v trainSeries=&quot;R&quot; speed=&quot;44&quot;/&gt;
&lt;v trainSeries=&quot;A&quot; speed=&quot;55&quot;/&gt;
&lt;/speeds&gt;
&lt;/curveSpeed&gt;
"/>
</NetworkSpecificPoint>
Expand All @@ -38,7 +42,11 @@
<!-- 'curveAfterHalt' (begins at an halt). -->
<NetworkSpecificParameter name="curveType" value="curveAfterHalt"/>
<NetworkSpecificParameter name="xmlCurveSpeed" value="
&lt;curveSpeed text=&quot;Kurve 1&quot; comment=&quot;Kurve 3&quot;&gt;
&lt;curveSpeed text=&quot;Kurve 5&quot; comment=&quot;Kurve 5 after stop&quot;&gt;
&lt;speeds&gt;
&lt;v trainSeries=&quot;R&quot; speed=&quot;44&quot;/&gt;
&lt;v trainSeries=&quot;A&quot; speed=&quot;55&quot;/&gt;
&lt;/speeds&gt;
&lt;/curveSpeed&gt;
"/>
</NetworkSpecificPoint>
Expand Down
Loading