public ConsoleApiPort(ApiPortClient apiPortClient, ITargetMapper targetMapper, IApiPortOptions options, DocIdSearchRepl repl) { _apiPortClient = apiPortClient; _targetMapper = targetMapper; _options = options; _repl = repl; }
private static async Task AnalyzeAssembliesAsync(ApiPortClient apiPort, ICommandLineOptions options, IProgressReporter progressReport, IFileWriter writer) { foreach (var errorInput in options.InvalidInputFiles) { progressReport.ReportIssue(string.Format(Microsoft.Fx.Portability.Resources.LocalizedStrings.InvalidFileName, errorInput)); } var results = await apiPort.GetAnalysisReportAsync(options); var outputPaths = new List <string>(); foreach (var resultAndFormat in results.Zip(options.OutputFormats, (r, f) => new { Result = r, Format = f })) { var outputPath = await CreateReport(resultAndFormat.Result, apiPort, options.OutputFileName, resultAndFormat.Format, progressReport, writer); outputPaths.Add(outputPath); } Console.WriteLine(); Console.WriteLine(LocalizedStrings.OutputWrittenTo); foreach (var outputPath in outputPaths) { Console.WriteLine(outputPath); } }
public async Task ListTargetsTest() { var targets = new List <AvailableTarget> { new AvailableTarget { Name = "Target1" }, new AvailableTarget { Name = "Target2" } }; var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); var apiPortService = Substitute.For <IApiPortService>(); apiPortService.GetTargetsAsync().Returns(CreateResponse <IEnumerable <AvailableTarget> >(targets.AsReadOnly())); var client = new ApiPortClient(apiPortService, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var actualTargets = await client.GetTargetsAsync(); Assert.Equal <AvailableTarget[]>(actualTargets.OrderBy(k => k.Name).ToArray(), targets.OrderBy(k => k.Name).ToArray()); }
public async Task AnalyzeTest() { var dependencyResult = Enumerable.Range(0, 10).ToDictionary( o => new MemberInfo { MemberDocId = "type" + o }, o => Enumerable.Range(0, o).Select(count => new AssemblyInfo { AssemblyIdentity = "dependency" + count }).ToList() as ICollection <AssemblyInfo>); var expectedResult = Enumerable.Range(0, 10).Select(o => Tuple.Create("type" + o, o)).ToList(); var apiPortService = Substitute.For <IApiPortService>(); apiPortService.SendAnalysisAsync(Arg.Any <AnalyzeRequest>()).Returns(r => { var a = r.Arg <AnalyzeRequest>(); var foundDocIds = a.Dependencies.Select(o => Tuple.Create(o.Key.MemberDocId, o.Value.Count)).ToList(); Assert.Equal <IEnumerable <Tuple <string, int> > >(expectedResult.OrderBy(k => k.Item1), foundDocIds.OrderBy(k => k.Item1)); return(CreateResponse(new AnalyzeResponse())); }); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var reportGenerator = Substitute.For <IReportGenerator>(); var writer = Substitute.For <IFileWriter>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); dependencyFinder.FindDependencies(Arg.Any <IEnumerable <FileInfo> >(), Arg.Any <IProgressReporter>()).Returns(r => { var list = r.Arg <IEnumerable <FileInfo> >(); var shared = r.Arg <IProgressReporter>(); var dependencies = Substitute.For <IDependencyInfo>(); dependencies.Dependencies.Returns(dependencyResult); dependencies.UnresolvedAssemblies.Returns(new Dictionary <string, ICollection <string> >()); dependencies.UserAssemblies.Returns(Enumerable.Empty <AssemblyInfo>()); dependencies.AssembliesWithErrors.Returns(Enumerable.Empty <string>()); return(dependencies); }); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var client = new ApiPortClient(apiPortService, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); options.Targets.Returns(Enumerable.Empty <string>()); options.InputAssemblies.Returns(Enumerable.Empty <FileInfo>()); var result = await client.AnalyzeAssembliesAsync(options); }
public ApiPortVsAnalyzer( ApiPortClient client, OptionsViewModel optionsViewModel, OutputWindowWriter outputWindow, IReportViewer viewer, IProgressReporter reporter) { _client = client; _optionsViewModel = optionsViewModel; _outputWindow = outputWindow; _viewer = viewer; _reporter = reporter; }
public ApiPortVsAnalyzer( ApiPortClient client, OptionsViewModel optionsViewModel, IOutputWindowWriter outputWindow, IReportViewer viewer, IProgressReporter reporter, IVSThreadingService threadingService) { _client = client; _optionsViewModel = optionsViewModel; _outputWindow = outputWindow; _viewer = viewer; _reporter = reporter; _threadingService = threadingService; }
private static async Task ListOutputFormats(ApiPortClient apiPortClient) { var outputFormats = await apiPortClient.ListResultFormatsAsync(); if (outputFormats.Any()) { Console.WriteLine(); Console.WriteLine(LocalizedStrings.AvailableOutputFormats); foreach (var outputFormat in outputFormats) { Console.WriteLine(string.Format(LocalizedStrings.TargetsListNoVersion, outputFormat)); } } }
private static async Task ListTargets(ApiPortClient apiPortClient, ITargetMapper targetMapper) { const string SelectedMarker = "*"; var targets = await apiPortClient.ListTargets(); if (targets.Any()) { Console.WriteLine(); Console.WriteLine(LocalizedStrings.AvailableTargets); var expandableTargets = targets.Where(target => target.ExpandedTargets.Any()); var groupedTargets = targets.Where(target => !target.ExpandedTargets.Any()).GroupBy(target => target.Name); foreach (var item in groupedTargets) { Console.WriteLine(LocalizedStrings.TargetsList, item.Key, String.Join(LocalizedStrings.VersionListJoin, item.Select(v => v.Version.ToString() + (v.IsSet ? SelectedMarker : String.Empty)))); } if (expandableTargets.Any()) { Console.WriteLine(); Console.WriteLine(Microsoft.Fx.Portability.Resources.LocalizedStrings.AvailableGroupedTargets); foreach (var item in expandableTargets) { Console.WriteLine(LocalizedStrings.TargetsListGrouped, item.Name, String.Join(CultureInfo.CurrentCulture.TextInfo.ListSeparator + " ", item.ExpandedTargets)); } } } if (targetMapper.Aliases.Any()) { Console.WriteLine(); Console.WriteLine(LocalizedStrings.AvailableAliases); foreach (var alias in targetMapper.Aliases) { Console.WriteLine(LocalizedStrings.TargetsListNoVersion, alias); } } Console.WriteLine(); Console.WriteLine(LocalizedStrings.NotesOnUsage); Console.WriteLine(LocalizedStrings.TargetsListNoVersion, Microsoft.Fx.Portability.Resources.LocalizedStrings.HowToSpecifyVersion); Console.WriteLine(); Console.WriteLine(LocalizedStrings.TargetsListNoVersion, LocalizedStrings.WhatAsteriskMeans); }
private static async Task UserAssemblyTestsAsync(IEnumerable <AssemblyInfo> assemblies) { var service = Substitute.For <IApiPortService>(); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); service.SendAnalysisAsync(Arg.Any <AnalyzeRequest>(), Arg.Any <IEnumerable <string> >()).Returns( ServiceResponse.Create(Enumerable.Empty <ReportingResultWithFormat>())); var client = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); IAssemblyFile CreateAssemblyFile(AssemblyInfo assemblyInfo) { var file = Substitute.For <IAssemblyFile>(); file.Name.Returns(assemblyInfo.AssemblyIdentity); file.Version.Returns(assemblyInfo.FileVersion); file.Exists.Returns(true); return(file); } var assemblyFiles = assemblies.Where(a => a.IsExplicitlySpecified).ToImmutableDictionary(CreateAssemblyFile, _ => false); options.InputAssemblies.Returns(assemblyFiles); var info = Substitute.For <IDependencyInfo>(); info.UserAssemblies.Returns(assemblies); dependencyFinder.FindDependencies(Arg.Any <IEnumerable <IAssemblyFile> >(), progressReporter) .Returns(info); await client.WriteAnalysisReportsAsync(options); Assert.All(assemblies, a => { var expected = assemblies.First(t => string.Equals(t.Location, a.Location, StringComparison.OrdinalIgnoreCase)).IsExplicitlySpecified; Assert.Equal(expected, a.IsExplicitlySpecified); }); }
public static async Task AnalyzeAssemblies_DoesNotThrowsOnInvalidOptions_TargetCount() { var service = Substitute.For <IApiPortService>(); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); var client = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); options.Targets.Returns(Enumerable.Range(0, 16).Select(x => x.ToString(CultureInfo.CurrentCulture))); options.OutputFormats.Returns(new[] { "HTML" }); var item = await client.AnalyzeAssembliesAsync(options); }
public async Task WriteAnalysisReports_ThrowsOnInvalidOptions_TargetCount() { var service = Substitute.For <IApiPortService>(); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); var client = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); options.Targets.Returns(Enumerable.Range(0, 16).Select(x => x.ToString())); options.OutputFormats.Returns(new[] { "HTML", "Excel" }); await Assert.ThrowsAsync <InvalidApiPortOptionsException>(() => client.WriteAnalysisReportsAsync(options)); await Assert.ThrowsAsync <InvalidApiPortOptionsException>(() => client.WriteAnalysisReportsAsync(options, true)); }
private static async Task <string> CreateReport(byte[] result, ApiPortClient apiPort, string suppliedOutputFileName, string outputFormat, IProgressReporter progressReport, IFileWriter writer) { var filePath = Path.GetFullPath(suppliedOutputFileName); var outputDirectory = Path.GetDirectoryName(filePath); var outputFileName = Path.GetFileName(filePath); using (var progressTask = progressReport.StartTask(LocalizedStrings.WritingReport)) { try { var extension = await apiPort.GetExtensionForFormat(outputFormat); return(await writer.WriteReportAsync(result, extension, outputDirectory, outputFileName, overwrite : false)); } catch (Exception) { progressTask.Abort(); throw; } } }
public void OptionsViewModel_TargetCount_Excel() { var service = Substitute.For <IApiPortService>(); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); var client = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); var resultFormats = Enumerable.Range(0, 5) .Select(x => new SelectedResultFormat { DisplayName = Invariant($"{nameof(SelectedResultFormat.DisplayName)} {x}"), FileExtension = Invariant($".{x}"), MimeType = Invariant($"type-{x}") }) .ToList(); var platforms = Enumerable.Range(0, 20).Select(platform => { var name = Invariant($"Platform {platform}"); var versions = Enumerable.Range(1, 5) .Select(version => new TargetPlatformVersion { PlatformName = name, Version = new Version(version, 0) }) .ToList(); return(new TargetPlatform { Name = name, Versions = versions }); }).ToList(); // Select the Excel format and another one. resultFormats.Add(new SelectedResultFormat { DisplayName = "Excel", IsSelected = true, FileExtension = ".xlsx", MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); resultFormats.First().IsSelected = true; var model = new OptionsModel { Formats = resultFormats, Platforms = platforms, OutputDirectory = Path.GetTempPath() }; using (var viewModel = new OptionsViewModel(service, targetMapper, model)) { var allPlatforms = platforms.SelectMany(x => x.Versions).ToArray(); int count = 1; while (count < (ApiPortClient.MaxNumberOfTargets + 2)) { allPlatforms[count].IsSelected = true; if (count > ApiPortClient.MaxNumberOfTargets) { Assert.True(viewModel.HasError); Assert.True(!string.IsNullOrEmpty(viewModel.ErrorMessage), "There should be an error message set after too many targets selected and the Excel format is selected."); } else { Assert.False(viewModel.HasError); Assert.True(string.IsNullOrEmpty(viewModel.ErrorMessage)); } count++; } } }
public void OptionsViewModel_TargetCount_WhenSelectedAndNot() { var service = Substitute.For <IApiPortService>(); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); var client = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); var platforms = Enumerable.Range(0, 20).Select(platform => { var name = Invariant($"Platform {platform}"); var versions = Enumerable.Range(1, 5) .Select(version => new TargetPlatformVersion { PlatformName = name, Version = new Version(version, 0), IsSelected = true }) .ToList(); return(new TargetPlatform { Name = name, Versions = versions }); }).ToList(); var excel = new SelectedResultFormat { DisplayName = "Excel", IsSelected = true, FileExtension = ".xlsx", MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }; var resultFormats = Enumerable.Range(0, 5) .Select(x => new SelectedResultFormat { DisplayName = Invariant($"{nameof(SelectedResultFormat.DisplayName)} {x}"), FileExtension = Invariant($".{x}"), MimeType = Invariant($"type-{x}") }) .ToList(); // Select the Excel format and another one. resultFormats.Add(excel); foreach (var format in resultFormats.Take(3)) { format.IsSelected = true; } var model = new OptionsModel { Formats = resultFormats, Platforms = platforms, OutputDirectory = Path.GetTempPath() }; using (var viewModel = new OptionsViewModel(service, targetMapper, model)) { // Check that when we select > MaxTargets and Excel is selected, it is in an error state. Assert.True(viewModel.HasError); Assert.True(!string.IsNullOrEmpty(viewModel.ErrorMessage)); // Uncheck the excel format excel.IsSelected = false; // Assert that the viewModel no longer has an error. Assert.False(viewModel.HasError); Assert.True(string.IsNullOrEmpty(viewModel.ErrorMessage)); } }
public void OptionsViewModel_TargetCount_NoExcel() { var service = Substitute.For <IApiPortService>(); var progressReporter = Substitute.For <IProgressReporter>(); var targetMapper = Substitute.For <ITargetMapper>(); var dependencyFinder = Substitute.For <IDependencyFinder>(); var reportGenerator = Substitute.For <IReportGenerator>(); var ignoreAssemblyInfoList = Substitute.For <IEnumerable <IgnoreAssemblyInfo> >(); var writer = Substitute.For <IFileWriter>(); var client = new ApiPortClient(service, progressReporter, targetMapper, dependencyFinder, reportGenerator, ignoreAssemblyInfoList, writer); var options = Substitute.For <IApiPortOptions>(); var resultFormats = Enumerable.Range(0, 5) .Select(x => new SelectedResultFormat { DisplayName = Invariant($"{nameof(SelectedResultFormat.DisplayName)} {x}"), FileExtension = Invariant($".{x}"), MimeType = Invariant($"type-{x}") }) .ToList(); var platforms = Enumerable.Range(0, 20).Select(platform => { var name = Invariant($"Platform {platform}"); var versions = Enumerable.Range(1, 5) .Select(version => new TargetPlatformVersion { PlatformName = name, Version = new Version(version, 0) }) .ToList(); return(new TargetPlatform { Name = name, Versions = versions }); }).ToList(); // Select the Excel format and another one. foreach (var format in resultFormats.Take(3)) { format.IsSelected = true; } var model = new OptionsModel { Formats = resultFormats, Platforms = platforms, OutputDirectory = Path.GetTempPath() }; using (var viewModel = new OptionsViewModel(service, targetMapper, model)) { var allPlatforms = platforms.SelectMany(x => x.Versions).ToArray(); int count = 1; while (count < (ApiPortClient.MaxNumberOfTargets + 2)) { allPlatforms[count].IsSelected = true; Assert.False(viewModel.HasError); Assert.True(string.IsNullOrEmpty(viewModel.ErrorMessage)); count++; } } }
public ConsoleApiPort(ApiPortClient apiPortClient, ITargetMapper targetMapper, IApiPortOptions options) { _apiPortClient = apiPortClient; _targetMapper = targetMapper; _options = options; }