4 using System.CodeDom.Compiler;
5 using System.Diagnostics;
8 using System.Text.RegularExpressions;
9 using SiliconStudio.ImageComparerService;
11 namespace SiliconStudio.
Paradox.Graphics.Regression
15 #region Private static members
20 private static readonly
object WriterLocker =
new object();
25 private static string imageMagickDir;
30 private const string GoldFolder =
@"gold\";
35 private const string JsonFolder =
@"json\";
40 private const string BuildFolder =
@"build\";
51 imageMagickDir = System.Environment.GetEnvironmentVariable(
"IMAGEMAGICK_DIR");
52 if (imageMagickDir == null)
53 imageMagickDir = Environment.CurrentDirectory;
65 bool copyOnShare = (receivedImage.Client.Connection.Flags & ImageComparisonFlags.CopyOnShare) != 0;
67 var testPerformed =
false;
72 Console.WriteLine(
@"Generating a new gold image.");
73 File.Delete(receivedImage.ResultFileName);
74 File.Copy(resultTempFileName, receivedImage.ResultFileName);
75 File.Copy(resultTempFileName, receivedImage.GoldFileName);
76 receivedImage.MeanSquareError = 0;
80 var tempGoldFileName = Path.GetTempPath() + Guid.NewGuid() +
".png";
81 var tempDiffFileName = Path.GetTempPath() + Guid.NewGuid() +
".png";
85 File.Copy(receivedImage.GoldFileName, tempGoldFileName);
87 Console.WriteLine(
@"Gold image found. Performing tests.");
88 var output = RunImageMagickCommand(
91 "-metric rmse \"{0}\" \"{1}\" \"{2}\"",
96 var outputResult = Regex.Match(output.OutputErrors[0],
@"(\S*) \((\S*)\)");
98 if (!
float.TryParse(outputResult.Groups[1].Value, out mse))
100 var stringBuild =
new StringBuilder();
101 stringBuild.Append(
"Errors:\n");
102 foreach (var err
in output.OutputErrors)
104 stringBuild.Append(
" ");
105 stringBuild.Append(err);
106 stringBuild.Append(
"\n");
108 stringBuild.Append(
"Messages:\n");
109 foreach (var mess
in output.OutputLines)
111 stringBuild.Append(
" ");
112 stringBuild.Append(mess);
113 stringBuild.Append(
"\n");
116 Console.WriteLine(
@"Unable to read the value of the error between the two images.");
117 Console.WriteLine(stringBuild.ToString());
121 Console.WriteLine(
@"Error: " + mse);
126 Console.WriteLine(
@"Existing difference with gold image. Continuing tests.");
129 RunImageMagickCommand(
132 "\"{0}\" \"{1}\" -compose difference \"{2}\"",
138 RunImageMagickCommand(
141 "\"{0}\" -auto-level \"{1}\"",
145 File.Copy(resultTempFileName, receivedImage.ResultFileName,
true);
146 File.Copy(tempDiffFileName, receivedImage.DiffFileName,
true);
150 Console.WriteLine(
@"No difference with gold image.");
153 File.Delete(receivedImage.DiffFileName);
154 File.Delete(receivedImage.DiffNormFileName);
157 receivedImage.MeanSquareError = mse;
160 WriteJson(receivedImage);
162 testPerformed =
true;
167 Console.WriteLine(
@"An exception occured in ImageMagick.");
168 Console.WriteLine(ex);
172 File.Delete(tempDiffFileName);
173 File.Delete(tempGoldFileName);
176 return testPerformed;
179 #region Private methods
187 private static ProcessOutputs RunImageMagickCommand(
string commandName,
string commandParameters)
189 return ShellHelper.RunProcessAndGetOutput(Path.Combine(imageMagickDir, commandName), commandParameters);
199 var fileName = GetJsonFileName(receivedImage);
200 bool fileExists = File.Exists(fileName);
201 var stream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.Write);
205 stream.Seek(-1, SeekOrigin.End);
206 WriteInStream(
",", stream);
210 WriteInStream(
"[", stream);
217 #region Static methods
226 stream.Write(Encoding.ASCII.GetBytes(name), 0,
Encoding.ASCII.GetByteCount(name));
236 return Path.Combine(receivedImage.JsonPath, receivedImage.GetJsonFileName());
250 using (var stream = GetJsonFileStream(receivedImage))
252 var newEntry = receivedImage.GetJsonString();
253 WriteInStream(newEntry, stream);
254 WriteInStream(
"]", stream);
bool Compare_RMSE(TestResultServerImage receivedImage, string resultTempFileName)
Performs the comparison between the generated image and its base.
System.Text.Encoding Encoding
bool SaveJson
A flag to enable the json file writing.
static void WriteInStream(string name, Stream stream)
Write a string in the stream.