2
// TaglibReadWriteTests.cs
5
// Gabriel Burt <gburt@novell.com>
7
// Copyright (C) 2008 Novell, Inc.
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
using System.Reflection;
34
using NUnit.Framework;
37
using Banshee.Collection;
38
using Banshee.Streaming;
39
using Banshee.Configuration.Schema;
43
namespace Banshee.Metadata
45
// FIXME: These tests don't really belong here
48
public class TaglibReadWriteTests : TestBase
50
private string [] files;
55
Mono.Addins.AddinManager.Initialize (BinDir);
57
files = new string [] {
58
Path.Combine (TestsDir, "data/test.mp3")
63
public void TestSystemIO ()
65
Banshee.IO.Provider.SetProvider (new Banshee.IO.SystemIO.Provider ());
66
WriteMetadata (files, ChangeTrack, VerifyTrack);
70
public void TestUnixIO ()
72
Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
73
WriteMetadata (files, ChangeTrack, VerifyTrack);
77
public void TestGenre ()
79
Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
80
WriteMetadata (files, delegate (TrackInfo track) {
82
track.Genre = "My Genre";
83
}, delegate (TrackInfo track) {
85
Assert.AreEqual ("My Genre", track.Genre);
90
public void TestNullGenreBug ()
92
// Bug in taglib-sharp-2.0.3.0: Crash if you send it a genre of "{ null }" on
93
// a song with both ID3v1 and ID3v2 metadata. It's happy with "{}", though.
94
// (see http://forum.taglib-sharp.com/viewtopic.php?f=5&t=239 )
95
// This tests our workaround.
96
Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
97
WriteMetadata (files, delegate (TrackInfo track) {
100
}, delegate (TrackInfo track) {
102
Assert.IsNull (track.Genre);
107
public void TestIsCompilation ()
109
Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
110
WriteMetadata (files, delegate (TrackInfo track) {
112
// bgo#563283: IsCompilation was reset if AlbumArtist == Artist
113
track.AlbumArtist = track.ArtistName;
114
track.IsCompilation = true;
115
}, delegate (TrackInfo track) {
117
Assert.AreEqual (track.ArtistName, track.AlbumArtist);
118
Assert.IsTrue (track.IsCompilation);
123
public void TestIsNotCompilation ()
125
Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
126
WriteMetadata (files, delegate (TrackInfo track) {
128
track.AlbumArtist = track.ArtistName;
129
track.IsCompilation = false;
130
}, delegate (TrackInfo track) {
132
Assert.AreEqual (track.ArtistName, track.AlbumArtist);
133
Assert.IsFalse (track.IsCompilation);
138
public void TestIsCompilationAndAlbumArtist ()
140
Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
141
WriteMetadata (files, delegate (TrackInfo track) {
143
track.AlbumArtist = "My Album Artist";
144
track.IsCompilation = true;
145
}, delegate (TrackInfo track) {
147
Assert.AreEqual ("My Album Artist", track.AlbumArtist);
148
Assert.IsTrue (track.IsCompilation);
152
private void WriteMetadata (string [] files, Action<TrackInfo> change, Action<TrackInfo> verify)
154
SafeUri newuri = null;
155
bool write_metadata = LibrarySchema.WriteMetadata.Get();
156
LibrarySchema.WriteMetadata.Set (true);
158
AssertForEach<string> (files, delegate (string uri) {
159
string extension = System.IO.Path.GetExtension (uri);
160
newuri = new SafeUri (Path.Combine (TestsDir, "data/test_write." + extension));
162
Banshee.IO.File.Copy (new SafeUri (uri), newuri, true);
164
ChangeAndVerify (newuri, change, verify);
167
LibrarySchema.WriteMetadata.Set (write_metadata);
169
Banshee.IO.File.Delete (newuri);
173
private void ChangeAndVerify (SafeUri uri, Action<TrackInfo> change, Action<TrackInfo> verify)
175
TagLib.File file = StreamTagger.ProcessUri (uri);
176
TrackInfo track = new TrackInfo ();
177
StreamTagger.TrackInfoMerge (track, file);
183
bool saved = StreamTagger.SaveToFile (track, true, true);
184
Assert.IsTrue (saved);
187
file = StreamTagger.ProcessUri (uri);
188
track = new TrackInfo ();
189
StreamTagger.TrackInfoMerge (track, file, false, true);
195
private void ChangeTrack (TrackInfo track)
197
track.TrackTitle = "My Title";
198
track.ArtistName = "My Artist";
199
track.AlbumTitle = "My Album";
200
track.TrackNumber = 4;
201
track.DiscNumber = 4;
207
private void VerifyTrack (TrackInfo track)
209
Assert.AreEqual ("My Title", track.TrackTitle);
210
Assert.AreEqual ("My Artist", track.ArtistName);
211
Assert.AreEqual ("My Album", track.AlbumTitle);
212
Assert.AreEqual (4, track.TrackNumber);
213
Assert.AreEqual (4, track.DiscNumber);
214
Assert.AreEqual (1999, track.Year);
215
Assert.AreEqual (2, track.Rating);
216
Assert.AreEqual (3, track.PlayCount);
219
private Type unix_io_type;
221
private Banshee.IO.IProvider CreateUnixIOProvider ()
223
if (unix_io_type == null) {
224
Assembly asm = Assembly.LoadFrom (BinDir + "/Banshee.Unix.dll");
225
unix_io_type = asm.GetType ("Banshee.IO.Unix.Provider");
228
return (Banshee.IO.IProvider)Activator.CreateInstance (unix_io_type);