diff --git a/AudioCuesheetEditorTests/Services/IO/CuesheetImportServiceTests.cs b/AudioCuesheetEditorTests/Services/IO/CuesheetImportServiceTests.cs new file mode 100644 index 00000000..4bbcc7bb --- /dev/null +++ b/AudioCuesheetEditorTests/Services/IO/CuesheetImportServiceTests.cs @@ -0,0 +1,217 @@ +//This file is part of AudioCuesheetEditor. + +//AudioCuesheetEditor is free software: you can redistribute it and/or modify +//it under the terms of the GNU General Public License as published by +//the Free Software Foundation, either version 3 of the License, or +//(at your option) any later version. + +//AudioCuesheetEditor is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//GNU General Public License for more details. + +//You should have received a copy of the GNU General Public License +//along with Foobar. If not, see +//. +using AudioCuesheetEditor.Model.AudioCuesheet; +using AudioCuesheetEditorTests.Properties; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace AudioCuesheetEditor.Services.IO.Tests +{ + [TestClass()] + public class CuesheetImportServiceTests + { + [TestMethod()] + public void Analyse_WithSampleCuesheet_CreatesValidCuesheet() + { + // Arrange + var fileContent = new List + { + "PERFORMER \"Sample CD Artist\"", + "TITLE \"Sample CD Title\"", + "FILE \"AC DC - TNT.mp3\" MP3", + "CDTEXTFILE \"Testfile.cdt\"", + "CATALOG 0123456789012", + "TRACK 01 AUDIO", + " PERFORMER \"Sample Artist 1\"", + " TITLE \"Sample Title 1\"", + " INDEX 01 00:00:00", + "TRACK 02 AUDIO", + " PERFORMER \"Sample Artist 2\"", + " TITLE \"Sample Title 2\"", + " INDEX 01 05:00:00", + "TRACK 03 AUDIO", + " PERFORMER \"Sample Artist 3\"", + " TITLE \"Sample Title 3\"", + " INDEX 01 09:23:00", + "TRACK 04 AUDIO", + " PERFORMER \"Sample Artist 4\"", + " TITLE \"Sample Title 4\"", + " INDEX 01 15:54:00", + "TRACK 05 AUDIO", + " PERFORMER \"Sample Artist 5\"", + " TITLE \"Sample Title 5\"", + " INDEX 01 20:13:00", + "TRACK 06 AUDIO", + " PERFORMER \"Sample Artist 6\"", + " TITLE \"Sample Title 6\"", + " INDEX 01 24:54:00", + "TRACK 07 AUDIO", + " PERFORMER \"Sample Artist 7\"", + " TITLE \"Sample Title 7\"", + " INDEX 01 31:54:00", + "TRACK 08 AUDIO", + " PERFORMER \"Sample Artist 8\"", + " TITLE \"Sample Title 8\"", + " INDEX 01 45:51:00" + }; + // Act + var importFile = CuesheetImportService.Analyse(fileContent); + // Assert + Assert.IsNotNull(importFile); + Assert.IsNull(importFile.AnalyseException); + Assert.IsNotNull(importFile.AnalysedCuesheet); + Assert.AreEqual(8, importFile.AnalysedCuesheet.Tracks.Count); + Assert.AreEqual(String.Format(CuesheetConstants.RecognizedMarkHTML, "PERFORMER \"Sample CD Artist\""), importFile.FileContentRecognized?.ElementAt(0)); + Assert.AreEqual(String.Format(CuesheetConstants.RecognizedMarkHTML, "TITLE \"Sample CD Title\""), importFile.FileContentRecognized?.ElementAt(1)); + Assert.AreEqual(String.Format(CuesheetConstants.RecognizedMarkHTML, "FILE \"AC DC - TNT.mp3\" MP3"), importFile.FileContentRecognized?.ElementAt(2)); + Assert.AreEqual(String.Format(CuesheetConstants.RecognizedMarkHTML, "CDTEXTFILE \"Testfile.cdt\""), importFile.FileContentRecognized?.ElementAt(3)); + Assert.AreEqual(String.Format(CuesheetConstants.RecognizedMarkHTML, "CATALOG 0123456789012"), importFile.FileContentRecognized?.ElementAt(4)); + Assert.AreEqual(String.Format(CuesheetConstants.RecognizedMarkHTML, "TRACK 01 AUDIO"), importFile.FileContentRecognized?.ElementAt(5)); + Assert.AreEqual(String.Format(" {0}", String.Format(CuesheetConstants.RecognizedMarkHTML, "PERFORMER \"Sample Artist 1\"")), importFile.FileContentRecognized?.ElementAt(6)); + Assert.AreEqual(String.Format(" {0}", String.Format(CuesheetConstants.RecognizedMarkHTML, "TITLE \"Sample Title 1\"")), importFile.FileContentRecognized?.ElementAt(7)); + Assert.AreEqual(String.Format(" {0}", String.Format(CuesheetConstants.RecognizedMarkHTML, "INDEX 01 00:00:00")), importFile.FileContentRecognized?.ElementAt(8)); + } + + [TestMethod()] + public void Analyse_WithCuesheetBug30_CreatesValidCuesheet() + { + //Arrange + var textImportMemoryStream = new MemoryStream(Resources.Playlist_Bug_30); + using var reader = new StreamReader(textImportMemoryStream); + List lines = []; + while (reader.EndOfStream == false) + { + lines.Add(reader.ReadLine()); + } + var fileContent = lines.AsReadOnly(); + //Act + var importFile = CuesheetImportService.Analyse(fileContent); + //Assert + Assert.IsNull(importFile.AnalyseException); + Assert.IsNotNull(importFile.AnalysedCuesheet); + } + + [TestMethod()] + public void Analyse_WithCuesheetBug57_CreatesValidCuesheet() + { + //Arrange + var textImportMemoryStream = new MemoryStream(Resources.Playlist_Bug_57); + using var reader = new StreamReader(textImportMemoryStream); + List lines = []; + while (reader.EndOfStream == false) + { + lines.Add(reader.ReadLine()); + } + var fileContent = lines.AsReadOnly(); + //Act + var importFile = CuesheetImportService.Analyse(fileContent); + //Assert + Assert.IsNull(importFile.AnalyseException); + Assert.IsNotNull(importFile.AnalysedCuesheet); + Assert.AreEqual(39, importFile.AnalysedCuesheet.Tracks.Count); + Assert.AreEqual(new TimeSpan(2, 8, 21), importFile.AnalysedCuesheet.Tracks.ElementAt(24).Begin); + } + + [TestMethod()] + public void Analyse_WithCuesheetBug36_CreatesValidCuesheet() + { + //Arrange + var textImportMemoryStream = new MemoryStream(Resources.Playlist__36_Frames); + using var reader = new StreamReader(textImportMemoryStream); + List lines = []; + while (reader.EndOfStream == false) + { + lines.Add(reader.ReadLine()); + } + var fileContent = lines.AsReadOnly(); + //Act + var importFile = CuesheetImportService.Analyse(fileContent); + //Assert + Assert.IsNull(importFile.AnalyseException); + Assert.IsNotNull(importFile.AnalysedCuesheet); + Assert.AreEqual(12, importFile.AnalysedCuesheet.Tracks.Count); + Assert.AreEqual(new TimeSpan(0, 0, 9, 15, 600), importFile.AnalysedCuesheet.Tracks.ElementAt(2).Begin); + } + + [TestMethod()] + public void Analyse_WithCDTextFileCatalogueNumberAndPreAndPostGap_CreatesValidCuesheet() + { + // Arrange + var fileContent = new List + { + "PERFORMER \"Sample CD Artist\"", + "TITLE \"Sample CD Title\"", + "FILE \"AC DC - TNT.mp3\" MP3", + "CDTEXTFILE \"Testfile.cdt\"", + "CATALOG 0123456789012", + "TRACK 01 AUDIO", + " PERFORMER \"Sample Artist 1\"", + " TITLE \"Sample Title 1\"", + " FLAGS 4CH DCP PRE SCMS", + " INDEX 01 00:00:00", + "TRACK 02 AUDIO", + " PERFORMER \"Sample Artist 2\"", + " TITLE \"Sample Title 2\"", + " FLAGS DCP PRE", + " INDEX 01 05:00:00", + "TRACK 03 AUDIO", + " PERFORMER \"Sample Artist 3\"", + " TITLE \"Sample Title 3\"", + " INDEX 01 09:23:00", + "TRACK 04 AUDIO", + " PERFORMER \"Sample Artist 4\"", + " TITLE \"Sample Title 4\"", + " INDEX 01 15:54:00", + "TRACK 05 AUDIO", + " PERFORMER \"Sample Artist 5\"", + " TITLE \"Sample Title 5\"", + " INDEX 01 20:13:00", + " POSTGAP 00:02:00", + "TRACK 06 AUDIO", + " PERFORMER \"Sample Artist 6\"", + " TITLE \"Sample Title 6\"", + " INDEX 01 24:54:00", + "TRACK 07 AUDIO", + " PERFORMER \"Sample Artist 7\"", + " TITLE \"Sample Title 7\"", + " PREGAP 00:04:00", + " INDEX 01 31:54:00", + "TRACK 08 AUDIO", + " PERFORMER \"Sample Artist 8\"", + " TITLE \"Sample Title 8\"", + " INDEX 01 45:51:00" + }; + // Act + var importFile = CuesheetImportService.Analyse(fileContent); + // Assert + Assert.IsNull(importFile.AnalyseException); + Assert.IsNotNull(importFile.AnalysedCuesheet); + Assert.AreEqual(String.Format(" {0}", String.Format(CuesheetConstants.RecognizedMarkHTML, "FLAGS 4CH DCP PRE SCMS")), importFile.FileContentRecognized?.ElementAt(8)); + Assert.AreEqual(String.Format(" {0}", String.Format(CuesheetConstants.RecognizedMarkHTML, "PREGAP 00:04:00")), importFile.FileContentRecognized?.ElementAt(35)); + Assert.AreEqual(8, importFile.AnalysedCuesheet.Tracks.Count); + Assert.IsNotNull(importFile.AnalysedCuesheet.CDTextfile); + Assert.AreEqual(4, importFile.AnalysedCuesheet.Tracks.ElementAt(0).Flags.Count); + Assert.AreEqual(2, importFile.AnalysedCuesheet.Tracks.ElementAt(1).Flags.Count); + Assert.IsNotNull(importFile.AnalysedCuesheet.Tracks.ElementAt(1).Flags.SingleOrDefault(x => x.CuesheetLabel == "DCP")); + Assert.IsNotNull(importFile.AnalysedCuesheet.Tracks.ElementAt(1).Flags.SingleOrDefault(x => x.CuesheetLabel == "PRE")); + Assert.AreEqual(new TimeSpan(0, 0, 2), importFile.AnalysedCuesheet.Tracks.ElementAt(4).PostGap); + Assert.AreEqual(new TimeSpan(0, 0, 4), importFile.AnalysedCuesheet.Tracks.ElementAt(6).PreGap); + } + } +} \ No newline at end of file