public void EmptyProject()
        {
            var assemblyToTest = TestAssembly.Create("EmptyProject.cs");
            var expected       = EmptyProjectMemberDocId();

            var filter           = new AlwaysTrueDependencyFilter();
            var dependencyFinder = new ReflectionMetadataDependencyFinder(filter, new SystemObjectFinder(filter));
            var progressReporter = Substitute.For <IProgressReporter>();

            var dependencies = dependencyFinder.FindDependencies(new[] { assemblyToTest }, progressReporter);

            var foundDocIds = dependencies
                              .Dependencies
                              .Select(o => Tuple.Create(o.Key.MemberDocId, o.Value.Count))
                              .OrderBy(o => o.Item1, StringComparer.Ordinal)
                              .ToList();

            var expectedOrdered = expected
                                  .OrderBy(o => o.Item1, StringComparer.Ordinal)
                                  .ToList();

            Assert.Equal(expectedOrdered.Count, foundDocIds.Count);

            foreach (var combined in expectedOrdered.Zip(foundDocIds, Tuple.Create))
            {
                var expectedItem = combined.Item1;
                var actualItem   = combined.Item2;

                Assert.Equal(expectedItem.Item1, actualItem.Item1);
                Assert.Equal(expectedItem.Item2, actualItem.Item2);
            }
        }
        private void TestForDocIdHelper(string source, string docid, bool allowUnsafe)
        {
            var filter           = new AlwaysTrueDependencyFilter();
            var dependencyFinder = new ReflectionMetadataDependencyFinder(filter, new SystemObjectFinder(filter));
            var assemblyToTest   = TestAssembly.Create(source, allowUnsafe);
            var progressReporter = Substitute.For <IProgressReporter>();

            var dependencies = dependencyFinder.FindDependencies(new[] { assemblyToTest }, progressReporter);

            foreach (var dependency in dependencies.Dependencies)
            {
                if (string.Equals(dependency.Key.MemberDocId, docid, StringComparison.Ordinal))
                {
                    return;
                }
            }

            _output.WriteLine("Found docids:");
            _output.WriteLine(string.Join(Environment.NewLine, dependencies.Dependencies.Select(o => o.Key.MemberDocId).OrderBy(o => o)));

            Assert.True(false, ((FormattableString)$"Could not find docid '{docid}'").ToString(CultureInfo.CurrentCulture));
        }
        public void UnresolvedAssemblyTest()
        {
            var filter         = new AlwaysTrueDependencyFilter();
            var finder         = new ReflectionMetadataDependencyFinder(filter, new SystemObjectFinder(filter));
            var progressReport = Substitute.For <IProgressReporter>();

            var path = this.GetType().GetTypeInfo().Assembly.Location;
            var referencedAssemblies = this.GetType().GetTypeInfo().Assembly.GetReferencedAssemblies()
                                       .Select(a => a.ToString())
                                       .OrderBy(a => a)
                                       .ToList();
            var testInfo = new FilePathAssemblyFile(path);

            var dependencies = finder.FindDependencies(new[] { testInfo }, progressReport);
            var actual       = dependencies.UnresolvedAssemblies
                               .Select(u => u.Key)
                               .OrderBy(u => u);

            _log.WriteLine("Actual unresolved assemblies:");
            foreach (var assembly in actual)
            {
                _log.WriteLine(assembly);
            }

            Assert.Equal(referencedAssemblies.Count(), actual.Count());

            // Use this instead of Assert.Equal so it will output the missing item
            foreach (var items in actual.Zip(referencedAssemblies, Tuple.Create))
            {
                Assert.Equal(items.Item1, items.Item2);
            }

            Assert.True(dependencies.UnresolvedAssemblies.All(o => o.Value.Count == 1));

            // Make sure no issues were found
            progressReport.Received(0).ReportIssue(Arg.Any <string>());
        }