PlayerExpansionController: optischer Öffnen-Fortschritt für den Vollbild-Player
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:melo/player/player_expansion_controller.dart';
|
||||
|
||||
void main() {
|
||||
Widget mitMediaQuery(bool disableAnimations, WidgetBuilder builder) {
|
||||
return MediaQuery(
|
||||
data: MediaQueryData(disableAnimations: disableAnimations),
|
||||
child: MaterialApp(home: Builder(builder: builder)),
|
||||
);
|
||||
}
|
||||
|
||||
testWidgets('progress startet bei 0', (tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
expect(controller.progress, 0.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets('dragBy nach oben erhöht progress, nach unten verringert ihn',
|
||||
(tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.dragBy(-150); // halbe Referenzhöhe nach oben
|
||||
expect(controller.progress, closeTo(0.5, 0.001));
|
||||
|
||||
controller.dragBy(75); // ein Viertel zurück nach unten
|
||||
expect(controller.progress, closeTo(0.25, 0.001));
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets('dragBy clampt auf [0, 1]', (tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.dragBy(-1000);
|
||||
expect(controller.progress, 1.0);
|
||||
controller.dragBy(2000);
|
||||
expect(controller.progress, 0.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets('open() fliegt zu 1, close() fliegt zu 0', (tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
late BuildContext ctx;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
ctx = context;
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.open(ctx);
|
||||
await tester.pumpAndSettle();
|
||||
expect(controller.progress, 1.0);
|
||||
|
||||
controller.close(ctx);
|
||||
await tester.pumpAndSettle();
|
||||
expect(controller.progress, 0.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets('open()/close() springen bei disableAnimations sofort',
|
||||
(tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
late BuildContext ctx;
|
||||
await tester.pumpWidget(mitMediaQuery(true, (context) {
|
||||
ctx = context;
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.open(ctx);
|
||||
expect(controller.progress, 1.0); // ohne pumpAndSettle sofort da
|
||||
controller.close(ctx);
|
||||
expect(controller.progress, 0.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'dragEnd beim Öffnen: ausreichende Strecke nach oben fliegt zu 1',
|
||||
(tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
late BuildContext ctx;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
ctx = context;
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.dragBy(-200);
|
||||
controller.dragEnd(ctx, -200, 0); // Strecke > wischStreckeSchwelle (80)
|
||||
await tester.pumpAndSettle();
|
||||
expect(controller.progress, 1.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'dragEnd beim Öffnen: zu kurze, langsame Geste fällt zurück auf 0',
|
||||
(tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
late BuildContext ctx;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
ctx = context;
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.dragBy(-30);
|
||||
controller.dragEnd(ctx, -30, 0); // unter wischStreckeSchwelle
|
||||
await tester.pumpAndSettle();
|
||||
expect(controller.progress, 0.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'dragEnd beim Schließen: ausreichende Strecke nach unten fliegt zu 0',
|
||||
(tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
late BuildContext ctx;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
ctx = context;
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.open(ctx);
|
||||
await tester.pumpAndSettle();
|
||||
controller.dragBy(200); // nach unten, Betrag > Referenzhöhe/2
|
||||
controller.dragEnd(ctx, 200, 0);
|
||||
await tester.pumpAndSettle();
|
||||
expect(controller.progress, 0.0);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'dragEnd beim Schließen: zu kurze, langsame Geste bleibt bei 1',
|
||||
(tester) async {
|
||||
late PlayerExpansionController controller;
|
||||
late BuildContext ctx;
|
||||
await tester.pumpWidget(mitMediaQuery(false, (context) {
|
||||
ctx = context;
|
||||
controller = PlayerExpansionController(vsync: tester);
|
||||
return const SizedBox();
|
||||
}));
|
||||
|
||||
controller.open(ctx);
|
||||
await tester.pumpAndSettle();
|
||||
controller.dragBy(30);
|
||||
controller.dragEnd(ctx, 30, 0);
|
||||
await tester.pumpAndSettle();
|
||||
expect(controller.progress, 1.0);
|
||||
controller.dispose();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user