Ocideck/test/footer_preview_test.dart

140 lines
3.8 KiB
Dart
Raw Permalink Normal View History

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:ocideck/models/settings.dart';
import 'package:ocideck/models/slide.dart';
import 'package:ocideck/widgets/slides/slide_preview.dart';
Widget _host(Slide slide, ThemeProfile profile, {int? number, int? count}) {
return MaterialApp(
home: Scaffold(
body: Center(
child: SizedBox(
width: 800,
height: 450,
child: SlidePreviewWidget(
slide: slide,
themeProfile: profile,
slideNumber: number,
slideCount: count,
),
),
),
),
);
}
void main() {
testWidgets('footer renders text tokens and page numbers', (tester) async {
const profile = ThemeProfile(
footerText: 'Vertrouwelijk · {page}/{total}',
footerShowPageNumbers: true,
);
await tester.pumpWidget(
_host(
Slide.create(SlideType.bullets).copyWith(title: 'T', bullets: ['a']),
profile,
number: 2,
count: 5,
),
);
await tester.pump();
expect(find.text('Vertrouwelijk · 2/5'), findsOneWidget);
expect(find.text('2 / 5'), findsOneWidget); // page-number block
});
testWidgets('footer can be hidden on an individual slide', (tester) async {
const profile = ThemeProfile(
footerText: 'Vertrouwelijk',
footerShowPageNumbers: true,
);
await tester.pumpWidget(
_host(
Slide.create(
SlideType.bullets,
).copyWith(title: 'T', bullets: ['a'], showFooter: false),
profile,
number: 2,
count: 5,
),
);
await tester.pump();
expect(find.text('Vertrouwelijk'), findsNothing);
expect(find.text('2 / 5'), findsNothing);
});
testWidgets('footer position can be left center or right', (tester) async {
Future<double> footerLeft(String position) async {
await tester.pumpWidget(
_host(
Slide.create(SlideType.bullets).copyWith(title: 'T', bullets: ['a']),
ThemeProfile(footerText: 'Voettekst', footerPosition: position),
number: 1,
count: 3,
),
);
await tester.pump();
return tester.getTopLeft(find.text('Voettekst')).dx;
}
final left = await footerLeft('left');
final center = await footerLeft('center');
final right = await footerLeft('right');
expect(left, lessThan(center));
expect(center, lessThan(right));
});
testWidgets('left footer aligns with the bullet content margin', (
tester,
) async {
await tester.pumpWidget(
_host(
Slide.create(SlideType.bullets).copyWith(title: 'T', bullets: ['a']),
const ThemeProfile(footerText: 'Voettekst', footerPosition: 'left'),
number: 1,
count: 3,
),
);
await tester.pump();
// Bullets beginnen op w*0.07 (w=800 → 56px); de footer lijnt daarmee uit.
final footerX = tester.getTopLeft(find.text('Voettekst')).dx;
expect(footerX, closeTo(800 * 0.07, 2));
});
testWidgets('footer is hidden on title slides', (tester) async {
const profile = ThemeProfile(
footerText: 'Altijd zichtbaar',
footerShowPageNumbers: true,
);
await tester.pumpWidget(
_host(
Slide.create(SlideType.title).copyWith(title: 'Welkom'),
profile,
number: 1,
count: 4,
),
);
await tester.pump();
expect(find.text('Altijd zichtbaar'), findsNothing);
});
testWidgets('no footer when profile has none configured', (tester) async {
const profile = ThemeProfile();
await tester.pumpWidget(
_host(
Slide.create(SlideType.bullets).copyWith(title: 'T', bullets: ['a']),
profile,
number: 1,
count: 3,
),
);
await tester.pump();
expect(find.text('1 / 3'), findsNothing);
});
}