using System; using System.Collections; using System.Collections.Generic; using Microsoft.Build.Framework; using Xunit; namespace Avalonia.Build.Tasks.UnitTest; /// /// This is fake BuildEngine using for testing build task /// at moment it manage only and /// other messages are ignored/> /// internal class UnitTestBuildEngine : IBuildEngine, IDisposable { private readonly bool _treatWarningAsError; private readonly bool _assertOnDispose; private readonly List _errors = new(); /// /// Start new instance of /// /// if it is false immediately assert error /// if it is true treat warning as error /// if it is true assert on dispose if there are any errors. /// public static UnitTestBuildEngine Start(bool continueOnError = false, bool treatWarningAsError = false, bool assertOnDispose = false) => new UnitTestBuildEngine(continueOnError, treatWarningAsError, assertOnDispose); private UnitTestBuildEngine(bool continueOnError, bool treatWarningAsError, bool assertOnDispose) { ContinueOnError = continueOnError; _treatWarningAsError = treatWarningAsError; _assertOnDispose = assertOnDispose; } public bool ContinueOnError { get; } public int LineNumberOfTaskNode { get; } public int ColumnNumberOfTaskNode { get; } public string ProjectFileOfTaskNode { get; } public IReadOnlyList Errors => _errors; public bool BuildProjectFile(string projectFileName, string[] targetNames, IDictionary globalProperties, IDictionary targetOutputs) => throw new NotImplementedException(); public void Dispose() { if (_assertOnDispose && _errors.Count > 0) { Assert.Fail("There is one o more errors."); } } public void LogCustomEvent(CustomBuildEventArgs e) { } public void LogMessageEvent(BuildMessageEventArgs e) { } public void LogErrorEvent(BuildErrorEventArgs e) { var message = UnitTestBuildEngineMessage.From(e); _errors.Add(message); if (!ContinueOnError) { Assert.Fail(message.Message); } } public void LogWarningEvent(BuildWarningEventArgs e) { if (_treatWarningAsError) { var message = UnitTestBuildEngineMessage.From(e); _errors.Add(message); if (!ContinueOnError) { Assert.Fail(message.Message); } } } }