public void GetsSourceFiles( [ValueSource(nameof(Preferences))] EnvironmentPreference preference, [ValueSource(nameof(ProjectFiles))] string projectFile) { // Given StringWriter log = new StringWriter(); IProjectAnalyzer analyzer = GetProjectAnalyzer(projectFile, log); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When IAnalyzerResults results = analyzer.Build(options); // Then // If this is the multi-targeted project, use the net462 target IReadOnlyList <string> sourceFiles = results.Count == 1 ? results.First().SourceFiles : results["net462"].SourceFiles; sourceFiles.ShouldNotBeNull(log.ToString()); new[] { #if Is_Windows // Linux and Mac builds appear to omit the AssemblyAttributes.cs file "AssemblyAttributes", #endif "Class1", "AssemblyInfo" }.ShouldBeSubsetOf(sourceFiles.Select(x => Path.GetFileName(x).Split('.').TakeLast(2).First()), log.ToString()); }
public void GetsProjectGuidFromProject([ValueSource(nameof(Preferences))] EnvironmentPreference preference) { // Given const string projectFile = @"SdkNetCoreProject\SdkNetCoreProject.csproj"; IProjectAnalyzer analyzer = new AnalyzerManager() .GetProject(GetProjectPath(projectFile)); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When DeleteProjectDirectory(projectFile, "obj"); DeleteProjectDirectory(projectFile, "bin"); IAnalyzerResults results = analyzer.Build(options); // Then // The generated GUIDs are based on subpath, so they'll be different from Windows to Linux // They can also change between MSBuild versions, so this may need to be updated periodically #if Is_Windows results.First().ProjectGuid.ToString().ShouldBe("432bfde1-4768-5837-8e20-8bb49c9d4734"); #else results.First().ProjectGuid.ToString().ShouldBe("c9df4376-d954-5554-bd10-b9976b7afa9d"); #endif }
public void CompilesProject(EnvironmentPreference preference, string solutionPath, string projectPath) { // Given StringWriter log = new StringWriter(); AnalyzerManager manager = new AnalyzerManager(solutionPath, new AnalyzerManagerOptions { LogWriter = log }); ProjectAnalyzer analyzer = manager.GetProject(projectPath); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // Set some enviornment variables to make it seem like we're not in a CI build // Sometimes this messes up libraries like SourceLink since we're building as part of a test and not for CI options.EnvironmentVariables.Add("APPVEYOR", "False"); options.EnvironmentVariables.Add("ContinuousIntegrationBuild", null); options.EnvironmentVariables.Add("CI", "False"); options.EnvironmentVariables.Add("CI_LINUX", "False"); options.EnvironmentVariables.Add("CI_WINDOWS", "False"); // When DeleteProjectDirectory(analyzer.ProjectFile.Path, "obj"); DeleteProjectDirectory(analyzer.ProjectFile.Path, "bin"); analyzer.IgnoreFaultyImports = false; #pragma warning disable 0162 if (BinaryLog) { analyzer.AddBinaryLogger($@"E:\Temp\{Path.GetFileNameWithoutExtension(solutionPath)}.{Path.GetFileNameWithoutExtension(analyzer.ProjectFile.Path)}.core.binlog"); } #pragma warning restore 0162 #if Is_Windows AnalyzerResults results = analyzer.Build(options); #else // On non-Windows platforms we have to remove the .NET Framework target frameworks and only build .NET Core target frameworks // See https://github.com/dotnet/sdk/issues/826 string[] excludedTargetFrameworks = new[] { "net2", "net3", "net4", "portable" }; string[] targetFrameworks = analyzer.ProjectFile.TargetFrameworks.Where(x => !excludedTargetFrameworks.Any(y => x.StartsWith(y))).ToArray(); if (targetFrameworks.Length == 0) { Assert.Ignore(); } AnalyzerResults results = analyzer.Build(targetFrameworks, options); #endif // Then results.Count.ShouldBeGreaterThan(0, log.ToString()); results.OverallSuccess.ShouldBeTrue(log.ToString()); results.ShouldAllBe(x => x.Succeeded, log.ToString()); }
public void GetsProjectGuidFromSolution([ValueSource(nameof(Preferences))] EnvironmentPreference preference) { // Given AnalyzerManager manager = new AnalyzerManager( GetProjectPath("TestProjects.sln")); IProjectAnalyzer analyzer = manager.Projects.First(x => x.Key.EndsWith("SdkNetStandardProject.csproj")).Value; EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When DeleteProjectDirectory(analyzer.ProjectFile.Path, "obj"); DeleteProjectDirectory(analyzer.ProjectFile.Path, "bin"); IAnalyzerResults results = analyzer.Build(options); // Then results.First().ProjectGuid.ToString().ShouldBe("016713d9-b665-4272-9980-148801a9b88f"); }
public void GetsSourceFilesFromBinaryLog( [ValueSource(nameof(Preferences))] EnvironmentPreference preference, [ValueSource(nameof(ProjectFiles))] string projectFile) { // Given StringWriter log = new StringWriter(); IProjectAnalyzer analyzer = GetProjectAnalyzer(projectFile, log); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; string binLogPath = Path.ChangeExtension(Path.GetTempFileName(), ".binlog"); analyzer.AddBinaryLogger(binLogPath); try { // When analyzer.Build(options); IAnalyzerResults results = analyzer.Manager.Analyze(binLogPath); // Then // If this is the multi-targeted project, use the net462 target IReadOnlyList <string> sourceFiles = results.Count == 1 ? results.First().SourceFiles : results["net462"].SourceFiles; sourceFiles.ShouldNotBeNull(log.ToString()); new[] { #if Is_Windows // Linux and Mac builds appear to omit the AssemblyAttributes.cs file "AssemblyAttributes", #endif "Class1", "AssemblyInfo" }.ShouldBeSubsetOf(sourceFiles.Select(x => Path.GetFileName(x).Split('.').TakeLast(2).First()), log.ToString()); } finally { if (File.Exists(binLogPath)) { File.Delete(binLogPath); } } }
public void DesignTimeBuildsProject( [ValueSource(nameof(Preferences))] EnvironmentPreference preference, [ValueSource(nameof(ProjectFiles))] string projectFile) { // Given StringWriter log = new StringWriter(); ProjectAnalyzer analyzer = GetProjectAnalyzer(projectFile, log); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When DeleteProjectDirectory(projectFile, "obj"); DeleteProjectDirectory(projectFile, "bin"); AnalyzerResults results = analyzer.Build(options); // Then results.Count.ShouldBeGreaterThan(0, log.ToString()); results.ShouldAllBe(x => x.OverallSuccess, log.ToString()); }
public void BuildsProjectWithoutLogger([ValueSource(nameof(Preferences))] EnvironmentPreference preference) { // Given const string projectFile = @"SdkNetCore2Project\SdkNetCore2Project.csproj"; IProjectAnalyzer analyzer = new AnalyzerManager() .GetProject(GetProjectPath(projectFile)); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When DeleteProjectDirectory(projectFile, "obj"); DeleteProjectDirectory(projectFile, "bin"); IAnalyzerResults results = analyzer.Build(options); // Then results.Count.ShouldBeGreaterThan(0); results.OverallSuccess.ShouldBeTrue(); results.ShouldAllBe(x => x.Succeeded); }
public void GetsProjectGuidFromProject([ValueSource(nameof(Preferences))] EnvironmentPreference preference) { // Given const string projectFile = @"SdkNetCore2Project\SdkNetCore2Project.csproj"; IProjectAnalyzer analyzer = new AnalyzerManager() .GetProject(GetProjectPath(projectFile)); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When DeleteProjectDirectory(projectFile, "obj"); DeleteProjectDirectory(projectFile, "bin"); IAnalyzerResults results = analyzer.Build(options); // Then // The generated GUIDs are based on subpath and can also change between MSBuild versions, // so this may need to be updated periodically results.First().ProjectGuid.ToString().ShouldBe("1ff50b40-c27b-5cea-b265-29c5436a8a7b"); }
public void GetsSourceFilesFromBinaryLog( [ValueSource(nameof(Preferences))] EnvironmentPreference preference, [ValueSource(nameof(ProjectFiles))] string projectFile) { // Given StringWriter log = new StringWriter(); ProjectAnalyzer analyzer = GetProjectAnalyzer(projectFile, log); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; string binLogPath = Path.ChangeExtension(Path.GetTempFileName(), ".binlog"); analyzer.AddBinaryLogger(binLogPath); try { // When analyzer.Build(options); IReadOnlyList <string> sourceFiles = analyzer.Manager.Analyze(binLogPath).First().SourceFiles; // Then sourceFiles.ShouldNotBeNull(log.ToString()); new[] { "Class1", "AssemblyAttributes", "AssemblyInfo" }.ShouldBeSubsetOf(sourceFiles.Select(x => Path.GetFileName(x).Split('.').TakeLast(2).First()), log.ToString()); } finally { if (File.Exists(binLogPath)) { File.Delete(binLogPath); } } }
public void GetsReferences( [ValueSource(nameof(Preferences))] EnvironmentPreference preference, [ValueSource(nameof(ProjectFiles))] string projectFile) { // Given StringWriter log = new StringWriter(); ProjectAnalyzer analyzer = GetProjectAnalyzer(projectFile, log); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When IReadOnlyList <string> references = analyzer.Build(options).First().GetReferences(); // Then references.ShouldNotBeNull(log.ToString()); references.ShouldContain(x => x.EndsWith("mscorlib.dll"), log.ToString()); if (projectFile.Contains("PackageReference")) { references.ShouldContain(x => x.EndsWith("NodaTime.dll"), log.ToString()); } }
public void CompilesProject(EnvironmentPreference preference, string solutionPath, string projectPath) { // Given StringWriter log = new StringWriter(); AnalyzerManager manager = new AnalyzerManager(solutionPath, new AnalyzerManagerOptions { LogWriter = log, LoggerVerbosity = Verbosity }); ProjectAnalyzer analyzer = manager.GetProject(projectPath); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // Set some enviornment variables to make it seem like we're not in a CI build // Sometimes this messes up libraries like SourceLink since we're building as part of a test and not for CI options.EnvironmentVariables.Add("APPVEYOR", "False"); options.EnvironmentVariables.Add("ContinuousIntegrationBuild", null); options.EnvironmentVariables.Add("CI", "False"); options.EnvironmentVariables.Add("CI_LINUX", "False"); options.EnvironmentVariables.Add("CI_WINDOWS", "False"); // When DeleteProjectDirectory(analyzer.ProjectFile.Path, "obj"); DeleteProjectDirectory(analyzer.ProjectFile.Path, "bin"); analyzer.IgnoreFaultyImports = false; if (BinaryLog) { analyzer.AddBinaryLogger($@"E:\Temp\{Path.GetFileNameWithoutExtension(solutionPath)}.{Path.GetFileNameWithoutExtension(analyzer.ProjectFile.Path)}.core.binlog"); } AnalyzerResults results = analyzer.Build(options); // Then results.Count.ShouldBeGreaterThan(0, log.ToString()); results.ShouldAllBe(x => x.OverallSuccess, log.ToString()); }
public void GetsSourceFiles( [ValueSource(nameof(Preferences))] EnvironmentPreference preference, [ValueSource(nameof(ProjectFiles))] string projectFile) { // Given StringWriter log = new StringWriter(); ProjectAnalyzer analyzer = GetProjectAnalyzer(projectFile, log); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When IReadOnlyList <string> sourceFiles = analyzer.Build(options).First().GetSourceFiles(); // Then sourceFiles.ShouldNotBeNull(log.ToString()); sourceFiles.Select(x => Path.GetFileName(x).Split('.').TakeLast(2).First()).ShouldBe(new[] { "Class1", "AssemblyAttributes", "AssemblyInfo" }, true, log.ToString()); }
public void GetsProjectGuidFromProject([ValueSource(nameof(Preferences))] EnvironmentPreference preference) { // Given const string projectFile = @"SdkNetCoreProject\SdkNetCoreProject.csproj"; ProjectAnalyzer analyzer = new AnalyzerManager() .GetProject(GetProjectPath(projectFile)); EnvironmentOptions options = new EnvironmentOptions { Preference = preference }; // When DeleteProjectDirectory(projectFile, "obj"); DeleteProjectDirectory(projectFile, "bin"); AnalyzerResults results = analyzer.Build(options); // Then // The generated GUIDs are based on subpath, so they'll be different from Windows to Linux #if Is_Windows results.First().ProjectGuid.ToString().ShouldBe("646a532e-8943-5a4b-b106-e1341b4d3535"); #else results.First().ProjectGuid.ToString().ShouldBe("c9df4376-d954-5554-bd10-b9976b7afa9d"); #endif }