taglib-ruby 0.6.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -1
- data/{CHANGES.md → CHANGELOG.md} +46 -11
- data/README.md +61 -17
- data/Rakefile +12 -3
- data/docs/taglib/aiff.rb +95 -0
- data/docs/taglib/base.rb +30 -2
- data/docs/taglib/flac.rb +60 -4
- data/docs/taglib/id3v1.rb +29 -0
- data/docs/taglib/id3v2.rb +22 -3
- data/docs/taglib/mp4.rb +124 -13
- data/docs/taglib/mpeg.rb +30 -1
- data/docs/taglib/ogg.rb +47 -5
- data/docs/taglib/riff.rb +3 -0
- data/docs/taglib/vorbis.rb +1 -1
- data/docs/taglib/wav.rb +116 -0
- data/ext/extconf_common.rb +24 -3
- data/ext/taglib_aiff/extconf.rb +4 -0
- data/ext/taglib_aiff/taglib_aiff.i +84 -0
- data/ext/taglib_aiff/taglib_aiff_wrap.cxx +3111 -0
- data/ext/taglib_base/includes.i +34 -5
- data/ext/taglib_base/taglib_base.i +42 -2
- data/ext/taglib_base/taglib_base_wrap.cxx +226 -186
- data/ext/taglib_flac/taglib_flac.i +21 -18
- data/ext/taglib_flac/taglib_flac_wrap.cxx +519 -955
- data/ext/taglib_flac_picture/extconf.rb +4 -0
- data/ext/taglib_flac_picture/includes.i +15 -0
- data/ext/taglib_flac_picture/taglib_flac_picture.i +15 -0
- data/ext/taglib_flac_picture/taglib_flac_picture_wrap.cxx +3087 -0
- data/ext/taglib_id3v1/taglib_id3v1.i +19 -0
- data/ext/taglib_id3v1/taglib_id3v1_wrap.cxx +391 -193
- data/ext/taglib_id3v2/relativevolumeframe.i +4 -17
- data/ext/taglib_id3v2/taglib_id3v2.i +72 -2
- data/ext/taglib_id3v2/taglib_id3v2_wrap.cxx +3051 -1113
- data/ext/taglib_mp4/taglib_mp4.i +101 -20
- data/ext/taglib_mp4/taglib_mp4_wrap.cxx +1088 -282
- data/ext/taglib_mpeg/taglib_mpeg.i +11 -16
- data/ext/taglib_mpeg/taglib_mpeg_wrap.cxx +646 -317
- data/ext/taglib_ogg/taglib_ogg.i +11 -0
- data/ext/taglib_ogg/taglib_ogg_wrap.cxx +478 -192
- data/ext/taglib_vorbis/taglib_vorbis.i +8 -0
- data/ext/taglib_vorbis/taglib_vorbis_wrap.cxx +202 -156
- data/ext/taglib_wav/extconf.rb +4 -0
- data/ext/taglib_wav/taglib_wav.i +90 -0
- data/ext/taglib_wav/taglib_wav_wrap.cxx +3423 -0
- data/lib/taglib.rb +2 -0
- data/lib/taglib/aiff.rb +7 -0
- data/lib/taglib/mp4.rb +2 -1
- data/lib/taglib/version.rb +2 -2
- data/lib/taglib/wav.rb +11 -0
- data/taglib-ruby.gemspec +42 -8
- data/tasks/ext.rake +48 -20
- data/tasks/gemspec_check.rake +1 -1
- data/tasks/swig.rake +36 -2
- data/test/aiff_examples_test.rb +39 -0
- data/test/aiff_file_test.rb +103 -0
- data/test/aiff_file_write_test.rb +88 -0
- data/test/data/Makefile +8 -2
- data/test/data/aiff-sample.aiff +0 -0
- data/test/data/flac_nopic.flac +0 -0
- data/test/data/vorbis-create.cpp +20 -1
- data/test/data/vorbis.oga +0 -0
- data/test/data/wav-create.cpp +55 -0
- data/test/data/wav-dump.cpp +74 -0
- data/test/data/wav-sample.wav +0 -0
- data/test/file_test.rb +21 -0
- data/test/fileref_properties_test.rb +1 -1
- data/test/flac_file_test.rb +45 -30
- data/test/flac_picture_memory_test.rb +43 -0
- data/test/id3v1_genres_test.rb +23 -0
- data/test/id3v1_tag_test.rb +1 -0
- data/test/id3v2_frames_test.rb +64 -0
- data/test/id3v2_tag_test.rb +6 -6
- data/test/id3v2_unknown_frames_test.rb +30 -0
- data/test/id3v2_write_test.rb +10 -13
- data/test/mp4_file_test.rb +33 -4
- data/test/mp4_file_write_test.rb +5 -5
- data/test/mp4_items_test.rb +83 -29
- data/test/mpeg_file_test.rb +120 -7
- data/test/vorbis_file_test.rb +2 -2
- data/test/vorbis_tag_test.rb +61 -7
- data/test/wav_examples_test.rb +42 -0
- data/test/wav_file_test.rb +108 -0
- data/test/wav_file_write_test.rb +113 -0
- metadata +86 -56
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class TestVorbisTag < Test::Unit::TestCase
|
4
|
+
context "TagLib::ID3v1" do
|
5
|
+
should "list genres" do
|
6
|
+
assert_equal "Jazz", TagLib::ID3v1::genre_list[8]
|
7
|
+
end
|
8
|
+
|
9
|
+
should "map genres to their index" do
|
10
|
+
assert_equal 8, TagLib::ID3v1::genre_map["Jazz"]
|
11
|
+
end
|
12
|
+
|
13
|
+
should "support to query the value of a genre" do
|
14
|
+
assert_equal "Jazz", TagLib::ID3v1::genre(8)
|
15
|
+
assert_equal "", TagLib::ID3v1::genre(255)
|
16
|
+
end
|
17
|
+
|
18
|
+
should "support to query the index of a genre" do
|
19
|
+
assert_equal 8, TagLib::ID3v1::genre_index("Jazz")
|
20
|
+
assert_equal 255, TagLib::ID3v1::genre_index("Unknown")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/test/id3v1_tag_test.rb
CHANGED
@@ -22,6 +22,7 @@ class TestID3v1Tag < Test::Unit::TestCase
|
|
22
22
|
assert_equal 'Album', @tag.album
|
23
23
|
assert_equal 'Comment', @tag.comment
|
24
24
|
assert_equal 'Pop', @tag.genre
|
25
|
+
assert_equal 13, @tag.genre_number
|
25
26
|
assert_equal 2011, @tag.year
|
26
27
|
assert_equal 7, @tag.track
|
27
28
|
assert_equal false, @tag.empty?
|
data/test/id3v2_frames_test.rb
CHANGED
@@ -92,6 +92,70 @@ class TestID3v2Frames < Test::Unit::TestCase
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
+
context 'CTOC and CHAP frames' do
|
96
|
+
setup do
|
97
|
+
@chapters = [
|
98
|
+
{ id: 'CH1', start_time: 100, end_time: 200 },
|
99
|
+
{ id: 'CH2', start_time: 201, end_time: 300 },
|
100
|
+
{ id: 'CH3', start_time: 301, end_time: 400 }
|
101
|
+
]
|
102
|
+
|
103
|
+
@default_ctoc = TagLib::ID3v2::TableOfContentsFrame.new('Test')
|
104
|
+
@default_chap = TagLib::ID3v2::ChapterFrame.new('Test', 0, 1, 0xFFFFFFFF, 0xFFFFFFFF)
|
105
|
+
end
|
106
|
+
|
107
|
+
should 'not have a CTOC frame' do
|
108
|
+
assert_equal [], @tag.frame_list('CTOC')
|
109
|
+
end
|
110
|
+
|
111
|
+
should 'not have a CHAP frame' do
|
112
|
+
assert_equal [], @tag.frame_list('CHAP')
|
113
|
+
end
|
114
|
+
|
115
|
+
should 'have one CTOC frame (only one Table of Contents)' do
|
116
|
+
toc = TagLib::ID3v2::TableOfContentsFrame.new('TOC')
|
117
|
+
toc.is_top_level = true
|
118
|
+
toc.is_ordered = true
|
119
|
+
|
120
|
+
@chapters.each do |chapter|
|
121
|
+
toc.add_child_element(chapter[:id])
|
122
|
+
end
|
123
|
+
|
124
|
+
@tag.add_frame(toc)
|
125
|
+
|
126
|
+
ctoc_frame_list = @tag.frame_list('CTOC')
|
127
|
+
assert_equal @default_ctoc.class, ctoc_frame_list.first.class
|
128
|
+
assert_equal 1, ctoc_frame_list.size
|
129
|
+
assert_equal 'TOC', ctoc_frame_list.first.element_id
|
130
|
+
assert_equal 3, ctoc_frame_list.first.child_elements.size
|
131
|
+
assert_equal %w[CH1 CH2 CH3], ctoc_frame_list.first.child_elements
|
132
|
+
end
|
133
|
+
|
134
|
+
should 'have CHAP frames (multiple chapters)' do
|
135
|
+
start_offset = 0xFFFFFFFF
|
136
|
+
end_offset = 0xFFFFFFFF
|
137
|
+
|
138
|
+
@chapters.each do |chapter|
|
139
|
+
chapter_frame = TagLib::ID3v2::ChapterFrame.new(
|
140
|
+
chapter[:id],
|
141
|
+
chapter[:start_time].to_i,
|
142
|
+
chapter[:end_time].to_i,
|
143
|
+
start_offset,
|
144
|
+
end_offset
|
145
|
+
)
|
146
|
+
|
147
|
+
@tag.add_frame(chapter_frame)
|
148
|
+
end
|
149
|
+
|
150
|
+
chap_frame_list = @tag.frame_list('CHAP')
|
151
|
+
assert_equal @default_chap.class, chap_frame_list.first.class
|
152
|
+
assert_equal 3, chap_frame_list.size
|
153
|
+
assert_equal 'CH1', chap_frame_list[0].element_id
|
154
|
+
assert_equal 'CH2', chap_frame_list[1].element_id
|
155
|
+
assert_equal 'CH3', chap_frame_list[2].element_id
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
95
159
|
context "TXXX frame" do
|
96
160
|
setup do
|
97
161
|
@txxx_frame = @tag.frame_list('TXXX').first
|
data/test/id3v2_tag_test.rb
CHANGED
@@ -43,12 +43,12 @@ class TestID3v2Tag < Test::Unit::TestCase
|
|
43
43
|
assert @tag.empty?
|
44
44
|
end
|
45
45
|
|
46
|
-
should "have
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
should "have empty string attributes" do
|
47
|
+
assert_equal "", @tag.title
|
48
|
+
assert_equal "", @tag.artist
|
49
|
+
assert_equal "", @tag.album
|
50
|
+
assert_equal "", @tag.comment
|
51
|
+
assert_equal "", @tag.genre
|
52
52
|
end
|
53
53
|
|
54
54
|
should "have 0 for numeric attributes" do
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class TestID3v2UnknownFrames < Test::Unit::TestCase
|
4
|
+
context "UnknownFrame" do
|
5
|
+
setup do
|
6
|
+
read_properties = false
|
7
|
+
@file = TagLib::MPEG::File.new("test/data/sample.mp3", read_properties)
|
8
|
+
@tag = @file.id3v2_tag
|
9
|
+
end
|
10
|
+
|
11
|
+
should "should be returned with correct class" do
|
12
|
+
f = TagLib::ID3v2::UnknownFrame.new("TDAT")
|
13
|
+
assert_not_nil f
|
14
|
+
@tag.add_frame(f)
|
15
|
+
frames = @tag.frame_list("TDAT")
|
16
|
+
tdat = frames.first
|
17
|
+
assert_not_nil tdat
|
18
|
+
# By looking at ID alone, it would have returned a
|
19
|
+
# TextIdentificationFrame. So make sure the correct
|
20
|
+
# class is returned here, because it would result in
|
21
|
+
# segfaults when calling methods on it.
|
22
|
+
assert_equal TagLib::ID3v2::UnknownFrame, tdat.class
|
23
|
+
end
|
24
|
+
|
25
|
+
teardown do
|
26
|
+
@file.close
|
27
|
+
@file = nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/test/id3v2_write_test.rb
CHANGED
@@ -54,21 +54,18 @@ class TestID3v2Write < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
should "be able to save ID3v2.3
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
@file.close
|
63
|
-
@file = nil
|
57
|
+
should "be able to save ID3v2.3" do
|
58
|
+
success = @file.save(TagLib::MPEG::File::ID3v2, true, 3)
|
59
|
+
assert_equal true, success
|
60
|
+
@file.close
|
61
|
+
@file = nil
|
64
62
|
|
65
|
-
|
66
|
-
|
67
|
-
end
|
68
|
-
# 3 stands for v2.3
|
69
|
-
s = "ID3" + 3.chr + 0.chr
|
70
|
-
assert_equal s, header
|
63
|
+
header = File.open(OUTPUT_FILE, 'rb') do |f|
|
64
|
+
f.read(5)
|
71
65
|
end
|
66
|
+
# 3 stands for v2.3
|
67
|
+
s = "ID3" + 3.chr + 0.chr
|
68
|
+
assert_equal s, header
|
72
69
|
end
|
73
70
|
|
74
71
|
should "be able to set fields to nil" do
|
data/test/mp4_file_test.rb
CHANGED
@@ -7,6 +7,11 @@ class MP4FileTest < Test::Unit::TestCase
|
|
7
7
|
@tag = @file.tag
|
8
8
|
end
|
9
9
|
|
10
|
+
should "have an MP4 tag" do
|
11
|
+
assert @file.mp4_tag?
|
12
|
+
refute_nil @tag
|
13
|
+
end
|
14
|
+
|
10
15
|
should "contain basic tag information" do
|
11
16
|
assert_equal "Title", @tag.title
|
12
17
|
assert_equal "Artist", @tag.artist
|
@@ -15,9 +20,33 @@ class MP4FileTest < Test::Unit::TestCase
|
|
15
20
|
assert_equal "Pop", @tag.genre
|
16
21
|
assert_equal 2011, @tag.year
|
17
22
|
assert_equal 7, @tag.track
|
23
|
+
|
18
24
|
assert_equal false, @tag.empty?
|
19
25
|
end
|
20
26
|
|
27
|
+
should "support testing for the presence of items" do
|
28
|
+
refute @tag.contains "unknown"
|
29
|
+
assert @tag.contains "trkn"
|
30
|
+
end
|
31
|
+
|
32
|
+
should "support accessing items" do
|
33
|
+
refute @tag["unkn"].valid?
|
34
|
+
|
35
|
+
assert @tag["trkn"].valid?
|
36
|
+
assert_equal 7, @tag.track
|
37
|
+
end
|
38
|
+
|
39
|
+
should "support editing items" do
|
40
|
+
@tag["trkn"] = TagLib::MP4::Item.from_int(1)
|
41
|
+
assert_equal 1, @tag.track
|
42
|
+
end
|
43
|
+
|
44
|
+
should "support removing items" do
|
45
|
+
assert @tag.contains "trkn"
|
46
|
+
@tag.remove_item("trkn")
|
47
|
+
refute @tag.contains "trkn"
|
48
|
+
end
|
49
|
+
|
21
50
|
context "audio properties" do
|
22
51
|
setup do
|
23
52
|
@properties = @file.audio_properties
|
@@ -28,8 +57,8 @@ class MP4FileTest < Test::Unit::TestCase
|
|
28
57
|
end
|
29
58
|
|
30
59
|
should "contain basic information" do
|
31
|
-
assert_equal 1, @properties.
|
32
|
-
assert_equal
|
60
|
+
assert_equal 1, @properties.length_in_seconds
|
61
|
+
assert_equal 55, @properties.bitrate
|
33
62
|
assert_equal 44100, @properties.sample_rate
|
34
63
|
# The test file is mono, this appears to be a TagLib bug
|
35
64
|
assert_equal 2, @properties.channels
|
@@ -37,8 +66,8 @@ class MP4FileTest < Test::Unit::TestCase
|
|
37
66
|
|
38
67
|
should "contain mp4-specific information" do
|
39
68
|
assert_equal 16, @properties.bits_per_sample
|
40
|
-
|
41
|
-
|
69
|
+
assert_equal false, @properties.encrypted?
|
70
|
+
assert_equal TagLib::MP4::Properties::AAC, @properties.codec
|
42
71
|
end
|
43
72
|
end
|
44
73
|
|
data/test/mp4_file_write_test.rb
CHANGED
@@ -34,22 +34,22 @@ class MP4FileWriteTest < Test::Unit::TestCase
|
|
34
34
|
end
|
35
35
|
|
36
36
|
should "be able to add and save new cover art" do
|
37
|
-
|
38
|
-
cover_art_list =
|
37
|
+
item_map = @file.tag.item_map
|
38
|
+
cover_art_list = item_map['covr'].to_cover_art_list
|
39
39
|
assert_equal 1, cover_art_list.size
|
40
40
|
|
41
41
|
data = File.open(PICTURE_FILE, 'rb') { |f| f.read }
|
42
42
|
new_cover_art = TagLib::MP4::CoverArt.new(TagLib::MP4::CoverArt::JPEG, data)
|
43
43
|
|
44
44
|
cover_art_list << new_cover_art
|
45
|
-
|
46
|
-
assert_equal 2,
|
45
|
+
item_map.insert('covr', TagLib::MP4::Item.from_cover_art_list(cover_art_list))
|
46
|
+
assert_equal 2, item_map['covr'].to_cover_art_list.size
|
47
47
|
|
48
48
|
success = @file.save
|
49
49
|
assert success
|
50
50
|
|
51
51
|
reloaded do |file|
|
52
|
-
written_cover_art = file.tag.
|
52
|
+
written_cover_art = file.tag.item_map['covr'].to_cover_art_list.last
|
53
53
|
assert_equal TagLib::MP4::CoverArt::JPEG, written_cover_art.format
|
54
54
|
assert_equal data, written_cover_art.data
|
55
55
|
end
|
data/test/mp4_items_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require File.join(File.dirname(__FILE__), 'helper')
|
3
|
+
require 'set'
|
3
4
|
|
4
5
|
class MP4ItemsTest < Test::Unit::TestCase
|
5
6
|
ITUNES_LEADER = "\xC2\xA9"
|
@@ -8,44 +9,44 @@ class MP4ItemsTest < Test::Unit::TestCase
|
|
8
9
|
setup do
|
9
10
|
@file = TagLib::MP4::File.new("test/data/mp4.m4a")
|
10
11
|
@tag = @file.tag
|
11
|
-
@
|
12
|
+
@item_map = @file.tag.item_map
|
12
13
|
@item_keys = [
|
13
|
-
"
|
14
|
+
"covr", "#{ITUNES_LEADER}nam", "#{ITUNES_LEADER}ART", "#{ITUNES_LEADER}alb",
|
14
15
|
"#{ITUNES_LEADER}cmt", "#{ITUNES_LEADER}gen", "#{ITUNES_LEADER}day",
|
15
16
|
"trkn", "#{ITUNES_LEADER}too", "#{ITUNES_LEADER}cpy"
|
16
17
|
]
|
17
18
|
end
|
18
19
|
|
19
|
-
context "
|
20
|
+
context "item_map" do
|
20
21
|
should "exist" do
|
21
|
-
assert_not_nil @
|
22
|
+
assert_not_nil @item_map
|
22
23
|
end
|
23
24
|
|
24
25
|
should "not be empty" do
|
25
|
-
assert_equal false, @
|
26
|
+
assert_equal false, @item_map.empty?
|
26
27
|
end
|
27
28
|
|
28
29
|
should "contain 10 items" do
|
29
|
-
assert_equal @item_keys.count, @
|
30
|
+
assert_equal @item_keys.count, @item_map.size
|
30
31
|
end
|
31
32
|
|
32
33
|
should "have keys" do
|
33
|
-
assert_equal true, @
|
34
|
-
assert_equal true, @
|
35
|
-
assert_equal true, @
|
36
|
-
assert_equal false, @
|
34
|
+
assert_equal true, @item_map.contains("trkn")
|
35
|
+
assert_equal true, @item_map.has_key?("#{ITUNES_LEADER}too")
|
36
|
+
assert_equal true, @item_map.include?("#{ITUNES_LEADER}cpy")
|
37
|
+
assert_equal false, @item_map.include?("none such key")
|
37
38
|
end
|
38
39
|
|
39
40
|
should "look up keys" do
|
40
|
-
assert_nil @
|
41
|
-
assert_equal ["Title"], @
|
41
|
+
assert_nil @item_map["none such key"]
|
42
|
+
assert_equal ["Title"], @item_map["#{ITUNES_LEADER}nam"].to_string_list
|
42
43
|
end
|
43
44
|
|
44
45
|
should "be clearable" do
|
45
|
-
assert_equal 10, @
|
46
|
-
comment = @
|
47
|
-
@
|
48
|
-
assert_equal true, @
|
46
|
+
assert_equal 10, @item_map.size
|
47
|
+
comment = @item_map["#{ITUNES_LEADER}cmt"]
|
48
|
+
@item_map.clear
|
49
|
+
assert_equal true, @item_map.empty?
|
49
50
|
begin
|
50
51
|
comment.to_string_list
|
51
52
|
flunk("Should have raised ObjectPreviouslyDeleted.")
|
@@ -54,23 +55,29 @@ class MP4ItemsTest < Test::Unit::TestCase
|
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
should "be
|
58
|
-
array = @
|
58
|
+
should "be convertible to an array" do
|
59
|
+
array = @item_map.to_a
|
59
60
|
assert_equal 10, array.count
|
60
61
|
array.each do |object|
|
61
62
|
assert_equal Array, object.class
|
62
63
|
assert_equal 2, object.count
|
63
64
|
assert_equal String, object.first.class
|
64
65
|
assert_equal TagLib::MP4::Item, object.last.class
|
66
|
+
assert_includes @item_keys, object.first
|
65
67
|
end
|
66
68
|
end
|
69
|
+
|
70
|
+
should "be convertible to a hash" do
|
71
|
+
hsh = @item_map.to_h
|
72
|
+
assert_equal Set.new(hsh.keys), Set.new(@item_keys)
|
73
|
+
end
|
67
74
|
end
|
68
75
|
|
69
76
|
should "be removable" do
|
70
|
-
assert_equal 10, @
|
71
|
-
title = @
|
72
|
-
@
|
73
|
-
assert_equal 9, @
|
77
|
+
assert_equal 10, @item_map.size
|
78
|
+
title = @item_map["#{ITUNES_LEADER}nam"]
|
79
|
+
@item_map.erase("#{ITUNES_LEADER}nam")
|
80
|
+
assert_equal 9, @item_map.size
|
74
81
|
begin
|
75
82
|
title.to_string_list
|
76
83
|
flunk("Should have raised ObjectPreviouslyDeleted.")
|
@@ -79,18 +86,47 @@ class MP4ItemsTest < Test::Unit::TestCase
|
|
79
86
|
end
|
80
87
|
end
|
81
88
|
|
89
|
+
should "reflect edition of items from the tag" do
|
90
|
+
assert @tag.contains "trkn"
|
91
|
+
track = @item_map["trkn"]
|
92
|
+
|
93
|
+
@tag["trkn"] = TagLib::MP4::Item.from_int(1)
|
94
|
+
|
95
|
+
begin
|
96
|
+
track.to_int_pair[0]
|
97
|
+
flunk("Should have raised ObjectPreviouslyDeleted.")
|
98
|
+
rescue => e
|
99
|
+
assert_equal "ObjectPreviouslyDeleted", e.class.to_s
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
should "reflect removal of items from the tag" do
|
104
|
+
assert @tag.contains "trkn"
|
105
|
+
track = @item_map["trkn"]
|
106
|
+
|
107
|
+
@tag.remove_item("trkn")
|
108
|
+
refute @item_map.contains "trkn"
|
109
|
+
|
110
|
+
begin
|
111
|
+
track.to_int_pair[0]
|
112
|
+
flunk("Should have raised ObjectPreviouslyDeleted.")
|
113
|
+
rescue => e
|
114
|
+
assert_equal "ObjectPreviouslyDeleted", e.class.to_s
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
82
118
|
context "inserting items" do
|
83
119
|
should "insert a new item" do
|
84
120
|
new_title = TagLib::MP4::Item.from_string_list(['new title'])
|
85
|
-
@
|
121
|
+
@item_map.insert("#{ITUNES_LEADER}nam", new_title)
|
86
122
|
new_title = nil
|
87
123
|
GC.start
|
88
|
-
assert_equal ['new title'], @
|
124
|
+
assert_equal ['new title'], @item_map["#{ITUNES_LEADER}nam"].to_string_list
|
89
125
|
end
|
90
126
|
|
91
127
|
should "unlink items that get replaced" do
|
92
|
-
title = @
|
93
|
-
@
|
128
|
+
title = @item_map["#{ITUNES_LEADER}nam"]
|
129
|
+
@item_map.insert("#{ITUNES_LEADER}nam", TagLib::MP4::Item.from_int(1))
|
94
130
|
begin
|
95
131
|
title.to_string_list
|
96
132
|
flunk("Should have raised ObjectPreviouslyDeleted.")
|
@@ -101,16 +137,34 @@ class MP4ItemsTest < Test::Unit::TestCase
|
|
101
137
|
end
|
102
138
|
|
103
139
|
context "TagLib::MP4::Item" do
|
140
|
+
should "be creatable from a boolean" do
|
141
|
+
item = TagLib::MP4::Item.from_bool(false)
|
142
|
+
assert_equal TagLib::MP4::Item, item.class
|
143
|
+
assert_equal false, item.to_bool
|
144
|
+
end
|
145
|
+
|
146
|
+
should "be creatable from a byte" do
|
147
|
+
item = TagLib::MP4::Item.from_byte(123)
|
148
|
+
assert_equal TagLib::MP4::Item, item.class
|
149
|
+
assert_equal 123, item.to_byte
|
150
|
+
end
|
151
|
+
|
152
|
+
should "be creatable from an unsigned int" do
|
153
|
+
item = TagLib::MP4::Item.from_int(12346)
|
154
|
+
assert_equal TagLib::MP4::Item, item.class
|
155
|
+
assert_equal 12346, item.to_uint
|
156
|
+
end
|
157
|
+
|
104
158
|
should "be creatable from an int" do
|
105
159
|
item = TagLib::MP4::Item.from_int(-42)
|
106
160
|
assert_equal TagLib::MP4::Item, item.class
|
107
161
|
assert_equal -42, item.to_int
|
108
162
|
end
|
109
163
|
|
110
|
-
should "be creatable from a
|
111
|
-
item = TagLib::MP4::Item.
|
164
|
+
should "be creatable from a long long" do
|
165
|
+
item = TagLib::MP4::Item.from_long_long(1234567890)
|
112
166
|
assert_equal TagLib::MP4::Item, item.class
|
113
|
-
assert_equal
|
167
|
+
assert_equal 1234567890, item.to_long_long
|
114
168
|
end
|
115
169
|
|
116
170
|
context ".from_int_pair" do
|