using Explorer.Application; using Explorer.Domain; namespace Explorer.Application.Tests; public class FilenamePatternTests { [Fact] public void Formats_artist_title_and_dates() { var tags = new MediaTagFields { Artist = "Pink Floyd", Title = "Comfortably Numb", Track = 6, Created = new DateTimeOffset(new DateTime(2024, 8, 26, 12, 0, 0, DateTimeKind.Local)), Stem = "clip", Extension = "mp3", Width = 1920 }; Assert.Equal( "Pink Floyd - Comfortably Numb", FilenamePattern.Expand("{Artist} - {Title}", tags)); Assert.Equal("06", FilenamePattern.Expand("{Track:00}", tags)); Assert.Equal("2024-08-26", FilenamePattern.Expand("{CreatedDate}", tags)); Assert.Equal("1920_clip", FilenamePattern.Expand("{Width}_{Name}", tags)); } [Fact] public void Parses_filename_into_tags() { Assert.True(FilenamePattern.TryParse( "{Artist} - {Title}", "AC/DC - Hells Bells", out var tags, out _)); Assert.Equal("AC/DC", tags.Artist); Assert.Equal("Hells Bells", tags.Title); } [Fact] public void Parse_fails_when_the_name_does_not_match() { Assert.False(FilenamePattern.TryParse("{Artist} - {Title}", "JustOneName", out _, out var error)); Assert.Contains("match", error, StringComparison.OrdinalIgnoreCase); } [Fact] public void Unknown_tokens_stay_in_the_name() { Assert.Equal("{Foo}_a", FilenamePattern.Expand("{Foo}_{Name}", new MediaTagFields { Stem = "a" })); } [Fact] public void Sanitizes_illegal_filename_characters_from_tags() { var name = FilenamePattern.Expand("{Title}", new MediaTagFields { Title = @"a:b/c" }); Assert.Equal("a-b-c", name); } [Fact] public void Taken_date_and_project_expand() { var tags = new MediaTagFields { Taken = new DateTimeOffset(new DateTime(2024, 8, 26, 15, 30, 0, DateTimeKind.Local)), Created = new DateTimeOffset(new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Local)), Stem = "DSC_001", Project = "Explorer", Parent = "photos" }; Assert.Equal("20240826_DSC_001", FilenamePattern.Expand("{TakenDate:yyyyMMdd}_{Name}", tags)); Assert.Equal("2024-08-26", FilenamePattern.Expand("{CreatedDate}", tags)); Assert.Equal("Explorer_DSC_001", FilenamePattern.Expand("{Project}_{Name}", tags)); } [Fact] public void Parses_taken_date_from_filename() { Assert.True(FilenamePattern.TryParse( "{TakenDate:yyyyMMdd}_{Name}", "20240826_DSC_001", out var tags, out _)); Assert.Equal(2024, tags.Taken?.Year); Assert.Equal(8, tags.Taken?.Month); Assert.Equal(26, tags.Taken?.Day); Assert.Equal(2024, tags.Year); } [Fact] public void WithProject_uses_repo_folder_then_parent() { var fields = new MediaTagFields { Parent = "photos" }; Assert.Equal("Explorer", FilenamePattern.WithProject(fields, @"C:\src\Explorer").Project); Assert.Equal("photos", FilenamePattern.WithProject(fields, null).Project); } [Fact] public void TakenDate_is_media_content_CreatedDate_and_Project_are_not() { Assert.True(FilenamePattern.UsesMediaContent("{TakenDate}_{Name}")); Assert.False(FilenamePattern.UsesMediaContent("{CreatedDate}_{Name}")); Assert.False(FilenamePattern.UsesMediaContent("{Project}_{Name}")); } }