107 lines
3.6 KiB
C#
107 lines
3.6 KiB
C#
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}"));
|
|
}
|
|
}
|