252 lines
5.4 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|