Skip to content

Commit

Permalink
feat!: Change file extension provider to match with dialog filter
Browse files Browse the repository at this point in the history
  • Loading branch information
sandre58 committed May 2, 2024
1 parent 64339e3 commit ce5f1d3
Show file tree
Hide file tree
Showing 4 changed files with 206 additions and 17 deletions.
189 changes: 189 additions & 0 deletions src/MyNet.Utilities.UnitTests/FileExtensionsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
// Copyright (c) Stéphane ANDRE. All Right Reserved.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using MyNet.Utilities.IO.FileExtensions;
using Xunit;

namespace MyNet.Utilities.UnitTests
{
public class FileExtensionsTests
{
[Fact]
public void Add_AddsSingleExtension()
{
var builder = new FileExtensionFilterBuilder();
builder.Add(new FileExtensionInfo("Test", [".txt"]));

Assert.Equal(0, builder.IndexOfExtension(".txt"));
}

[Fact]
public void AddRange_AddsMultipleExtensions()
{
var builder = new FileExtensionFilterBuilder();
var extensions = new List<FileExtensionInfo>
{
new("Test1", [".txt"]),
new("Test2", [".jpg"])
};

builder.AddRange(extensions);

Assert.Equal(1, builder.IndexOfExtension(".jpg"));
}

[Fact]
public void AddMerge_AddsExtensionAtFirstPosition()
{
var builder = new FileExtensionFilterBuilder();
builder.Add(new FileExtensionInfo("Existing", [".txt"]));
builder.AddMerge("New", true, new FileExtensionInfo("Test", [".jpg"]));

Assert.Equal(0, builder.IndexOfExtension(".jpg"));
}

[Fact]
public void AddMerge_AddsExtensionAtLastPosition()
{
var builder = new FileExtensionFilterBuilder();
builder.Add(new FileExtensionInfo("Existing", [".txt"]));
builder.AddMerge("New", false, new FileExtensionInfo("Test", [".jpg"]));

Assert.Equal(1, builder.IndexOfExtension(".jpg"));
}

[Fact]
public void AddContentMerge_AddsAllExtensions()
{
var builder = new FileExtensionFilterBuilder();
builder.Add(new FileExtensionInfo("Existing1", [".txt"]));
builder.Add(new FileExtensionInfo("Existing2", [".jpg"]));

builder.AddContentMerge("Merged");

Assert.Equal(1, builder.IndexOfExtension(".jpg"));
Assert.Equal(0, builder.IndexOfExtension(".txt"));
}

[Fact]
public void GenerateFilters_ReturnsCorrectFilters()
{
var builder = new FileExtensionFilterBuilder();
builder.Add(new FileExtensionInfo("Test1", [".txt"]));
builder.Add(new FileExtensionInfo("Test2", [".jpg"]));

var filters = builder.GenerateFilters();

Assert.Equal("Test1 (*.txt)|*.txt|Test2 (*.jpg)|*.jpg", filters);
}

[Fact]
public void IndexOfExtension_ReturnsCorrectIndex()
{
var builder = new FileExtensionFilterBuilder();
builder.Add(new FileExtensionInfo("Test1", [".txt"]));
builder.Add(new FileExtensionInfo("Test2", [".jpg"]));

var index = builder.IndexOfExtension(".jpg");

Assert.Equal(1, index);
}

[Fact]
public void GetFileFilter_ReturnsCorrectNameAndExtensions()
{
var fileTypeExtension = new FileExtensionInfo("Test", [".txt", ".jpg"]);

var (name, extensions) = fileTypeExtension.GetFileFilter();

Assert.Equal("Test (*.txt;*.jpg)", name);
Assert.Equal("*.txt;*.jpg", extensions);
}

[Fact]
public void GetAllFilesFilter_ReturnsCorrectNameAndExtensions()
{
var fileTypeExtension = FileExtensionInfoProvider.AllFiles;

var (name, extensions) = fileTypeExtension.GetFileFilter();

Assert.Equal("AllFiles", name);
Assert.Equal("*.*", extensions);
}

[Fact]
public void GetFileFilters_ReturnsCorrectFiltersForSingleExtension()
{
var fileTypeExtension = new FileExtensionInfo("Test", [".txt"]);

var filters = fileTypeExtension.GetFileFilters();

Assert.Equal("Test (*.txt)|*.txt", filters);
}

[Fact]
public void GetFileFilters_ReturnsCorrectFiltersForMultipleExtensions()
{
var fileTypeExtensions = new List<FileExtensionInfo>
{
new("Test1", [".txt", ".csv", ".test"]),
new("Test2", [".jpg"])
};

var filters = fileTypeExtensions.GetFileFilters();

Assert.Equal("Test1 (*.txt;*.csv;*.test)|*.txt;*.csv;*.test|Test2 (*.jpg)|*.jpg", filters);
}

[Fact]
public void GetExtensionNames_ReturnsLowercaseExtensions()
{
var fileTypeExtension = new FileExtensionInfo("Test", [".TXT", ".JPG"]);

var extensions = fileTypeExtension.GetExtensionNames();

Assert.Contains(".txt", extensions);
Assert.Contains(".jpg", extensions);
}

[Fact]
public void FilterFiles_ReturnsFilteredFiles()
{
var fileTypeExtension = new FileExtensionInfo("Test", [".txt"]);
var fileNames = new List<string> { "file1.txt", "file2.jpg", "file3.exe" };

var filteredFiles = fileTypeExtension.FilterFiles(fileNames);

Assert.Contains("file1.txt", filteredFiles);
Assert.DoesNotContain("file2.jpg", filteredFiles);
Assert.DoesNotContain("file3.exe", filteredFiles);
}

[Theory]
[InlineData(".txt", "file.txt", true)]
[InlineData(".txt", "file.TXT", true)]
[InlineData(".txt", "file.jpg", false)]
public void IsValid_ReturnsCorrectValidity(string extension, string filename, bool expected)
{
var fileTypeExtension = new FileExtensionInfo("Test", [extension]);

var isValid = fileTypeExtension.IsValid(filename);

Assert.Equal(expected, isValid);
}

[Fact]
public void Concat_ConcatenatesExtensions()
{
var fileTypeExtension1 = new FileExtensionInfo("Test1", [".txt"]);
var fileTypeExtension2 = new FileExtensionInfo("Test2", [".jpg"]);

var concatenatedExtension = fileTypeExtension1.Concat(fileTypeExtension2, "Concatenated");

Assert.Equal("Concatenated", concatenatedExtension.Key);
Assert.Contains(".txt", concatenatedExtension.Extensions);
Assert.Contains(".jpg", concatenatedExtension.Extensions);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ public FileExtensionFilterBuilder AddContentMerge(string key, bool fistPosition
return AddMerge(key, fistPosition, extensions);
}

public IDictionary<string, string> GenerateFilters(Func<string, string?>? translateKey = null) => _extensions.GetFileFilters(translateKey);
public string? GenerateFilters(Func<string, string?>? translateKey = null) => _extensions.GetFileFilters(translateKey);

public int IndexOfExtension(string extensionName) =>
_extensions.Select((x, y) => (index: y, item: x))
.FirstOrDefault(x => x.item.GetExtensionNames().Contains(extensionName.ToLowerInvariant()))
.index;
.FirstOrDefault(x => x.item.GetExtensionNames().Contains(extensionName.ToLowerInvariant()))
.index;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,32 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using MyNet.Utilities.Extensions;

namespace MyNet.Utilities.IO.FileExtensions
{
public static class FileExtensionInfoExtensions
{
public static (string Name, string Extensions) GetFileFilter(this FileExtensionInfo fileTypeExtension, Func<string, string?>? translateKey = null)
public static (string Title, string Extensions) GetFileFilter(this FileExtensionInfo fileTypeExtension, Func<string, string?>? translateKey = null)
{
var extensionFilters = fileTypeExtension.Extensions.Select(x => $"*{x}").Aggregate((x, y) => $"{x};{y}");
var title = $"{translateKey?.Invoke(fileTypeExtension.Key) ?? fileTypeExtension.Key.Translate()}";

return ($"{translateKey?.Invoke(fileTypeExtension.Key) ?? fileTypeExtension.Key}", extensionFilters);
if (!string.IsNullOrEmpty(extensionFilters) && extensionFilters != "*.*")
title += $" ({extensionFilters})";

return (title, extensionFilters);
}

public static IDictionary<string, string> GetFileFilters(this FileExtensionInfo fileTypeExtension, Func<string, string?>? translateKey = null)
public static string? GetFileFilters(this FileExtensionInfo fileTypeExtension, Func<string, string?>? translateKey = null)
=> GetFileFilters([fileTypeExtension], translateKey);

public static IDictionary<string, string> GetFileFilters(this IEnumerable<FileExtensionInfo> fileTypeExtensions, Func<string, string?>? translateKey = null)
{
var result = new Dictionary<string, string>();
foreach (var fileTypeExtension in fileTypeExtensions)
public static string? GetFileFilters(this IEnumerable<FileExtensionInfo> fileTypeExtensions, Func<string, string?>? translateKey = null)
=> string.Join("|", fileTypeExtensions.SelectMany(x =>
{
var (name, extensions) = fileTypeExtension.GetFileFilter(translateKey);
result.Add(name, extensions);
}

return result;
}
var fileFilter = x.GetFileFilter(translateKey);
return new[] { fileFilter.Title, fileFilter.Extensions };
}).ToList());

public static IEnumerable<string> GetExtensionNames(this FileExtensionInfo fileTypeExtension) => fileTypeExtension.Extensions.Select(x => x.ToLowerInvariant());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace MyNet.Utilities.IO.FileExtensions
{
public static class FileExtensionInfoProvider
{
public static FileExtensionInfo AllFiles { get; } = new(nameof(AllFiles), new[] { "*" });
public static FileExtensionInfo AllFiles { get; } = new(nameof(AllFiles), new[] { ".*" });

public static FileExtensionInfo Csv { get; } = new(BuildTitleKey(nameof(Csv)), new[] { ".csv" });

Expand Down

0 comments on commit ce5f1d3

Please sign in to comment.