/src/Core/Banshee.Services/Banshee.Metadata/Tests/TaglibReadWriteTests.cs

https://github.com/petejohanson/banshee · C# · 227 lines · 165 code · 25 blank · 37 comment · 2 complexity · 6120f6f1aee5778a0214c6c567d265b6 MD5 · raw file

  1. //
  2. // TaglibReadWriteTests.cs
  3. //
  4. // Author:
  5. // Gabriel Burt <gburt@novell.com>
  6. //
  7. // Copyright (C) 2008 Novell, Inc.
  8. //
  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:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  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.
  27. //
  28. #if ENABLE_TESTS
  29. using System;
  30. using System.IO;
  31. using System.Reflection;
  32. using NUnit.Framework;
  33. using Banshee.Collection;
  34. using Banshee.Streaming;
  35. using Banshee.Configuration.Schema;
  36. using Hyena;
  37. using Hyena.Tests;
  38. namespace Banshee.Metadata
  39. {
  40. // FIXME: These tests don't really belong here
  41. [TestFixture]
  42. public class TaglibReadWriteTests : TestBase
  43. {
  44. private string [] files;
  45. [TestFixtureSetUp]
  46. public void Setup ()
  47. {
  48. files = new string [] {
  49. Path.Combine (TestsDir, "data/test.mp3")
  50. };
  51. }
  52. [Test]
  53. public void TestChangeTrack ()
  54. {
  55. foreach (var p in Banshee.IO.Tests.Providers) {
  56. Banshee.IO.Provider.SetProvider (p);
  57. WriteMetadata (files, ChangeTrack, VerifyTrack);
  58. }
  59. }
  60. [Test]
  61. public void TestGenre ()
  62. {
  63. foreach (var p in Banshee.IO.Tests.Providers) {
  64. Banshee.IO.Provider.SetProvider (p);
  65. WriteMetadata (files, delegate (TrackInfo track) {
  66. ChangeTrack (track);
  67. track.Genre = "My Genre";
  68. }, delegate (TrackInfo track) {
  69. VerifyTrack (track);
  70. Assert.AreEqual ("My Genre", track.Genre);
  71. });
  72. }
  73. }
  74. [Test]
  75. public void TestNullGenreBug ()
  76. {
  77. foreach (var p in Banshee.IO.Tests.Providers) {
  78. Banshee.IO.Provider.SetProvider (p);
  79. // Bug in taglib-sharp-2.0.3.0: Crash if you send it a genre of "{ null }" on
  80. // a song with both ID3v1 and ID3v2 metadata. It's happy with "{}", though.
  81. // (see http://forum.taglib-sharp.com/viewtopic.php?f=5&t=239 )
  82. // This tests our workaround.
  83. WriteMetadata (files, delegate (TrackInfo track) {
  84. ChangeTrack (track);
  85. track.Genre = null;
  86. }, delegate (TrackInfo track) {
  87. VerifyTrack (track);
  88. Assert.IsNull (track.Genre);
  89. });
  90. }
  91. }
  92. [Test]
  93. public void TestIsCompilation ()
  94. {
  95. foreach (var p in Banshee.IO.Tests.Providers) {
  96. Banshee.IO.Provider.SetProvider (p);
  97. WriteMetadata (files, delegate (TrackInfo track) {
  98. ChangeTrack (track);
  99. // bgo#563283: IsCompilation was reset if AlbumArtist == Artist
  100. track.AlbumArtist = track.ArtistName;
  101. track.IsCompilation = true;
  102. }, delegate (TrackInfo track) {
  103. VerifyTrack (track);
  104. Assert.AreEqual (track.ArtistName, track.AlbumArtist);
  105. Assert.IsTrue (track.IsCompilation);
  106. });
  107. }
  108. }
  109. [Test]
  110. public void TestIsNotCompilation ()
  111. {
  112. foreach (var p in Banshee.IO.Tests.Providers) {
  113. Banshee.IO.Provider.SetProvider (p);
  114. WriteMetadata (files, delegate (TrackInfo track) {
  115. ChangeTrack (track);
  116. track.AlbumArtist = track.ArtistName;
  117. track.IsCompilation = false;
  118. }, delegate (TrackInfo track) {
  119. VerifyTrack (track);
  120. Assert.AreEqual (track.ArtistName, track.AlbumArtist);
  121. Assert.IsFalse (track.IsCompilation);
  122. });
  123. }
  124. }
  125. [Test]
  126. public void TestIsCompilationAndAlbumArtist ()
  127. {
  128. foreach (var p in Banshee.IO.Tests.Providers) {
  129. Banshee.IO.Provider.SetProvider (p);
  130. WriteMetadata (files, delegate (TrackInfo track) {
  131. ChangeTrack (track);
  132. track.AlbumArtist = "My Album Artist";
  133. track.IsCompilation = true;
  134. }, delegate (TrackInfo track) {
  135. VerifyTrack (track);
  136. Assert.AreEqual ("My Album Artist", track.AlbumArtist);
  137. Assert.IsTrue (track.IsCompilation);
  138. });
  139. }
  140. }
  141. private void WriteMetadata (string [] files, Action<TrackInfo> change, Action<TrackInfo> verify)
  142. {
  143. SafeUri newuri = null;
  144. bool write_metadata = LibrarySchema.WriteMetadata.Get();
  145. LibrarySchema.WriteMetadata.Set (true);
  146. try {
  147. AssertForEach<string> (files, delegate (string uri) {
  148. string extension = System.IO.Path.GetExtension (uri);
  149. newuri = new SafeUri (Path.Combine (TestsDir, "data/test_write." + extension));
  150. Banshee.IO.File.Copy (new SafeUri (uri), newuri, true);
  151. ChangeAndVerify (newuri, change, verify);
  152. });
  153. } finally {
  154. LibrarySchema.WriteMetadata.Set (write_metadata);
  155. if (newuri != null)
  156. Banshee.IO.File.Delete (newuri);
  157. }
  158. }
  159. private void ChangeAndVerify (SafeUri uri, Action<TrackInfo> change, Action<TrackInfo> verify)
  160. {
  161. TagLib.File file = StreamTagger.ProcessUri (uri);
  162. TrackInfo track = new TrackInfo ();
  163. StreamTagger.TrackInfoMerge (track, file);
  164. file.Dispose ();
  165. // Make changes
  166. change (track);
  167. // Save changes
  168. bool saved = StreamTagger.SaveToFile (track, true, true);
  169. Assert.IsTrue (saved);
  170. // Read changes
  171. file = StreamTagger.ProcessUri (uri);
  172. track = new TrackInfo ();
  173. StreamTagger.TrackInfoMerge (track, file, false, true);
  174. file.Dispose ();
  175. // Verify changes
  176. verify (track);
  177. }
  178. private void ChangeTrack (TrackInfo track)
  179. {
  180. track.TrackTitle = "My Title";
  181. track.ArtistName = "My Artist";
  182. track.AlbumTitle = "My Album";
  183. track.TrackNumber = 4;
  184. track.DiscNumber = 4;
  185. track.Year = 1999;
  186. track.Rating = 2;
  187. track.PlayCount = 3;
  188. }
  189. private void VerifyTrack (TrackInfo track)
  190. {
  191. Assert.AreEqual ("My Title", track.TrackTitle);
  192. Assert.AreEqual ("My Artist", track.ArtistName);
  193. Assert.AreEqual ("My Album", track.AlbumTitle);
  194. Assert.AreEqual (4, track.TrackNumber);
  195. Assert.AreEqual (4, track.DiscNumber);
  196. Assert.AreEqual (1999, track.Year);
  197. Assert.AreEqual (2, track.Rating);
  198. Assert.AreEqual (3, track.PlayCount);
  199. }
  200. }
  201. }
  202. #endif