Initial commit
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:smplayer/features/player/widgets/android/android_bottom_transport_controls.dart';
|
||||
|
||||
import '../../../../helpers/fake_player_engine.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('renders prev play next order', (tester) async {
|
||||
final player = FakePlayerEngine(playing: true);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Scaffold(
|
||||
backgroundColor: Colors.black,
|
||||
body: Center(
|
||||
child: AndroidBottomTransportControls(
|
||||
player: player,
|
||||
hasPrev: true,
|
||||
hasNext: true,
|
||||
onPrevItem: () {},
|
||||
onNextItem: () {},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
expect(find.byIcon(Icons.skip_previous), findsOneWidget);
|
||||
expect(find.byIcon(Icons.pause), findsOneWidget);
|
||||
expect(find.byIcon(Icons.skip_next), findsOneWidget);
|
||||
|
||||
final prevCenter = tester.getCenter(find.byIcon(Icons.skip_previous));
|
||||
final playCenter = tester.getCenter(find.byIcon(Icons.pause));
|
||||
final nextCenter = tester.getCenter(find.byIcon(Icons.skip_next));
|
||||
|
||||
expect(prevCenter.dx < playCenter.dx, isTrue);
|
||||
expect(playCenter.dx < nextCenter.dx, isTrue);
|
||||
|
||||
await player.dispose();
|
||||
});
|
||||
|
||||
testWidgets('invokes prev/next callbacks and toggles playback', (
|
||||
tester,
|
||||
) async {
|
||||
final player = FakePlayerEngine(playing: true);
|
||||
var prevTaps = 0;
|
||||
var nextTaps = 0;
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Center(
|
||||
child: AndroidBottomTransportControls(
|
||||
player: player,
|
||||
hasPrev: true,
|
||||
hasNext: true,
|
||||
onPrevItem: () => prevTaps++,
|
||||
onNextItem: () => nextTaps++,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.byIcon(Icons.skip_previous));
|
||||
await tester.tap(find.byIcon(Icons.skip_next));
|
||||
await tester.tap(find.byIcon(Icons.pause));
|
||||
await tester.pump();
|
||||
|
||||
expect(prevTaps, 1);
|
||||
expect(nextTaps, 1);
|
||||
expect(player.pauseCalls, 1);
|
||||
expect(player.playCalls, 0);
|
||||
|
||||
await player.dispose();
|
||||
});
|
||||
|
||||
testWidgets('disables prev/next when unavailable', (tester) async {
|
||||
final player = FakePlayerEngine(playing: true);
|
||||
var prevTaps = 0;
|
||||
var nextTaps = 0;
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Center(
|
||||
child: AndroidBottomTransportControls(
|
||||
player: player,
|
||||
hasPrev: false,
|
||||
hasNext: false,
|
||||
onPrevItem: () => prevTaps++,
|
||||
onNextItem: () => nextTaps++,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
final prevBtn = tester.widget<IconButton>(
|
||||
find.widgetWithIcon(IconButton, Icons.skip_previous),
|
||||
);
|
||||
final nextBtn = tester.widget<IconButton>(
|
||||
find.widgetWithIcon(IconButton, Icons.skip_next),
|
||||
);
|
||||
|
||||
expect(prevBtn.onPressed, isNull);
|
||||
expect(nextBtn.onPressed, isNull);
|
||||
|
||||
await player.dispose();
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:smplayer/features/player/widgets/android/android_gesture_feedback.dart';
|
||||
|
||||
void main() {
|
||||
Widget buildSubject({required bool seekIsForward}) {
|
||||
return MaterialApp(
|
||||
home: SizedBox(
|
||||
width: 360,
|
||||
height: 240,
|
||||
child: AndroidGestureFeedback(
|
||||
data: GestureFeedbackData(
|
||||
kind: GestureFeedbackKind.seek,
|
||||
seekTarget: const Duration(minutes: 1),
|
||||
totalDuration: const Duration(minutes: 10),
|
||||
seekIsForward: seekIsForward,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
testWidgets('seek preview shows rewind icon for backward seek', (
|
||||
tester,
|
||||
) async {
|
||||
await tester.pumpWidget(buildSubject(seekIsForward: false));
|
||||
|
||||
expect(find.byIcon(Icons.fast_rewind), findsOneWidget);
|
||||
expect(find.byIcon(Icons.fast_forward), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('seek preview shows forward icon for forward seek', (
|
||||
tester,
|
||||
) async {
|
||||
await tester.pumpWidget(buildSubject(seekIsForward: true));
|
||||
|
||||
expect(find.byIcon(Icons.fast_forward), findsOneWidget);
|
||||
expect(find.byIcon(Icons.fast_rewind), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('long press speed uses light background', (tester) async {
|
||||
await tester.pumpWidget(
|
||||
const MaterialApp(
|
||||
home: SizedBox(
|
||||
width: 360,
|
||||
height: 240,
|
||||
child: AndroidGestureFeedback(
|
||||
data: GestureFeedbackData(
|
||||
kind: GestureFeedbackKind.longPressSpeed,
|
||||
speedRate: 3,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
final container = tester.widget<Container>(
|
||||
find.descendant(
|
||||
of: find.byType(AndroidGestureFeedback),
|
||||
matching: find.byType(Container),
|
||||
),
|
||||
);
|
||||
final decoration = container.decoration as BoxDecoration;
|
||||
|
||||
expect(decoration.color, const Color(0x45181818));
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user