diff --git a/src/ScriptCs.Core/AssemblyName.cs b/src/ScriptCs.Core/AssemblyName.cs deleted file mode 100644 index ffaea2b5..00000000 --- a/src/ScriptCs.Core/AssemblyName.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ScriptCs -{ - public class AssemblyName : IAssemblyName - { - public System.Reflection.AssemblyName GetAssemblyName(string path) - { - return System.Reflection.AssemblyName.GetAssemblyName(path); - } - } -} diff --git a/src/ScriptCs.Core/AssemblyResolver.cs b/src/ScriptCs.Core/AssemblyResolver.cs new file mode 100644 index 00000000..c48cb3f0 --- /dev/null +++ b/src/ScriptCs.Core/AssemblyResolver.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Common.Logging; + +namespace ScriptCs +{ + public class AssemblyResolver : IAssemblyResolver + { + private readonly Dictionary> _assemblyPathCache = new Dictionary>(); + + private readonly IFileSystem _fileSystem; + + private readonly IPackageAssemblyResolver _packageAssemblyResolver; + + private readonly ILog _logger; + + private readonly IAssemblyUtility _assemblyUtility; + + public AssemblyResolver( + IFileSystem fileSystem, + IPackageAssemblyResolver packageAssemblyResolver, + IAssemblyUtility assemblyUtility, + ILog logger) + { + _fileSystem = fileSystem; + _packageAssemblyResolver = packageAssemblyResolver; + _logger = logger; + _assemblyUtility = assemblyUtility; + } + + public IEnumerable GetAssemblyPaths(string path) + { + Guard.AgainstNullArgument("path", path); + + List assemblies; + if (_assemblyPathCache.TryGetValue(path, out assemblies)) return assemblies; + + var packageAssemblies = GetPackageAssemblies(path); + var binAssemblies = GetBinAssemblies(path); + + assemblies = packageAssemblies.Union(binAssemblies).ToList(); + _assemblyPathCache.Add(path, assemblies); + + return assemblies; + } + + private IEnumerable GetBinAssemblies(string path) + { + var binFolder = Path.Combine(path, Constants.BinFolder); + if (!_fileSystem.DirectoryExists(binFolder)) + return Enumerable.Empty(); + + var assemblies = _fileSystem.EnumerateFiles(binFolder, "*.dll") + .Union(_fileSystem.EnumerateFiles(binFolder, "*.exe")) + .Where(_assemblyUtility.IsManagedAssembly) + .ToList(); + + foreach (var assembly in assemblies) + { + _logger.DebugFormat("Found assembly in bin folder: {0}", Path.GetFileName(assembly)); + } + + return assemblies; + } + + private IEnumerable GetPackageAssemblies(string path) + { + var packagesFolder = Path.Combine(path, Constants.PackagesFolder); + if (!_fileSystem.DirectoryExists(packagesFolder)) + return Enumerable.Empty(); + + var assemblies = _packageAssemblyResolver.GetAssemblyNames(path).ToList(); + + foreach (var packageAssembly in assemblies) + { + _logger.DebugFormat("Found package assembly: {0}", Path.GetFileName(packageAssembly)); + } + + return assemblies; + } + } +} diff --git a/src/ScriptCs.Core/AssemblyUtility.cs b/src/ScriptCs.Core/AssemblyUtility.cs new file mode 100644 index 00000000..5a9346eb --- /dev/null +++ b/src/ScriptCs.Core/AssemblyUtility.cs @@ -0,0 +1,21 @@ +using System; +using System.Reflection; + +namespace ScriptCs +{ + public class AssemblyUtility : IAssemblyUtility + { + public bool IsManagedAssembly(string path) + { + try + { + AssemblyName.GetAssemblyName(path); + return true; + } + catch (BadImageFormatException) + { + return false; + } + } + } +} \ No newline at end of file diff --git a/src/ScriptCs.Core/Constants.cs b/src/ScriptCs.Core/Constants.cs index 62a745b0..acfff78a 100644 --- a/src/ScriptCs.Core/Constants.cs +++ b/src/ScriptCs.Core/Constants.cs @@ -7,7 +7,6 @@ public static class Constants public const string PackagesFolder = "packages"; public const string BinFolder = "bin"; public const string DefaultRepositoryUrl = "https://nuget.org/api/v2/"; - public const string DebugContractName = "Debug"; public const string RunContractName = "Run"; } diff --git a/src/ScriptCs.Core/FileSystem.cs b/src/ScriptCs.Core/FileSystem.cs index 0d6bb702..f96b8cdb 100644 --- a/src/ScriptCs.Core/FileSystem.cs +++ b/src/ScriptCs.Core/FileSystem.cs @@ -6,9 +6,9 @@ namespace ScriptCs { public class FileSystem : IFileSystem { - public IEnumerable EnumerateFiles(string dir, string searchPattern) + public IEnumerable EnumerateFiles(string dir, string searchPattern, SearchOption searchOption = SearchOption.AllDirectories) { - return Directory.EnumerateFiles(dir, searchPattern, SearchOption.AllDirectories); + return Directory.EnumerateFiles(dir, searchPattern, searchOption); } public void Copy(string source, string dest, bool overwrite) @@ -81,6 +81,11 @@ public IEnumerable SplitLines(string value) return value.Split(new[] { NewLine }, StringSplitOptions.None); } + public void WriteToFile(string path, string text) + { + File.WriteAllText(path, text); + } + public Stream CreateFileStream(string filePath, FileMode mode) { return new FileStream(filePath, mode); diff --git a/src/ScriptCs.Core/IAssemblyName.cs b/src/ScriptCs.Core/IAssemblyName.cs deleted file mode 100644 index 3d2d9dd8..00000000 --- a/src/ScriptCs.Core/IAssemblyName.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace ScriptCs -{ - public interface IAssemblyName - { - System.Reflection.AssemblyName GetAssemblyName(string path); - } -} diff --git a/src/ScriptCs.Core/IAssemblyResolver.cs b/src/ScriptCs.Core/IAssemblyResolver.cs new file mode 100644 index 00000000..04bc3338 --- /dev/null +++ b/src/ScriptCs.Core/IAssemblyResolver.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace ScriptCs +{ + public interface IAssemblyResolver + { + IEnumerable GetAssemblyPaths(string path); + } +} diff --git a/src/ScriptCs.Core/IAssemblyUtility.cs b/src/ScriptCs.Core/IAssemblyUtility.cs new file mode 100644 index 00000000..805b4d5b --- /dev/null +++ b/src/ScriptCs.Core/IAssemblyUtility.cs @@ -0,0 +1,7 @@ +namespace ScriptCs +{ + public interface IAssemblyUtility + { + bool IsManagedAssembly(string assemblyPath); + } +} \ No newline at end of file diff --git a/src/ScriptCs.Core/IFileSystem.cs b/src/ScriptCs.Core/IFileSystem.cs index 1d6d7ddf..fdb62ce3 100644 --- a/src/ScriptCs.Core/IFileSystem.cs +++ b/src/ScriptCs.Core/IFileSystem.cs @@ -6,7 +6,7 @@ namespace ScriptCs { public interface IFileSystem { - IEnumerable EnumerateFiles(string dir, string search); + IEnumerable EnumerateFiles(string dir, string search, SearchOption searchOption = SearchOption.AllDirectories); void Copy(string source, string dest, bool overwrite); @@ -39,6 +39,8 @@ public interface IFileSystem void FileDelete(string path); IEnumerable SplitLines(string value); + + void WriteToFile(string path, string text); Stream CreateFileStream(string filePath, FileMode mode); } diff --git a/src/ScriptCs.Core/ScriptCs.Core.csproj b/src/ScriptCs.Core/ScriptCs.Core.csproj index 63f91f59..9c78920e 100644 --- a/src/ScriptCs.Core/ScriptCs.Core.csproj +++ b/src/ScriptCs.Core/ScriptCs.Core.csproj @@ -42,7 +42,8 @@ - + + @@ -56,7 +57,8 @@ - + + diff --git a/src/ScriptCs/Command/CleanCommand.cs b/src/ScriptCs/Command/CleanCommand.cs index 62b62173..dcbc4d22 100644 --- a/src/ScriptCs/Command/CleanCommand.cs +++ b/src/ScriptCs/Command/CleanCommand.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Linq; using Common.Logging; namespace ScriptCs.Command @@ -8,17 +7,15 @@ namespace ScriptCs.Command internal class CleanCommand : ICleanCommand { private readonly string _scriptName; + private readonly IFileSystem _fileSystem; - private readonly IPackageAssemblyResolver _packageAssemblyResolver; + private readonly ILog _logger; - public CleanCommand(string scriptName, - IFileSystem fileSystem, - IPackageAssemblyResolver packageAssemblyResolver, ILog logger) + public CleanCommand(string scriptName, IFileSystem fileSystem, ILog logger) { _scriptName = scriptName; _fileSystem = fileSystem; - _packageAssemblyResolver = packageAssemblyResolver; _logger = logger; } @@ -29,32 +26,11 @@ public CommandResult Execute() var workingDirectory = _fileSystem.GetWorkingDirectory(_scriptName); _logger.TraceFormat("Working directory: {0}", workingDirectory); - var binFolder = Path.Combine(workingDirectory, Constants.BinFolder); - _logger.TraceFormat("Bin folder: {0}", binFolder); - var packageFolder = Path.Combine(workingDirectory, Constants.PackagesFolder); _logger.TraceFormat("Packages folder: {0}", packageFolder); try { - if (_fileSystem.DirectoryExists(binFolder)) - { - var packages = _packageAssemblyResolver.GetAssemblyNames(workingDirectory); - - foreach (var package in packages) - { - _logger.DebugFormat("Deleting file: {0}", package); - DeleteFile(package, binFolder); - } - - var remaining = _fileSystem.EnumerateFiles(binFolder, "*.*").Any(); - if (!remaining) - { - _logger.DebugFormat("Deleting bin directory: {0}", binFolder); - _fileSystem.DeleteDirectory(binFolder); - } - } - if (_fileSystem.DirectoryExists(packageFolder)) { _logger.DebugFormat("Deleting package directory: {0}", packageFolder); @@ -70,18 +46,5 @@ public CommandResult Execute() return CommandResult.Error; } } - - private void DeleteFile(string package, string binFolder) - { - var assemblyFileName = Path.GetFileName(package); - if (assemblyFileName == null) return; - - var destFile = Path.Combine(binFolder, assemblyFileName); - - if (_fileSystem.FileExists(destFile)) - { - _fileSystem.FileDelete(destFile); - } - } } } \ No newline at end of file diff --git a/src/ScriptCs/Command/CommandFactory.cs b/src/ScriptCs/Command/CommandFactory.cs index d08edacb..f322affb 100644 --- a/src/ScriptCs/Command/CommandFactory.cs +++ b/src/ScriptCs/Command/CommandFactory.cs @@ -23,9 +23,14 @@ public ICommand CreateCommand(ScriptCsArgs args, string[] scriptArgs) if (args.Repl) { var replCommand = new ExecuteReplCommand( - _scriptServiceRoot.FileSystem, _scriptServiceRoot.ScriptPackResolver, - _scriptServiceRoot.Engine, _scriptServiceRoot.FilePreProcessor, _scriptServiceRoot.Logger, _scriptServiceRoot.Console, - _scriptServiceRoot.AssemblyName); + _scriptServiceRoot.FileSystem, + _scriptServiceRoot.ScriptPackResolver, + _scriptServiceRoot.Engine, + _scriptServiceRoot.FilePreProcessor, + _scriptServiceRoot.Logger, + _scriptServiceRoot.Console, + _scriptServiceRoot.AssemblyResolver); + return replCommand; } @@ -38,7 +43,7 @@ public ICommand CreateCommand(ScriptCsArgs args, string[] scriptArgs) _scriptServiceRoot.Executor, _scriptServiceRoot.ScriptPackResolver, _scriptServiceRoot.Logger, - _scriptServiceRoot.AssemblyName); + _scriptServiceRoot.AssemblyResolver); var fileSystem = _scriptServiceRoot.FileSystem; var currentDirectory = fileSystem.CurrentDirectory; @@ -55,24 +60,7 @@ public ICommand CreateCommand(ScriptCsArgs args, string[] scriptArgs) _scriptServiceRoot.PackageInstaller, _scriptServiceRoot.Logger); - var restoreCommand = new RestoreCommand( - args.ScriptName, - _scriptServiceRoot.FileSystem, - _scriptServiceRoot.PackageAssemblyResolver, - _scriptServiceRoot.Logger); - - return new CompositeCommand(installCommand, restoreCommand, executeCommand); - } - - if (args.Restore) - { - var restoreCommand = new RestoreCommand( - args.ScriptName, - _scriptServiceRoot.FileSystem, - _scriptServiceRoot.PackageAssemblyResolver, - _scriptServiceRoot.Logger); - - return new CompositeCommand(restoreCommand, executeCommand); + return new CompositeCommand(installCommand, executeCommand); } return executeCommand; @@ -88,22 +76,16 @@ public ICommand CreateCommand(ScriptCsArgs args, string[] scriptArgs) _scriptServiceRoot.PackageInstaller, _scriptServiceRoot.Logger); - var restoreCommand = new RestoreCommand( - args.Install, - _scriptServiceRoot.FileSystem, - _scriptServiceRoot.PackageAssemblyResolver, - _scriptServiceRoot.Logger); - var currentDirectory = _scriptServiceRoot.FileSystem.CurrentDirectory; var packageFile = Path.Combine(currentDirectory, Constants.PackagesFile); if (!_scriptServiceRoot.FileSystem.FileExists(packageFile)) { var saveCommand = new SaveCommand(_scriptServiceRoot.PackageAssemblyResolver); - return new CompositeCommand(installCommand, restoreCommand, saveCommand); + return new CompositeCommand(installCommand, saveCommand); } - return new CompositeCommand(installCommand, restoreCommand); + return installCommand; } if (args.Clean) @@ -113,7 +95,6 @@ public ICommand CreateCommand(ScriptCsArgs args, string[] scriptArgs) var cleanCommand = new CleanCommand( args.ScriptName, _scriptServiceRoot.FileSystem, - _scriptServiceRoot.PackageAssemblyResolver, _scriptServiceRoot.Logger); return new CompositeCommand(saveCommand, cleanCommand); diff --git a/src/ScriptCs/Command/ExecuteReplCommand.cs b/src/ScriptCs/Command/ExecuteReplCommand.cs index 0c081711..95d5d3ed 100644 --- a/src/ScriptCs/Command/ExecuteReplCommand.cs +++ b/src/ScriptCs/Command/ExecuteReplCommand.cs @@ -1,27 +1,25 @@ using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; + using Common.Logging; -using System.Reflection; using ScriptCs.Contracts; namespace ScriptCs.Command { internal class ExecuteReplCommand : IScriptCommand { - private readonly IFileSystem _fileSystem; private readonly IScriptPackResolver _scriptPackResolver; - private readonly IScriptEngine _scriptEngine; + + private readonly IAssemblyResolver _assemblyResolver; + private readonly IFilePreProcessor _filePreProcessor; - private readonly IAssemblyName _assemblyName; - private readonly ILog _logger; + private readonly IScriptEngine _scriptEngine; + + private readonly IFileSystem _fileSystem; + private readonly IConsole _console; - public string[] ScriptArgs { get; private set; } + private readonly ILog _logger; public ExecuteReplCommand( IFileSystem fileSystem, @@ -30,8 +28,7 @@ public ExecuteReplCommand( IFilePreProcessor filePreProcessor, ILog logger, IConsole console, - IAssemblyName assemblyName - ) + IAssemblyResolver assemblyResolver) { _fileSystem = fileSystem; _scriptPackResolver = scriptPackResolver; @@ -39,25 +36,32 @@ IAssemblyName assemblyName _filePreProcessor = filePreProcessor; _logger = logger; _console = console; - _assemblyName = assemblyName; + _assemblyResolver = assemblyResolver; } + public string[] ScriptArgs { get; private set; } + public CommandResult Execute() { _console.WriteLine("scriptcs (ctrl-c or blank to exit)\r\n"); var repl = new Repl(_fileSystem, _scriptEngine, _logger, _console, _filePreProcessor); - repl.Initialize(GetAssemblyPaths(_fileSystem.CurrentDirectory), _scriptPackResolver.GetPacks()); + + var workingDirectory = _fileSystem.CurrentDirectory; + var assemblies = _assemblyResolver.GetAssemblyPaths(workingDirectory); + var scriptPacks = _scriptPackResolver.GetPacks(); + + repl.Initialize(assemblies, scriptPacks); + try { - while (ExecuteLine(repl)) - { - } + while (ExecuteLine(repl)) { } } catch (Exception ex) { _logger.Error(ex.Message); return CommandResult.Error; } + repl.Terminate(); return CommandResult.Success; } @@ -65,47 +69,12 @@ public CommandResult Execute() private bool ExecuteLine(Repl repl) { _console.Write("> "); + var line = _console.ReadLine(); - if (line == "") - return false; + if (line == string.Empty) return false; repl.Execute(line); return true; } - - - private IEnumerable GetAssemblyPaths(string workingDirectory) - { - var binFolder = Path.Combine(workingDirectory, "bin"); - - if (!_fileSystem.DirectoryExists(binFolder)) - _fileSystem.CreateDirectory(binFolder); - - var assemblyPaths = - _fileSystem.EnumerateFiles(binFolder, "*.dll") - .Union(_fileSystem.EnumerateFiles(binFolder, "*.exe")) - .Where(IsManagedAssembly) - .ToList(); - - foreach (var path in assemblyPaths.Select(Path.GetFileName)) - { - _logger.DebugFormat("Found assembly reference: {0}", path); - } - - return assemblyPaths; - } - - private bool IsManagedAssembly(string path) - { - try - { - _assemblyName.GetAssemblyName(path); - } - catch (BadImageFormatException) - { - return false; - } - return true; - } } } diff --git a/src/ScriptCs/Command/ExecuteScriptCommand.cs b/src/ScriptCs/Command/ExecuteScriptCommand.cs index 80cabf30..9b39cf82 100644 --- a/src/ScriptCs/Command/ExecuteScriptCommand.cs +++ b/src/ScriptCs/Command/ExecuteScriptCommand.cs @@ -1,19 +1,20 @@ using System; -using System.Collections.Generic; -using System.IO; using System.Linq; using Common.Logging; -using System.Reflection; namespace ScriptCs.Command { internal class ExecuteScriptCommand : IScriptCommand { - private readonly string _script; - private readonly IFileSystem _fileSystem; - private readonly IScriptExecutor _scriptExecutor; private readonly IScriptPackResolver _scriptPackResolver; - private readonly IAssemblyName _assemblyName; + + private readonly IAssemblyResolver _assemblyResolver; + + private readonly IScriptExecutor _scriptExecutor; + + private readonly IFileSystem _fileSystem; + + private readonly string _script; private readonly ILog _logger; @@ -23,15 +24,15 @@ public ExecuteScriptCommand(string script, IScriptExecutor scriptExecutor, IScriptPackResolver scriptPackResolver, ILog logger, - IAssemblyName assemblyName) + IAssemblyResolver assemblyResolver) { _script = script; - ScriptArgs = scriptArgs; _fileSystem = fileSystem; + ScriptArgs = scriptArgs; _scriptExecutor = scriptExecutor; _scriptPackResolver = scriptPackResolver; _logger = logger; - _assemblyName = assemblyName; + _assemblyResolver = assemblyResolver; } public string[] ScriptArgs { get; private set; } @@ -45,7 +46,7 @@ public CommandResult Execute() var workingDirectory = _fileSystem.GetWorkingDirectory(_script); if (workingDirectory != null) { - assemblyPaths = GetAssemblyPaths(workingDirectory); + assemblyPaths = _assemblyResolver.GetAssemblyPaths(workingDirectory); } _scriptExecutor.Initialize(assemblyPaths, _scriptPackResolver.GetPacks()); var result = _scriptExecutor.Execute(_script, ScriptArgs); @@ -76,39 +77,5 @@ public CommandResult Execute() return CommandResult.Error; } } - - private IEnumerable GetAssemblyPaths(string workingDirectory) - { - var binFolder = Path.Combine(workingDirectory, "bin"); - - if (!_fileSystem.DirectoryExists(binFolder)) - _fileSystem.CreateDirectory(binFolder); - - var assemblyPaths = - _fileSystem.EnumerateFiles(binFolder, "*.dll") - .Union(_fileSystem.EnumerateFiles(binFolder, "*.exe")) - .Where(IsManagedAssembly) - .ToList(); - - foreach (var path in assemblyPaths.Select(Path.GetFileName)) - { - _logger.DebugFormat("Found assembly reference: {0}", path); - } - - return assemblyPaths; - } - - private bool IsManagedAssembly(string path) - { - try - { - _assemblyName.GetAssemblyName(path); - } - catch (BadImageFormatException) - { - return false; - } - return true; - } } } diff --git a/src/ScriptCs/Command/ICommand.cs b/src/ScriptCs/Command/ICommand.cs index 41c55ea3..deef3623 100644 --- a/src/ScriptCs/Command/ICommand.cs +++ b/src/ScriptCs/Command/ICommand.cs @@ -6,8 +6,6 @@ public interface IScriptCommand : ICommand { string[] ScriptArgs { get; } } - public interface IRestoreCommand : ICommand { } - public interface ISaveCommand : ICommand { } public interface ICleanCommand : ICommand { } diff --git a/src/ScriptCs/Command/RestoreCommand.cs b/src/ScriptCs/Command/RestoreCommand.cs deleted file mode 100644 index 6f6b155b..00000000 --- a/src/ScriptCs/Command/RestoreCommand.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.IO; -using Common.Logging; - -namespace ScriptCs.Command -{ - internal class RestoreCommand : IRestoreCommand - { - private readonly string _scriptName; - private readonly IFileSystem _fileSystem; - private readonly IPackageAssemblyResolver _packageAssemblyResolver; - - private readonly ILog _logger; - - public RestoreCommand(string scriptName, IFileSystem fileSystem, IPackageAssemblyResolver packageAssemblyResolver, ILog logger) - { - _scriptName = scriptName; - _fileSystem = fileSystem; - _packageAssemblyResolver = packageAssemblyResolver; - _logger = logger; - } - - public CommandResult Execute() - { - _logger.Info("Copying assemblies to bin folder..."); - - var workingDirectory = _fileSystem.GetWorkingDirectory(_scriptName); - var binFolder = Path.Combine(workingDirectory, Constants.BinFolder); - - try - { - if (!_fileSystem.DirectoryExists(binFolder)) - _fileSystem.CreateDirectory(binFolder); - - var packages = _packageAssemblyResolver.GetAssemblyNames(workingDirectory); - foreach (var package in packages) - { - CopyFile(package, binFolder); - } - - _logger.Info("Restore completed successfully."); - return CommandResult.Success; - } - catch (Exception e) - { - _logger.ErrorFormat("Restore failed: {0}.", e.Message); - return CommandResult.Error; - } - } - - private void CopyFile(string package, string binFolder) - { - var assemblyFileName = Path.GetFileName(package); - if (assemblyFileName == null) return; - - var destFile = Path.Combine(binFolder, assemblyFileName); - - var sourceFileLastWriteTime = _fileSystem.GetLastWriteTime(package); - var destFileLastWriteTime = _fileSystem.GetLastWriteTime(destFile); - - if (sourceFileLastWriteTime == destFileLastWriteTime) - { - _logger.InfoFormat("Skipped: {0}.", assemblyFileName); - return; - } - - _fileSystem.Copy(package, destFile, true); - - _logger.InfoFormat("Copied: {0}.", assemblyFileName); - } - } -} \ No newline at end of file diff --git a/src/ScriptCs/CompositionRoot.cs b/src/ScriptCs/CompositionRoot.cs index 0ed06d33..d37eddda 100644 --- a/src/ScriptCs/CompositionRoot.cs +++ b/src/ScriptCs/CompositionRoot.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; using System.ComponentModel.Composition.Hosting; using System.IO; +using System.Linq; + using Autofac; using Autofac.Integration.Mef; using Common.Logging; @@ -42,14 +45,10 @@ public void Initialize() var types = new[] { typeof (ScriptHostFactory), - typeof (FileSystem), - typeof (PackageAssemblyResolver), - typeof (PackageContainer), typeof (FilePreProcessor), typeof (ScriptPackResolver), typeof (NugetInstallationProvider), typeof (PackageInstaller), - typeof (AssemblyName) }; builder.RegisterTypes(types).AsImplementedInterfaces(); @@ -67,16 +66,34 @@ public void Initialize() builder.RegisterType().As(); - if (_shouldInitDrirectoryCatalog) + // Hack to resolve assemblies for MEF catalog before building Autofac container + var fileSystem = new FileSystem(); + var assemblyUtility = new AssemblyUtility(); + var packageContainer = new PackageContainer(fileSystem); + var packageAssemblyResolver = new PackageAssemblyResolver(fileSystem, packageContainer); + var assemblyResolver = new AssemblyResolver(fileSystem, packageAssemblyResolver, assemblyUtility, logger); + + builder.RegisterInstance(fileSystem).As(); + builder.RegisterInstance(assemblyUtility).As(); + builder.RegisterInstance(packageContainer).As(); + builder.RegisterInstance(packageAssemblyResolver).As(); + builder.RegisterInstance(assemblyResolver).As(); + + if (_shouldInitDrirectoryCatalog) { - var scriptPath = Path.Combine(Environment.CurrentDirectory, "bin"); - if (Directory.Exists(scriptPath)) - { - var catalog = new DirectoryCatalog(scriptPath); - builder.RegisterComposablePartCatalog(catalog); - } + var currentDirectory = Environment.CurrentDirectory; + var assemblies = assemblyResolver.GetAssemblyPaths(currentDirectory); + + var aggregateCatalog = new AggregateCatalog(); + + assemblies.Select(x => new AssemblyCatalog(x)).ToList() + .ForEach(catalog => aggregateCatalog.Catalogs.Add(catalog)); + + builder.RegisterComposablePartCatalog(aggregateCatalog); } + _container = builder.Build(); + _scriptServiceRoot = _container.Resolve(); } @@ -95,4 +112,4 @@ private static bool ShouldInitDrirectoryCatalog(ScriptCsArgs args) return args.Repl || !string.IsNullOrWhiteSpace(args.ScriptName); } } -} \ No newline at end of file +} diff --git a/src/ScriptCs/ScriptCs.csproj b/src/ScriptCs/ScriptCs.csproj index 5fc6d0e2..5a735557 100644 --- a/src/ScriptCs/ScriptCs.csproj +++ b/src/ScriptCs/ScriptCs.csproj @@ -72,7 +72,6 @@ - diff --git a/src/ScriptCs/ScriptCsArgs.cs b/src/ScriptCs/ScriptCsArgs.cs index fd0440aa..0b75acee 100644 --- a/src/ScriptCs/ScriptCsArgs.cs +++ b/src/ScriptCs/ScriptCsArgs.cs @@ -34,10 +34,6 @@ public class ScriptCsArgs [ArgDescription("Installs and restores packages which are specified in packages.config")] public string Install { get; set; } - [ArgShortcut("restore")] - [ArgDescription("Restores installed packages, making them ready for using by the script")] - public bool Restore { get; set; } - [ArgShortcut("save")] [ArgDescription("Creates a packages.config file based on the packages directory")] public bool Save { get; set; } diff --git a/src/ScriptCs/ScriptServiceRoot.cs b/src/ScriptCs/ScriptServiceRoot.cs index ac2c90e7..d8d665bb 100644 --- a/src/ScriptCs/ScriptServiceRoot.cs +++ b/src/ScriptCs/ScriptServiceRoot.cs @@ -15,7 +15,7 @@ public ScriptServiceRoot( IScriptPackResolver scriptPackResolver, IPackageInstaller packageInstaller, ILog logger, - IAssemblyName assemblyName, + IAssemblyResolver assemblyResolver, IConsole console = null) { FileSystem = fileSystem; @@ -27,7 +27,7 @@ public ScriptServiceRoot( PackageInstaller = packageInstaller; Logger = logger; Console = console; - AssemblyName = assemblyName; + AssemblyResolver = assemblyResolver; } public IFileSystem FileSystem { get; private set; } @@ -39,6 +39,6 @@ public ScriptServiceRoot( public IScriptEngine Engine { get; private set; } public IFilePreProcessor FilePreProcessor { get; private set; } public IConsole Console { get; private set; } - public IAssemblyName AssemblyName { get; private set; } + public IAssemblyResolver AssemblyResolver { get; private set; } } } diff --git a/test/ScriptCs.Core.Tests/AssemblyResolverTests.cs b/test/ScriptCs.Core.Tests/AssemblyResolverTests.cs new file mode 100644 index 00000000..aa2aa503 --- /dev/null +++ b/test/ScriptCs.Core.Tests/AssemblyResolverTests.cs @@ -0,0 +1,90 @@ +using System; +using System.IO; +using System.Linq; + +using Common.Logging; + +using Moq; + +using Should; + +using Xunit; + +namespace ScriptCs.Tests +{ + public class AssemblyResolverTests + { + public class GetAssemblyPathsMethod + { + [Fact] + public void ShouldReturnAssembliesFromPackagesFolder() + { + const string WorkingDirectory = @"C:\"; + + var packagesFolder = Path.Combine(WorkingDirectory, Constants.PackagesFolder); + var assemblyFile = Path.Combine(packagesFolder, "MyAssembly.dll"); + + var fileSystem = new Mock(); + fileSystem.Setup(x => x.DirectoryExists(packagesFolder)).Returns(true); + + var packageAssemblyResolver = new Mock(); + packageAssemblyResolver.Setup(x => x.GetAssemblyNames(WorkingDirectory, It.IsAny>())).Returns(new[] { assemblyFile }); + + var resolver = new AssemblyResolver(fileSystem.Object, packageAssemblyResolver.Object, Mock.Of(), Mock.Of()); + + var assemblies = resolver.GetAssemblyPaths(WorkingDirectory).ToList(); + + assemblies.Count.ShouldEqual(1); + assemblies[0].ShouldEqual(assemblyFile); + } + + [Fact] + public void ShouldReturnAssembliesFromBinFolder() + { + const string WorkingDirectory = @"C:\"; + + var binFolder = Path.Combine(WorkingDirectory, "bin"); + var assemblyFile = Path.Combine(binFolder, "MyAssembly.dll"); + + var fileSystem = new Mock(); + fileSystem.Setup(x => x.DirectoryExists(binFolder)).Returns(true); + fileSystem.Setup(x => x.EnumerateFiles(binFolder, It.IsAny(), SearchOption.AllDirectories)).Returns(new[] { assemblyFile }); + + var assemblyUtility = new Mock(); + assemblyUtility.Setup(x => x.IsManagedAssembly(assemblyFile)).Returns(true); + + var resolver = new AssemblyResolver(fileSystem.Object, Mock.Of(), assemblyUtility.Object, Mock.Of()); + + var assemblies = resolver.GetAssemblyPaths(WorkingDirectory).ToList(); + + assemblies.Count.ShouldEqual(1); + assemblies[0].ShouldEqual(assemblyFile); + } + + [Fact] + public void ShouldNotReturnNonManagedAssemblies() + { + const string WorkingDirectory = @"C:\"; + + var binFolder = Path.Combine(WorkingDirectory, "bin"); + var managed = Path.Combine(binFolder, "MyAssembly.dll"); + var nonManaged = Path.Combine(binFolder, "MyAssembly.dll"); + + var fileSystem = new Mock(); + fileSystem.Setup(x => x.DirectoryExists(binFolder)).Returns(true); + fileSystem.Setup(x => x.EnumerateFiles(binFolder, It.IsAny(), SearchOption.AllDirectories)) + .Returns(new[] { managed, nonManaged }); + + var assemblyUtility = new Mock(); + assemblyUtility.Setup(x => x.IsManagedAssembly(managed)).Returns(true); + + var resolver = new AssemblyResolver(fileSystem.Object, Mock.Of(), assemblyUtility.Object, Mock.Of()); + + var assemblies = resolver.GetAssemblyPaths(WorkingDirectory).ToList(); + + assemblies.Count.ShouldEqual(1); + assemblies[0].ShouldEqual(managed); + } + } + } +} \ No newline at end of file diff --git a/test/ScriptCs.Core.Tests/ScriptCs.Core.Tests.csproj b/test/ScriptCs.Core.Tests/ScriptCs.Core.Tests.csproj index 9d5e649b..b2d1e374 100644 --- a/test/ScriptCs.Core.Tests/ScriptCs.Core.Tests.csproj +++ b/test/ScriptCs.Core.Tests/ScriptCs.Core.Tests.csproj @@ -37,6 +37,7 @@ Properties\CommonVersionInfo.cs + diff --git a/test/ScriptCs.Tests/CleanCommandTests.cs b/test/ScriptCs.Tests/CleanCommandTests.cs index cae08c14..62553def 100644 --- a/test/ScriptCs.Tests/CleanCommandTests.cs +++ b/test/ScriptCs.Tests/CleanCommandTests.cs @@ -1,5 +1,4 @@ -using System; -using Common.Logging; +using Common.Logging; using Moq; using ScriptCs.Command; using ScriptCs.Package; @@ -24,7 +23,7 @@ public void ShouldDeletePackagesFolder() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); fs.Setup(i => i.DirectoryExists(It.Is(x => x.Contains(Constants.PackagesFolder)))).Returns(true); @@ -38,90 +37,6 @@ public void ShouldDeletePackagesFolder() fs.Verify(i => i.DirectoryExists(It.Is(x => x.Contains(Constants.PackagesFolder))), Times.Once()); fs.Verify(i => i.DeleteDirectory(It.Is(x => x.Contains(Constants.PackagesFolder))), Times.Once()); } - - [Fact] - public void ShouldDeleteBinFolder() - { - var args = new ScriptCsArgs { Clean = true }; - - var fs = new Mock(); - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - fs.Setup(i => i.DirectoryExists(It.Is(x => x.Contains(Constants.BinFolder)))).Returns(true); - fs.Setup(i => i.GetWorkingDirectory(It.IsAny())).Returns("c:\\"); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(i => i.DirectoryExists(It.Is(x => x.Contains(Constants.BinFolder))), Times.Once()); - fs.Verify(i => i.DeleteDirectory(It.Is(x => x.Contains(Constants.BinFolder))), Times.Once()); - } - - [Fact] - public void ShouldNotDeleteBinFolderIfDllsAreLeft() - { - var args = new ScriptCsArgs { Clean = true }; - - var fs = new Mock(); - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - - fs.Setup(i => i.DirectoryExists(It.Is(x => x.Contains(Constants.BinFolder)))).Returns(true); - fs.Setup(i => i.GetWorkingDirectory(It.IsAny())).Returns("c:/"); - fs.Setup(i => i.EnumerateFiles(It.IsAny(), It.IsAny())).Returns(new[] { "c:/file.dll", "c:/file2.dll" }); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(i => i.DeleteDirectory(It.Is(x => x.Contains(Constants.BinFolder))), Times.Never()); - } - - [Fact] - public void ShouldDeleteAllFilesResolvedFromPackages() - { - var args = new ScriptCsArgs { Clean = true }; - - var fs = new Mock(); - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - - fs.Setup(i => i.DirectoryExists(It.Is(x => x.Contains(Constants.BinFolder)))).Returns(true); - fs.Setup(i => i.GetWorkingDirectory(It.IsAny())).Returns("c:\\"); - fs.Setup(i => i.FileExists(It.IsAny())).Returns(true); - resolver.Setup(i => i.GetAssemblyNames(It.IsAny(), It.IsAny>())).Returns(new[] { "c:\\file.dll", "c:\\file2.dll" }); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(i => i.FileDelete(It.IsAny()), Times.Exactly(2)); - } } } } diff --git a/test/ScriptCs.Tests/CommandFactoryTests.cs b/test/ScriptCs.Tests/CommandFactoryTests.cs index 47bb68e7..353d9030 100644 --- a/test/ScriptCs.Tests/CommandFactoryTests.cs +++ b/test/ScriptCs.Tests/CommandFactoryTests.cs @@ -29,7 +29,7 @@ private static ScriptServiceRoot CreateRoot(bool packagesFileExists = true, bool var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); return root; @@ -48,16 +48,11 @@ public void ShouldInstallAndRestoreWhenInstallFlagIsOn() var factory = new CommandFactory(CreateRoot()); var result = factory.CreateCommand(args, new string[0]); - var compositeCommand = result as ICompositeCommand; - compositeCommand.ShouldNotBeNull(); - - compositeCommand.Commands.Count.ShouldEqual(2); - compositeCommand.Commands[0].ShouldImplement(); - compositeCommand.Commands[1].ShouldImplement(); + result.ShouldImplement(); } [Fact] - public void ShouldInstallRestoreAndSaveWhenInstallFlagIsOnAndNoPackagesFileExists() + public void ShouldInstallAndSaveWhenInstallFlagIsOnAndNoPackagesFileExists() { var args = new ScriptCsArgs { @@ -72,10 +67,9 @@ public void ShouldInstallRestoreAndSaveWhenInstallFlagIsOnAndNoPackagesFileExist var compositeCommand = result as ICompositeCommand; compositeCommand.ShouldNotBeNull(); - compositeCommand.Commands.Count.ShouldEqual(3); + compositeCommand.Commands.Count.ShouldEqual(2); compositeCommand.Commands[0].ShouldImplement(); - compositeCommand.Commands[1].ShouldImplement(); - compositeCommand.Commands[2].ShouldImplement(); + compositeCommand.Commands[1].ShouldImplement(); } [Fact] @@ -111,10 +105,9 @@ public void ShouldInstallAndExecuteWhenScriptNameIsPassedAndPackagesFolderDoesNo var compositeCommand = result as ICompositeCommand; compositeCommand.ShouldNotBeNull(); - compositeCommand.Commands.Count.ShouldEqual(3); + compositeCommand.Commands.Count.ShouldEqual(2); compositeCommand.Commands[0].ShouldImplement(); - compositeCommand.Commands[1].ShouldImplement(); - compositeCommand.Commands[2].ShouldImplement(); + compositeCommand.Commands[1].ShouldImplement(); } [Fact] @@ -133,22 +126,6 @@ public void ShouldExecuteWhenBothNameAndInstallArePassed() result.ShouldImplement(); } - [Fact] - public void ShouldRestoreWhenBothNameAndRestoreArePassed() - { - var args = new ScriptCsArgs { Restore = true, ScriptName = "" }; - - var factory = new CommandFactory(CreateRoot()); - var result = factory.CreateCommand(args, new string[0]); - - var compositeCommand = result as ICompositeCommand; - compositeCommand.ShouldNotBeNull(); - - compositeCommand.Commands.Count.ShouldEqual(2); - compositeCommand.Commands[0].ShouldImplement(); - compositeCommand.Commands[1].ShouldImplement(); - } - [Fact] public void ShouldSaveAndCleanWhenCleanFlagIsPassed() { diff --git a/test/ScriptCs.Tests/ExecuteReplCommandTests.cs b/test/ScriptCs.Tests/ExecuteReplCommandTests.cs index da9a7dd1..d86e3ed0 100644 --- a/test/ScriptCs.Tests/ExecuteReplCommandTests.cs +++ b/test/ScriptCs.Tests/ExecuteReplCommandTests.cs @@ -36,7 +36,7 @@ public void ShouldPromptForInput() Mock.Of(), Mock.Of(), Mock.Of(), - Mock.Of(), + Mock.Of(), console); var commandFactory = new CommandFactory(root); diff --git a/test/ScriptCs.Tests/ExecuteScriptCommandTests.cs b/test/ScriptCs.Tests/ExecuteScriptCommandTests.cs index f2627768..c3363161 100644 --- a/test/ScriptCs.Tests/ExecuteScriptCommandTests.cs +++ b/test/ScriptCs.Tests/ExecuteScriptCommandTests.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using Common.Logging; using Moq; @@ -6,7 +7,6 @@ using ScriptCs.Contracts; using ScriptCs.Package; using Xunit; -using System; using System.Linq; namespace ScriptCs.Tests @@ -35,7 +35,7 @@ public void ScriptExecCommandShouldInvokeWithScriptPassedFromArgs() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); var factory = new CommandFactory(root); @@ -48,38 +48,6 @@ public void ScriptExecCommandShouldInvokeWithScriptPassedFromArgs() executor.Verify(i => i.Terminate(), Times.Once()); } - [Fact] - public void ShouldCreateMissingBinFolder() - { - const string WorkingDirectory = @"C:\"; - - var binFolder = Path.Combine(WorkingDirectory, "bin"); - - var args = new ScriptCsArgs { ScriptName = "test.csx" }; - - var fs = new Mock(); - fs.Setup(x => x.GetWorkingDirectory(It.IsAny())).Returns(WorkingDirectory); - fs.SetupGet(x => x.CurrentDirectory).Returns(WorkingDirectory); - fs.Setup(x => x.DirectoryExists(binFolder)).Returns(false); - - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(x => x.CreateDirectory(binFolder), Times.Once()); - } - [Fact] public void NonManagedAssembliesAreExcluded() { @@ -94,7 +62,7 @@ public void NonManagedAssembliesAreExcluded() var fs = new Mock(); fs.SetupGet(x => x.CurrentDirectory).Returns("C:\\"); - fs.Setup(x => x.EnumerateFiles(It.IsAny(), It.IsAny())).Returns(new[] { + fs.Setup(x => x.EnumerateFiles(It.IsAny(), It.IsAny(), SearchOption.AllDirectories)).Returns(new[] { "managed.dll", nonManaged }); @@ -106,8 +74,7 @@ public void NonManagedAssembliesAreExcluded() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - assemblyName.Setup(x => x.GetAssemblyName(It.Is(y => y == nonManaged))).Throws(new BadImageFormatException()); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); @@ -145,7 +112,7 @@ public void ShouldReturnErrorIfThereIsCompileException() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); var factory = new CommandFactory(root); @@ -180,7 +147,7 @@ public void ShouldReturnErrorIfThereIsExecuteException() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); var factory = new CommandFactory(root); diff --git a/test/ScriptCs.Tests/InstallCommandTests.cs b/test/ScriptCs.Tests/InstallCommandTests.cs index 13c9ebbc..c1e4efaa 100644 --- a/test/ScriptCs.Tests/InstallCommandTests.cs +++ b/test/ScriptCs.Tests/InstallCommandTests.cs @@ -37,7 +37,7 @@ public void InstallCommandShouldInstallSinglePackageIfNamePassed() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); var factory = new CommandFactory(root); @@ -71,7 +71,7 @@ public void InstallCommandShouldInstallFromPackagesConfigIfNoNamePassed() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); resolver.Setup(i => i.GetPackages(It.IsAny())).Returns(new List diff --git a/test/ScriptCs.Tests/RestoreCommandTests.cs b/test/ScriptCs.Tests/RestoreCommandTests.cs deleted file mode 100644 index 7ee7559a..00000000 --- a/test/ScriptCs.Tests/RestoreCommandTests.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.IO; -using Common.Logging; -using Moq; -using ScriptCs.Command; -using ScriptCs.Package; -using Xunit; - -namespace ScriptCs.Tests -{ - public class RestoreCommandTests - { - public class TheExecuteMethod - { - [Fact] - public void ShouldNotCopyFilesInPathIfLastWriteTimeEqualsLastWriteTimeOfFileInBin() - { - var args = new ScriptCsArgs { Restore = true, ScriptName = "" }; - - var fs = new Mock(); - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - - const string CurrentDirectory = @"C:\"; - - var sourceFilePath = Path.Combine(CurrentDirectory, "fileName.cs"); - var sourceWriteTime = new DateTime(2013, 3, 7); - - var destFilePath = Path.Combine(CurrentDirectory, "bin", "fileName.cs"); - var destWriteTime = sourceWriteTime; - - fs.Setup(x => x.GetWorkingDirectory(It.IsAny())).Returns(CurrentDirectory); - fs.SetupGet(x => x.CurrentDirectory).Returns(CurrentDirectory); - - fs.Setup(x => x.GetLastWriteTime(sourceFilePath)).Returns(sourceWriteTime).Verifiable(); - fs.Setup(x => x.GetLastWriteTime(destFilePath)).Returns(destWriteTime).Verifiable(); - - resolver.Setup(i => i.GetAssemblyNames(CurrentDirectory, It.IsAny>())).Returns(new[] { sourceFilePath }); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(x => x.Copy(sourceFilePath, destFilePath, true), Times.Never()); - fs.Verify(x => x.GetLastWriteTime(sourceFilePath), Times.Once()); - fs.Verify(x => x.GetLastWriteTime(destFilePath), Times.Once()); - } - - [Fact] - public void ShouldCopyFilesInPathIfLastWriteTimeDiffersFromLastWriteTimeOfFileInBin() - { - var args = new ScriptCsArgs { Restore = true, ScriptName = "" }; - - var fs = new Mock(); - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - - const string CurrentDirectory = @"C:\"; - - var sourceFilePath = Path.Combine(CurrentDirectory, "fileName.cs"); - var sourceWriteTime = new DateTime(2013, 3, 7); - - var destFilePath = Path.Combine(CurrentDirectory, "bin", "fileName.cs"); - var destWriteTime = new DateTime(2013, 2, 7); - - fs.Setup(x => x.GetWorkingDirectory(It.IsAny())).Returns(CurrentDirectory); - fs.SetupGet(x => x.CurrentDirectory).Returns(CurrentDirectory); - - fs.Setup(x => x.GetLastWriteTime(sourceFilePath)).Returns(sourceWriteTime).Verifiable(); - fs.Setup(x => x.GetLastWriteTime(destFilePath)).Returns(destWriteTime).Verifiable(); - - resolver.Setup(i => i.GetAssemblyNames(CurrentDirectory, It.IsAny>())).Returns(new[] { sourceFilePath }); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(x => x.Copy(sourceFilePath, destFilePath, true), Times.Once()); - fs.Verify(x => x.GetLastWriteTime(sourceFilePath), Times.Once()); - fs.Verify(x => x.GetLastWriteTime(destFilePath), Times.Once()); - } - - [Fact] - public void ShouldCreateBinFolderIfItDoesNotExist() - { - var args = new ScriptCsArgs { Restore = true, ScriptName = "" }; - - var fs = new Mock(); - var resolver = new Mock(); - var executor = new Mock(); - var engine = new Mock(); - var scriptpackResolver = new Mock(); - var packageInstaller = new Mock(); - var logger = new Mock(); - var filePreProcessor = new Mock(); - var assemblyName = new Mock(); - var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); - - const string CurrentDirectory = @"C:\"; - const string BinFolder = @"C:\bin"; - - fs.Setup(x => x.GetWorkingDirectory(It.IsAny())).Returns(CurrentDirectory); - fs.SetupGet(x => x.CurrentDirectory).Returns(CurrentDirectory); - - var binFolderCreated = false; - - fs.Setup(x => x.DirectoryExists(BinFolder)).Returns(() => binFolderCreated).Verifiable(); - fs.Setup(x => x.CreateDirectory(BinFolder)).Callback(() => binFolderCreated = true).Verifiable(); - - var factory = new CommandFactory(root); - var result = factory.CreateCommand(args, new string[0]); - - result.Execute(); - - fs.Verify(x => x.DirectoryExists(BinFolder), Times.AtLeastOnce()); - fs.Verify(x => x.CreateDirectory(BinFolder), Times.Once()); - } - } - } -} diff --git a/test/ScriptCs.Tests/ScriptCs.Tests.csproj b/test/ScriptCs.Tests/ScriptCs.Tests.csproj index e64fa785..7a0b535e 100644 --- a/test/ScriptCs.Tests/ScriptCs.Tests.csproj +++ b/test/ScriptCs.Tests/ScriptCs.Tests.csproj @@ -47,7 +47,6 @@ - diff --git a/test/ScriptCs.Tests/VersionCommandTests.cs b/test/ScriptCs.Tests/VersionCommandTests.cs index bbc7f11e..8546f5e8 100644 --- a/test/ScriptCs.Tests/VersionCommandTests.cs +++ b/test/ScriptCs.Tests/VersionCommandTests.cs @@ -42,7 +42,7 @@ public void VersionCommandShouldOutputVersion() var packageInstaller = new Mock(); var logger = new Mock(); var filePreProcessor = new Mock(); - var assemblyName = new Mock(); + var assemblyName = new Mock(); var root = new ScriptServiceRoot(fs.Object, resolver.Object, executor.Object, engine.Object, filePreProcessor.Object, scriptpackResolver.Object, packageInstaller.Object, logger.Object, assemblyName.Object); var factory = new CommandFactory(root);