namespace ImageSharp.Tests { using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Security; public static class TestEnvironment { private const string ImageSharpSolutionFileName = "ImageSharp.sln"; private const string InputImagesRelativePath = @"tests\Images\Input"; private const string ActualOutputDirectoryRelativePath = @"tests\Images\ActualOutput"; private const string ReferenceOutputDirectoryRelativePath = @"tests\Images\External\ReferenceOutput"; private static Lazy solutionDirectoryFullPath = new Lazy(GetSolutionDirectoryFullPathImpl); private static Lazy runsOnCi = new Lazy( () => { bool isCi; return bool.TryParse(Environment.GetEnvironmentVariable("CI"), out isCi) && isCi; }); // ReSharper disable once InconsistentNaming /// /// Gets a value indicating whether test execution runs on CI. /// internal static bool RunsOnCI => runsOnCi.Value; internal static string SolutionDirectoryFullPath => solutionDirectoryFullPath.Value; private static string GetSolutionDirectoryFullPathImpl() { string assemblyLocation = typeof(TestFile).GetTypeInfo().Assembly.Location; var assemblyFile = new FileInfo(assemblyLocation); DirectoryInfo directory = assemblyFile.Directory; while (!directory.EnumerateFiles(ImageSharpSolutionFileName).Any()) { try { directory = directory.Parent; } catch (Exception ex) { throw new Exception( $"Unable to find ImageSharp solution directory from {assemblyLocation} because of {ex.GetType().Name}!", ex); } if (directory == null) { throw new Exception($"Unable to find ImageSharp solution directory from {assemblyLocation}!"); } } return directory.FullName; } /// /// Gets the correct full path to the Input Images directory. /// internal static string InputImagesDirectoryFullPath => Path.Combine(SolutionDirectoryFullPath, InputImagesRelativePath); /// /// Gets the correct full path to the Actual Output directory. (To be written to by the test cases.) /// internal static string ActualOutputDirectoryFullPath => Path.Combine(SolutionDirectoryFullPath, ActualOutputDirectoryRelativePath); /// /// Gets the correct full path to the Expected Output directory. (To compare the test results to.) /// internal static string ReferenceOutputDirectoryFullPath => Path.Combine(SolutionDirectoryFullPath, ReferenceOutputDirectoryRelativePath); internal static string GetReferenceOutputFileName(string actualOutputFileName) => actualOutputFileName.Replace("ActualOutput", @"External\ReferenceOutput"); } }