Files
seanime-docker/seanime-2.9.10/internal/mediaplayers/iina/iina_test.go
2025-09-20 14:08:38 +01:00

142 lines
4.0 KiB
Go

package iina
import (
"seanime/internal/test_utils"
"seanime/internal/util"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
var testFilePath = "/Users/rahim/Documents/collection/Bocchi the Rock/[ASW] Bocchi the Rock! - 01 [1080p HEVC][EDC91675].mkv"
var testFilePath2 = "/Users/rahim/Documents/collection/One Piece/[Erai-raws] One Piece - 1072 [1080p][Multiple Subtitle][51CB925F].mkv"
func TestIina_OpenPlayPauseSeekClose(t *testing.T) {
test_utils.InitTestProvider(t, test_utils.MediaPlayer())
i := New(util.NewLogger(), "", "")
// Test Open and Play
t.Log("Open and Play...")
err := i.OpenAndPlay(testFilePath)
if err != nil {
t.Skipf("Skipping test: %v", err)
}
// Subscribe to events
sub := i.Subscribe("test")
time.Sleep(3 * time.Second)
t.Log("Get Playback Status...")
status, err := i.GetPlaybackStatus()
if err != nil {
t.Logf("Warning: Could not get playback status: %v", err)
} else {
t.Logf("Playback Status: Duration=%.2f, Position=%.2f, Playing=%t, Filename=%s",
status.Duration, status.Position, !status.Paused, status.Filename)
assert.True(t, status.IsRunning, "Player should be running")
assert.Greater(t, status.Duration, 0.0, "Duration should be greater than 0")
}
t.Log("Pause...")
err = i.Pause()
if err != nil {
t.Logf("Warning: Could not pause: %v", err)
} else {
time.Sleep(2 * time.Second)
status, err := i.GetPlaybackStatus()
if err == nil {
t.Logf("After pause - Paused: %t", status.Paused)
assert.True(t, status.Paused, "Player should be paused")
}
}
t.Log("Resume...")
err = i.Resume()
if err != nil {
t.Logf("Warning: Could not resume: %v", err)
} else {
time.Sleep(2 * time.Second)
status, err := i.GetPlaybackStatus()
if err == nil {
t.Logf("After resume - Paused: %t", status.Paused)
assert.False(t, status.Paused, "Player should not be paused")
}
}
t.Log("Seek...")
seekPosition := 30.0 // Seek to 30 seconds
err = i.Seek(seekPosition)
if err != nil {
t.Logf("Warning: Could not seek: %v", err)
} else {
time.Sleep(2 * time.Second)
status, err := i.GetPlaybackStatus()
if err == nil {
t.Logf("After seek - Position: %.2f", status.Position)
assert.InDelta(t, seekPosition, status.Position, 5.0, "Position should be close to seek position")
}
}
t.Log("SeekTo...")
seekToPosition := 60.0 // Seek to 60 seconds
err = i.SeekTo(seekToPosition)
if err != nil {
t.Logf("Warning: Could not seek to position: %v", err)
} else {
time.Sleep(2 * time.Second)
status, err := i.GetPlaybackStatus()
if err == nil {
t.Logf("After seekTo - Position: %.2f", status.Position)
assert.InDelta(t, seekToPosition, status.Position, 5.0, "Position should be close to seekTo position")
}
}
// Test loading another file
t.Log("Open another file...")
err = i.OpenAndPlay(testFilePath2)
if err != nil {
t.Logf("Warning: Could not open another file: %v", err)
} else {
time.Sleep(2 * time.Second) // Wait for the new file to load
status, err := i.GetPlaybackStatus()
if err != nil {
t.Logf("Warning: Could not get playback status after opening another file: %v", err)
} else {
t.Logf("New Playback Status: Duration=%.2f, Position=%.2f, Playing=%t, Filename=%s",
status.Duration, status.Position, !status.Paused, status.Filename)
assert.True(t, status.IsRunning, "Player should be running after opening another file")
assert.Greater(t, status.Duration, 0.0, "Duration should be greater than 0 after opening another file")
}
}
// Test Close
t.Log("Close...")
go func() {
time.Sleep(2 * time.Second)
i.CloseAll()
}()
// Wait for close event
select {
case <-sub.Closed():
t.Log("IINA exited successfully")
case <-time.After(10 * time.Second):
t.Log("Timeout waiting for IINA to close")
i.CloseAll() // Force close
}
// Verify player is not running
time.Sleep(1 * time.Second)
status, err = i.GetPlaybackStatus()
if err != nil {
t.Log("Confirmed: Player is no longer running")
} else if status != nil && !status.IsRunning {
t.Log("Confirmed: Player status shows not running")
}
t.Log("Test completed successfully")
}