require 'test/unit'
require 'solution'

$songs = <<SONGS
My Favourite Things;    John Coltrane;      Jazz, Bebop;        popular, cover
Greensleves;            John Coltrane;      Jazz, Bebop;        popular, cover
Alabama;                John Coltrane;      Jazz, Avantgarde;   melancholic
Acknowledgement;        John Coltrane;      Jazz, Avantgarde;
Afro Blue;              John Coltrane;      Jazz;               melancholic
'Round Midnight;        John Coltrane;      Jazz;
My Funny Valentine;     Miles Davis;        Jazz;               popular
Tutu;                   Miles Davis;        Jazz, Fusion;
Miles Runs The Voodo Down; Miles Davis;     Jazz, Fusion;
Boplicity;              Miles Davis;        Jazz, Bebop;
Autumn Leaves;          Bill Evans;         Jazz;               popular
Waltz for Debbie;       Bill Evans;         Jazz;
'Round Midnight;        Thelonious Monk;    Jazz, Bebop;
Ruby, My Dear;          Thelonious Monk;    Jazz;               saxophone
Fur Elise;              L.v. Beethoven;     Classical;          popular
Moonlight Sonata;       L.v. Beethoven;     Classical;          popular
Pathetique;             L.v. Beethoven;     Classical;
Toccata e Fuga;         J.S. Bach;          Classical, Baroque; popular
Goldberg Variations;    J.S. Bach;          Classical, Baroque;
Eine Kleine Nachtmusik; W.A. Mozart;        Classical;          popular, violin
SONGS

$artist_tags = {
  "John Coltrane" => [:saxophone],
  "J.S. Bach" => [:piano, :polyphony],
  "Bill Evans" => [:piano],
  "Thelonious Monk" => [:piano],
  "Miles Davis" => [:trumpet],
  "L.v. Beethoven" => [:piano],
  "W.A. Mozart" => [:piano],
}

class SampleClassicsAndJazzTest < Test::Unit::TestCase

  def setup
    @collection = Collection.new($songs, $artist_tags)
  end

  def test_song_methods
    goldberg = @collection.find(:song, :name => "Goldberg Variations").first

    assert_equal "Goldberg Variations", goldberg.name
    assert_equal "J.S. Bach", goldberg.artist
    assert_equal "Classical", goldberg.genre
    assert_equal "Baroque", goldberg.subgenre
    assert_equal [:classical, :baroque, :piano, :polyphony].sort_by { |t| t.to_s }, goldberg.tags.sort_by { |t| t.to_s }
  end

  def test_get_subgenre
    subgenres = @collection.find(:subgenre, :artist => "John Coltrane", :tags => :jazz)

    assert_equal ["Bebop", "Avantgarde"].sort, subgenres.sort
  end

  def test_get_tags_and_iterator
    @collection.find(:song, :tags => [:jazz, :piano!, :saxophone!]) do |song|
      assert_equal "Miles Davis", song.artist
    end
  end
end

