public TestSuiteVm(SolutionVm solution, string name, string config)
: base(solution, Path.Combine(solution.RootFolder, name))
{
Statistics = new StatisticsTask.Container("TestSuite", "Test Suite");
string testSuitePath = base.FullPath;
var rootPath = solution.RootFolder;
Solution = solution;
_rootPath = rootPath;
TestSuitePath = testSuitePath;
Language = Language.Instance;
DynamicExtensions = new ObservableCollection<GrammarDescriptor>();
Assemblies = NoAssembiles;
var libs = new List<LibReference>
{
new FileLibReference(Nitra.Visualizer.Utils.NitraRuntimePath)
};
var configPath = Path.GetFullPath(Path.Combine(testSuitePath, ConfigFileName));
try
{
var assemblyRelativePaths = new Dictionary<string, Assembly>();
var languageAndExtensions = SerializationHelper.Deserialize(File.ReadAllText(configPath),
path =>
{
var fullPath = Path.GetFullPath(Path.Combine(rootPath, path));
Assembly result;
if (!assemblyRelativePaths.TryGetValue(fullPath, out result))
assemblyRelativePaths.Add(fullPath, result = Utils.LoadAssembly(fullPath, config));
return result;
});
Language = languageAndExtensions.Item1;
foreach (var ext in languageAndExtensions.Item2)
DynamicExtensions.Add(ext);
Assemblies = assemblyRelativePaths.Values.ToArray();
libs.AddRange(languageAndExtensions.Item3);
DisableSemanticAnalysis = languageAndExtensions.Item4;
var indent = Environment.NewLine + " ";
var para = Environment.NewLine + Environment.NewLine;
_hint = "Language:" + indent + Language.FullName + para
+ "DynamicExtensions:" + indent + string.Join(indent, DynamicExtensions.Select(g => g.FullName)) + para
+ "Libraries:" + indent + string.Join(indent, assemblyRelativePaths.Keys);
}
catch (FileNotFoundException ex)
{
TestState = TestState.Ignored;
string additionMsg = null;
if (ex.FileName.EndsWith("config.xml", StringComparison.OrdinalIgnoreCase))
additionMsg = @"The configuration file (config.xml) does not exist in the test suite folder.";
else if (ex.FileName.EndsWith("Nitra.Runtime.dll", StringComparison.OrdinalIgnoreCase))
additionMsg = @"Try to recompile the parser.";
if (additionMsg != null)
additionMsg = Environment.NewLine + Environment.NewLine + additionMsg;
_hint = "Failed to load test suite:" + Environment.NewLine + ex.Message + additionMsg;
}
catch (Exception ex)
{
TestState = TestState.Ignored;
_hint = "Failed to load test suite:" + Environment.NewLine + ex.GetType().Name + ":" + ex.Message;
}
Libs = libs.ToArray();
Name = Path.GetFileName(testSuitePath);
var tests = new ObservableCollection<ITest>();
if (Directory.Exists(testSuitePath))
{
var paths = Directory.GetFiles(testSuitePath, "*.test").Concat(Directory.GetDirectories(testSuitePath));
var id = 0;
foreach (var path in paths.OrderBy(f => f))
{
if (Directory.Exists(path))
tests.Add(new TestFolderVm(path, this));
else
tests.Add(new TestVm(path, id, this));
id++;
}
}
else if (TestState != TestState.Ignored)
{
_hint = "The test suite folder '" + Path.GetDirectoryName(testSuitePath) + "'does not exist.";
TestState = TestState.Ignored;
}
Tests = tests;
solution.TestSuites.Add(this);
}