public void RunAnalyzersAfterGeneratingSource() { string text = @"class C { }"; using (var directory = new DisposableDirectory(Temp)) { var file = directory.CreateFile("c.cs"); file.WriteAllText(text); int analyzerCalls = 0; ImmutableArray<SyntaxTree> treesToAnalyze; var analyzer = new MyAnalyzer(c => { analyzerCalls++; Assert.True(treesToAnalyze.IsDefault); treesToAnalyze = ImmutableArray.CreateRange(c.Compilation.SyntaxTrees); }); int generatorCalls = 0; var generator = new MyGenerator(c => { generatorCalls++; c.AddCompilationUnit("__c", CSharpSyntaxTree.ParseText("class __C { }")); }); var compiler = new MyCompiler( baseDirectory: directory.Path, args: new[] { "/nologo", "/preferreduilang:en", "/t:library", file.Path }, analyzers: ImmutableArray.Create<DiagnosticAnalyzer>(analyzer), generators: ImmutableArray.Create<SourceGenerator>(generator)); var builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { compiler.Run(writer); } var output = builder.ToString(); // No errors from analyzer. Assert.Equal("", output); Assert.Equal(1, generatorCalls); Assert.Equal(1, analyzerCalls); Assert.Equal(2, treesToAnalyze.Length); } }
public void Resolve() { using (var directory = new DisposableDirectory(Temp)) { var assembly1 = directory.CreateFile("_1.dll"); var assembly2 = directory.CreateFile("_2.dll"); // With NuGetPackageResolver. var resolver = new RuntimeMetadataReferenceResolver( new RelativePathResolver(ImmutableArray.Create(directory.Path), baseDirectory: directory.Path), new PackageResolver(ImmutableDictionary<string, ImmutableArray<string>>.Empty.Add("nuget:N/1.0", ImmutableArray.Create(assembly1.Path, assembly2.Path))), gacFileResolver: null, useCoreResolver: false); // Recognized NuGet reference. var actualReferences = resolver.ResolveReference("nuget:N/1.0", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); AssertEx.SetEqual(actualReferences.SelectAsArray(r => r.FilePath), assembly1.Path, assembly2.Path); // Unrecognized NuGet reference. actualReferences = resolver.ResolveReference("nuget:N/2.0", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); Assert.True(actualReferences.IsEmpty); // Recognized file path. actualReferences = resolver.ResolveReference("_2.dll", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); AssertEx.SetEqual(actualReferences.SelectAsArray(r => r.FilePath), assembly2.Path); // Unrecognized file path. actualReferences = resolver.ResolveReference("_3.dll", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); Assert.True(actualReferences.IsEmpty); // Without NuGetPackageResolver. resolver = new RuntimeMetadataReferenceResolver( new RelativePathResolver(ImmutableArray.Create(directory.Path), baseDirectory: directory.Path), packageResolver: null, gacFileResolver: null, useCoreResolver: false); // Unrecognized NuGet reference. actualReferences = resolver.ResolveReference("nuget:N/1.0", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); Assert.True(actualReferences.IsEmpty); // Recognized file path. actualReferences = resolver.ResolveReference("_2.dll", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); AssertEx.SetEqual(actualReferences.SelectAsArray(r => r.FilePath), assembly2.Path); // Unrecognized file path. actualReferences = resolver.ResolveReference("_3.dll", baseFilePath: null, properties: MetadataReferenceProperties.Assembly); Assert.True(actualReferences.IsEmpty); } }
public void NoGenerators() { string text = @"class C { }"; var compilation = CSharpCompilation.Create(GetUniqueName(), new[] { CSharpSyntaxTree.ParseText(text) }, new[] { MscorlibRef }); using (var directory = new DisposableDirectory(Temp)) { var path = directory.Path; // Default generators array. Assert.Throws<ArgumentException>(() => compilation.GenerateSource(default(ImmutableArray<SourceGenerator>), path, writeToDisk: false, cancellationToken: default(CancellationToken))); // Empty generators array. var trees = compilation.GenerateSource(ImmutableArray<SourceGenerator>.Empty, path, writeToDisk: false, cancellationToken: default(CancellationToken)); Assert.True(trees.IsEmpty); } }
public void Paths() { string text = @"class C { }"; var compilation = CSharpCompilation.Create(GetUniqueName(), new[] { CSharpSyntaxTree.ParseText(text) }, new[] { MscorlibRef }); var generator = new MyGenerator(context => context.AddCompilationUnit("__c", CSharpSyntaxTree.ParseText(@"class __C { }"))); using (var directory = new DisposableDirectory(Temp)) { // Null path. Assert.Throws<ArgumentNullException>(() => compilation.GenerateSource(ImmutableArray.Create<SourceGenerator>(generator), path: null, writeToDisk: false, cancellationToken: default(CancellationToken))); // Relative path. var path = Path.GetFileName(directory.Path); var trees = compilation.GenerateSource(ImmutableArray.Create<SourceGenerator>(generator), path, writeToDisk: false, cancellationToken: default(CancellationToken)); Assert.Equal(1, trees.Length); var filePath = Path.Combine(path, "__c.cs"); Assert.Equal(filePath, trees[0].FilePath); } }
public void DoNotPersist() { string text = @"class C { }"; var compilation = CSharpCompilation.Create(GetUniqueName(), new[] { CSharpSyntaxTree.ParseText(text) }, new[] { MscorlibRef }); var generator = new MyGenerator(context => context.AddCompilationUnit("__c", CSharpSyntaxTree.ParseText(@"class __C { }"))); using (var directory = new DisposableDirectory(Temp)) { var path = directory.Path; var trees = compilation.GenerateSource( ImmutableArray.Create<SourceGenerator>(generator), path, writeToDisk: false, cancellationToken: default(CancellationToken)); Assert.Equal(1, trees.Length); var filePath = Path.Combine(path, "__c.cs"); Assert.Equal(filePath, trees[0].FilePath); Assert.False(File.Exists(filePath)); } }
public void RelativePath() { using (var directory = new DisposableDirectory(Temp)) { const string scriptName = "c.csx"; var script = directory.CreateFile(scriptName).WriteAllText("Print(3);"); var scriptPath = PathUtilities.CombinePathsUnchecked(PathUtilities.GetFileName(directory.Path), scriptName); var workingDirectory = PathUtilities.GetDirectoryName(directory.Path); Assert.False(PathUtilities.IsAbsolute(scriptPath)); var runner = CreateRunner( args: new[] { scriptPath }, workingDirectory: workingDirectory); runner.RunInteractive(); AssertEx.AssertEqualToleratingWhitespaceDifferences("3", runner.Console.Out.ToString()); } }
public TempDirectory CreateDirectory() { var dir = new DisposableDirectory(this); temps.Add(dir); return dir; }
private void Persist(Encoding generatedEncoding, Encoding persistedEncoding) { var compilation = CSharpCompilation.Create(GetUniqueName(), new[] { CSharpSyntaxTree.ParseText(@"class C { }") }, new[] { MscorlibRef }); var generatedText = @"class __C { }"; var generator = new MyGenerator(context => context.AddCompilationUnit("__c", CSharpSyntaxTree.ParseText(generatedText, encoding: generatedEncoding))); using (var directory = new DisposableDirectory(Temp)) { var path = directory.Path; var trees = compilation.GenerateSource( ImmutableArray.Create<SourceGenerator>(generator), path, writeToDisk: true, cancellationToken: default(CancellationToken)); Assert.Equal(1, trees.Length); var filePath = Path.Combine(path, "__c.cs"); Assert.Equal(filePath, trees[0].FilePath); Assert.True(File.Exists(filePath)); using (var reader = new StreamReader(filePath, detectEncodingFromByteOrderMarks: true)) { // Need at least one read to get encoding. var persistedText = reader.ReadToEnd(); Assert.Equal(persistedEncoding, reader.CurrentEncoding); Assert.Equal(persistedText, generatedText); } } }
public void ResolveReference() { var expectedProjectJson = @"{ ""dependencies"": { ""A.B.C"": ""1.2"" }, ""frameworks"": { ""net46"": {} } }"; var actualProjectLockJson = @"{ ""locked"": false, ""version"": 1, ""targets"": { "".NETFramework,Version=v4.5"": { }, "".NETFramework,Version=v4.6"": { ""System.Collections/4.0.10"": { ""dependencies"": { ""System.Runtime"": """" }, ""compile"": { ""ref/dotnet/System.Runtime.dll"": {} }, ""runtime"": { ""ref/dotnet/System.Collections.dll"": {} } }, ""System.Diagnostics.Debug/4.0.10"": { ""dependencies"": { ""System.Runtime"": """" }, }, ""System.IO/4.0.10"": { ""dependencies"": {}, ""runtime"": { ""ref/dotnet/System.Runtime.dll"": {}, ""ref/dotnet/System.IO.dll"": {} } } } } }"; using (var directory = new DisposableDirectory(Temp)) { var packagesDirectory = directory.Path; var resolver = new NuGetPackageResolverImpl( packagesDirectory, startInfo => { var arguments = startInfo.Arguments.Split('"'); Assert.Equal(5, arguments.Length); Assert.Equal("restore ", arguments[0]); Assert.Equal("project.json", PathUtilities.GetFileName(arguments[1])); Assert.Equal(" -PackagesDirectory ", arguments[2]); Assert.Equal(packagesDirectory, arguments[3]); Assert.Equal("", arguments[4]); var projectJsonPath = arguments[1]; var actualProjectJson = File.ReadAllText(projectJsonPath); Assert.Equal(expectedProjectJson, actualProjectJson); var projectLockJsonPath = PathUtilities.CombineAbsoluteAndRelativePaths(PathUtilities.GetDirectoryName(projectJsonPath), "project.lock.json"); using (var writer = new StreamWriter(projectLockJsonPath)) { writer.Write(actualProjectLockJson); } }); var actualPaths = resolver.ResolveNuGetPackage("A.B.C/1.2"); AssertEx.SetEqual(actualPaths, PathUtilities.CombineAbsoluteAndRelativePaths(packagesDirectory, PathUtilities.CombinePossiblyRelativeAndRelativePaths("System.Collections/4.0.10", "ref/dotnet/System.Collections.dll")), PathUtilities.CombineAbsoluteAndRelativePaths(packagesDirectory, PathUtilities.CombinePossiblyRelativeAndRelativePaths("System.IO/4.0.10", "ref/dotnet/System.Runtime.dll")), PathUtilities.CombineAbsoluteAndRelativePaths(packagesDirectory, PathUtilities.CombinePossiblyRelativeAndRelativePaths("System.IO/4.0.10", "ref/dotnet/System.IO.dll"))); } }
public void HandledException() { using (var directory = new DisposableDirectory(Temp)) { var resolver = new NuGetPackageResolverImpl(directory.Path, startInfo => { throw new IOException(); }); var actualPaths = resolver.ResolveNuGetPackage("A.B.C/1.2"); Assert.True(actualPaths.IsDefault); } }
public void UnhandledException() { using (var directory = new DisposableDirectory(Temp)) { var resolver = new NuGetPackageResolverImpl(directory.Path, startInfo => { throw new InvalidOperationException(); }); Assert.Throws<InvalidOperationException>(() => resolver.ResolveNuGetPackage("A.B.C/1.2")); } }
public void ResolveReference() { var expectedProjectJson = @"{ ""dependencies"": { ""A.B.C"": ""1.2"" }, ""frameworks"": { ""net46"": {} } }"; var expectedConfig = @"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <packageRestore> <add key=""enabled"" value=""True"" /> <add key=""automatic"" value=""False"" /> </packageRestore> <packageSources/> </configuration>"; var actualProjectLockJson = @"{ ""locked"": false, ""version"": 1, ""targets"": { "".NETFramework,Version=v4.5"": { }, "".NETFramework,Version=v4.6"": { ""System.Collections/4.0.10"": { ""dependencies"": { ""System.Runtime"": """" }, ""compile"": { ""ref/dotnet/System.Runtime.dll"": {} }, ""runtime"": { ""ref/dotnet/System.Collections.dll"": {} } }, ""System.Diagnostics.Debug/4.0.10"": { ""dependencies"": { ""System.Runtime"": """" }, }, ""System.Runtime/4.0.0"": { ""runtime"": { ""ref/dotnet/_._"": {} } }, ""System.IO/4.0.10"": { ""dependencies"": {}, ""runtime"": { ""ref/dotnet/System.Runtime.dll"": {}, ""ref/dotnet/System.IO.dll"": {} } } } } }"; using (var directory = new DisposableDirectory(Temp)) { var packagesDirectory = directory.Path; var resolver = new NuGetPackageResolverImpl( packagesDirectory, startInfo => { // Verify arguments. var arguments = startInfo.Arguments.Split('"'); Assert.Equal(7, arguments.Length); Assert.Equal("restore ", arguments[0]); Assert.Equal("project.json", PathUtilities.GetFileName(arguments[1])); Assert.Equal(" -ConfigFile ", arguments[2]); Assert.Equal("nuget.config", PathUtilities.GetFileName(arguments[3])); Assert.Equal(" -PackagesDirectory ", arguments[4]); Assert.Equal(packagesDirectory, arguments[5]); Assert.Equal("", arguments[6]); // Verify project.json contents. var projectJsonPath = arguments[1]; var actualProjectJson = File.ReadAllText(projectJsonPath); Assert.Equal(expectedProjectJson, actualProjectJson); // Verify config file contents. var configPath = arguments[3]; var actualConfig = File.ReadAllText(configPath); Assert.Equal(expectedConfig, actualConfig); // Generate project.lock.json. var projectLockJsonPath = PathUtilities.CombineAbsoluteAndRelativePaths(PathUtilities.GetDirectoryName(projectJsonPath), "project.lock.json"); using (var writer = new StreamWriter(projectLockJsonPath)) { writer.Write(actualProjectLockJson); } }); var actualPaths = resolver.ResolveNuGetPackage("A.B.C", "1.2"); AssertEx.SetEqual(actualPaths, PathUtilities.CombineAbsoluteAndRelativePaths(packagesDirectory, PathUtilities.CombinePossiblyRelativeAndRelativePaths("System.Collections/4.0.10", "ref/dotnet/System.Collections.dll")), PathUtilities.CombineAbsoluteAndRelativePaths(packagesDirectory, PathUtilities.CombinePossiblyRelativeAndRelativePaths("System.IO/4.0.10", "ref/dotnet/System.Runtime.dll")), PathUtilities.CombineAbsoluteAndRelativePaths(packagesDirectory, PathUtilities.CombinePossiblyRelativeAndRelativePaths("System.IO/4.0.10", "ref/dotnet/System.IO.dll"))); } }
public void UnhandledException() { using (var directory = new DisposableDirectory(Temp)) { bool restored = false; var resolver = new NuGetPackageResolverImpl(directory.Path, startInfo => { restored = true; throw new InvalidOperationException(); }); Assert.Throws<InvalidOperationException>(() => resolver.ResolveNuGetPackage("A.B.C", "1.2")); Assert.True(restored); } }
public void HandledException() { using (var directory = new DisposableDirectory(Temp)) { bool restored = false; var resolver = new NuGetPackageResolverImpl(directory.Path, startInfo => { restored = true; throw new IOException(); }); var actualPaths = resolver.ResolveNuGetPackage("A.B.C", "1.2"); Assert.True(actualPaths.IsEmpty); Assert.True(restored); } }