diff --git a/ScriptCs.sln b/ScriptCs.sln index b1d3dd0e..ef4d90bc 100644 --- a/ScriptCs.sln +++ b/ScriptCs.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptCs", "src\ScriptCs\ScriptCs.csproj", "{25080671-1A80-4041-B9C7-260578FF4849}" EndProject @@ -37,6 +37,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptCs.Engine.Mono.Tests", "test\ScriptCs.Engine.Mono.Tests\ScriptCs.Engine.Mono.Tests.csproj", "{D0723C2D-D3B4-40B7-8E5A-84FB3A6E5092}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptCs.Tests.Acceptance", "test\ScriptCs.Tests.Acceptance\ScriptCs.Tests.Acceptance.csproj", "{10684649-2922-41F5-AB9B-20B127CBF92C}" + ProjectSection(ProjectDependencies) = postProject + {25080671-1A80-4041-B9C7-260578FF4849} = {25080671-1A80-4041-B9C7-260578FF4849} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{B138045D-DC04-4A04-A2BA-F771173BCC32}" ProjectSection(SolutionItems) = preProject diff --git a/src/ScriptCs.Core/AssemblyResolver.cs b/src/ScriptCs.Core/AssemblyResolver.cs index a129deac..75b3a5c8 100644 --- a/src/ScriptCs.Core/AssemblyResolver.cs +++ b/src/ScriptCs.Core/AssemblyResolver.cs @@ -10,14 +10,10 @@ 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; + private readonly ILog _logger; public AssemblyResolver( IFileSystem fileSystem, @@ -29,11 +25,14 @@ public AssemblyResolver( Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFolder", fileSystem.PackagesFolder); Guard.AgainstNullArgumentProperty("fileSystem", "BinFolder", fileSystem.BinFolder); + Guard.AgainstNullArgument("packageAssemblyResolver", packageAssemblyResolver); + Guard.AgainstNullArgument("assemblyUtility", assemblyUtility); + Guard.AgainstNullArgument("logger", logger); + _fileSystem = fileSystem; _packageAssemblyResolver = packageAssemblyResolver; - _logger = logger; _assemblyUtility = assemblyUtility; - + _logger = logger; } public IEnumerable GetAssemblyPaths(string path, bool binariesOnly = false) @@ -43,21 +42,15 @@ public IEnumerable GetAssemblyPaths(string path, bool binariesOnly = fal List assemblies; if (!_assemblyPathCache.TryGetValue(path, out assemblies)) { - var packageAssemblies = GetPackageAssemblies(path); - var binAssemblies = GetBinAssemblyPaths(path); - - assemblies = packageAssemblies.Union(binAssemblies).ToList(); - + assemblies = GetPackageAssemblyNames(path).Union(GetBinAssemblyPaths(path)).ToList(); _assemblyPathCache.Add(path, assemblies); } - if (binariesOnly) - { - return assemblies.Where( - m => m.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || m.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)); - } - - return assemblies; + return binariesOnly + ? assemblies.Where(m => + m.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || + m.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) + : assemblies.ToArray(); } private IEnumerable GetBinAssemblyPaths(string path) @@ -65,39 +58,24 @@ private IEnumerable GetBinAssemblyPaths(string path) var binFolder = Path.Combine(path, _fileSystem.BinFolder); if (!_fileSystem.DirectoryExists(binFolder)) { - return Enumerable.Empty(); + yield break; } - var assemblies = _fileSystem.EnumerateBinaries(binFolder, SearchOption.TopDirectoryOnly) - .Where(f => _assemblyUtility.IsManagedAssembly(f)) - .ToList(); - - foreach (var assembly in assemblies) + foreach (var assembly in _fileSystem.EnumerateBinaries(binFolder, SearchOption.TopDirectoryOnly) + .Where(f => _assemblyUtility.IsManagedAssembly(f))) { _logger.DebugFormat("Found assembly in bin folder: {0}", Path.GetFileName(assembly)); + yield return assembly; } - - return assemblies; } - private IEnumerable GetPackageAssemblies(string path) + private IEnumerable GetPackageAssemblyNames(string path) { - var packagesFolder = Path.Combine(path, _fileSystem.PackagesFolder); - if (!_fileSystem.DirectoryExists(packagesFolder)) + foreach (var assembly in _packageAssemblyResolver.GetAssemblyNames(path)) { - return Enumerable.Empty(); + _logger.DebugFormat("Found package assembly: {0}", Path.GetFileName(assembly)); + yield return assembly; } - - var assemblies = _packageAssemblyResolver.GetAssemblyNames(path) - .Where(f => _assemblyUtility.IsManagedAssembly(f)) - .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 index f2357870..5e1b1f9c 100644 --- a/src/ScriptCs.Core/AssemblyUtility.cs +++ b/src/ScriptCs.Core/AssemblyUtility.cs @@ -1,22 +1,13 @@ using System; using System.Reflection; - using ScriptCs.Contracts; namespace ScriptCs { - using System.IO; - - public class AssemblyUtility : IAssemblyUtility + public class AssemblyUtility : IAssemblyUtility { public bool IsManagedAssembly(string path) { - if (!Path.IsPathRooted(path) && !(path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || - path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))) - { - return true; - } - try { AssemblyName.GetAssemblyName(path); @@ -43,4 +34,4 @@ public AssemblyName GetAssemblyName(string path) return AssemblyName.GetAssemblyName(path); } } -} \ No newline at end of file +} diff --git a/src/ScriptCs.Core/PackageAssemblyResolver.cs b/src/ScriptCs.Core/PackageAssemblyResolver.cs index a84016b2..86819c36 100644 --- a/src/ScriptCs.Core/PackageAssemblyResolver.cs +++ b/src/ScriptCs.Core/PackageAssemblyResolver.cs @@ -12,23 +12,30 @@ public class PackageAssemblyResolver : IPackageAssemblyResolver private readonly IFileSystem _fileSystem; private readonly IPackageContainer _packageContainer; private readonly ILog _logger; + private readonly IAssemblyUtility _assemblyUtility; + private List _topLevelPackages; - public PackageAssemblyResolver(IFileSystem fileSystem, IPackageContainer packageContainer, ILog logger) + public PackageAssemblyResolver( + IFileSystem fileSystem, IPackageContainer packageContainer, ILog logger, IAssemblyUtility assemblyUtility) { Guard.AgainstNullArgument("fileSystem", fileSystem); Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFolder", fileSystem.PackagesFolder); Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFile", fileSystem.PackagesFile); + Guard.AgainstNullArgument("packageContainer", packageContainer); + Guard.AgainstNullArgument("logger", logger); + Guard.AgainstNullArgument("assemblyUtility", assemblyUtility); + _fileSystem = fileSystem; _packageContainer = packageContainer; _logger = logger; + _assemblyUtility = assemblyUtility; } public void SavePackages() { var packagesFolder = Path.Combine(_fileSystem.CurrentDirectory, _fileSystem.PackagesFolder); - if (!_fileSystem.DirectoryExists(packagesFolder)) { _logger.Info("Packages directory does not exist!"); @@ -40,12 +47,9 @@ public void SavePackages() public IEnumerable GetPackages(string workingDirectory) { - var packageFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); - var packages = _packageContainer.FindReferences(packageFile).ToList(); - - _topLevelPackages = packages; - - return packages; + var packagesFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); + _topLevelPackages = _packageContainer.FindReferences(packagesFile).ToList(); + return _topLevelPackages.ToArray(); } public IEnumerable GetAssemblyNames(string workingDirectory) @@ -56,75 +60,70 @@ public IEnumerable GetAssemblyNames(string workingDirectory) return Enumerable.Empty(); } - var packageFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); - var packageDir = Path.Combine(workingDirectory, _fileSystem.PackagesFolder); + var packagesFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); + var packagesFolder = Path.Combine(workingDirectory, _fileSystem.PackagesFolder); - var foundAssemblyPaths = new List(); - - LoadFiles(packageDir, packages, foundAssemblyPaths, _fileSystem.FileExists(packageFile)); - - return foundAssemblyPaths; + var names = new List(); + GetAssemblyNames(packagesFolder, packages, names, _fileSystem.FileExists(packagesFile)); + return names; } - private void LoadFiles( + private void GetAssemblyNames( string packageDir, IEnumerable packageReferences, - List foundAssemblies, - bool strictLoad = true) + ICollection names, + bool strictLoad) { - foreach (var packageRef in packageReferences) + foreach (var packageReference in packageReferences) { - var nugetPackage = _packageContainer.FindPackage(packageDir, packageRef); - if (nugetPackage == null) + var packageObject = _packageContainer.FindPackage(packageDir, packageReference); + if (packageObject == null) { _logger.WarnFormat( CultureInfo.InvariantCulture, "Cannot find: {0} {1}", - packageRef.PackageId, - packageRef.Version); + packageReference.PackageId, + packageReference.Version); continue; } - var compatibleFiles = nugetPackage.GetCompatibleDlls(packageRef.FrameworkName); - if (compatibleFiles == null) + var compatibleDlls = packageObject.GetCompatibleDlls(packageReference.FrameworkName); + if (compatibleDlls == null) { _logger.WarnFormat( CultureInfo.InvariantCulture, "Cannot find compatible binaries for {0} in: {1} {2}", - packageRef.FrameworkName, - packageRef.PackageId, - packageRef.Version); + packageReference.FrameworkName, + packageReference.PackageId, + packageReference.Version); continue; } - var compatibleFilePaths = compatibleFiles - .Select(packageFile => Path.Combine(packageDir, nugetPackage.FullName, packageFile)) - .Concat(nugetPackage.FrameworkAssemblies); - - foreach (var path in compatibleFilePaths) + foreach (var name in compatibleDlls + .Select(packageFile => Path.Combine(packageDir, packageObject.FullName, packageFile)) + .Where(path => _assemblyUtility.IsManagedAssembly(path)) + .Concat(packageObject.FrameworkAssemblies) + .Where(name => !names.Contains(name))) { - if (foundAssemblies.Contains(path)) - { - continue; - } - - foundAssemblies.Add(path); - _logger.Debug("Found: " + path); + names.Add(name); + _logger.Debug("Found: " + name); } - if (nugetPackage.Dependencies == null || !nugetPackage.Dependencies.Any() || !strictLoad) + if (packageObject.Dependencies == null || !packageObject.Dependencies.Any() || !strictLoad) { continue; } - var dependencyReferences = nugetPackage.Dependencies - .Where(i => _topLevelPackages.All(x => x.PackageId != i.Id)) - .Select(i => new PackageReference(i.Id, i.FrameworkName, i.Version)); + var dependencyReferences = packageObject.Dependencies + .Where(dependency => + _topLevelPackages.All(topLevelPackage => topLevelPackage.PackageId != dependency.Id)) + .Select(dependency => + new PackageReference(dependency.Id, dependency.FrameworkName, dependency.Version)); - LoadFiles(packageDir, dependencyReferences, foundAssemblies, true); + GetAssemblyNames(packageDir, dependencyReferences, names, true); } } } -} \ No newline at end of file +} diff --git a/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs b/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs index 0e50c115..4e1a8834 100644 --- a/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs +++ b/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs @@ -1,16 +1,10 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using ScriptCs.Contracts; +using Should; +using Xunit; namespace ScriptCs.Tests { - using System.IO; - using Contracts; - using Xunit; - using Should; - public class AssemblyUtilityTests { public class TheIsManagedAssemblyMethod @@ -18,9 +12,9 @@ public class TheIsManagedAssemblyMethod private readonly IAssemblyUtility _assemblyUtility = new AssemblyUtility(); [Fact] - public void ShouldReturnTrueWhenThePathIsNotRootedAndDoesNotHaveADllOrExeExtension() + public void ShouldReturnFalseWhenThePathDoesNotPointToAManagedAssembly() { - _assemblyUtility.IsManagedAssembly("System.Data").ShouldBeTrue(); + _assemblyUtility.IsManagedAssembly("ScriptCs.Core.Tests.dll.config").ShouldBeFalse(); } [Fact] diff --git a/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs b/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs index c8db0014..7d01c0ad 100644 --- a/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs +++ b/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs @@ -21,6 +21,7 @@ public class GetAssemblyNamesMethod private readonly Mock _filesystem; private readonly Mock _package; private readonly Mock _packageContainer; + private readonly Mock _assemblyUtility; private readonly List _packageIds; private readonly string _workingDirectory; @@ -56,12 +57,15 @@ public GetAssemblyNamesMethod() _packageContainer = new Mock(); _packageContainer.Setup(i => i.FindReferences(It.IsAny())).Returns(_packageIds); _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.IsAny())).Returns(_package.Object); + + _assemblyUtility = new Mock(); + _assemblyUtility.Setup(u => u.IsManagedAssembly(It.IsAny())).Returns(true); } [Fact] public void WhenManyPackagesAreMatchedAllMatchingDllsWithUniquePathsShouldBeReturned() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); _packageIds.Add(new PackageReference("testId2", VersionUtility.ParseFrameworkName("net40"), new Version("3.0"))); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -84,7 +88,7 @@ public void WhenManyPackagesAreMatchedAllMatchingDllsShouldBeReturned() _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "testId2"))).Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); found.ShouldNotBeEmpty(); @@ -100,7 +104,7 @@ public void WhenPackageIsMatchedItsNonMatchingDllsShouldBeExcluded() It.Is(x => x.FullName == VersionUtility.ParseFrameworkName("net40").FullName))) .Returns(new List { "test.dll" }); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -128,7 +132,7 @@ public void WhenManyPackagesAreMatchedAllNonMatchingDllsShouldBeExcluded() _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "testId2"))).Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -139,7 +143,7 @@ public void WhenManyPackagesAreMatchedAllNonMatchingDllsShouldBeExcluded() [Fact] public void WhenDllsAreMatchedDllFilePathsAreCorrectlyConcatenated() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory); @@ -156,7 +160,7 @@ public void WhenNoPackagesAreFoundShouldLogWarning() _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.IsAny())) .Returns>(null); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); // act resolver.GetAssemblyNames(_workingDirectory); @@ -176,7 +180,7 @@ public void WhenPackagesAreFoundButNoMatchingDllsExistShouldLogWarning() // arrange _package.Setup(i => i.GetCompatibleDlls(It.IsAny())).Returns>(null); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); // act resolver.GetAssemblyNames(_workingDirectory); @@ -194,7 +198,7 @@ public void WhenPackagesAreFoundButNoMatchingDllsExistShouldLogWarning() [Fact] public void WhenPackageDirectoryDoesNotExistShouldReturnEmptyPackagesList() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object, _assemblyUtility.Object); _filesystem.Setup(i => i.DirectoryExists(It.IsAny())).Returns(false); var found = resolver.GetAssemblyNames(_workingDirectory); @@ -204,7 +208,7 @@ public void WhenPackageDirectoryDoesNotExistShouldReturnEmptyPackagesList() [Fact] public void WhenPackagesConfigDoesNotExistShouldReturnEmptyPackagesList() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object, _assemblyUtility.Object); _filesystem.Setup(i => i.FileExists(It.IsAny())).Returns(false); var found = resolver.GetAssemblyNames(_workingDirectory); @@ -227,7 +231,7 @@ public void ShouldLoadAllDependenciesIfPackageHasAny() i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "p2"))) .Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -254,7 +258,7 @@ public void ShouldNotLoadDuplicateDependencies() i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "p2"))) .Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -279,7 +283,7 @@ public void ShouldNotLoadIncompatibleDependenciesDlls() i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "p2"))) .Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -287,6 +291,19 @@ public void ShouldNotLoadIncompatibleDependenciesDlls() found.ShouldNotBeEmpty(); found.Count.ShouldEqual(4); } + + [Fact] + public void ShouldIgnoreUnmanagedAssemblies() + { + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); + _packageIds.Add(new PackageReference("testId2", VersionUtility.ParseFrameworkName("net40"), new Version("3.0"))); + _assemblyUtility.Setup(u => u.IsManagedAssembly(It.Is(s => Path.GetFileName(s) == "test.dll"))).Returns(false); + + var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); + + found.ShouldNotBeEmpty(); + found.Count.ShouldEqual(3); + } } public class GetPackagesMethod @@ -294,6 +311,7 @@ public class GetPackagesMethod private Mock _fs; private Mock _pc; private Mock _logger; + private Mock _assemblyUtility; public GetPackagesMethod() { @@ -303,6 +321,7 @@ public GetPackagesMethod() _pc = new Mock(); _logger = new Mock(); + _assemblyUtility = new Mock(); } [Fact] @@ -310,7 +329,7 @@ public void ShouldReturnEmptyIfPackagesConfigDoesNotExist() { _fs.Setup(i => i.FileExists(It.IsAny())).Returns(false); - var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object, _assemblyUtility.Object); var result = resolver.GetPackages(@"c:/"); result.ShouldBeEmpty(); @@ -322,7 +341,7 @@ public void ShouldGetReferencesToPackages() _fs.Setup(i => i.FileExists(It.IsAny())).Returns(true); _pc.Setup(i => i.FindReferences(It.IsAny())).Returns(new List { new PackageReference("id", VersionUtility.ParseFrameworkName("net40"), new Version("3.0")) }); - var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object, _assemblyUtility.Object); var result = resolver.GetPackages(@"c:/"); _pc.Verify(i => i.FindReferences(It.IsAny()), Times.Once()); @@ -335,6 +354,7 @@ public class SavePackagesMethod private Mock _fs; private Mock _pc; private Mock _logger; + private Mock _assemblyUtility; public SavePackagesMethod() { @@ -344,11 +364,12 @@ public SavePackagesMethod() _pc = new Mock(); _logger = new Mock(); + _assemblyUtility = new Mock(); } private IPackageAssemblyResolver GetResolver() { - return new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object); + return new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object, _assemblyUtility.Object); } [Fact] diff --git a/test/ScriptCs.Tests.Acceptance/Packages.cs b/test/ScriptCs.Tests.Acceptance/Packages.cs new file mode 100644 index 00000000..acd813a2 --- /dev/null +++ b/test/ScriptCs.Tests.Acceptance/Packages.cs @@ -0,0 +1,31 @@ +namespace ScriptCs.Tests.Acceptance +{ + using System; + using System.Reflection; + using ScriptCs.Tests.Acceptance.Support; + using Should; + using Should.Core.Assertions; + using Xbehave; + + public static class Packages + { + [Scenario] + public static void PackageContainsAFrameworkAssemblyReference(ScenarioDirectory directory, Exception exception) + { + var scenario = MethodBase.GetCurrentMethod().GetFullName(); + + "Given a simple script" + .f(() => directory = ScenarioDirectory.Create(scenario) + .WriteLine("foo.csx", "Console.WriteLine();")); + + "When I install a package which contains a framework assembly reference" + .f(() => ScriptCsExe.Install("FrameworkAssemblyReferencer", directory)); + + "And I execute the script" + .f(() => exception = Record.Exception(() => ScriptCsExe.Run("foo.csx", directory))); + + "Then there should be no errors" + .f(() => exception.ShouldBeNull()); + } + } +} diff --git a/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj b/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj index 71102bf6..3cfc1be8 100644 --- a/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj +++ b/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj @@ -45,6 +45,7 @@ + @@ -75,6 +76,9 @@ + + Always + Always diff --git a/test/ScriptCs.Tests.Acceptance/Support/Gallery/FrameworkAssemblyReferencer.1.0.0.nupkg b/test/ScriptCs.Tests.Acceptance/Support/Gallery/FrameworkAssemblyReferencer.1.0.0.nupkg new file mode 100644 index 00000000..25061b67 Binary files /dev/null and b/test/ScriptCs.Tests.Acceptance/Support/Gallery/FrameworkAssemblyReferencer.1.0.0.nupkg differ