2015-12-14 17:39:29 -08:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
2016-01-11 13:40:47 -08:00
using System ;
using System.Text.RegularExpressions ;
2015-12-14 17:39:29 -08:00
using FluentAssertions ;
using FluentAssertions.Execution ;
using Microsoft.DotNet.Cli.Utils ;
namespace Microsoft.DotNet.Tools.Test.Utilities
{
public class CommandResultAssertions
{
private CommandResult _commandResult ;
public CommandResultAssertions ( CommandResult commandResult )
{
_commandResult = commandResult ;
}
public AndConstraint < CommandResultAssertions > ExitWith ( int expectedExitCode )
{
Execute . Assertion . ForCondition ( _commandResult . ExitCode = = expectedExitCode )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( $"Expected command to exit with {expectedExitCode} but it did not." ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > Pass ( )
2016-01-11 13:40:47 -08:00
{
2015-12-14 17:39:29 -08:00
Execute . Assertion . ForCondition ( _commandResult . ExitCode = = 0 )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( $"Expected command to pass but it did not." ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > Fail ( )
{
Execute . Assertion . ForCondition ( _commandResult . ExitCode ! = 0 )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( $"Expected command to fail but it did not." ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > HaveStdOut ( )
2016-01-11 13:40:47 -08:00
{
2015-12-14 17:39:29 -08:00
Execute . Assertion . ForCondition ( ! string . IsNullOrEmpty ( _commandResult . StdOut ) )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( "Command did not output anything to stdout" ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
2015-12-30 17:02:59 -08:00
public AndConstraint < CommandResultAssertions > HaveStdOut ( string expectedOutput )
{
Execute . Assertion . ForCondition ( _commandResult . StdOut . Equals ( expectedOutput , StringComparison . Ordinal ) )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( $"Command did not output with Expected Output. Expected: {expectedOutput}" ) ) ;
2015-12-30 17:02:59 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
2016-03-01 17:42:44 -08:00
public AndConstraint < CommandResultAssertions > HaveStdOutContaining ( string pattern )
{
Execute . Assertion . ForCondition ( _commandResult . StdOut . Contains ( pattern ) )
. FailWith ( AppendDiagnosticsTo ( $"The command output did not contain expected result: {pattern}{Environment.NewLine}" ) ) ;
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > HaveStdOutMatching ( string pattern , RegexOptions options = RegexOptions . None )
2016-01-11 13:40:47 -08:00
{
Execute . Assertion . ForCondition ( Regex . Match ( _commandResult . StdOut , pattern , options ) . Success )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( $"Matching the command output failed. Pattern: {pattern}{Environment.NewLine}" ) ) ;
2016-01-11 13:40:47 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
2015-12-14 17:39:29 -08:00
public AndConstraint < CommandResultAssertions > HaveStdErr ( )
{
Execute . Assertion . ForCondition ( ! string . IsNullOrEmpty ( _commandResult . StdErr ) )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( "Command did not output anything to stderr." ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
2016-03-01 17:42:44 -08:00
}
public AndConstraint < CommandResultAssertions > HaveStdErrContaining ( string pattern )
{
Execute . Assertion . ForCondition ( _commandResult . StdErr . Contains ( pattern ) )
. FailWith ( AppendDiagnosticsTo ( $"The command error output did not contain expected result: {pattern}{Environment.NewLine}" ) ) ;
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > HaveStdErrMatching ( string pattern , RegexOptions options = RegexOptions . None )
{
Execute . Assertion . ForCondition ( Regex . Match ( _commandResult . StdErr , pattern , options ) . Success )
. FailWith ( AppendDiagnosticsTo ( $"Matching the command error output failed. Pattern: {pattern}{Environment.NewLine}" ) ) ;
return new AndConstraint < CommandResultAssertions > ( this ) ;
2015-12-14 17:39:29 -08:00
}
public AndConstraint < CommandResultAssertions > NotHaveStdOut ( )
{
Execute . Assertion . ForCondition ( string . IsNullOrEmpty ( _commandResult . StdOut ) )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( $"Expected command to not output to stdout but it was not:" ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > NotHaveStdErr ( )
{
Execute . Assertion . ForCondition ( string . IsNullOrEmpty ( _commandResult . StdErr ) )
2016-01-24 01:04:39 -08:00
. FailWith ( AppendDiagnosticsTo ( "Expected command to not output to stderr but it was not:" ) ) ;
2015-12-14 17:39:29 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
2016-01-24 01:04:39 -08:00
private string AppendDiagnosticsTo ( string s )
{
return s + $"{Environment.NewLine}" +
$"File Name: {_commandResult.StartInfo.FileName}{Environment.NewLine}" +
$"Arguments: {_commandResult.StartInfo.Arguments}{Environment.NewLine}" +
$"Exit Code: {_commandResult.ExitCode}{Environment.NewLine}" +
$"StdOut:{Environment.NewLine}{_commandResult.StdOut}{Environment.NewLine}" +
$"StdErr:{Environment.NewLine}{_commandResult.StdErr}{Environment.NewLine}" ; ;
2016-01-26 14:53:56 -08:00
}
public AndConstraint < CommandResultAssertions > HaveSkippedProjectCompilation ( string skippedProject )
{
2016-03-01 17:35:32 -06:00
_commandResult . StdOut . Should ( ) . Contain ( $"Project {skippedProject} (.NETStandardApp,Version=v1.5) was previously compiled. Skipping compilation." ) ;
2016-01-26 14:53:56 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
}
public AndConstraint < CommandResultAssertions > HaveCompiledProject ( string compiledProject )
{
2016-03-01 17:35:32 -06:00
_commandResult . StdOut . Should ( ) . Contain ( $"Project {compiledProject} (.NETStandardApp,Version=v1.5) will be compiled" ) ;
2016-01-26 14:53:56 -08:00
return new AndConstraint < CommandResultAssertions > ( this ) ;
2016-01-24 01:04:39 -08:00
}
2015-12-14 17:39:29 -08:00
}
}