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()); }
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)); }
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); }); }
/// <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(); } } }
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); }
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); }
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)); }
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); }
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))); }
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); } }
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); }
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)); }
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); }