144 lines
4.5 KiB
Dart
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();
|
|
});
|
|
});
|
|
}
|