diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs index 1475f80d..a33c04e4 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/TreeNode.cs @@ -181,7 +181,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes nodePath = path; } - public TreeNode FindNodeByPath(string path, bool refreshChildren = false) + public TreeNode FindNodeByPath(string path, bool expandIfNeeded = false) { TreeNode nodeForPath = ObjectExplorerUtils.FindNode(this, node => { @@ -189,7 +189,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes }, nodeToFilter => { return path.StartsWith(nodeToFilter.GetNodePath()); - }, refreshChildren); + }, expandIfNeeded); return nodeForPath; } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerUtils.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerUtils.cs index 5c635f0f..cf3c658e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerUtils.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerUtils.cs @@ -49,7 +49,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer /// determines whether to stop going further up the tree /// Predicate function to filter the children when traversing /// A Tree Node that matches the condition - public static TreeNode FindNode(TreeNode node, Predicate condition, Predicate filter, bool refreshChildren = false) + public static TreeNode FindNode(TreeNode node, Predicate condition, Predicate filter, bool expandIfNeeded = false) { if(node == null) { @@ -60,12 +60,12 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer { return node; } - var children = refreshChildren && !node.IsAlwaysLeaf ? node.Refresh() : node.GetChildren(); + var children = expandIfNeeded && !node.IsAlwaysLeaf ? node.Expand() : node.GetChildren(); foreach (var child in children) { if (filter != null && filter(child)) { - TreeNode childNode = FindNode(child, condition, filter, refreshChildren); + TreeNode childNode = FindNode(child, condition, filter, expandIfNeeded); if (childNode != null) { return childNode; diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/ObjectExplorerServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/ObjectExplorerServiceTests.cs index d538c7c4..52f4ac07 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/ObjectExplorerServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/ObjectExplorerServiceTests.cs @@ -15,6 +15,7 @@ using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Contracts; using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes; using Microsoft.SqlTools.ServiceLayer.UnitTests.Utility; using Moq; +using Moq.Protected; using Xunit; using Microsoft.SqlTools.ServiceLayer.LanguageServices; using Microsoft.SqlServer.Management.Common; @@ -263,6 +264,21 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer Assert.Equal(0, foundNodes.Count); } + [Fact] + public void FindNodeCanExpandParentNodes() + { + var mockTreeNode = new Mock(); + object[] populateChildrenArguments = { ItExpr.Is(x => x == false), ItExpr.IsNull() }; + mockTreeNode.Protected().Setup("PopulateChildren", populateChildrenArguments); + mockTreeNode.Object.IsAlwaysLeaf = false; + + // If I try to find a child node of the mock tree node with the expand parameter set to true + ObjectExplorerUtils.FindNode(mockTreeNode.Object, node => false, node => false, true); + + // Then PopulateChildren gets called to expand the tree node + mockTreeNode.Protected().Verify("PopulateChildren", Times.Once(), populateChildrenArguments); + } + private async Task CreateSession() { SessionCreatedParameters sessionResult = null;