/// <summary> /// Asserts that the bitmap matches the image in the specified file. /// </summary> /// <param name="filename">The filename of the image to match against the bitmap.</param> public void ShouldMatch(String filename) { var machineName = UltravioletTestFramework.GetSanitizedMachineName(); Directory.CreateDirectory(machineName); var expected = (Bitmap)Image.FromFile(filename); var filenameNoExtension = Path.GetFileNameWithoutExtension(filename); var filenameExpected = Path.ChangeExtension(filenameNoExtension + "_Expected", "png"); SaveBitmap(expected, Path.Combine(machineName, filenameExpected)); var filenameActual = Path.ChangeExtension(filenameNoExtension + "_Actual", "png"); SaveBitmap(bitmap, Path.Combine(machineName, filenameActual)); if (expected.Width != bitmap.Width || expected.Height != bitmap.Height) { Assert.Fail("Images do not match due to differing dimensions"); } var mismatchesFound = 0; var mismatchesRequired = (Int32)((bitmap.Width * bitmap.Height) * threshold); using (var diff = new Bitmap(expected.Width, expected.Height)) { // Ignore pixels that are within about 1% of the expected value. const Int32 PixelDiffThreshold = 2; for (int y = 0; y < expected.Height; y++) { for (int x = 0; x < expected.Width; x++) { var pixelExpected = expected.GetPixel(x, y); var pixelActual = bitmap.GetPixel(x, y); var diffR = Math.Abs(pixelExpected.R + pixelActual.R - 2 * Math.Min(pixelExpected.R, pixelActual.R)); var diffG = Math.Abs(pixelExpected.G + pixelActual.G - 2 * Math.Min(pixelExpected.G, pixelActual.G)); var diffB = Math.Abs(pixelExpected.B + pixelActual.B - 2 * Math.Min(pixelExpected.B, pixelActual.B)); if (diffR > PixelDiffThreshold || diffG > PixelDiffThreshold || diffB > PixelDiffThreshold) { mismatchesFound++; } diff.SetPixel(x, y, System.Drawing.Color.FromArgb(255, diffR, diffG, diffB)); } } var filenameDiff = Path.ChangeExtension(filenameNoExtension + "_Diff", "png"); SaveBitmap(diff, Path.Combine(machineName, filenameDiff)); if (mismatchesFound > mismatchesRequired) { Assert.Fail("Images do not match"); } } }
public void SetUp() { Environment.CurrentDirectory = TestContext.CurrentContext.WorkDirectory; try { var imageDir = Path.Combine(Environment.CurrentDirectory, UltravioletTestFramework.GetSanitizedMachineName()); foreach (var image in Directory.GetFiles(imageDir, "*.png")) { File.Delete(image); } } catch (DirectoryNotFoundException) { } Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); }