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);
}
}
}
}