Browse Source

Merge pull request #684 from SixLabors/js/DuplicateFormats

Don't allow duplicate formats in configuration.
af/merge-core
James Jackson-South 8 years ago
committed by GitHub
parent
commit
fda7235265
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 23
      src/ImageSharp/Formats/ImageFormatManager.cs
  2. 31
      tests/ImageSharp.Tests/ConfigurationTests.cs

23
src/ImageSharp/Formats/ImageFormatManager.cs

@ -13,6 +13,12 @@ namespace SixLabors.ImageSharp.Formats
/// </summary>
public class ImageFormatManager
{
/// <summary>
/// Used for locking against as there is no ConcurrentSet type.
/// <see href="https://github.com/dotnet/corefx/issues/6318"/>
/// </summary>
private static readonly object HashLock = new object();
/// <summary>
/// The list of supported <see cref="IImageEncoder"/> keyed to mime types.
/// </summary>
@ -26,7 +32,7 @@ namespace SixLabors.ImageSharp.Formats
/// <summary>
/// The list of supported <see cref="IImageFormat"/>s.
/// </summary>
private readonly ConcurrentBag<IImageFormat> imageFormats = new ConcurrentBag<IImageFormat>();
private readonly HashSet<IImageFormat> imageFormats = new HashSet<IImageFormat>();
/// <summary>
/// The list of supported <see cref="IImageFormatDetector"/>s.
@ -74,7 +80,14 @@ namespace SixLabors.ImageSharp.Formats
Guard.NotNull(format, nameof(format));
Guard.NotNull(format.MimeTypes, nameof(format.MimeTypes));
Guard.NotNull(format.FileExtensions, nameof(format.FileExtensions));
this.imageFormats.Add(format);
lock (HashLock)
{
if (!this.imageFormats.Contains(format))
{
this.imageFormats.Add(format);
}
}
}
/// <summary>
@ -86,9 +99,9 @@ namespace SixLabors.ImageSharp.Formats
{
Guard.NotNullOrWhiteSpace(extension, nameof(extension));
if (extension[0] == '.')
{
extension = extension.Substring(1);
if (extension[0] == '.')
{
extension = extension.Substring(1);
}
return this.imageFormats.FirstOrDefault(x => x.FileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase));

31
tests/ImageSharp.Tests/ConfigurationTests.cs

@ -2,13 +2,9 @@
// Licensed under the Apache License, Version 2.0.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.IO;
using SixLabors.ImageSharp.PixelFormats;
using Moq;
using SixLabors.ImageSharp.IO;
using Xunit;
// ReSharper disable InconsistentNaming
@ -19,8 +15,8 @@ namespace SixLabors.ImageSharp.Tests
/// </summary>
public class ConfigurationTests
{
public Configuration ConfigurationEmpty { get; private set; }
public Configuration DefaultConfiguration { get; private set; }
public Configuration ConfigurationEmpty { get; }
public Configuration DefaultConfiguration { get; }
public ConfigurationTests()
{
@ -96,5 +92,26 @@ namespace SixLabors.ImageSharp.Tests
provider.Verify(x => x.Configure(config));
}
[Fact]
public void ConfigurationCannotAddDuplicates()
{
const int count = 4;
Configuration config = Configuration.Default;
Assert.Equal(count, config.ImageFormats.Count());
config.ImageFormatsManager.AddImageFormat(ImageFormats.Bmp);
Assert.Equal(count, config.ImageFormats.Count());
}
[Fact]
public void DefaultConfigurationHasCorrectFormatCount()
{
Configuration config = Configuration.Default;
Assert.Equal(4, config.ImageFormats.Count());
}
}
}
Loading…
Cancel
Save