require "test/unit"
require "ogg/vorbis/tagger"
require "fileutils"
-require "stringio"
-require "open3"
+require "digest/md5"
class MainTest < Test::Unit::TestCase
OGG_FILE = "test/test.ogg"
def setup
- tmp =<<EOF
--c "artist=Bolt Thrower" -c "album=...For Victory" -c "date=1994"
-EOF
-
- @ogg_buf = StringIO.new
- cmd = "oggenc -q 0 #{tmp.strip} -r -"
-
- Open3.popen3(cmd) do |sin, sout, _|
- sin.write("\0\0\0\0")
- sin.close
-
- begin
- tmp = sout.read
- @ogg_buf << tmp
- end while !tmp.length.zero?
- end
-
- @ogg_buf.seek(0)
+ FileUtils.cp("test/sample.ogg", OGG_FILE)
end
def teardown
- @ogg_buf.close
+ FileUtils.rm_f(OGG_FILE)
end
def test_read
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
# make sure the keys are returned in the correct order
assert_equal(["artist", "album", "date"], t.comments.keys)
assert_equal(["Bolt Thrower", "...For Victory", "1994"],
end
end
+ def test_write_is_non_destructive
+ a = Digest::MD5.hexdigest(File.read(OGG_FILE))
+
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ t.write
+ end
+
+ b = Digest::MD5.hexdigest(File.read(OGG_FILE))
+
+ assert_equal(a, b)
+ end
+
+ def test_multiple_writes
+ a = Digest::MD5.hexdigest(File.read(OGG_FILE))
+
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ 1.upto(10) do
+ t.write
+ end
+ end
+
+ b = Digest::MD5.hexdigest(File.read(OGG_FILE))
+
+ assert_equal(a, b)
+ end
+
def test_write_stable_order
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert_equal(3, t.write)
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert_equal(["artist", "album", "date"], t.comments.keys)
end
end
def test_write_stable_order_change
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
t.comments["artist"] = "Ballista"
assert_equal(3, t.write)
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert_equal(["artist", "album", "date"], t.comments.keys)
end
end
+ def test_write_keeps_file_mode
+ mode = File.stat(OGG_FILE).mode
+
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ t.write
+ end
+
+ assert_equal(mode, File.stat(OGG_FILE).mode)
+ end
+
def test_append
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
t.comments["genre"] = "Death Metal"
assert_equal(4, t.write)
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert_equal("Death Metal", t.comments["genre"])
end
end
def test_delete
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert_equal("...For Victory", t.comments.delete("album"))
assert_nil(t.comments.delete("foo"))
assert_equal(2, t.write)
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert_equal(["artist", "date"], t.comments.keys)
end
end
def test_clear
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
t.comments.clear
assert_equal(0, t.write)
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert(t.comments.empty?)
end
end
def test_empty
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert(!t.comments.empty?)
t.comments.delete("artist")
assert_equal(0, t.write)
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert(t.comments.empty?)
end
end
def test_each
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
a = {
"artist" => "Bolt Thrower",
"album" => "...For Victory",
end
def test_each_key
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
b = []
t.comments.each_key do |k|
end
def test_each_value
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
b = []
t.comments.each_value do |v|
end
def test_inspect
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
tmp=<<EOF
{"artist"=>"Bolt Thrower", "album"=>"...For Victory", "date"=>"1994"}
EOF
end
def test_has_key
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
assert(t.comments.has_key?("artist"))
assert(!t.comments.has_key?("foo"))
+
+ assert(t.comments.key?("artist"))
+ assert(t.comments.include?("artist"))
+ assert(t.comments.member?("artist"))
end
end
a = nil
b = nil
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
a = t.comments
end
- @ogg_buf.seek(0)
-
- Ogg::Vorbis::Tagger.open(@ogg_buf) do |t|
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
b = t.comments
end
b["artist"] = "Foo"
assert_equal(-1, a <=> b)
end
+
+ def test_modify_existing_key
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ assert_raises(TypeError) do
+ t.comments.keys.first.replace("new")
+ end
+ end
+ end
+
+ def test_modify_added_key
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ t.comments["Foo"] = "Bar"
+
+ assert_raises(TypeError) do
+ t.comments.keys.last.replace("new")
+ end
+ end
+ end
+
+ def test_merge
+ repl = {
+ "artist" => "Ballista",
+ "genre" => "Death Metal",
+ }
+
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ t.comments.merge!(repl)
+
+ assert_equal(["artist", "album", "date", "genre"],
+ t.comments.keys)
+ assert_equal(["Ballista", "...For Victory", "1994",
+ "Death Metal"],
+ t.comments.values)
+ end
+ end
+
+ def test_shift
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ assert_equal(["artist", "Bolt Thrower"], t.comments.shift)
+ assert_equal(["album", "...For Victory"], t.comments.shift)
+ assert_equal(["date", "1994"], t.comments.shift)
+ assert_equal(nil, t.comments.shift)
+ end
+ end
+
+ def test_close
+ Ogg::Vorbis::Tagger.new(OGG_FILE).close
+ end
+
+ def test_close2
+ t = Ogg::Vorbis::Tagger.new(OGG_FILE)
+ t.close
+
+ assert_raise(Ogg::Vorbis::Tagger::ClosedStreamError) do
+ t.close
+ end
+
+ assert_raise(Ogg::Vorbis::Tagger::ClosedStreamError) do
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ t.close
+ end
+ end
+ end
+
+ def test_open_non_existing_file
+ assert_raises(Ogg::Vorbis::Tagger::OpenError) do
+ Ogg::Vorbis::Tagger.new("foo.bar")
+ end
+ end
+
+ def test_open_non_ogg_file
+ File.open("test/foo.bar", "w") do |f|
+ f << "foobarbazxyzzy"
+ end
+
+ assert_raises(Ogg::Vorbis::Tagger::InvalidDataError) do
+ Ogg::Vorbis::Tagger.new("test/foo.bar")
+ end
+ ensure
+ FileUtils.rm_f("test/foo.bar")
+ end
end