From d82f4e88b1dce551bd08a19f6b94f9e20bc3c38a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Mon, 6 Oct 2014 15:05:21 +0200 Subject: [PATCH] Shaves off a few seconds off unit tests by loading the images just once Former-commit-id: 62aaff736204d33a9e8c1ce92d862fa7c9d97647 Former-commit-id: 18a14e628e14cddec72495b9b60499297d335f78 --- build/build.ps1 | 1 + .../ImageFactoryUnitTests.cs | 509 ++++++++---------- .../ImageProcessor.UnitTests.csproj | 14 - .../color-vision-test.gif.REMOVED.git-id | 1 - .../Images/size-Penguins-200.jpg | Bin 37476 -> 0 bytes 5 files changed, 213 insertions(+), 312 deletions(-) delete mode 100644 src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/size-Penguins-200.jpg diff --git a/build/build.ps1 b/build/build.ps1 index ecd0661bd8..65956529eb 100644 --- a/build/build.ps1 +++ b/build/build.ps1 @@ -152,6 +152,7 @@ task Run-Coverage -depends Build-Tests { $CoverageOutputPath = Join-Path $TEST_RESULTS "$($_)_Coverage.xml" Write-Host "Running code coverage on project $_" + $coverageFilter = "-filter:+[*]* -[FluentAssertions*]* -[*]Common.Exceptions -[ImageProcessor.UnitTests]* -[ImageProcessor.Web.UnitTests]*" & $OPENCOVER_EXE -register:user -target:$NUNIT_EXE -targetargs:"$TestDdlPath /noshadow /nologo" -targetdir:$TestDllFolder -output:$CoverageOutputPath Write-Host "Transforming coverage results file to HTML" diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 87cd3d51d0..2c364000f8 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -27,7 +27,12 @@ namespace ImageProcessor.UnitTests /// /// The list of images. Designed to speed up the tests a little. /// - private IEnumerable images; + private IEnumerable imagesInfos; + + /// + /// The list of ImageFactories. Designed to speed up the test a bit more. + /// + private List imagesFactories; /// /// Tests the loading of image from a file @@ -92,17 +97,13 @@ namespace ImageProcessor.UnitTests [Test] public void TestSaveToMemory() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) + using (MemoryStream s = new MemoryStream()) { - imageFactory.Load(file.FullName); - using (MemoryStream s = new MemoryStream()) - { - imageFactory.Save(s); - s.Seek(0, SeekOrigin.Begin); - Assert.AreEqual(true, s.Capacity > 0); - } + imageFactory.Save(s); + s.Seek(0, SeekOrigin.Begin); + Assert.AreEqual(true, s.Capacity > 0); } } } @@ -113,15 +114,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectAlpha() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Alpha(50); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Alpha(50); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -131,15 +128,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBrightness() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Brightness(50); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Brightness(50); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -149,15 +142,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBackgroundColor() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.BackgroundColor(Color.Yellow); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.BackgroundColor(Color.Yellow); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -167,15 +156,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectContrast() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Contrast(50); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Contrast(50); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -185,15 +170,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectSaturation() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Saturation(50); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Saturation(50); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -203,15 +184,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectTint() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Tint(Color.FromKnownColor(KnownColor.AliceBlue)); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Tint(Color.FromKnownColor(KnownColor.AliceBlue)); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -221,15 +198,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectVignette() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Vignette(Color.FromKnownColor(KnownColor.AliceBlue)); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Vignette(Color.FromKnownColor(KnownColor.AliceBlue)); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -239,21 +212,17 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectWatermark() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Watermark(new TextLayer { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Watermark(new TextLayer - { - FontFamily = new FontFamily("Arial"), - FontSize = 10, - Position = new Point(10, 10), - Text = "Lorem ipsum dolor" - }); - Assert.AreNotEqual(original, imageFactory.Image); - } + FontFamily = new FontFamily("Arial"), + FontSize = 10, + Position = new Point(10, 10), + Text = "Lorem ipsum dolor" + }); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -263,15 +232,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBlur() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.GaussianBlur(5); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.GaussianBlur(5); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -281,15 +246,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBlurWithLayer() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.GaussianBlur(new GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.GaussianBlur(new GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -299,15 +260,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectSharpen() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.GaussianSharpen(5); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.GaussianSharpen(5); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -317,15 +274,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectSharpenWithLayer() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.GaussianSharpen(new GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.GaussianSharpen(new GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -335,53 +288,49 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectFilter() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); + Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Filter(MatrixFilters.BlackWhite); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.BlackWhite); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.Comic); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.Comic); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.Gotham); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.Gotham); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.GreyScale); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.GreyScale); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.HiSatch); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.HiSatch); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.Invert); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.Invert); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.Lomograph); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.Lomograph); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.LoSatch); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.LoSatch); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.Polaroid); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Filter(MatrixFilters.Polaroid); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.Filter(MatrixFilters.Sepia); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); - } + imageFactory.Filter(MatrixFilters.Sepia); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); } } @@ -391,15 +340,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestRoundedCorners() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.RoundedCorners(new RoundedCornerLayer(5)); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.RoundedCorners(new RoundedCornerLayer(5)); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -410,15 +355,11 @@ namespace ImageProcessor.UnitTests public void TestResizeConstraints() { const int MaxSize = 200; - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - imageFactory.Constrain(new Size(MaxSize, MaxSize)); - Assert.LessOrEqual(imageFactory.Image.Width, MaxSize); - Assert.LessOrEqual(imageFactory.Image.Height, MaxSize); - } + imageFactory.Constrain(new Size(MaxSize, MaxSize)); + Assert.LessOrEqual(imageFactory.Image.Width, MaxSize); + Assert.LessOrEqual(imageFactory.Image.Height, MaxSize); } } @@ -429,17 +370,13 @@ namespace ImageProcessor.UnitTests public void TestCrop() { const int MaxSize = 20; - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Crop(new Rectangle(0, 0, MaxSize, MaxSize)); - Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(MaxSize, imageFactory.Image.Width); - Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Crop(new Rectangle(0, 0, MaxSize, MaxSize)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(MaxSize, imageFactory.Image.Width); + Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); } } @@ -450,17 +387,13 @@ namespace ImageProcessor.UnitTests public void TestCropWithCropLayer() { const int MaxSize = 20; - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Crop(new CropLayer(0, 0, MaxSize, MaxSize, CropMode.Pixels)); - Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(MaxSize, imageFactory.Image.Width); - Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Crop(new CropLayer(0, 0, MaxSize, MaxSize, CropMode.Pixels)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(MaxSize, imageFactory.Image.Width); + Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); } } @@ -470,23 +403,19 @@ namespace ImageProcessor.UnitTests [Test] public void TestFlip() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Flip(true); - Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(original.Width, imageFactory.Image.Width); - Assert.AreEqual(original.Height, imageFactory.Image.Height); - imageFactory.Reset(); - - imageFactory.Flip(); - Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(original.Width, imageFactory.Image.Width); - Assert.AreEqual(original.Height, imageFactory.Image.Height); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Flip(true); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(original.Width, imageFactory.Image.Width); + Assert.AreEqual(original.Height, imageFactory.Image.Height); + imageFactory.Reset(); + + imageFactory.Flip(); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(original.Width, imageFactory.Image.Width); + Assert.AreEqual(original.Height, imageFactory.Image.Height); } } @@ -497,15 +426,11 @@ namespace ImageProcessor.UnitTests public void TestResize() { const int NewSize = 150; - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - imageFactory.Resize(new Size(NewSize, NewSize)); - Assert.AreEqual(NewSize, imageFactory.Image.Width); - Assert.AreEqual(NewSize, imageFactory.Image.Height); - } + imageFactory.Resize(new Size(NewSize, NewSize)); + Assert.AreEqual(NewSize, imageFactory.Image.Width); + Assert.AreEqual(NewSize, imageFactory.Image.Height); } } @@ -516,15 +441,11 @@ namespace ImageProcessor.UnitTests public void TestResizeWithLayer() { const int NewSize = 150; - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - imageFactory.Resize(new ResizeLayer(new Size(NewSize, NewSize), ResizeMode.Stretch, AnchorPosition.Left)); - Assert.AreEqual(NewSize, imageFactory.Image.Width); - Assert.AreEqual(NewSize, imageFactory.Image.Height); - } + imageFactory.Resize(new ResizeLayer(new Size(NewSize, NewSize), ResizeMode.Stretch, AnchorPosition.Left)); + Assert.AreEqual(NewSize, imageFactory.Image.Width); + Assert.AreEqual(NewSize, imageFactory.Image.Height); } } @@ -534,16 +455,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestRotate() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Rotate(90); - Assert.AreEqual(original.Height, imageFactory.Image.Width); - Assert.AreEqual(original.Width, imageFactory.Image.Height); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Rotate(90); + Assert.AreEqual(original.Height, imageFactory.Image.Width); + Assert.AreEqual(original.Width, imageFactory.Image.Height); } } @@ -553,20 +470,16 @@ namespace ImageProcessor.UnitTests [Test] public void TestHue() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Hue(90); - Assert.AreNotEqual(original, imageFactory.Image); + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Hue(90); + Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.Reset(); - imageFactory.Hue(116, true); - Assert.AreNotEqual(original, imageFactory.Image); - } + imageFactory.Hue(116, true); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -576,15 +489,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestPixelate() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.Pixelate(8); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Pixelate(8); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -594,17 +503,13 @@ namespace ImageProcessor.UnitTests [Test] public void TestQuality() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - int original = imageFactory.CurrentImageFormat.Quality; - imageFactory.Quality(69); - int updated = imageFactory.CurrentImageFormat.Quality; + int original = imageFactory.CurrentImageFormat.Quality; + imageFactory.Quality(69); + int updated = imageFactory.CurrentImageFormat.Quality; - Assert.AreNotEqual(original, updated); - } + Assert.AreNotEqual(original, updated); } } @@ -614,15 +519,11 @@ namespace ImageProcessor.UnitTests [Test] public void TestReplaceColor() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); - imageFactory.ReplaceColor(Color.White, Color.Black, 90); - Assert.AreNotEqual(original, imageFactory.Image); - } + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.ReplaceColor(Color.White, Color.Black, 90); + Assert.AreNotEqual(original, imageFactory.Image); } } @@ -632,49 +533,45 @@ namespace ImageProcessor.UnitTests [Test] public void TestEdgeDetection() { - foreach (FileInfo file in this.ListInputFiles()) + foreach (ImageFactory imageFactory in this.ListInputImages()) { - using (ImageFactory imageFactory = new ImageFactory()) - { - imageFactory.Load(file.FullName); - Image original = (Image)imageFactory.Image.Clone(); + Image original = (Image)imageFactory.Image.Clone(); - imageFactory.DetectEdges(new KayyaliEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new KayyaliEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new KirschEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new KirschEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new Laplacian3X3EdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new Laplacian3X3EdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new Laplacian5X5EdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new Laplacian5X5EdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new LaplacianOfGaussianEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new LaplacianOfGaussianEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new PrewittEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new PrewittEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new RobertsCrossEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new RobertsCrossEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new ScharrEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); + imageFactory.DetectEdges(new ScharrEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); - imageFactory.DetectEdges(new SobelEdgeFilter()); - Assert.AreNotEqual(original, imageFactory.Image); - imageFactory.Reset(); - } + imageFactory.DetectEdges(new SobelEdgeFilter()); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); } } @@ -710,16 +607,34 @@ namespace ImageProcessor.UnitTests /// The list of files. private IEnumerable ListInputFiles() { - if (this.images != null) + if (this.imagesInfos != null) { - return this.images; + return this.imagesInfos; } DirectoryInfo directoryInfo = new DirectoryInfo("./Images"); - this.images = GetFilesByExtensions(directoryInfo, new[] { ".jpg", ".jpeg", ".png", ".gif", ".tiff", ".bmp", ".webp" }); + this.imagesInfos = GetFilesByExtensions(directoryInfo, new[] { ".jpg", ".jpeg", ".png", ".gif", ".tiff", ".bmp", ".webp" }); + + return this.imagesInfos; + } + + /// + /// Lists the input images to use from the Images folder + /// + /// The list of images + private IEnumerable ListInputImages() + { + if (imagesFactories == null || imagesFactories.Count() == 0) + { + imagesFactories = new List(); + foreach (FileInfo fi in this.ListInputFiles()) + { + imagesFactories.Add((new ImageFactory()).Load(fi.FullName)); + } + } - return this.images; + return imagesFactories; } } } \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index fdc2c86684..ce96b012a2 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -69,9 +69,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -114,9 +111,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -135,14 +129,6 @@ Images\text.png PreserveNewest - - Images\thor.jpg - PreserveNewest - - - Images\udendørs-374.jpg - PreserveNewest - Images\udendørs.jpg PreserveNewest diff --git a/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id deleted file mode 100644 index ed1d0b80bf..0000000000 --- a/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -b169fac4f1591e81e91c0bb6fed6dcf62a34c80e \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/size-Penguins-200.jpg b/src/ImageProcessor.UnitTests/Images/size-Penguins-200.jpg deleted file mode 100644 index a9aa44d3dff9e5d51cee7a1165f43bdedcce1e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37476 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�DD4`Tx zhy7Ws_CLKeQB46tKluEu`>*)(N+_yeRA2Riu73%lijJUUYv1w-y8i%jygR}3Iq?<1 zF30EfqKdRZ?3zm*ugz>*{{X2!N+_!X3h(|tja;$&k3|&($8li)09@2jMFyw;*$b+r Al>h($