diff --git a/AudioCuesheetEditor.End2EndTests/AudioCuesheetEditor.End2EndTests.csproj b/AudioCuesheetEditor.End2EndTests/AudioCuesheetEditor.End2EndTests.csproj index 80fde05c..27b76684 100644 --- a/AudioCuesheetEditor.End2EndTests/AudioCuesheetEditor.End2EndTests.csproj +++ b/AudioCuesheetEditor.End2EndTests/AudioCuesheetEditor.End2EndTests.csproj @@ -23,10 +23,6 @@ - - - - PreserveNewest diff --git a/AudioCuesheetEditor.End2EndTests/MSTestSettings.cs b/AudioCuesheetEditor.End2EndTests/MSTestSettings.cs new file mode 100644 index 00000000..aaf278c8 --- /dev/null +++ b/AudioCuesheetEditor.End2EndTests/MSTestSettings.cs @@ -0,0 +1 @@ +[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] diff --git a/AudioCuesheetEditor.End2EndTests/Models/DetailView.cs b/AudioCuesheetEditor.End2EndTests/Models/DetailView.cs index 59d57bb6..cd02b511 100644 --- a/AudioCuesheetEditor.End2EndTests/Models/DetailView.cs +++ b/AudioCuesheetEditor.End2EndTests/Models/DetailView.cs @@ -48,18 +48,22 @@ internal async Task EditTrackAsync(string? artist = null, string? title = null) { await _page.Locator("td:nth-child(3)").ClickAsync(); await _page.Locator("td:nth-child(3)").Last.GetByRole(AriaRole.Textbox).FillAsync(artist); + // Autocomplete overlay will pop up, so we close it await _page.Locator(".mud-popover-open").WaitForAsync(new() { State = WaitForSelectorState.Visible }); await _page.Keyboard.PressAsync("Escape"); - await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync(); + // Click outside the autocomplete to have an focus lost event for getting the value written to model + await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync(new() { Force = true }); await _page.WaitForTimeoutAsync(100); } if (title != null) { await _page.Locator("td:nth-child(4)").ClickAsync(); await _page.Locator("td:nth-child(4)").Last.GetByRole(AriaRole.Textbox).FillAsync(title); + // Autocomplete overlay will pop up, so we close it await _page.Locator(".mud-popover-open").WaitForAsync(new() { State = WaitForSelectorState.Visible }); await _page.Keyboard.PressAsync("Escape"); - await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync(); + // Click outside the autocomplete to have an focus lost event for getting the value written to model + await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync(new() { Force = true }); await _page.WaitForTimeoutAsync(100); } } diff --git a/AudioCuesheetEditor.Tests/AudioCuesheetEditor.Tests.csproj b/AudioCuesheetEditor.Tests/AudioCuesheetEditor.Tests.csproj index 80ac430d..5c178646 100644 --- a/AudioCuesheetEditor.Tests/AudioCuesheetEditor.Tests.csproj +++ b/AudioCuesheetEditor.Tests/AudioCuesheetEditor.Tests.csproj @@ -22,18 +22,30 @@ - - True - True - Resources.resx - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/AudioCuesheetEditor.Tests/MSTestSettings.cs b/AudioCuesheetEditor.Tests/MSTestSettings.cs new file mode 100644 index 00000000..e466aa12 --- /dev/null +++ b/AudioCuesheetEditor.Tests/MSTestSettings.cs @@ -0,0 +1,3 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] diff --git a/AudioCuesheetEditor.Tests/Model/Entity/ValidateableTests.cs b/AudioCuesheetEditor.Tests/Model/Entity/ValidateableTests.cs index be481b15..809dab4c 100644 --- a/AudioCuesheetEditor.Tests/Model/Entity/ValidateableTests.cs +++ b/AudioCuesheetEditor.Tests/Model/Entity/ValidateableTests.cs @@ -72,7 +72,7 @@ public void ValidateTest() }; Assert.AreEqual(ValidationStatus.Error, testObject.Validate().Status); Assert.IsNotNull(testObject.Validate().ValidationMessages); - Assert.IsTrue(testObject.Validate().ValidationMessages?.Count == 1); + Assert.AreEqual(1, testObject.Validate().ValidationMessages?.Count); testObject.TestProperty = "Test"; Assert.AreEqual(ValidationStatus.Success, testObject.Validate().Status); } diff --git a/AudioCuesheetEditor.Tests/Model/Entity/ValidationResultTests.cs b/AudioCuesheetEditor.Tests/Model/Entity/ValidationResultTests.cs index 69d9eda1..1b30435f 100644 --- a/AudioCuesheetEditor.Tests/Model/Entity/ValidationResultTests.cs +++ b/AudioCuesheetEditor.Tests/Model/Entity/ValidationResultTests.cs @@ -32,7 +32,7 @@ public void Create_NoValidation_ReturnsExpectedResult() // Assert Assert.AreEqual(ValidationStatus.NoValidation, validationResult.Status); - Assert.AreEqual(0, validationResult.ValidationMessages.Count); + Assert.IsEmpty(validationResult.ValidationMessages); } [TestMethod] @@ -43,7 +43,7 @@ public void Create_Success_ReturnsExpectedResult() // Assert Assert.AreEqual(ValidationStatus.Success, validationResult.Status); - Assert.AreEqual(0, validationResult.ValidationMessages.Count); + Assert.IsEmpty(validationResult.ValidationMessages); } [TestMethod] @@ -54,7 +54,7 @@ public void Create_Error_ReturnsExpectedResult() // Assert Assert.AreEqual(ValidationStatus.Error, validationResult.Status); - Assert.AreEqual(0, validationResult.ValidationMessages.Count); + Assert.IsEmpty(validationResult.ValidationMessages); } [TestMethod] @@ -93,7 +93,7 @@ public void Default_Status_IsNoValidation() // Assert Assert.AreEqual(ValidationStatus.NoValidation, validationResult.Status); - Assert.AreEqual(0, validationResult.ValidationMessages.Count); + Assert.IsEmpty(validationResult.ValidationMessages); } [TestMethod] diff --git a/AudioCuesheetEditor.Tests/Model/IO/Audio/AudiofileTests.cs b/AudioCuesheetEditor.Tests/Model/IO/Audio/AudiofileTests.cs index 7b0bea1b..7779ba5a 100644 --- a/AudioCuesheetEditor.Tests/Model/IO/Audio/AudiofileTests.cs +++ b/AudioCuesheetEditor.Tests/Model/IO/Audio/AudiofileTests.cs @@ -29,7 +29,7 @@ public void AudioFileTest() Assert.IsNull(audioFile.ContentStream); Assert.IsFalse(audioFile.IsContentStreamLoaded); Assert.IsNotNull(audioFile.Name); - Assert.AreEqual(audioFile.AudioFileType, "MP3"); + Assert.AreEqual("MP3", audioFile.AudioFileType); audioFile = new Audiofile("Test"); Assert.AreEqual(audioFile.AudioFileType, string.Empty); Assert.IsNotNull(audioFile.Name); @@ -37,7 +37,7 @@ public void AudioFileTest() audioFile = new Audiofile("test", "TestobjectURL", codec); Assert.IsNotNull(audioFile.Name); Assert.AreEqual("test.ogg", audioFile.Name); - Assert.AreEqual(audioFile.AudioFileType, "OGG"); + Assert.AreEqual("OGG", audioFile.AudioFileType); Assert.IsNotNull(audioFile.ObjectURL); Assert.IsTrue(audioFile.PlaybackPossible); codec = Audiofile.AudioCodecs.Single(x => x.FileExtension == ".mp3"); diff --git a/AudioCuesheetEditor.Tests/Model/IO/Export/CuesheetSectionTests.cs b/AudioCuesheetEditor.Tests/Model/IO/Export/CuesheetSectionTests.cs index 0629a434..e752c314 100644 --- a/AudioCuesheetEditor.Tests/Model/IO/Export/CuesheetSectionTests.cs +++ b/AudioCuesheetEditor.Tests/Model/IO/Export/CuesheetSectionTests.cs @@ -1,9 +1,10 @@ using AudioCuesheetEditor.Model.AudioCuesheet; using AudioCuesheetEditor.Model.Entity; +using AudioCuesheetEditor.Model.IO.Export; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; -namespace AudioCuesheetEditor.Model.IO.Export.Tests +namespace AudioCuesheetEditor.Tests.Model.IO.Export { [TestClass()] public class CuesheetSectionTests diff --git a/AudioCuesheetEditor.Tests/Model/IO/Import/ImportprofileTests.cs b/AudioCuesheetEditor.Tests/Model/IO/Import/ImportprofileTests.cs index b25e9756..e91fe976 100644 --- a/AudioCuesheetEditor.Tests/Model/IO/Import/ImportprofileTests.cs +++ b/AudioCuesheetEditor.Tests/Model/IO/Import/ImportprofileTests.cs @@ -37,7 +37,7 @@ public void Validate_WithoutPlaceholder_ReturnsInvalid() var result = importprofile.Validate(); // Assert Assert.AreEqual(ValidationStatus.Error, result.Status); - Assert.AreEqual(2, result.ValidationMessages.Count); + Assert.HasCount(2, result.ValidationMessages); Assert.AreEqual("{0} contains no placeholder!", result.ValidationMessages.First().Message); Assert.AreEqual(nameof(Importprofile.SchemeCuesheet), result.ValidationMessages.First().Parameter?.First().ToString()); Assert.AreEqual("{0} contains no placeholder!", result.ValidationMessages.Last().Message); diff --git a/AudioCuesheetEditor.Tests/Model/IO/ProjectfileTests.cs b/AudioCuesheetEditor.Tests/Model/IO/ProjectfileTests.cs index 847e2528..f8f6cd0d 100644 --- a/AudioCuesheetEditor.Tests/Model/IO/ProjectfileTests.cs +++ b/AudioCuesheetEditor.Tests/Model/IO/ProjectfileTests.cs @@ -142,7 +142,7 @@ public void ImportFile_ValidProjectfile_ShouldImportFile() Assert.AreEqual("AudioFile.mp3", cuesheet.Audiofile?.Name); Assert.AreEqual("A123", cuesheet.Cataloguenumber); Assert.AreEqual(2, cuesheet.Validate(nameof(Cuesheet.Cataloguenumber)).ValidationMessages?.Count); - Assert.AreEqual(10, cuesheet.Tracks.Count); + Assert.HasCount(10, cuesheet.Tracks); Assert.IsTrue(cuesheet.Tracks.ElementAt(3).Flags.Contains(Flag.DCP)); Assert.IsTrue(cuesheet.Tracks.ElementAt(3).Flags.Contains(Flag.FourCH)); Assert.AreEqual("Artist 10", cuesheet.Tracks.Last().Artist); @@ -167,7 +167,7 @@ public void ImportFile_ValidProjectfileWithSections_ShouldImportFile() Assert.AreEqual("AudioFile.mp3", cuesheet.Audiofile?.Name); Assert.AreEqual("A123", cuesheet.Cataloguenumber); Assert.AreEqual(2, cuesheet.Validate(nameof(Cuesheet.Cataloguenumber)).ValidationMessages?.Count); - Assert.AreEqual(10, cuesheet.Tracks.Count); + Assert.HasCount(10, cuesheet.Tracks); Assert.IsTrue(cuesheet.Tracks.ElementAt(3).Flags.Contains(Flag.DCP)); Assert.IsTrue(cuesheet.Tracks.ElementAt(3).Flags.Contains(Flag.FourCH)); Assert.AreEqual("Artist 10", cuesheet.Tracks.Last().Artist); @@ -175,7 +175,7 @@ public void ImportFile_ValidProjectfileWithSections_ShouldImportFile() Assert.IsTrue(ReferenceEquals(cuesheet.Tracks.First(), cuesheet.GetPreviousLinkedTrack(cuesheet.Tracks.ElementAt(1)))); Assert.AreEqual(cuesheet.Tracks.First(), cuesheet.GetPreviousLinkedTrack(cuesheet.Tracks.ElementAt(1))); Assert.AreEqual((uint)10, cuesheet.Tracks.Last().Position); - Assert.AreEqual(2, cuesheet.Sections.Count); + Assert.HasCount(2, cuesheet.Sections); Assert.AreEqual(new TimeSpan(0, 30, 0), cuesheet.Sections.First().Begin); Assert.AreEqual(new TimeSpan(1, 0, 0), cuesheet.Sections.Last().Begin); } diff --git a/AudioCuesheetEditor.Tests/Model/Options/ExportOptionsTest.cs b/AudioCuesheetEditor.Tests/Model/Options/ExportOptionsTest.cs index d7a5df81..77486245 100644 --- a/AudioCuesheetEditor.Tests/Model/Options/ExportOptionsTest.cs +++ b/AudioCuesheetEditor.Tests/Model/Options/ExportOptionsTest.cs @@ -18,20 +18,21 @@ using System.Linq; using System.Text.Json; -namespace AudioCuesheetEditorTests.Model.Options +namespace AudioCuesheetEditor.Tests.Model.Options { [TestClass()] public class ExportOptionsTest { + private readonly JsonSerializerOptions serializerOptions = new() + { + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull + }; + [TestMethod()] public void SerializationTest() { - var options = new ExportOptions(); - var serializerOptions = new JsonSerializerOptions - { - DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull - }; - var optionsJson = JsonSerializer.Serialize(options, serializerOptions); + var exportOptions = new ExportOptions(); + var optionsJson = JsonSerializer.Serialize(exportOptions, serializerOptions); Assert.IsNotNull(optionsJson); } @@ -50,7 +51,7 @@ public void DeserializeBackwardCompabilityTest() var optionsJson = "{\"ExportProfiles\":[{\"Name\":\"YouTube\",\"SchemeHead\":\"%Cuesheet.Artist% - %Cuesheet.Title%\",\"SchemeTracks\":\"%Track.Artist% - %Track.Title% %Track.Begin%\",\"SchemeFooter\":\"\",\"Filename\":\"YouTube.txt\"},{\"Name\":\"Mixcloud\",\"SchemeHead\":\"\",\"SchemeTracks\":\"%Track.Artist% - %Track.Title% %Track.Begin%\",\"SchemeFooter\":\"\",\"Filename\":\"Mixcloud.txt\"},{\"Name\":\"CSV Export\",\"SchemeHead\":\"%Cuesheet.Artist%;%Cuesheet.Title%;\",\"SchemeTracks\":\"%Track.Position%;%Track.Artist%;%Track.Title%;%Track.Begin%;%Track.End%;%Track.Length%\",\"SchemeFooter\":\"Exported at %DateTime% using AudioCuesheetEditor (https://neocodermatrix86.github.io/AudioCuesheetEditor/)\",\"Filename\":\"Export.csv\"},{\"Name\":\"Tracks only\",\"SchemeHead\":\"\",\"SchemeTracks\":\"%Track.Position% - %Track.Artist% - %Track.Title% - %Track.Begin% - %Track.End% - %Track.Length%\",\"SchemeFooter\":\"\",\"Filename\":\"Tracks.txt\"}]}"; var options = JsonSerializer.Deserialize(optionsJson); Assert.IsNotNull(options); - Assert.AreEqual(4, options.ExportProfiles.Count); + Assert.HasCount(4, options.ExportProfiles); } } } diff --git a/AudioCuesheetEditor.Tests/Properties/Resources.Designer.cs b/AudioCuesheetEditor.Tests/Properties/Resources.Designer.cs deleted file mode 100644 index c8637f77..00000000 --- a/AudioCuesheetEditor.Tests/Properties/Resources.Designer.cs +++ /dev/null @@ -1,153 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace AudioCuesheetEditor.Tests.Properties { - using System; - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AudioCuesheetEditor.Tests.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Playlist__36_Frames { - get { - object obj = ResourceManager.GetObject("Playlist__36_Frames", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Playlist_Bug_30 { - get { - object obj = ResourceManager.GetObject("Playlist_Bug_30", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Playlist_Bug_57 { - get { - object obj = ResourceManager.GetObject("Playlist_Bug_57", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Sample_Inputfile { - get { - object obj = ResourceManager.GetObject("Sample_Inputfile", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Textimport_Bug__233 { - get { - object obj = ResourceManager.GetObject("Textimport_Bug__233", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Textimport_Bug_213 { - get { - object obj = ResourceManager.GetObject("Textimport_Bug_213", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Textimport_Bug_54 { - get { - object obj = ResourceManager.GetObject("Textimport_Bug_54", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Textimport_with_Cuesheetdata { - get { - object obj = ResourceManager.GetObject("Textimport with Cuesheetdata", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] Traktor_Export { - get { - object obj = ResourceManager.GetObject("Traktor Export", resourceCulture); - return ((byte[])(obj)); - } - } - } -} diff --git a/AudioCuesheetEditor.Tests/Properties/Resources.resx b/AudioCuesheetEditor.Tests/Properties/Resources.resx deleted file mode 100644 index 0370cfee..00000000 --- a/AudioCuesheetEditor.Tests/Properties/Resources.resx +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Playlist-Bug#30.cue;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Playlist-Bug#57.cue;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Playlist-#36-Frames.cue;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Textimport_Bug_213.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Textimport-Bug-#54.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Textimport_Bug_#233.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Traktor Export.html;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Textimport with Cuesheetdata.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\Sample_Inputfile.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/AudioCuesheetEditor.Tests/Resources/Textimport-Bug-#54.txt b/AudioCuesheetEditor.Tests/Resources/Textimport-Bug-#54.txt deleted file mode 100644 index 4552ea1d..00000000 --- a/AudioCuesheetEditor.Tests/Resources/Textimport-Bug-#54.txt +++ /dev/null @@ -1,40 +0,0 @@ - -Adriatique - X. 00:05:24 -Third Harmony - Fears And Dreams (Original Mix) 00:10:39 -Dele Sosimi Afrobeat Orchestra - Too Much Information (Laolu Remix; Edit) 00:17:06 -Edem, Govan - Ankh (Onetwo MX Remix) 00:23:21 -Jody Wisternoff - For All Time (feat. Hendrik Burkhard) (Extended Mix) 00:29:02 -Einmusik - Bead (Original Mix) 00:34:27 -Sebastien Leger - La Danse du Scorpion 00:40:59 -Paul Thomas & Solid Stone - La Bombo (Solid Stone Remix) 00:46:19 -GusGus - Crossfade (Maceo Plex Mix) 00:52:20 -Klangkarussell - Time (Original Mix) 00:56:19 -Anysense & Un:said - Missing Path (Original Mix) 01:01:41 -Space Food - Bombay 01:06:33 -SHDW & Obscure Shape - Wächter der Nacht (Original Mix) 01:11:04 -HOSH - Karma 01:15:28 -Alexey Union - Olympia (Original Mix) 01:21:08 -Paul Taylor - Afterglow 01:25:38 -Philter - Stranger 01:31:52 -Skizologic - Hypersphere (Original Mix) 01:36:40 -Thomas Schumacher, Caitlin - All of You (Remix) 01:42:16 -A. Skomoroh - White Horse Conquest (Original Mix) 01:47:04 -Patrik Berg - Bright (Original Mix) 01:52:37 -Hidden Empire - Bengal 01:58:05 -Mario Ochoa - Levitate 02:03:00 -Raul Facio - Eyes Wide Shut (Original Mix) 02:08:21 -Soolver - Regular (Original Mix) 02:14:31 -Weska - EQ64 (Original Mix) 02:18:35 -Tempo Giusto - The Fall (Extended Mix) 02:24:12 -Vlind & Asteroid & Gary Leroy - Trinity (Extended Mix) 02:29:38 -Astral Legacy - Vaveyla (Original Mix) 02:32:52 -Gerrox - Chakra (Original Mix) 02:37:00 -Charlotte De Witte - Pattern 02:41:55 -Space Food - Amabey 02:46:55 -ARTBAT - Papilion (Original Mix) 02:51:13 -PETER PAHN - Enjoy Infinity (Original Mix) 02:56:08 -Solitek - Instinct (Original Mix) 03:00:57 -Veerus - Heavy 03:05:19 -Secret Cinema & Reinier Zonneveld - Pain Thing (Original Mix) 03:09:38 -Amelie Lens - Hypnotized 03:13:13 -Nikolay Kirov - Chasing the Sun (Original Mix) diff --git a/AudioCuesheetEditor.Tests/Services/IO/CuesheetExportServiceTests.cs b/AudioCuesheetEditor.Tests/Services/IO/CuesheetExportServiceTests.cs index 3cf0420a..f103792d 100644 --- a/AudioCuesheetEditor.Tests/Services/IO/CuesheetExportServiceTests.cs +++ b/AudioCuesheetEditor.Tests/Services/IO/CuesheetExportServiceTests.cs @@ -109,7 +109,7 @@ public void GenerateExportfiles_WithoutSections_ReturnsExportFile() var result = cuesheetExportService.GenerateExportfiles(filename); // Assert - Assert.AreEqual(1, result.Count); + Assert.HasCount(1, result); Assert.AreEqual(filename, result.First().Name); Assert.AreEqual(TimeSpan.Zero, result.First().Begin); Assert.AreEqual(new TimeSpan(0, 8, 32), result.First().End); @@ -206,7 +206,7 @@ public void GenerateExportfiles_WithSections_ReturnsExportFiles() var result = cuesheetExportService.GenerateExportfiles(filename); // Assert - Assert.AreEqual(3, result.Count); + Assert.HasCount(3, result); Assert.AreEqual("Test valid Filename(3).cue", result.Last().Name); Assert.AreEqual(section3.Begin, result.Last().Begin); Assert.AreEqual(section3.End, result.Last().End); @@ -254,7 +254,7 @@ public void GenerateExportfiles_WithInvalidTracks_ReturnsEmpty() var result = cuesheetExportService.GenerateExportfiles("test.cue"); // Assert - Assert.AreEqual(0, result.Count); + Assert.HasCount(0, result); } } } \ No newline at end of file diff --git a/AudioCuesheetEditor.Tests/Services/IO/CuesheetImportServiceTests.cs b/AudioCuesheetEditor.Tests/Services/IO/CuesheetImportServiceTests.cs index 6199a18c..c2ab173d 100644 --- a/AudioCuesheetEditor.Tests/Services/IO/CuesheetImportServiceTests.cs +++ b/AudioCuesheetEditor.Tests/Services/IO/CuesheetImportServiceTests.cs @@ -15,7 +15,6 @@ //. using AudioCuesheetEditor.Model.AudioCuesheet; using AudioCuesheetEditor.Services.IO; -using AudioCuesheetEditor.Tests.Properties; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.IO; @@ -73,7 +72,7 @@ TRACK 08 AUDIO Assert.IsNotNull(importFile); Assert.IsNull(importFile.AnalyseException); Assert.IsNotNull(importFile.AnalyzedCuesheet); - Assert.AreEqual(8, importFile.AnalyzedCuesheet.Tracks.Count); + Assert.HasCount(8, importFile.AnalyzedCuesheet.Tracks); Assert.IsNotNull(importFile.FileContentRecognized); var lines = importFile.FileContentRecognized.Split(Environment.NewLine); Assert.AreEqual(string.Format(CuesheetConstants.RecognizedMarkHTML, "PERFORMER \"Sample CD Artist\""), lines.ElementAt(0)); @@ -91,9 +90,7 @@ TRACK 08 AUDIO public void Analyse_WithCuesheetBug30_CreatesValidCuesheet() { //Arrange - var textImportMemoryStream = new MemoryStream(Resources.Playlist_Bug_30); - using var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Playlist-Bug#30.cue"); //Act var importFile = CuesheetImportService.Analyse(fileContent); //Assert @@ -105,15 +102,13 @@ public void Analyse_WithCuesheetBug30_CreatesValidCuesheet() public void Analyse_WithCuesheetBug57_CreatesValidCuesheet() { //Arrange - var textImportMemoryStream = new MemoryStream(Resources.Playlist_Bug_57); - using var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Playlist-Bug#57.cue"); //Act var importFile = CuesheetImportService.Analyse(fileContent); //Assert Assert.IsNull(importFile.AnalyseException); Assert.IsNotNull(importFile.AnalyzedCuesheet); - Assert.AreEqual(39, importFile.AnalyzedCuesheet.Tracks.Count); + Assert.HasCount(39, importFile.AnalyzedCuesheet.Tracks); Assert.AreEqual(new TimeSpan(2, 8, 21), importFile.AnalyzedCuesheet.Tracks.ElementAt(24).Begin); } @@ -121,15 +116,13 @@ public void Analyse_WithCuesheetBug57_CreatesValidCuesheet() public void Analyse_WithCuesheetBug36_CreatesValidCuesheet() { //Arrange - var textImportMemoryStream = new MemoryStream(Resources.Playlist__36_Frames); - using var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Playlist-#36-Frames.cue"); //Act var importFile = CuesheetImportService.Analyse(fileContent); //Assert Assert.IsNull(importFile.AnalyseException); Assert.IsNotNull(importFile.AnalyzedCuesheet); - Assert.AreEqual(12, importFile.AnalyzedCuesheet.Tracks.Count); + Assert.HasCount(12, importFile.AnalyzedCuesheet.Tracks); Assert.AreEqual(new TimeSpan(0, 0, 9, 15, 600), importFile.AnalyzedCuesheet.Tracks.ElementAt(2).Begin); } @@ -187,7 +180,7 @@ TRACK 08 AUDIO var lines = importFile.FileContentRecognized.Split(Environment.NewLine); Assert.AreEqual(string.Format(" {0}", string.Format(CuesheetConstants.RecognizedMarkHTML, "FLAGS 4CH DCP PRE SCMS")), lines.ElementAt(8)); Assert.AreEqual(string.Format(" {0}", string.Format(CuesheetConstants.RecognizedMarkHTML, "PREGAP 00:04:00")), lines.ElementAt(35)); - Assert.AreEqual(8, importFile.AnalyzedCuesheet.Tracks.Count); + Assert.HasCount(8, importFile.AnalyzedCuesheet.Tracks); Assert.IsNotNull(importFile.AnalyzedCuesheet.CDTextfile); Assert.AreEqual(4, importFile.AnalyzedCuesheet.Tracks.ElementAt(0).Flags.Count()); Assert.AreEqual(2, importFile.AnalyzedCuesheet.Tracks.ElementAt(1).Flags.Count()); diff --git a/AudioCuesheetEditor.Tests/Services/IO/ExportfileGeneratorTests.cs b/AudioCuesheetEditor.Tests/Services/IO/ExportfileGeneratorTests.cs index fbb038b7..e9c1339a 100644 --- a/AudioCuesheetEditor.Tests/Services/IO/ExportfileGeneratorTests.cs +++ b/AudioCuesheetEditor.Tests/Services/IO/ExportfileGeneratorTests.cs @@ -77,7 +77,7 @@ public void GenerateExportFile_ShouldGenerateExportfile_WithoutSections() // Assert Assert.IsNotNull(result); - Assert.AreEqual(1, result.Count); + Assert.HasCount(1, result); Assert.AreEqual(exportProfile.Filename, result.First().Name); Assert.AreEqual(TimeSpan.Zero, result.First().Begin); Assert.AreEqual(new TimeSpan(0, 8, 32), result.First().End); @@ -167,7 +167,7 @@ public void GenerateExportFile_ShouldGenerateExportfiles_WithSections() // Assert Assert.IsNotNull(result); - Assert.AreEqual(3, result.Count); + Assert.HasCount(3, result); Assert.AreEqual("TestExport(3).txt", result.Last().Name); Assert.AreEqual(section3.Begin, result.Last().Begin); Assert.AreEqual(section3.End, result.Last().End); @@ -214,7 +214,7 @@ public void GenerateExportFile_ShouldHandleEmptyProfile() // Assert Assert.IsNotNull(result); - Assert.AreEqual(1, result.Count); + Assert.HasCount(1, result); Assert.AreEqual(Exportprofile.DefaultFileName, result.First().Name); Assert.AreEqual(TimeSpan.Zero, result.First().Begin); Assert.AreEqual(new TimeSpan(0, 8, 32), result.First().End); @@ -257,7 +257,7 @@ public void GenerateExportFile_ReturnsEmpty_WithInvalidTracks() var result = exportfileGenerator.GenerateExportfiles(exportProfile); // Assert - Assert.AreEqual(0, result.Count); + Assert.HasCount(0, result); } } } \ No newline at end of file diff --git a/AudioCuesheetEditor.Tests/Services/IO/TextImportServiceTests.cs b/AudioCuesheetEditor.Tests/Services/IO/TextImportServiceTests.cs index 36f1b0a6..637db7bc 100644 --- a/AudioCuesheetEditor.Tests/Services/IO/TextImportServiceTests.cs +++ b/AudioCuesheetEditor.Tests/Services/IO/TextImportServiceTests.cs @@ -20,7 +20,6 @@ using AudioCuesheetEditor.Model.Options; using AudioCuesheetEditor.Model.Utility; using AudioCuesheetEditor.Services.IO; -using AudioCuesheetEditor.Tests.Properties; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; @@ -327,9 +326,7 @@ public async Task AnalyseAsync_CuesheetTracksOnly_CreatesValidCuesheetAsync() public async Task AnalyseAsync_CuesheetBug213_CreatesValidCuesheetAsync() { // Arrange - var textImportMemoryStream = new MemoryStream(Resources.Textimport_Bug_213); - using var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Textimport_Bug_213.txt"); var profile = new Importprofile() { SchemeTracks = $"{nameof(ImportTrack.Artist)} - {nameof(ImportTrack.Title)}\t{nameof(ImportTrack.End)}", @@ -546,9 +543,7 @@ public async Task AnalyseAsync_TextfileBug233_CreatesValidFileContentRecognizedA { SchemeTracks = $"{nameof(ImportTrack.Artist)} - {nameof(ImportTrack.Title)}\t{nameof(ImportTrack.End)}" }; - var textImportMemoryStream = new MemoryStream(Resources.Textimport_Bug__233); - using var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Textimport_Bug_#233.txt"); var localStorageOptionsProviderMock = new Mock(); var options = new ImportOptions { @@ -580,9 +575,7 @@ public async Task AnalyseAsync_WithRegularExpression_ReturnsCuesheetAsync() UseRegularExpression = true, SchemeTracks = "\\s*\\d+\\s*(?.*?)\\s*(?.*?)</td>\\s*<td>(?<StartDateTime>.*?)</td>\\s*</tr>" }; - var textImportMemoryStream = new MemoryStream(Resources.Traktor_Export); - var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Traktor Export.html"); var localStorageOptionsProviderMock = new Mock<ILocalStorageOptionsProvider>(); var options = new ImportOptions { @@ -622,9 +615,7 @@ public async Task AnalyseAsync_WithoutRegularExpression_ReturnsCuesheetAsync() SchemeCuesheet = "Artist - Title - Cataloguenumber", SchemeTracks = "Artist - Title\tBegin" }; - var textImportMemoryStream = new MemoryStream(Resources.Textimport_with_Cuesheetdata); - var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Textimport with Cuesheetdata.txt"); var localStorageOptionsProviderMock = new Mock<ILocalStorageOptionsProvider>(); var options = new ImportOptions { @@ -734,9 +725,7 @@ public async Task AnalyseAsync_WithCommonDataMatchingMultipleLines_SetsCommonDat SchemeCuesheet = "Artist - Title\tAudiofile", SchemeTracks = "Artist - Title\tBegin" }; - var textImportMemoryStream = new MemoryStream(Resources.Sample_Inputfile); - var reader = new StreamReader(textImportMemoryStream); - var fileContent = reader.ReadToEnd(); + var fileContent = File.ReadAllText("Resources/Sample_Inputfile.txt"); var localStorageOptionsProviderMock = new Mock<ILocalStorageOptionsProvider>(); var options = new ImportOptions { diff --git a/AudioCuesheetEditor.Tests/Services/UI/ApplicationOptionsTimeSpanParserTests.cs b/AudioCuesheetEditor.Tests/Services/UI/ApplicationOptionsTimeSpanParserTests.cs index b58aaac6..b7e8ef56 100644 --- a/AudioCuesheetEditor.Tests/Services/UI/ApplicationOptionsTimeSpanParserTests.cs +++ b/AudioCuesheetEditor.Tests/Services/UI/ApplicationOptionsTimeSpanParserTests.cs @@ -20,7 +20,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; -using System.Linq.Expressions; using System.Threading.Tasks; namespace AudioCuesheetEditor.Tests.Services.UI @@ -44,7 +43,6 @@ public async Task TimespanTextChanged_ValidInput_SetsPropertyCorrectly() .Setup(p => p.GetOptionsAsync<ApplicationOptions>()) .ReturnsAsync(options); var parser = new ApplicationOptionsTimeSpanParser(mockOptionsProvider.Object); - await Task.Delay(50); var track = new Track(); // Act await parser.TimespanTextChanged(track, x => x.Begin, "92:12"); @@ -67,7 +65,6 @@ public async Task TimespanTextChanged_InvalidInput_SetsNull() .Setup(p => p.GetOptionsAsync<ApplicationOptions>()) .ReturnsAsync(options); var parser = new ApplicationOptionsTimeSpanParser(mockOptionsProvider.Object); - await Task.Delay(50); var track = new Track(); // Act await parser.TimespanTextChanged(track, x => x.End, "not a time"); @@ -76,7 +73,7 @@ public async Task TimespanTextChanged_InvalidInput_SetsNull() } [TestMethod()] - public async Task GetTimespanFormatted_ValidFormat_ReturnsCorrectString() + public void GetTimespanFormatted_ValidFormat_ReturnsCorrectString() { // Arrange var options = new ApplicationOptions() @@ -88,7 +85,6 @@ public async Task GetTimespanFormatted_ValidFormat_ReturnsCorrectString() .Setup(p => p.GetOptionsAsync<ApplicationOptions>()) .ReturnsAsync(options); var parser = new ApplicationOptionsTimeSpanParser(mockOptionsProvider.Object); - await Task.Delay(50); // Act var result = parser.GetTimespanFormatted(new TimeSpan(0, 1, 30, 27, 200, 103)); // Assert @@ -96,7 +92,7 @@ public async Task GetTimespanFormatted_ValidFormat_ReturnsCorrectString() } [TestMethod()] - public async Task GetTimespanFormatted_InvalidFormat_FallbackToDefault() + public void GetTimespanFormatted_InvalidFormat_FallbackToDefault() { // Arrange var options = new ApplicationOptions() @@ -108,7 +104,6 @@ public async Task GetTimespanFormatted_InvalidFormat_FallbackToDefault() .Setup(p => p.GetOptionsAsync<ApplicationOptions>()) .ReturnsAsync(options); var parser = new ApplicationOptionsTimeSpanParser(mockOptionsProvider.Object); - await Task.Delay(50); // Act var result = parser.GetTimespanFormatted(new TimeSpan(0, 1, 30, 27, 200, 103)); // Assert diff --git a/AudioCuesheetEditor/AudioCuesheetEditor.csproj b/AudioCuesheetEditor/AudioCuesheetEditor.csproj index 9ba06fe1..61e00e9d 100644 --- a/AudioCuesheetEditor/AudioCuesheetEditor.csproj +++ b/AudioCuesheetEditor/AudioCuesheetEditor.csproj @@ -21,7 +21,7 @@ <ItemGroup> <PackageReference Include="HtmlSanitizer" Version="9.0.886" /> - <PackageReference Include="MetaBrainz.MusicBrainz" Version="6.1.0" /> + <PackageReference Include="MetaBrainz.MusicBrainz" Version="7.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.9" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.9" PrivateAssets="all" /> <PackageReference Include="BlazorDownloadFile" Version="2.4.0.2" /> diff --git a/AudioCuesheetEditor/Services/UI/ApplicationOptionsTimeSpanParser.cs b/AudioCuesheetEditor/Services/UI/ApplicationOptionsTimeSpanParser.cs index a82fe8e5..b4723850 100644 --- a/AudioCuesheetEditor/Services/UI/ApplicationOptionsTimeSpanParser.cs +++ b/AudioCuesheetEditor/Services/UI/ApplicationOptionsTimeSpanParser.cs @@ -26,13 +26,14 @@ public class ApplicationOptionsTimeSpanParser private readonly ILocalStorageOptionsProvider _localStorageOptionsProvider; private ApplicationOptions? applicationOptions; + private Task? _initTask; private bool disposedValue; public ApplicationOptionsTimeSpanParser(ILocalStorageOptionsProvider localStorageOptionsProvider) { _localStorageOptionsProvider = localStorageOptionsProvider; _localStorageOptionsProvider.OptionSaved += LocalStorageOptionsProvider_OptionSaved; - Task.Run(InitAsync); + _initTask = InitAsync(); } public async Task TimespanTextChanged<T, TProperty>(T entity, Expression<Func<T, TProperty>> expression, String value) @@ -41,10 +42,7 @@ public async Task TimespanTextChanged<T, TProperty>(T entity, Expression<Func<T, { throw new ArgumentException("'expression' should be a member expression"); } - if (applicationOptions == null) - { - await InitAsync(); - } + await EnsureInitializedAsync(); TimeSpan? result = TimeSpanUtility.ParseTimeSpan(value, applicationOptions?.TimeSpanFormat); switch (memberExpression.Member.MemberType) { @@ -59,6 +57,7 @@ public async Task TimespanTextChanged<T, TProperty>(T entity, Expression<Func<T, public string? GetTimespanFormatted(TimeSpan? timeSpan) { string? formatted = null; + EnsureInitializedAsync().GetAwaiter().GetResult(); if (timeSpan.HasValue) { try @@ -92,6 +91,14 @@ private async Task InitAsync() applicationOptions ??= await _localStorageOptionsProvider.GetOptionsAsync<ApplicationOptions>(); } + private async Task EnsureInitializedAsync() + { + if (_initTask != null) + { + await _initTask; + } + } + private void LocalStorageOptionsProvider_OptionSaved(object? sender, IOptions options) { if (options is ApplicationOptions applicationOption) diff --git a/AudioCuesheetEditor/Shared/Dialogs/EditMultipleTracksModal.razor b/AudioCuesheetEditor/Shared/Dialogs/EditMultipleTracksModal.razor index eabf09f1..40e7c59e 100644 --- a/AudioCuesheetEditor/Shared/Dialogs/EditMultipleTracksModal.razor +++ b/AudioCuesheetEditor/Shared/Dialogs/EditMultipleTracksModal.razor @@ -62,13 +62,11 @@ along with Foobar. If not, see Error="!String.IsNullOrEmpty(GetValidationErrorMessage(editTrackArtist, EditedTrack, nameof(Track.Artist)))" ErrorText="@GetValidationErrorMessage(editTrackArtist, EditedTrack, nameof(Track.Artist))" MaxItems="null" CoerceText="false"> <ItemTemplate Context="autocompleteContext"> + <MudText>@autocompleteContext.Name</MudText> @if (autocompleteContext.Disambiguation != null) { - <MudText>@String.Format("{0} ({1})", autocompleteContext.Name, autocompleteContext.Disambiguation)</MudText> - } - else - { - <MudText>@autocompleteContext.Name</MudText> + <MudSpacer /> + <MudText Typo="Typo.subtitle2" Color="Color.Secondary">@autocompleteContext.Disambiguation</MudText> } </ItemTemplate> </MudAutocomplete> @@ -88,13 +86,11 @@ along with Foobar. If not, see Error="!String.IsNullOrEmpty(GetValidationErrorMessage(editTrackTitle, EditedTrack, nameof(Track.Title)))" ErrorText="@GetValidationErrorMessage(editTrackTitle, EditedTrack, nameof(Track.Title))" MaxItems="null" CoerceText="false"> <ItemTemplate Context="autocompleteContext"> + <MudText>@autocompleteContext.Title</MudText> @if (autocompleteContext.Disambiguation != null) { - <MudText>@String.Format("{0} ({1})", autocompleteContext.Title, autocompleteContext.Disambiguation)</MudText> - } - else - { - <MudText>@autocompleteContext.Title</MudText> + <MudSpacer /> + <MudText Typo="Typo.subtitle2" Color="Color.Secondary">@autocompleteContext.Disambiguation</MudText> } </ItemTemplate> </MudAutocomplete> diff --git a/AudioCuesheetEditor/Shared/Dialogs/EditTrackModal.razor b/AudioCuesheetEditor/Shared/Dialogs/EditTrackModal.razor index ddd0639e..cd1199a8 100644 --- a/AudioCuesheetEditor/Shared/Dialogs/EditTrackModal.razor +++ b/AudioCuesheetEditor/Shared/Dialogs/EditTrackModal.razor @@ -42,13 +42,11 @@ along with Foobar. If not, see @bind-Text="EditedTrack.Artist" @bind-Value="autocompleteArtist" Clearable ShowProgressIndicator Error="!String.IsNullOrEmpty(GetValidationErrorMessage(EditedTrack, nameof(Track.Artist)))" ErrorText="@GetValidationErrorMessage(EditedTrack, nameof(Track.Artist))" MaxItems="null" CoerceText="false"> <ItemTemplate Context="autocompleteContext"> + <MudText>@autocompleteContext.Name</MudText> @if (autocompleteContext.Disambiguation != null) { - <MudText>@String.Format("{0} ({1})", autocompleteContext.Name, autocompleteContext.Disambiguation)</MudText> - } - else - { - <MudText>@autocompleteContext.Name</MudText> + <MudSpacer /> + <MudText Typo="Typo.subtitle2" Color="Color.Secondary">@autocompleteContext.Disambiguation</MudText> } </ItemTemplate> </MudAutocomplete> @@ -63,13 +61,11 @@ along with Foobar. If not, see @bind-Text="EditedTrack.Title" Value="autocompleteTrack" ValueChanged="TitleSelected" Clearable ShowProgressIndicator Error="!String.IsNullOrEmpty(GetValidationErrorMessage(EditedTrack, nameof(Track.Title)))" ErrorText="@GetValidationErrorMessage(EditedTrack, nameof(Track.Title))" MaxItems="null" CoerceText="false"> <ItemTemplate Context="autocompleteContext"> + <MudText>@autocompleteContext.Title</MudText> @if (autocompleteContext.Disambiguation != null) { - <MudText>@String.Format("{0} ({1})", autocompleteContext.Title, autocompleteContext.Disambiguation)</MudText> - } - else - { - <MudText>@autocompleteContext.Title</MudText> + <MudSpacer /> + <MudText Typo="Typo.subtitle2" Color="Color.Secondary">@autocompleteContext.Disambiguation</MudText> } </ItemTemplate> </MudAutocomplete> diff --git a/AudioCuesheetEditor/Shared/TrackList/ArtistColumn.razor b/AudioCuesheetEditor/Shared/TrackList/ArtistColumn.razor index 9fbd38d0..b82322b0 100644 --- a/AudioCuesheetEditor/Shared/TrackList/ArtistColumn.razor +++ b/AudioCuesheetEditor/Shared/TrackList/ArtistColumn.razor @@ -24,13 +24,11 @@ along with Foobar. If not, see Value="autocompleteArtist" ValueChanged="ValueChanged" Clearable ShowProgressIndicator Validation="(string? newArtist) => _validationService.Validate(Track, nameof(Track.Artist))" MaxItems="null" CoerceText="false" OnBlur="OnBlur"> <ItemTemplate> + <MudText>@context.Name</MudText> @if (context.Disambiguation != null) { - <MudText>@String.Format("{0} ({1})", context.Name, context.Disambiguation)</MudText> - } - else - { - <MudText>@context.Name</MudText> + <MudSpacer /> + <MudText Typo="Typo.subtitle2" Color="Color.Secondary">@context.Disambiguation</MudText> } </ItemTemplate> </MudAutocomplete> diff --git a/AudioCuesheetEditor/Shared/TrackList/TitleColumn.razor b/AudioCuesheetEditor/Shared/TrackList/TitleColumn.razor index 1f9205f4..ccb84295 100644 --- a/AudioCuesheetEditor/Shared/TrackList/TitleColumn.razor +++ b/AudioCuesheetEditor/Shared/TrackList/TitleColumn.razor @@ -24,13 +24,11 @@ along with Foobar. If not, see @bind-Text="title" Value="autocompleteTrack" ValueChanged="TitleSelected" ResetValueOnEmptyText Clearable ShowProgressIndicator Validation="(string? newTitle) => _validationService.Validate(Track, nameof(Track.Title))" MaxItems="null" CoerceText="false" OnBlur="OnBlur"> <ItemTemplate Context="autocompleteContext"> + <MudText>@autocompleteContext.Title</MudText> @if (autocompleteContext.Disambiguation != null) { - <MudText>@String.Format("{0} ({1})", autocompleteContext.Title, autocompleteContext.Disambiguation)</MudText> - } - else - { - <MudText>@autocompleteContext.Title</MudText> + <MudSpacer /> + <MudText Typo="Typo.subtitle2" Color="Color.Secondary">@autocompleteContext.Disambiguation</MudText> } </ItemTemplate> </MudAutocomplete>