Prefer rb_funcall2() over rb_funcall().
[ruby-vorbistagger.git] / test / test_main.rb
index 802c9c5385d3ea1d5a040d3deef87f2e1a30971b..fe622e674a70fd2e1517f595023c40ffc370b04f 100644 (file)
@@ -1,30 +1,13 @@
 require "test/unit"
 require "ogg/vorbis/tagger"
 require "fileutils"
-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
-
-               f = File.open(OGG_FILE, "w")
-               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
-                               f << tmp
-                       end while !tmp.length.zero?
-               end
-
-               f.close
+               FileUtils.cp("test/sample.ogg", OGG_FILE)
        end
 
        def teardown
@@ -47,6 +30,32 @@ EOF
                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_FILE) do |t|
                        assert_equal(3, t.write)
@@ -68,6 +77,16 @@ EOF
                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_FILE) do |t|
                        t.comments["genre"] = "Death Metal"
@@ -231,6 +250,14 @@ EOF
                end
        end
 
+       def test_merge_bad_arg
+               Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+                       assert_raises(ArgumentError) do
+                               t.comments.merge!(42)
+                       end
+               end
+       end
+
        def test_shift
                Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
                        assert_equal(["artist", "Bolt Thrower"], t.comments.shift)
@@ -239,4 +266,46 @@ EOF
                        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
+
+       def test_standalone_comments_object
+               o = Ogg::Vorbis::Comments.new
+               assert_equal(o.length, 0);
+       end
 end