package artist
import (
"os"
"path/filepath"
"reflect"
"testing"
)
func TestSplit(t *testing.T) {
cases := []struct {
in string
want []string
collab bool
}{
{"Porter Robinson & Madeon", []string{"Porter Robinson", "Madeon"}, true},
{"Porter Robinson and Madeon", []string{"Porter Robinson", "Madeon"}, true},
{"Boards of Canada", []string{"Boards of Canada"}, false},
{"Björk", []string{"Björk"}, false},
{"A feat. B", []string{"A", "B"}, true},
{"A, B & C", []string{"A", "B", "C"}, true},
{"", []string{""}, false},
}
for _, c := range cases {
got, collab := Split(c.in)
if !reflect.DeepEqual(got, c.want) || collab != c.collab {
t.Errorf("Split(%q) = %v,%v want %v,%v", c.in, got, collab, c.want, c.collab)
}
}
}
func TestRomanize(t *testing.T) {
cases := []struct{ in, want string }{
{"きのこ帝国", "kinoko"},
{"プライマル", "puraimaru"},
{"きのこ 帝国", "kinoko"},
{"Привет", "privet"},
{"Ελλάδα", "ellada"},
{"Boards of Canada", ""},
{"椎名林檎", ""},
}
for _, c := range cases {
if got := Romanize(c.in); got != c.want {
t.Errorf("Romanize(%q) = %q, want %q", c.in, got, c.want)
}
}
}
func TestSimilarity(t *testing.T) {
cases := []struct {
a, b string
min float64
}{
{"deadmau5", "deadmou5", 0.85},
{"porter-robinson-madeon", "porter-robinson", 0.9},
{"c418", "c418", 1.0},
{"boards-of-canada", "aphex-twin", 0.0},
}
for _, c := range cases {
got := Similarity(c.a, c.b)
if got < c.min {
t.Errorf("Similarity(%q,%q) = %.2f, want >= %.2f", c.a, c.b, got, c.min)
}
}
}
func TestResolveExactAndAlias(t *testing.T) {
ix := NewIndex()
ix.AddDir("c418")
ix.AddDir("boards-of-canada")
for _, credit := range []string{"C418", "c418", "C418 "} {
m := ix.Resolve(credit)
if len(m.Dirs) == 0 || m.Dirs[0].Dir != "c418" || !m.Dirs[0].ExactDir {
t.Errorf("Resolve(%q): got %+v, want exact c418", credit, m.Dirs)
}
}
ix.SetAlias("Various Artists", "various-artists")
ix.AddDir("various-artists")
m := ix.Resolve("Various Artists")
if len(m.Dirs) == 0 || m.Dirs[0].Dir != "various-artists" {
t.Fatalf("alias resolution failed: %+v", m.Dirs)
}
}
func TestResolveFuzzyAndNew(t *testing.T) {
ix := NewIndex()
ix.AddDir("deadmau5")
m := ix.Resolve("deadmou5")
if len(m.Dirs) == 0 || m.Dirs[0].Dir != "deadmau5" || !m.Dirs[0].Fuzzy {
t.Errorf("expected fuzzy match to deadmau5, got %+v", m.Dirs)
}
m = ix.Resolve("Aphex Twin")
last := m.Dirs[len(m.Dirs)-1]
if last.Dir != "aphex-twin" || last.Score != 0 {
t.Errorf("expected new folder aphex-twin, got %+v", m.Dirs)
}
}
func TestAliasRoundTrip(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "artists.toml")
ix := NewIndex()
ix.SetAlias("椎名林檎", "shiina-ringo")
ix.SetAlias("C418", "c418")
ix.SetAlias("Porter Robinson & Madeon", "porter-robinson")
if err := ix.SaveAliases(path); err != nil {
t.Fatal(err)
}
data, err := os.ReadFile(path)
if err != nil {
t.Fatal(err)
}
if len(data) == 0 || data[0] != '#' {
t.Errorf("alias file should start with an explanatory comment, got %q", string(data[:min(len(data), 40)]))
}
back := NewIndex()
if err := back.LoadAliases(path); err != nil {
t.Fatal(err)
}
for k, want := range ix.Alias {
if got := back.Alias[k]; got != want {
t.Errorf("alias %q round-tripped as %q, want %q", k, got, want)
}
}
}
func TestLoadAliasesMissingFile(t *testing.T) {
ix := NewIndex()
if err := ix.LoadAliases(filepath.Join(t.TempDir(), "nope.toml")); err != nil {
t.Errorf("missing alias file should not be an error, got %v", err)
}
}