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.
using FluentAssertions ;
using FluentAssertions.Execution ;
using Microsoft.DotNet.Cli.Utils ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Threading.Tasks ;
namespace Microsoft.DotNet.Tools.Test.Utilities
{
public class DirectoryInfoAssertions
{
2016-04-04 17:51:36 -07:00
private DirectoryInfo _dirInfo ;
2015-12-14 17:39:29 -08:00
public DirectoryInfoAssertions ( DirectoryInfo dir )
{
2016-04-04 17:51:36 -07:00
_dirInfo = dir ;
2015-12-14 17:39:29 -08:00
}
2016-02-03 10:57:25 -08:00
public DirectoryInfo DirectoryInfo = > _dirInfo ;
2015-12-14 17:39:29 -08:00
public AndConstraint < DirectoryInfoAssertions > Exist ( )
{
Execute . Assertion . ForCondition ( _dirInfo . Exists )
. FailWith ( "Expected directory {0} does not exist." , _dirInfo . FullName ) ;
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
public AndConstraint < DirectoryInfoAssertions > HaveFile ( string expectedFile )
{
var file = _dirInfo . EnumerateFiles ( expectedFile , SearchOption . TopDirectoryOnly ) . SingleOrDefault ( ) ;
Execute . Assertion . ForCondition ( file ! = null )
. FailWith ( "Expected File {0} cannot be found in directory {1}." , expectedFile , _dirInfo . FullName ) ;
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
public AndConstraint < DirectoryInfoAssertions > NotHaveFile ( string expectedFile )
{
var file = _dirInfo . EnumerateFiles ( expectedFile , SearchOption . TopDirectoryOnly ) . SingleOrDefault ( ) ;
Execute . Assertion . ForCondition ( file = = null )
. FailWith ( "File {0} should not be found in directory {1}." , expectedFile , _dirInfo . FullName ) ;
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
public AndConstraint < DirectoryInfoAssertions > HaveFiles ( IEnumerable < string > expectedFiles )
2016-03-09 11:36:16 -08:00
{
2015-12-14 17:39:29 -08:00
foreach ( var expectedFile in expectedFiles )
{
HaveFile ( expectedFile ) ;
}
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
2016-10-04 19:29:07 +02:00
public AndConstraint < DirectoryInfoAssertions > HaveFilesMatching ( string expectedFilesSearchPattern , SearchOption searchOption )
{
var matchingFileExists = _dirInfo . EnumerateFiles ( expectedFilesSearchPattern , searchOption ) . Any ( ) ;
Execute . Assertion . ForCondition ( matchingFileExists = = true )
. FailWith ( "Expected directory {0} to contain files matching {1}, but no matching file exists." ,
_dirInfo . FullName , expectedFilesSearchPattern ) ;
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
2016-04-11 11:01:41 -07:00
public AndConstraint < DirectoryInfoAssertions > NotHaveFiles ( IEnumerable < string > expectedFiles )
{
foreach ( var expectedFile in expectedFiles )
{
NotHaveFile ( expectedFile ) ;
}
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
2016-10-04 19:29:07 +02:00
public AndConstraint < DirectoryInfoAssertions > NotHaveFilesMatching ( string expectedFilesSearchPattern , SearchOption searchOption )
{
var matchingFileCount = _dirInfo . EnumerateFiles ( expectedFilesSearchPattern , searchOption ) . Count ( ) ;
Execute . Assertion . ForCondition ( matchingFileCount = = 0 )
. FailWith ( "Found {0} files that should not exist in directory {1}. No file matching {2} should exist." ,
matchingFileCount , _dirInfo . FullName , expectedFilesSearchPattern ) ;
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
2015-12-14 17:39:29 -08:00
public AndConstraint < DirectoryInfoAssertions > HaveDirectory ( string expectedDir )
{
var dir = _dirInfo . EnumerateDirectories ( expectedDir , SearchOption . TopDirectoryOnly ) . SingleOrDefault ( ) ;
Execute . Assertion . ForCondition ( dir ! = null )
. FailWith ( "Expected directory {0} cannot be found inside directory {1}." , expectedDir , _dirInfo . FullName ) ;
2016-03-09 11:36:16 -08:00
2015-12-14 17:39:29 -08:00
return new AndConstraint < DirectoryInfoAssertions > ( new DirectoryInfoAssertions ( dir ) ) ;
}
2016-04-04 17:51:36 -07:00
public AndConstraint < DirectoryInfoAssertions > OnlyHaveFiles ( IEnumerable < string > expectedFiles )
{
var actualFiles = _dirInfo . EnumerateFiles ( "*" , SearchOption . TopDirectoryOnly ) . Select ( f = > f . Name ) ;
var missingFiles = Enumerable . Except ( expectedFiles , actualFiles ) ;
var extraFiles = Enumerable . Except ( actualFiles , expectedFiles ) ;
var nl = Environment . NewLine ;
Execute . Assertion . ForCondition ( ! missingFiles . Any ( ) )
. FailWith ( $"Following files cannot be found inside directory {_dirInfo.FullName} {nl} {string.Join(nl, missingFiles)}" ) ;
Execute . Assertion . ForCondition ( ! extraFiles . Any ( ) )
. FailWith ( $"Following extra files are found inside directory {_dirInfo.FullName} {nl} {string.Join(nl, extraFiles)}" ) ;
return new AndConstraint < DirectoryInfoAssertions > ( this ) ;
}
2015-12-14 17:39:29 -08:00
}
}