Inheritance: Microsoft.CodeAnalysis.Test.Utilities.TempDirectory, IDisposable
Example #1
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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());
     }
 }
Example #7
0
 public TempDirectory CreateDirectory()
 {
     var dir = new DisposableDirectory(this);
     temps.Add(dir);
     return dir;
 }
Example #8
0
 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"));
     }
 }
Example #12
0
        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")));
            }
        }
Example #13
0
 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);
     }
 }
Example #14
0
 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);
     }
 }