static TestCollection FindNamespace(TestCollection collection, string parentNamespace, string @namespace) { if (parentNamespace == @namespace) { return(collection); } foreach (var node in collection.OfType <TestNamespace>()) { if (@namespace == node.NamespaceName) { return(node.NestedTests); } if (@namespace.StartsWith(node.NamespaceName + ".", StringComparison.Ordinal)) { return(FindNamespace(node.NestedTests, node.NamespaceName, @namespace)); } } return(null); }
TestCollection FindOrCreateNamespace(TestCollection collection, string parentNamespace, string @namespace) { if (parentNamespace == @namespace) { return(collection); } foreach (var node in collection.OfType <TestNamespace>()) { if (@namespace == node.NamespaceName) { return(node.NestedTests); } if (@namespace.StartsWith(node.NamespaceName + ".", StringComparison.Ordinal)) { return(FindOrCreateNamespace(node.NestedTests, node.NamespaceName, @namespace)); } } // Create missing namespace node: // Figure out which part of the namespace we can remove due to the parent namespace: int startPos = 0; if (@namespace.StartsWith(parentNamespace + ".", StringComparison.Ordinal)) { startPos = parentNamespace.Length + 1; } // Get the next dot int dotPos = @namespace.IndexOf('.', startPos); if (dotPos < 0) { var newNode = new TestNamespace(this, @namespace); collection.Add(newNode); return(newNode.NestedTests); } else { var newNode = new TestNamespace(this, @namespace.Substring(0, dotPos)); collection.Add(newNode); return(FindOrCreateNamespace(newNode.NestedTests, newNode.NamespaceName, @namespace)); } }
/// <summary> /// Removes the target namespace and all parent namespaces that are empty after the removal. /// </summary> static void RemoveTestNamespace(TestCollection collection, string parentNamespace, string @namespace) { if (parentNamespace == @namespace) { return; } foreach (var node in collection.OfType <TestNamespace>()) { if (@namespace == node.NamespaceName) { collection.Remove(node); return; } if (@namespace.StartsWith(node.NamespaceName + ".", StringComparison.Ordinal)) { RemoveTestNamespace(node.NestedTests, node.NamespaceName, @namespace); if (node.NestedTests.Count == 0) { collection.Remove(node); } return; } } }