From 4d6a0ec836eb53c6cc8dec43bfdcf3498a3c6e44 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 18 Apr 2020 16:47:09 +0100 Subject: [PATCH] Add options builder extension --- .../GraphicOptionsDefaultsExtensions.cs | 26 +++++++++- .../GraphicOptionsDefaultsExtensionsTests.cs | 50 +++++++++++++++++-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs b/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs index 38baf91d3..45e444ffe 100644 --- a/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs +++ b/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs @@ -11,6 +11,30 @@ namespace SixLabors.ImageSharp /// public static class GraphicOptionsDefaultsExtensions { + /// + /// Sets the default options against the image processing context. + /// + /// The image processing context to store default against. + /// The action to update instance of the default options used. + public static void SetDefaultOptions(this IImageProcessingContext context, Action optionsBuilder) + { + var cloned = context.GetDefaultGraphicsOptions().DeepClone(); + optionsBuilder(cloned); + context.Properties[typeof(GraphicsOptions)] = cloned; + } + + /// + /// Sets the default options against the configuration. + /// + /// The image processing context to store default against. + /// The default options to use. + public static void SetDefaultGraphicsOptions(this Configuration context, Action optionsBuilder) + { + var cloned = context.GetDefaultGraphicsOptions().DeepClone(); + optionsBuilder(cloned); + context.Properties[typeof(GraphicsOptions)] = cloned; + } + /// /// Sets the default options against the image processing context. /// @@ -26,7 +50,7 @@ namespace SixLabors.ImageSharp /// /// The image processing context to store default against. /// The default options to use. - public static void SetDefaultOptions(this Configuration context, GraphicsOptions options) + public static void SetDefaultGraphicsOptions(this Configuration context, GraphicsOptions options) { context.Properties[typeof(GraphicsOptions)] = options; } diff --git a/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs b/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs index 6707341d2..4b0d7a62d 100644 --- a/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs +++ b/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs @@ -3,6 +3,7 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests.Processing; +using SixLabors.ImageSharp.Tests.TestUtilities; using Xunit; namespace SixLabors.ImageSharp.Tests @@ -23,17 +24,60 @@ namespace SixLabors.ImageSharp.Tests Assert.DoesNotContain(typeof(GraphicsOptions), config.Properties.Keys); } + [Fact] + public void UpdateDefaultOptionsOnProcessingContext_AlwaysNewInstance() + { + var option = new GraphicsOptions() + { + BlendPercentage = 0.9f + }; + var config = new Configuration(); + var context = new FakeImageOperationsProvider.FakeImageOperations(config, null, true); + context.SetDefaultOptions(option); + + context.SetDefaultOptions(o => + { + Assert.Equal(0.9f, o.BlendPercentage); // has origional values + o.BlendPercentage = 0.4f; + }); + + var returnedOption = context.GetDefaultGraphicsOptions(); + Assert.Equal(0.4f, returnedOption.BlendPercentage); + Assert.Equal(0.9f, option.BlendPercentage); // hasn't been mutated + } + [Fact] public void SetDefaultOptionsOnConfiguration() { var option = new GraphicsOptions(); var config = new Configuration(); - config.SetDefaultOptions(option); + config.SetDefaultGraphicsOptions(option); Assert.Equal(option, config.Properties[typeof(GraphicsOptions)]); } + [Fact] + public void UpdateDefaultOptionsOnConfiguration_AlwaysNewInstance() + { + var option = new GraphicsOptions() + { + BlendPercentage = 0.9f + }; + var config = new Configuration(); + config.SetDefaultGraphicsOptions(option); + + config.SetDefaultGraphicsOptions(o => + { + Assert.Equal(0.9f, o.BlendPercentage); // has origional values + o.BlendPercentage = 0.4f; + }); + + var returnedOption = config.GetDefaultGraphicsOptions(); + Assert.Equal(0.4f, returnedOption.BlendPercentage); + Assert.Equal(0.9f, option.BlendPercentage); // hasn't been mutated + } + [Fact] public void GetDefaultOptionsFromConfiguration_SettingNullThenReturnsNewInstance() { @@ -41,7 +85,7 @@ namespace SixLabors.ImageSharp.Tests var options = config.GetDefaultGraphicsOptions(); Assert.NotNull(options); - config.SetDefaultOptions((GraphicsOptions)null); + config.SetDefaultGraphicsOptions((GraphicsOptions)null); var options2 = config.GetDefaultGraphicsOptions(); Assert.NotNull(options2); @@ -107,7 +151,7 @@ namespace SixLabors.ImageSharp.Tests { var option = new GraphicsOptions(); var config = new Configuration(); - config.SetDefaultOptions(option); + config.SetDefaultGraphicsOptions(option); var context = new FakeImageOperationsProvider.FakeImageOperations(config, null, true); var ctxOptions = context.GetDefaultGraphicsOptions();