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

252 lines
5.4 KiB
Go

package mpv
import (
"seanime/internal/test_utils"
"seanime/internal/util"
"testing"
"time"
"github.com/davecgh/go-spew/spew"
"github.com/stretchr/testify/assert"
)
var testFilePath = "E:\\ANIME\\[SubsPlease] Bocchi the Rock! (01-12) (1080p) [Batch]\\[SubsPlease] Bocchi the Rock! - 01v2 (1080p) [ABDDAE16].mkv"
func TestMpv_OpenAndPlay(t *testing.T) {
test_utils.InitTestProvider(t, test_utils.MediaPlayer())
m := New(util.NewLogger(), "", "")
err := m.OpenAndPlay(testFilePath)
if err != nil {
t.Fatal(err)
}
sub := m.Subscribe("test")
go func() {
time.Sleep(2 * time.Second)
m.CloseAll()
}()
select {
case v, _ := <-sub.Closed():
t.Logf("mpv exited, %+v", v)
break
}
t.Log("Done")
}
func TestMpv_OpenAndPlayPath(t *testing.T) {
test_utils.InitTestProvider(t, test_utils.MediaPlayer())
m := New(util.NewLogger(), "", test_utils.ConfigData.Provider.MpvPath)
err := m.OpenAndPlay(testFilePath)
if err != nil {
t.Fatal(err)
}
sub := m.Subscribe("test")
select {
case v, _ := <-sub.Closed():
t.Logf("mpv exited, %+v", v)
break
}
t.Log("Done")
}
func TestMpv_Playback(t *testing.T) {
test_utils.InitTestProvider(t, test_utils.MediaPlayer())
m := New(util.NewLogger(), "", "")
err := m.OpenAndPlay(testFilePath)
if err != nil {
t.Fatal(err)
}
sub := m.Subscribe("test")
loop:
for {
select {
case v, _ := <-sub.Closed():
t.Logf("mpv exited, %+v", v)
break loop
default:
spew.Dump(m.GetPlaybackStatus())
time.Sleep(2 * time.Second)
}
}
t.Log("Done")
}
func TestMpv_Multiple(t *testing.T) {
test_utils.InitTestProvider(t, test_utils.MediaPlayer())
m := New(util.NewLogger(), "", "")
err := m.OpenAndPlay(testFilePath)
if err != nil {
t.Fatal(err)
}
time.Sleep(2 * time.Second)
err = m.OpenAndPlay(testFilePath)
if !assert.NoError(t, err) {
t.Log("error opening mpv instance twice")
}
sub := m.Subscribe("test")
go func() {
time.Sleep(2 * time.Second)
m.CloseAll()
}()
select {
case v, _ := <-sub.Closed():
t.Logf("mpv exited, %+v", v)
break
}
t.Log("Done")
}
// Test parseArgs function
func TestParseArgs(t *testing.T) {
tests := []struct {
name string
input string
expected []string
hasError bool
}{
{
name: "simple arguments",
input: "--fullscreen --volume=50",
expected: []string{"--fullscreen", "--volume=50"},
hasError: false,
},
{
name: "double quoted argument",
input: "--title=\"My Movie Name\"",
expected: []string{"--title=My Movie Name"},
hasError: false,
},
{
name: "single quoted argument",
input: "--title='My Movie Name'",
expected: []string{"--title=My Movie Name"},
hasError: false,
},
{
name: "space separated quoted argument",
input: "--title \"My Movie Name\"",
expected: []string{"--title", "My Movie Name"},
hasError: false,
},
{
name: "single space separated quoted argument",
input: "--title 'My Movie Name'",
expected: []string{"--title", "My Movie Name"},
hasError: false,
},
{
name: "mixed arguments",
input: "--fullscreen --title \"My Movie\" --volume=50",
expected: []string{"--fullscreen", "--title", "My Movie", "--volume=50"},
hasError: false,
},
{
name: "path with spaces",
input: "--subtitle-file \"C:\\Program Files\\subtitles\\movie.srt\"",
expected: []string{"--subtitle-file", "C:\\Program Files\\subtitles\\movie.srt"},
hasError: false,
},
{
name: "escaped quotes",
input: "--title \"Movie with \\\"quotes\\\" in title\"",
expected: []string{"--title", "Movie with \"quotes\" in title"},
hasError: false,
},
{
name: "empty string",
input: "",
expected: []string{},
hasError: false,
},
{
name: "only spaces",
input: " ",
expected: []string{},
hasError: false,
},
{
name: "tabs and spaces",
input: "--fullscreen\t\t--volume=50 --loop",
expected: []string{"--fullscreen", "--volume=50", "--loop"},
hasError: false,
},
{
name: "unclosed double quote",
input: "--title \"My Movie",
expected: nil,
hasError: true,
},
{
name: "unclosed single quote",
input: "--title 'My Movie",
expected: nil,
hasError: true,
},
{
name: "nested quotes",
input: "--title \"Movie 'with' nested quotes\"",
expected: []string{"--title", "Movie 'with' nested quotes"},
hasError: false,
},
{
name: "complex mixed case",
input: "--fullscreen --title=\"Complex Movie\" --volume 75 --subtitle-file 'path/with spaces/sub.srt' --loop",
expected: []string{"--fullscreen", "--title=Complex Movie", "--volume", "75", "--subtitle-file", "path/with spaces/sub.srt", "--loop"},
hasError: false,
},
{
name: "empty quoted string",
input: "--title \"\"",
expected: []string{"--title", ""},
hasError: false,
},
{
name: "multiple spaces between args",
input: "--fullscreen --volume=50",
expected: []string{"--fullscreen", "--volume=50"},
hasError: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, err := parseArgs(tt.input)
if tt.hasError {
assert.Error(t, err, "Expected error for input: %q", tt.input)
assert.Nil(t, result, "Expected nil result when error occurs")
} else {
assert.NoError(t, err, "Unexpected error for input: %q", tt.input)
assert.Equal(t, tt.expected, result, "Mismatch for input: %q", tt.input)
}
})
}
}