Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 92d7389

Browse files
committed
fixed the controller tests
1 parent 92b0aa0 commit 92d7389

3 files changed

Lines changed: 177 additions & 67 deletions

File tree

packages/video_player/video_player/test/video_player_initialization_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ void main() {
1919
'https://127.0.0.1',
2020
);
2121
await controller.initialize();
22-
expect(fakeVideoPlayerPlatform.calls.first.method, 'init');
22+
expect(fakeVideoPlayerPlatform.calls.first, 'init');
2323
});
2424
}

packages/video_player/video_player/test/video_player_test.dart

Lines changed: 73 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:flutter/widgets.dart';
1111
import 'package:video_player/video_player.dart';
1212
import 'package:flutter_test/flutter_test.dart';
1313
import 'package:video_player_platform_interface/video_player_platform_interface.dart';
14+
import 'package:video_player_platform_interface/messages.dart';
1415

1516
class FakeController extends ValueNotifier<VideoPlayerValue>
1617
implements VideoPlayerController {
@@ -169,11 +170,9 @@ void main() {
169170
await controller.initialize();
170171

171172
expect(
172-
fakeVideoPlayerPlatform.dataSourceDescriptions[0],
173-
<String, dynamic>{
174-
'asset': 'a.avi',
175-
'package': null,
176-
});
173+
fakeVideoPlayerPlatform.dataSourceDescriptions[0].asset, 'a.avi');
174+
expect(fakeVideoPlayerPlatform.dataSourceDescriptions[0].packageName,
175+
null);
177176
});
178177

179178
test('network', () async {
@@ -182,12 +181,10 @@ void main() {
182181
);
183182
await controller.initialize();
184183

184+
expect(fakeVideoPlayerPlatform.dataSourceDescriptions[0].uri,
185+
'https://127.0.0.1');
185186
expect(
186-
fakeVideoPlayerPlatform.dataSourceDescriptions[0],
187-
<String, dynamic>{
188-
'uri': 'https://127.0.0.1',
189-
'formatHint': null,
190-
});
187+
fakeVideoPlayerPlatform.dataSourceDescriptions[0].formatHint, null);
191188
});
192189

193190
test('network with hint', () async {
@@ -196,12 +193,10 @@ void main() {
196193
formatHint: VideoFormat.dash);
197194
await controller.initialize();
198195

199-
expect(
200-
fakeVideoPlayerPlatform.dataSourceDescriptions[0],
201-
<String, dynamic>{
202-
'uri': 'https://127.0.0.1',
203-
'formatHint': 'dash',
204-
});
196+
expect(fakeVideoPlayerPlatform.dataSourceDescriptions[0].uri,
197+
'https://127.0.0.1');
198+
expect(fakeVideoPlayerPlatform.dataSourceDescriptions[0].formatHint,
199+
'dash');
205200
});
206201

207202
test('init errors', () async {
@@ -224,11 +219,8 @@ void main() {
224219
VideoPlayerController.file(File('a.avi'));
225220
await controller.initialize();
226221

227-
expect(
228-
fakeVideoPlayerPlatform.dataSourceDescriptions[0],
229-
<String, dynamic>{
230-
'uri': 'file://a.avi',
231-
});
222+
expect(fakeVideoPlayerPlatform.dataSourceDescriptions[0].uri,
223+
'file://a.avi');
232224
});
233225
});
234226

@@ -255,7 +247,7 @@ void main() {
255247
await controller.play();
256248

257249
expect(controller.value.isPlaying, isTrue);
258-
expect(fakeVideoPlayerPlatform.calls.last.method, 'play');
250+
expect(fakeVideoPlayerPlatform.calls.last, 'play');
259251
});
260252

261253
test('setLooping', () async {
@@ -280,7 +272,7 @@ void main() {
280272
await controller.pause();
281273

282274
expect(controller.value.isPlaying, isFalse);
283-
expect(fakeVideoPlayerPlatform.calls.last.method, 'pause');
275+
expect(fakeVideoPlayerPlatform.calls.last, 'pause');
284276
});
285277

286278
group('seekTo', () {
@@ -543,58 +535,73 @@ void main() {
543535
});
544536
}
545537

546-
class FakeVideoPlayerPlatform {
538+
class FakeVideoPlayerPlatform extends VideoPlayerApiTest {
547539
FakeVideoPlayerPlatform() {
548-
_channel.setMockMethodCallHandler(onMethodCall);
540+
VideoPlayerApiTestSetup(this);
549541
}
550542

551-
final MethodChannel _channel = const MethodChannel('flutter.io/videoPlayer');
552-
553543
Completer<bool> initialized = Completer<bool>();
554-
List<MethodCall> calls = <MethodCall>[];
555-
List<Map<String, dynamic>> dataSourceDescriptions = <Map<String, dynamic>>[];
544+
List<String> calls = <String>[];
545+
List<CreateMessage> dataSourceDescriptions = <CreateMessage>[];
556546
final Map<int, FakeVideoEventStream> streams = <int, FakeVideoEventStream>{};
557547
bool forceInitError = false;
558548
int nextTextureId = 0;
559549
final Map<int, Duration> _positions = <int, Duration>{};
560550

561-
Future<dynamic> onMethodCall(MethodCall call) {
562-
calls.add(call);
563-
switch (call.method) {
564-
case 'init':
565-
initialized.complete(true);
566-
break;
567-
case 'create':
568-
streams[nextTextureId] = FakeVideoEventStream(nextTextureId, 100, 100,
569-
const Duration(seconds: 1), forceInitError);
570-
final Map<dynamic, dynamic> dataSource = call.arguments;
571-
dataSourceDescriptions.add(dataSource.cast<String, dynamic>());
572-
return Future<Map<String, int>>.sync(() {
573-
return <String, int>{
574-
'textureId': nextTextureId++,
575-
};
576-
});
577-
break;
578-
case 'position':
579-
final Duration position = _positions[call.arguments['textureId']] ??
580-
const Duration(seconds: 0);
581-
return Future<int>.value(position.inMilliseconds);
582-
break;
583-
case 'seekTo':
584-
_positions[call.arguments['textureId']] =
585-
Duration(milliseconds: call.arguments['location']);
586-
break;
587-
case 'dispose':
588-
case 'pause':
589-
case 'play':
590-
case 'setLooping':
591-
case 'setVolume':
592-
break;
593-
default:
594-
throw UnimplementedError(
595-
'${call.method} is not implemented by the FakeVideoPlayerPlatform');
596-
}
597-
return Future<void>.sync(() {});
551+
@override
552+
TextureMessage create(CreateMessage arg) {
553+
calls.add('create');
554+
streams[nextTextureId] = FakeVideoEventStream(
555+
nextTextureId, 100, 100, const Duration(seconds: 1), forceInitError);
556+
TextureMessage result = TextureMessage();
557+
result.textureId = nextTextureId++;
558+
dataSourceDescriptions.add(arg);
559+
return result;
560+
}
561+
562+
@override
563+
void dispose(TextureMessage arg) {
564+
calls.add('dispose');
565+
}
566+
567+
@override
568+
void initialize() {
569+
calls.add('init');
570+
initialized.complete(true);
571+
}
572+
573+
@override
574+
void pause(TextureMessage arg) {
575+
calls.add('pause');
576+
}
577+
578+
@override
579+
void play(TextureMessage arg) {
580+
calls.add('play');
581+
}
582+
583+
@override
584+
PositionMessage position(TextureMessage arg) {
585+
calls.add('position');
586+
final Duration position =
587+
_positions[arg.textureId] ?? const Duration(seconds: 0);
588+
return PositionMessage()..position = position.inMilliseconds;
589+
}
590+
591+
@override
592+
void seekTo(PositionMessage arg) {
593+
calls.add('seekTo');
594+
_positions[arg.textureId] = Duration(milliseconds: arg.position);
595+
}
596+
597+
@override
598+
void setLooping(LoopingMessage arg) {
599+
calls.add('setLooping');
600+
}
601+
602+
@override
603+
void setVolume(VolumeMessage arg) {
604+
calls.add('setVolume');
598605
}
599606
}
600607

packages/video_player/video_player_platform_interface/lib/messages.dart

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,109 @@ class PositionMessage {
107107
}
108108
}
109109

110+
abstract class VideoPlayerApiTest {
111+
void initialize();
112+
TextureMessage create(CreateMessage arg);
113+
void dispose(TextureMessage arg);
114+
void setLooping(LoopingMessage arg);
115+
void setVolume(VolumeMessage arg);
116+
void play(TextureMessage arg);
117+
PositionMessage position(TextureMessage arg);
118+
void seekTo(PositionMessage arg);
119+
void pause(TextureMessage arg);
120+
}
121+
122+
void VideoPlayerApiTestSetup(VideoPlayerApiTest api) {
123+
{
124+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
125+
'dev.flutter.pigeon.VideoPlayerApi.initialize', StandardMessageCodec());
126+
channel.setMockMessageHandler((dynamic message) async {
127+
api.initialize();
128+
return {};
129+
});
130+
}
131+
{
132+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
133+
'dev.flutter.pigeon.VideoPlayerApi.create', StandardMessageCodec());
134+
channel.setMockMessageHandler((dynamic message) async {
135+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
136+
final CreateMessage input = CreateMessage._fromMap(mapMessage);
137+
final TextureMessage output = api.create(input);
138+
return {'result': output._toMap()};
139+
});
140+
}
141+
{
142+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
143+
'dev.flutter.pigeon.VideoPlayerApi.dispose', StandardMessageCodec());
144+
channel.setMockMessageHandler((dynamic message) async {
145+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
146+
final TextureMessage input = TextureMessage._fromMap(mapMessage);
147+
api.dispose(input);
148+
return {};
149+
});
150+
}
151+
{
152+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
153+
'dev.flutter.pigeon.VideoPlayerApi.setLooping', StandardMessageCodec());
154+
channel.setMockMessageHandler((dynamic message) async {
155+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
156+
final LoopingMessage input = LoopingMessage._fromMap(mapMessage);
157+
api.setLooping(input);
158+
return {};
159+
});
160+
}
161+
{
162+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
163+
'dev.flutter.pigeon.VideoPlayerApi.setVolume', StandardMessageCodec());
164+
channel.setMockMessageHandler((dynamic message) async {
165+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
166+
final VolumeMessage input = VolumeMessage._fromMap(mapMessage);
167+
api.setVolume(input);
168+
return {};
169+
});
170+
}
171+
{
172+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
173+
'dev.flutter.pigeon.VideoPlayerApi.play', StandardMessageCodec());
174+
channel.setMockMessageHandler((dynamic message) async {
175+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
176+
final TextureMessage input = TextureMessage._fromMap(mapMessage);
177+
api.play(input);
178+
return {};
179+
});
180+
}
181+
{
182+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
183+
'dev.flutter.pigeon.VideoPlayerApi.position', StandardMessageCodec());
184+
channel.setMockMessageHandler((dynamic message) async {
185+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
186+
final TextureMessage input = TextureMessage._fromMap(mapMessage);
187+
final PositionMessage output = api.position(input);
188+
return {'result': output._toMap()};
189+
});
190+
}
191+
{
192+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
193+
'dev.flutter.pigeon.VideoPlayerApi.seekTo', StandardMessageCodec());
194+
channel.setMockMessageHandler((dynamic message) async {
195+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
196+
final PositionMessage input = PositionMessage._fromMap(mapMessage);
197+
api.seekTo(input);
198+
return {};
199+
});
200+
}
201+
{
202+
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
203+
'dev.flutter.pigeon.VideoPlayerApi.pause', StandardMessageCodec());
204+
channel.setMockMessageHandler((dynamic message) async {
205+
final Map<dynamic, dynamic> mapMessage = message as Map<dynamic, dynamic>;
206+
final TextureMessage input = TextureMessage._fromMap(mapMessage);
207+
api.pause(input);
208+
return {};
209+
});
210+
}
211+
}
212+
110213
class VideoPlayerApi {
111214
Future<void> initialize() async {
112215
const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(

0 commit comments

Comments
 (0)