lum_splash_video/test/splash_video_controller_tes...

144 lines
4.5 KiB
Dart

/*
* Copyright (c) 2026 Malloc LLC (malloc.io)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import 'package:flutter_test/flutter_test.dart';
import 'package:media_kit/media_kit.dart';
import 'package:splash_video/splash_video.dart';
void main() {
// Initialize MediaKit for testing
setUpAll(() {
MediaKit.ensureInitialized();
});
group('SplashVideoController', () {
late Player player;
setUp(() {
player = Player();
});
tearDown(() async {
await player.dispose();
});
test('creates with default values', () {
final controller = SplashVideoController();
expect(controller.loopVideo, isFalse);
expect(controller.skipRequested, isFalse);
});
test('creates with loopVideo enabled', () {
final controller = SplashVideoController(loopVideo: true);
expect(controller.loopVideo, isTrue);
});
test('throws StateError when accessing player before attach', () {
final controller = SplashVideoController();
expect(
() => controller.player,
throwsStateError,
);
});
test('allows player access after attach', () {
final controller = SplashVideoController();
controller.attach(player);
expect(controller.player, equals(player));
});
test('attach throws StateError after disposal', () {
final controller = SplashVideoController();
controller.dispose();
expect(
() => controller.attach(player),
throwsStateError,
);
});
test('skip sets skipRequested flag', () async {
final controller = SplashVideoController();
controller.attach(player);
expect(controller.skipRequested, isFalse);
await controller.skip();
expect(controller.skipRequested, isTrue);
});
test('play/pause operations work with attached player', () async {
final controller = SplashVideoController();
controller.attach(player);
// These should complete without error
await expectLater(controller.play(), completes);
await expectLater(controller.pause(), completes);
});
test('operations are no-ops after disposal', () async {
final controller = SplashVideoController();
controller.attach(player);
controller.dispose();
// These should complete without error (no-op)
await expectLater(controller.play(), completes);
await expectLater(controller.pause(), completes);
await expectLater(controller.skip(), completes);
});
test('multiple dispose calls are safe', () {
final controller = SplashVideoController();
controller.dispose();
controller.dispose();
// Should not throw
});
});
group('SplashVideoController lifecycle', () {
test('can create multiple controllers', () {
final controller1 = SplashVideoController();
final controller2 = SplashVideoController(loopVideo: true);
expect(controller1.loopVideo, isFalse);
expect(controller2.loopVideo, isTrue);
controller1.dispose();
controller2.dispose();
});
test('skipRequested resets on new controller', () async {
final player1 = Player();
final controller1 = SplashVideoController();
controller1.attach(player1);
await controller1.skip();
expect(controller1.skipRequested, isTrue);
controller1.dispose();
final controller2 = SplashVideoController();
expect(controller2.skipRequested, isFalse);
controller2.dispose();
await player1.dispose();
});
});
}