Files
Client/test/widget/prosemirror/pm_table_view_test.dart
T
2026-07-23 14:22:32 +02:00

111 lines
3.4 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:marianum_mobile/widget/prosemirror/pm_document_view.dart';
import 'package:marianum_mobile/widget/prosemirror/pm_node.dart';
import 'package:marianum_mobile/widget/prosemirror/pm_table_view.dart';
PmNode _tableDoc() {
final raw = File(
'test/widget/prosemirror/fixtures/table.json',
).readAsStringSync();
return PmNode.fromJson(jsonDecode(raw) as Map<String, dynamic>);
}
Widget _host(PmNode doc) => MaterialApp(
home: Scaffold(
body: SingleChildScrollView(child: PmDocumentView(doc: doc)),
),
);
PmTableCell _textCell(String text) => PmTableCell(
children: [
PmParagraph(children: [PmText(text: text)]),
],
);
void main() {
setUp(() => pmTableMode.value = PmTableMode.scroll);
tearDown(() => pmTableMode.value = PmTableMode.scroll);
testWidgets('renders in every display mode without exception', (tester) async {
await tester.pumpWidget(_host(_tableDoc()));
for (final mode in PmTableMode.values) {
pmTableMode.value = mode;
await tester.pumpAndSettle();
expect(tester.takeException(), isNull, reason: 'mode $mode threw');
}
});
testWidgets('cells in a row share one height when wrapping', (tester) async {
// One row, two cells: a short one and one long enough to wrap at the
// constrained width. Both cell boxes must end up the same height.
final doc = PmTable(
children: [
PmTableRow(
children: [
_textCell('kurz'),
_textCell('ein deutlich laengerer Text der ganz sicher umbricht'),
],
),
],
);
pmTableMode.value = PmTableMode.wrap;
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Center(
child: SizedBox(width: 200, child: PmDocumentView(doc: doc)),
),
),
),
);
await tester.pumpAndSettle();
final boxes = find.descendant(
of: find.byType(LayoutGrid),
matching: find.byType(DecoratedBox),
);
expect(boxes, findsNWidgets(2));
final first = tester.getSize(boxes.at(0)).height;
final second = tester.getSize(boxes.at(1)).height;
expect(first, greaterThan(0));
expect(first, moreOrLessEquals(second, epsilon: 0.5));
});
testWidgets('tapping a toolbar button switches the shared mode', (
tester,
) async {
// The mode toolbar only renders once the table overflows its width — at the
// full test surface the fixture table fits and the toggle stays hidden. Pin
// a narrow width so it overflows, then let the post-frame overflow
// measurement settle so the toolbar is present before tapping.
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: SingleChildScrollView(
child: Center(
child: SizedBox(width: 200, child: PmDocumentView(doc: _tableDoc())),
),
),
),
),
);
await tester.pumpAndSettle();
expect(pmTableMode.value, PmTableMode.scroll);
await tester.tap(find.byTooltip('Spalten umbrechen').first);
await tester.pumpAndSettle();
expect(pmTableMode.value, PmTableMode.wrap);
await tester.tap(find.byTooltip('Verkleinern (alles auf einen Blick)').first);
await tester.pumpAndSettle();
expect(pmTableMode.value, PmTableMode.zoom);
});
}