Пример #1
0
        public void DependencyNodeId_GetHashCode(string firstIdString,
                                                 string secondIdString,
                                                 bool expectedResult)
        {
            var id1 = DependencyNodeId.FromString(firstIdString);
            var id2 = DependencyNodeId.FromString(secondIdString);

            Assert.Equal(id1.GetHashCode(), id2.GetHashCode());
        }
Пример #2
0
        public void DependencyNodeId_Equals(string firstIdString,
                                            string secondIdString,
                                            bool expectedResult)
        {
            var id1 = DependencyNodeId.FromString(firstIdString);
            var id2 = DependencyNodeId.FromString(secondIdString);

            Assert.Equal(expectedResult, id1.Equals(id2));
            Assert.Equal(expectedResult, id2.Equals(id1));
        }
Пример #3
0
        public void PackageDependencyNode_Constructor_WhenCaptionIsNullOrEmpty_ShouldThrow()
        {
            var id = DependencyNodeId.FromString("file:///[MyProviderType]");

            Assert.Throws <ArgumentNullException>("name", () => {
                new PackageDependencyNode(id, null, null, ProjectTreeFlags.Empty);
            });

            Assert.Throws <ArgumentNullException>("caption", () => {
                new PackageDependencyNode(id, "somename", null, ProjectTreeFlags.Empty);
            });
        }
Пример #4
0
        /// <summary>
        /// Checks if given node has children and adds corresponding IDependencyDescription to the node.
        /// </summary>
        private async Task CheckChildrenAsync(IGraphContext graphContext)
        {
            foreach (var inputGraphNode in graphContext.InputNodes)
            {
                if (graphContext.CancelToken.IsCancellationRequested)
                {
                    return;
                }

                // All graph nodes generated here will have this unique node id, root node will have it equal to null
                var nodeIdString = GetPartialValueFromGraphNodeId(inputGraphNode.Id, CodeGraphNodeIdName.File);
                var nodeId       = DependencyNodeId.FromString(nodeIdString);
                if (nodeId == null)
                {
                    continue;
                }

                var projectPath = GetPartialValueFromGraphNodeId(inputGraphNode.Id, CodeGraphNodeIdName.Assembly);
                if (string.IsNullOrEmpty(projectPath))
                {
                    continue;
                }

                var subTreeProvider = await GetSubTreeProviderAsync(graphContext,
                                                                    inputGraphNode,
                                                                    projectPath,
                                                                    nodeId).ConfigureAwait(false);

                if (subTreeProvider == null)
                {
                    continue;
                }

                IDependencyNode nodeInfo = subTreeProvider.GetDependencyNode(nodeId);
                if (nodeInfo == null)
                {
                    continue;
                }

                using (var scope = new GraphTransactionScope())
                {
                    inputGraphNode.SetValue(DependenciesGraphSchema.ProviderProperty, subTreeProvider);
                    inputGraphNode.SetValue(DependenciesGraphSchema.DependencyNodeProperty, nodeInfo);

                    if (nodeInfo.HasChildren)
                    {
                        inputGraphNode.SetValue(DgmlNodeProperties.ContainsChildren, true);
                    }

                    scope.Complete();
                }
            }
        }
Пример #5
0
        public void DependencyNode_Alias(string idString, string caption, string expectedAlias)
        {
            // Arrange
            var id = DependencyNodeId.FromString(idString);

            // Act
            var node = new DependencyNode(id, ProjectTreeFlags.Empty);

            node.Caption = caption;

            // Assert
            Assert.Equal(expectedAlias, node.Alias);
        }
Пример #6
0
        public void DependencyNode_Constructor_Caption(string idString, string expectedCaption)
        {
            // Arrange
            var id         = DependencyNodeId.FromString(idString);
            var properties = new Dictionary <string, string>().ToImmutableDictionary();
            var priority   = 2;

            // Act
            var node = new DependencyNode(id, ProjectTreeFlags.Empty, priority, properties);

            // Assert
            Assert.Equal(expectedCaption, node.Caption);
            Assert.Equal(priority, node.Priority);
            Assert.Equal(properties, node.Properties);
        }
Пример #7
0
        public void DependencyNode_Equals(string firstIdString,
                                          string secondIdString,
                                          bool expectedResult)
        {
            // Arrange
            var id1 = DependencyNodeId.FromString(firstIdString);
            var id2 = DependencyNodeId.FromString(secondIdString);

            // Act
            var node1 = new DependencyNode(id1, ProjectTreeFlags.Empty);
            var node2 = new DependencyNode(id2, ProjectTreeFlags.Empty);

            // Assert
            Assert.Equal(expectedResult, node1.Equals(node2));
            Assert.Equal(expectedResult, node2.Equals(node1));
        }
Пример #8
0
        public void DependencyNode_Constructor_FlagsAndResolved(bool resolved)
        {
            // Arrange
            var id = DependencyNodeId.FromString(
                "file:///[MyProviderType;MyItemSpec;MyItemType;MyUniqueToken]");
            var myFlags = ProjectTreeFlags.Create("CustomFlag");

            // Act
            var node = new DependencyNode(id, myFlags, resolved: resolved);

            // Assert
            var expectedFlags = resolved
                ? DependencyNode.GenericResolvedDependencyFlags.Union(myFlags)
                : DependencyNode.GenericUnresolvedDependencyFlags.Union(myFlags);

            Assert.True(node.Flags.Contains(expectedFlags));
            Assert.Equal(resolved, node.Resolved);
        }
Пример #9
0
        public void PackageDependencyNode_Constructor(bool resolved)
        {
            // Arrange
            var expectedIcon = resolved
                ? KnownMonikers.PackageReference
                : KnownMonikers.ReferenceWarning;

            var defaultFlags = (resolved
                ? DependencyNode.GenericResolvedDependencyFlags
                : DependencyNode.GenericUnresolvedDependencyFlags);

            var priority = resolved
                            ? DependencyNode.PackageNodePriority
                            : DependencyNode.UnresolvedReferenceNodePriority;

            var name    = "MyName";
            var caption = "MyCaption (xxx)";
            var id      = DependencyNodeId.FromString(
                "file:///[MyProviderType;c:\\MyItemSpec.dll;MyItemType;MyUniqueToken]");
            var properties = new Dictionary <string, string>().ToImmutableDictionary();
            var myFlags    = ProjectTreeFlags.Create("MyFlag");

            // Act
            var node = new PackageDependencyNode(id,
                                                 name,
                                                 caption,
                                                 myFlags,
                                                 properties,
                                                 resolved: resolved);

            // Assert
            Assert.Equal(expectedIcon, node.Icon);
            Assert.Equal(resolved, node.Resolved);
            Assert.Equal(priority, node.Priority);
            Assert.Equal(name, node.Name);
            Assert.Equal(caption, node.Caption);
            Assert.Equal(node.Alias, node.Caption);
            Assert.Equal(properties, node.Properties);
            Assert.Equal(node.Icon, node.ExpandedIcon);
            Assert.True(node.Flags.Contains(defaultFlags.Union(myFlags)));
        }
Пример #10
0
        public void DependencyNodeId_FromString(string input,
                                                string expectedProviderType,
                                                string expectedItemSpec,
                                                string expectedItemType,
                                                string expectedUniqueToken)

        {
            var id = DependencyNodeId.FromString(input);

            if (expectedProviderType == null)
            {
                // expect null id returned
                Assert.Null(id);
            }
            else
            {
                Assert.Equal(expectedProviderType, id.ProviderType);
                Assert.Equal(expectedItemSpec, id.ItemSpec);
                Assert.Equal(expectedItemType, id.ItemType);
                Assert.Equal(expectedUniqueToken, id.UniqueToken);
            }
        }
Пример #11
0
        public void DependencyNode_Children()
        {
            var id = DependencyNodeId.FromString(
                "file:///[MyProviderType;MyItemSpec;MyItemType;MyUniqueToken]");

            var node = new DependencyNode(id, ProjectTreeFlags.Empty);

            // check empty node
            Assert.False(node.HasChildren);

            // add new node
            var childId = DependencyNodeId.FromString(
                "file:///[MyProviderType;MyItemSpec2;MyItemType2;MyUniqueToken2]");
            var childNode = new DependencyNode(childId, ProjectTreeFlags.Empty);

            node.AddChild(childNode);
            Assert.True(node.HasChildren);

            // remove child node
            node.RemoveChild(childNode);
            Assert.False(node.HasChildren);
        }
Пример #12
0
        public void NuGetDependenciesSubTreeProvider_GetDependencyNode_VerifyAllNodeTypesAreCreated()
        {
            var provider = new TestableNuGetDependenciesSubTreeProvider();

            var snapshotJson = @"
{
    ""NodesCache"": [
        {
            ""Id"": {
                ""ProviderType"": ""NuGetDependency"",
                ""ItemSpec"": ""tfm1/Package1/1.0.0"",
                ""ItemType"": ""PackageReference""
            }
        }
    ],
    ""DependenciesWorld"": [
        {
            ""ItemSpec"": ""tfm1/Package2/1.0.0"",
            ""Properties"": {
                ""Name"": ""Package2"",
                ""Version"": ""1.0.0"",
                ""Type"": ""Package"",
                ""Path"": ""SomePath"",
                ""Resolved"": ""true"",
                ""Dependencies"": ""Package3/2.0.0;NotExistentPackage/2.0.0;Assembly1/1.0.0;FrameworkAssembly1/4.0.0;SomeUnknown/1.0.0;AnalyzerAssembly1/4.0.0""
            }
        },
        {
            ""ItemSpec"": ""tfm1/Package3/2.0.0"",
            ""Properties"": {
                ""Name"": ""Package3"",
                ""Version"": ""2.0.0"",
                ""Type"": ""Package"",
                ""Path"": ""SomePath"",
                ""Resolved"": ""true"",
                ""Dependencies"": """"
            }
        },
        {
            ""ItemSpec"": ""tfm1/Assembly1/1.0.0"",
            ""Properties"": {
                ""Name"": ""Assembly1"",
                ""Version"": ""1.0.0"",
                ""Type"": ""Assembly"",
                ""Path"": ""SomePath"",
                ""Resolved"": ""true"",
                ""Dependencies"": """"
            }
        },
        {
            ""ItemSpec"": ""tfm1/FrameworkAssembly1/4.0.0"",
            ""Properties"": {
                ""Name"": ""FrameworkAssembly1"",
                ""Version"": ""4.0.0"",
                ""Type"": ""FrameworkAssembly"",
                ""Path"": ""SomePath"",
                ""Resolved"": ""true"",
                ""Dependencies"": """"
            }
        },
        {
            ""ItemSpec"": ""tfm1/AnalyzerAssembly1/4.0.0"",
            ""Properties"": {
                ""Name"": ""AnalyzerAssembly1"",
                ""Version"": ""4.0.0"",
                ""Type"": ""AnalyzerAssembly"",
                ""Path"": ""SomePath"",
                ""Resolved"": ""true"",
                ""Dependencies"": """"
            }
        },
        {
            ""ItemSpec"": ""tfm1/SomeUnknown/1.0.0"",
            ""Properties"": {
                ""Name"": ""SomeUnknown"",
                ""Version"": ""1.0.0"",
                ""Type"": ""Xxxx"",
                ""Path"": ""SomePath"",
                ""Resolved"": ""true"",
                ""Dependencies"": """"
            }
        }
    ]
}";

            provider.LoadSnapshotFromJson(snapshotJson);

            var id         = DependencyNodeId.FromString(@"file:///[MyProviderType;tfm1/Package2/1.0.0]");
            var resultNode = provider.GetDependencyNode(id);

            Assert.NotNull(resultNode);
            Assert.Equal(5, resultNode.Children.Count);

            var childrenArray = resultNode.Children.ToArray();

            Assert.True(childrenArray[0] is PackageDependencyNode);
            Assert.Equal("Package3 (2.0.0)", childrenArray[0].Caption);
            Assert.False(string.IsNullOrEmpty(childrenArray[0].Id.UniqueToken));
            Assert.True(childrenArray[1] is PackageAssemblyDependencyNode);
            Assert.Equal("Assembly1", childrenArray[1].Caption);
            Assert.False(string.IsNullOrEmpty(childrenArray[1].Id.UniqueToken));
            Assert.True(childrenArray[2] is PackageUnknownDependencyNode);
            Assert.Equal("SomeUnknown", childrenArray[2].Caption);
            Assert.False(string.IsNullOrEmpty(childrenArray[2].Id.UniqueToken));
            // Analyzers
            Assert.Equal("AnalyzerAssembly1", childrenArray[3].Caption);
            Assert.True(childrenArray[3] is PackageAnalyzerAssemblyDependencyNode);
            // Framework assemblies
            Assert.True(childrenArray[4] is PackageFrameworkAssembliesDependencyNode);
            Assert.False(string.IsNullOrEmpty(childrenArray[4].Id.UniqueToken));
            Assert.True(childrenArray[4].Children.First() is PackageAssemblyDependencyNode);
            Assert.Equal("FrameworkAssembly1", childrenArray[4].Children.First().Caption);
            Assert.False(string.IsNullOrEmpty(childrenArray[4].Children.First().Id.UniqueToken));

            Assert.True(provider.GetCurrentSnapshotNodesCache().Contains(id.ItemSpec));
        }
Пример #13
0
        GetDependencyNodeInfoAsync(IGraphContext graphContext, GraphNode inputGraphNode, string projectPath)
        {
            IDependencyNode node = null;
            IProjectDependenciesSubTreeProvider subTreeProvider = null;

            // check if node is toplevel or lowerlevel hierarchy
            node = inputGraphNode.GetValue <IDependencyNode>(DependenciesGraphSchema.DependencyNodeProperty);
            if (node == null)
            {
                // this is a top level dependency node or unsupported node like some source file node
                var hierarchyItem = inputGraphNode.GetValue <IVsHierarchyItem>(HierarchyGraphNodeProperties.HierarchyItem);
                if (hierarchyItem == null)
                {
                    // unknown node
                    return(node, subTreeProvider);
                }

                // now check node file path if it is a DependencyNodeId
                var nodeFilePath = GetPartialValueFromGraphNodeId(inputGraphNode.Id, CodeGraphNodeIdName.File);
                var nodeId       = DependencyNodeId.FromString(nodeFilePath);
                if (nodeId == null)
                {
                    // check parent node - it will be a IProjectTree node which can have file path to be
                    // in our DependencyNodeId format. If it is a top level dependency, it's parent will
                    // be provider root node: Dependencies\NuGet\<top level dependency>. In this sample
                    // parent for <top level dependency> will be NuGet node, which will be not IProjectItemTree,
                    // but IProjecTree and thus has FilePath containing actual DependencyNodeId.
                    var parentFilePath = hierarchyItem.Parent.CanonicalName;
                    nodeId = DependencyNodeId.FromString(parentFilePath);
                }

                if (nodeId == null)
                {
                    // unknown node
                    return(node, subTreeProvider);
                }

                subTreeProvider = await GetSubTreeProviderAsync(graphContext,
                                                                inputGraphNode,
                                                                projectPath,
                                                                nodeId).ConfigureAwait(false);

                if (subTreeProvider == null)
                {
                    return(node, subTreeProvider);
                }

                // now get real DependencyNodeId - find the actual node in the provider's top
                // level node. Note: nodeId above we need only to get correct sub tree provider, but
                // it would not contain our top level node's ItemSpec, ItemType etc. We need to get it here.
                var caption = hierarchyItem.Text;
                node = subTreeProvider.RootNode.Children.Where(x => x.Caption.Equals(caption, StringComparison.OrdinalIgnoreCase))
                       .FirstOrDefault();
                if (node == null)
                {
                    // node is not ours or does node exist anymore
                    return(node, subTreeProvider);
                }
            }
            else
            {
                // this is lower level graph node that is created by this provider, just get it's subTreeProvider
                subTreeProvider = await GetSubTreeProviderAsync(graphContext,
                                                                inputGraphNode,
                                                                projectPath,
                                                                node.Id).ConfigureAwait(false);
            }

            return(node, subTreeProvider);
        }