// 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 { private DirectoryInfo _dirInfo; public DirectoryInfoAssertions(DirectoryInfo dir) { _dirInfo = dir; } public DirectoryInfo DirectoryInfo => _dirInfo; public AndConstraint Exist() { Execute.Assertion.ForCondition(_dirInfo.Exists) .FailWith("Expected directory {0} does not exist.", _dirInfo.FullName); return new AndConstraint(this); } public AndConstraint 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(this); } public AndConstraint 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(this); } public AndConstraint HaveFiles(IEnumerable expectedFiles) { foreach (var expectedFile in expectedFiles) { HaveFile(expectedFile); } return new AndConstraint(this); } public AndConstraint NotHaveFiles(IEnumerable expectedFiles) { foreach (var expectedFile in expectedFiles) { NotHaveFile(expectedFile); } return new AndConstraint(this); } public AndConstraint 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); return new AndConstraint(new DirectoryInfoAssertions(dir)); } public AndConstraint OnlyHaveFiles(IEnumerable 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(this); } } }