Browse Source

add tests for IAssemblyModel.Namespaces

addin-manager-package-subdirectories
Siegfried Pammer 12 years ago
parent
commit
314110dc69
  1. 106
      src/Main/Base/Test/Dom/AssemblyModelNamespaceTests.cs
  2. 1
      src/Main/Base/Test/Dom/TopLevelTypeModelsTests.cs
  3. 1
      src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
  4. 2
      src/Main/SharpDevelop/Dom/NamespaceModel.cs
  5. 79
      src/Main/SharpDevelop/Dom/ProjectAssemblyModel.cs

106
src/Main/Base/Test/Dom/AssemblyModelNamespaceTests.cs

@ -0,0 +1,106 @@ @@ -0,0 +1,106 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
namespace ICSharpCode.SharpDevelop.Dom
{
[TestFixture]
public class AssemblyModelNamespaceTests : CSharpModelTestBase
{
[Test]
public void AddUnnamedNamespace()
{
var topLevelChangeEventArgs = ListenForChanges(assemblyModel.TopLevelTypeDefinitions);
var namespaceChangeEventArgs = ListenForChanges(assemblyModel.Namespaces);
AddCodeFile("test.cs", "class Test {}");
Assert.AreEqual(1, assemblyModel.TopLevelTypeDefinitions.Count);
Assert.AreEqual(1, assemblyModel.Namespaces.Count);
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single();
var unnamedNamespace = assemblyModel.Namespaces.Single();
Assert.IsNull(unnamedNamespace.ParentNamespace);
Assert.IsEmpty(unnamedNamespace.Name);
Assert.IsEmpty(topLevelChangeEventArgs.Single().OldItems);
Assert.IsEmpty(namespaceChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().NewItems);
Assert.AreEqual(new[] { unnamedNamespace }, namespaceChangeEventArgs.Single().NewItems);
}
[Test]
public void MoveFromUnnamedNamespaceToFirstLevel()
{
AddUnnamedNamespace();
MoveToNamespace("test.cs", "FirstLevel");
}
[Test]
public void MoveFromUnnamedNamespaceToSecondLevel()
{
AddUnnamedNamespace();
MoveToNamespace("test.cs", "FirstLevel.SecondLevel");
}
[Test]
public void MoveFromUnnamedNamespaceToThirdLevelSteps()
{
AddUnnamedNamespace();
MoveToNamespace("test.cs", "FirstLevel");
MoveToNamespace("test.cs", "FirstLevel.SecondLevel");
MoveToNamespace("test.cs", "FirstLevel.SecondLevel.ThirdLevel");
}
[Test]
public void MoveFromUnnamedNamespaceToSecondLevelAndOther()
{
AddUnnamedNamespace();
MoveToNamespace("test.cs", "FirstLevel.SecondLevel");
MoveToNamespace("test.cs", "FirstLevel.Nested");
}
void MoveToNamespace(string filename, string newNamespace)
{
var topLevelChangeEventArgs = ListenForChanges(assemblyModel.TopLevelTypeDefinitions);
var namespaceChangeEventArgs = ListenForChanges(assemblyModel.Namespaces);
var oldClass = assemblyModel.TopLevelTypeDefinitions.Single();
var oldNamespace = assemblyModel.Namespaces.Single();
UpdateCodeFile(filename, "namespace " + newNamespace + " { class Test {} }");
Assert.AreEqual(1, assemblyModel.TopLevelTypeDefinitions.Count);
Assert.AreEqual(1, assemblyModel.Namespaces.Count);
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single();
string[] parts = newNamespace.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries);
var simpleNamespace = assemblyModel.Namespaces.Single();
Assert.AreEqual(new[] {
simpleNamespace
}, namespaceChangeEventArgs.Single().NewItems);
Assert.AreEqual(new[] {
oldNamespace
}, namespaceChangeEventArgs.Single().OldItems);
Assert.AreEqual(newNamespace, simpleNamespace.FullName);
for (int i = parts.Length - 1; i <= 0; i++) {
Assert.IsNotNull(simpleNamespace.ParentNamespace);
Assert.AreEqual(parts[i], simpleNamespace.Name);
if (i == 0) {
Assert.IsEmpty(simpleNamespace.ParentNamespace.Name);
Assert.IsNull(simpleNamespace.ParentNamespace.ParentNamespace);
} else {
Assert.AreEqual(new[] { simpleNamespace }, simpleNamespace.ParentNamespace.ChildNamespaces);
}
}
Assert.AreEqual(new[] {
oldClass
}, topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] {
simpleClass
}, topLevelChangeEventArgs.Single().NewItems);
}
}
}

1
src/Main/Base/Test/Dom/TopLevelTypeModelsTests.cs

@ -30,6 +30,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -30,6 +30,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public void EmptyProject()
{
Assert.AreEqual(0, assemblyModel.TopLevelTypeDefinitions.Count);
Assert.AreEqual(0, assemblyModel.Namespaces.Count);
Assert.IsNull(assemblyModel.TopLevelTypeDefinitions[new TopLevelTypeName("MissingClass")]);
}

1
src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj

@ -82,6 +82,7 @@ @@ -82,6 +82,7 @@
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="CodeConverterTests.cs" />
<Compile Include="Dom\AssemblyModelNamespaceTests.cs" />
<Compile Include="Dom\CSharpModelTestBase.cs" />
<Compile Include="Dom\ProjectEntityModelContextTests.cs" />
<Compile Include="Dom\TopLevelTypeModelsTests.cs" />

2
src/Main/SharpDevelop/Dom/NamespaceModel.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -34,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Dom
get {
if (parent == null || string.IsNullOrEmpty(parent.name))
return name;
return parent.name + "." + name;
return parent.FullName + "." + name;
}
}

79
src/Main/SharpDevelop/Dom/ProjectAssemblyModel.cs

@ -60,41 +60,58 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -60,41 +60,58 @@ namespace ICSharpCode.SharpDevelop.Dom
void TypeDeclarationsCollectionChanged(IReadOnlyCollection<ITypeDefinitionModel> removedItems, IReadOnlyCollection<ITypeDefinitionModel> addedItems)
{
NamespaceModel ns;
foreach (ITypeDefinitionModel addedItem in addedItems) {
if (!namespaces.TryGetValue(addedItem.Namespace, out ns)) {
string[] parts = addedItem.Namespace.Split('.');
int level = 0;
ns = rootNamespace;
while (level < parts.Length) {
var nextNS = ns.ChildNamespaces
.FirstOrDefault(n => n.Name == parts[level]);
if (nextNS == null) break;
ns = nextNS;
level++;
List<IDisposable> batchList = new List<IDisposable>();
try {
NamespaceModel ns;
foreach (ITypeDefinitionModel addedItem in addedItems) {
if (!namespaces.TryGetValue(addedItem.Namespace, out ns)) {
string[] parts = addedItem.Namespace.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries);
int level = 0;
ns = rootNamespace;
while (level < parts.Length) {
var nextNS = ns.ChildNamespaces
.FirstOrDefault(n => n.Name == parts[level]);
if (nextNS == null) break;
ns = nextNS;
level++;
}
while (level < parts.Length) {
var child = new NamespaceModel(context, ns, parts[level]);
batchList.AddIfNotNull(ns.ChildNamespaces.BatchUpdate());
ns.ChildNamespaces.Add(child);
ns = child;
level++;
}
if (!namespaces.Contains(ns)) {
batchList.AddIfNotNull(namespaces.BatchUpdate());
namespaces.Add(ns);
}
batchList.AddIfNotNull(ns.Types.BatchUpdate());
ns.Types.Add(addedItem);
}
while (level < parts.Length) {
var child = new NamespaceModel(context, ns, parts[level]);
ns.ChildNamespaces.Add(child);
ns = child;
level++;
}
if (!namespaces.Contains(ns))
namespaces.Add(ns);
ns.Types.Add(addedItem);
}
}
foreach (ITypeDefinitionModel removedItem in removedItems) {
if (namespaces.TryGetValue(removedItem.Namespace, out ns)) {
ns.Types.Remove(removedItem);
if (ns.Types.Count == 0)
namespaces.Remove(ns);
while (ns.ParentNamespace != null) {
if (ns.ChildNamespaces.Count == 0 && ns.Types.Count == 0)
((NamespaceModel)ns.ParentNamespace).ChildNamespaces.Remove(ns);
ns = (NamespaceModel)ns.ParentNamespace;
foreach (ITypeDefinitionModel removedItem in removedItems) {
if (namespaces.TryGetValue(removedItem.Namespace, out ns)) {
batchList.AddIfNotNull(ns.Types.BatchUpdate());
ns.Types.Remove(removedItem);
if (ns.Types.Count == 0) {
batchList.AddIfNotNull(namespaces.BatchUpdate());
namespaces.Remove(ns);
}
while (ns.ParentNamespace != null) {
var p = ((NamespaceModel)ns.ParentNamespace);
if (ns.ChildNamespaces.Count == 0 && ns.Types.Count == 0) {
batchList.AddIfNotNull(p.ChildNamespaces.BatchUpdate());
p.ChildNamespaces.Remove(ns);
}
ns = p;
}
}
}
} finally {
batchList.Reverse();
foreach (IDisposable d in batchList)
d.Dispose();
}
}
}

Loading…
Cancel
Save