Browse Source

EnvDTE.CodeModel: re-enable a few unit tests

pull/45/merge
Daniel Grunwald 13 years ago
parent
commit
012ab9129f
  1. 9
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  2. 188
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeAttribute2Tests.cs
  3. 233
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeClass2Tests.cs
  4. 34
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTestBase.cs
  5. 8
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  6. 96
      src/Main/Base/Test/Dom/CSharpModelTestBase.cs
  7. 136
      src/Main/Base/Test/Dom/TopLevelTypeModelsTests.cs
  8. 3
      src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj

9
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -90,6 +90,7 @@ @@ -90,6 +90,7 @@
<Compile Include="Src\EnvDTE\CodeFunctionTests.cs" />
<Compile Include="Src\EnvDTE\CodeImportTests.cs" />
<Compile Include="Src\EnvDTE\CodeInterfaceTests.cs" />
<Compile Include="Src\EnvDTE\CodeModelTestBase.cs" />
<Compile Include="Src\EnvDTE\CodeModelTests.cs">
<DependentUpon>CodeTypeTests.cs</DependentUpon>
</Compile>
@ -341,6 +342,10 @@ @@ -341,6 +342,10 @@
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>
<Name>ICSharpCode.AvalonEdit</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory.CSharp\ICSharpCode.NRefactory.CSharp.csproj">
<Project>{53DCA265-3C3C-42F9-B647-F72BA678122B}</Project>
<Name>ICSharpCode.NRefactory.CSharp</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>
@ -349,6 +354,10 @@ @@ -349,6 +354,10 @@
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Test\ICSharpCode.SharpDevelop.Tests.csproj">
<Project>{4980B743-B32F-4ABA-AABD-45E2CAD3568D}</Project>
<Name>ICSharpCode.SharpDevelop.Tests</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>

188
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeAttribute2Tests.cs

@ -1,94 +1,96 @@ @@ -1,94 +1,96 @@
//// 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.Linq;
//using ICSharpCode.PackageManagement.EnvDTE;
//using NUnit.Framework;
//using PackageManagement.Tests.Helpers;
//
//namespace PackageManagement.Tests.EnvDTE
//{
// [TestFixture]
// public class CodeAttribute2Tests
// {
// CodeAttribute2 codeAttribute;
// AttributeHelper helper;
//
// void CreateAttribute()
// {
// codeAttribute = new CodeAttribute2(helper.Attribute);
// }
//
// void CreateMSBuildAttribute(string fullName)
// {
// CreateMSBuildAttribute(fullName, fullName);
// }
//
// void CreateMSBuildAttribute(string fullName, string shortName)
// {
// helper = new AttributeHelper();
// helper.CreateAttribute(fullName, shortName);
// }
//
// [Test]
// public void FullName_AttributeIsDataAnnotationsDisplayColumnAttribute_ReturnsDisplayColumnAttributeFullyQualifiedName()
// {
// CreateMSBuildAttribute("System.ComponentModel.DataAnnotations.DisplayColumnAttribute");
// CreateAttribute();
//
// string name = codeAttribute.FullName;
//
// Assert.AreEqual("System.ComponentModel.DataAnnotations.DisplayColumnAttribute", name);
// }
//
// [Test]
// public void Name_AttributeIsDataAnnotationsDisplayColumnAttribute_ReturnsShortDisplayColumnAttributeNameWithoutTheAttributePart()
// {
// CreateMSBuildAttribute("System.ComponentModel.DataAnnotations.DisplayColumnAttribute", "DisplayColumnAttribute");
// CreateAttribute();
//
// string name = codeAttribute.Name;
//
// Assert.AreEqual("DisplayColumn", name);
// }
//
// [Test]
// public void Value_AttributeHasOneStringPositionalArgument_ReturnsStringInQuotes()
// {
// CreateMSBuildAttribute("Test.MyAttribute");
// helper.AddPositionalArguments("StringValue");
// CreateAttribute();
//
// string attributeValue = codeAttribute.Value;
//
// Assert.AreEqual("\"StringValue\"", attributeValue);
// }
//
// [Test]
// public void Value_AttributeHasOneBooleanPositionalArgument_ReturnsBooleanValue()
// {
// CreateMSBuildAttribute("Test.MyAttribute");
// helper.AddPositionalArguments(true);
// CreateAttribute();
//
// string attributeValue = codeAttribute.Value;
//
// Assert.AreEqual("True", attributeValue);
// }
//
// [Test]
// public void Value_AttributeHasStringAndBooleanPositionalArgument_ReturnsArgumentCommandSeparated()
// {
// CreateMSBuildAttribute("Test.MyAttribute");
// helper.AddPositionalArguments("Test", true);
// CreateAttribute();
//
// string attributeValue = codeAttribute.Value;
//
// Assert.AreEqual("\"Test\", True", attributeValue);
// }
//
// 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.Linq;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.PackageManagement.EnvDTE;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class CodeAttribute2Tests : CodeModelTestBase
{
CodeAttribute2 codeAttribute;
public override void SetUp()
{
base.SetUp();
AddCodeFile("myAttribute.cs", @"using System;
namespace Test {
public class MyAttribute : Attribute
{
public MyAttribute(object arg) {}
public MyAttribute(object arg1, object arg2) {}
public object One, Two;
}
}");
}
void CreateAttribute(string code)
{
AddCodeFile("attr.cs", code + " class ClassWithAttribute {}");
var compilation = projectContent.CreateCompilation();
var testClass = compilation.FindType(new FullTypeName("ClassWithAttribute")).GetDefinition();
var attribute = testClass.Attributes.Single();
codeAttribute = new CodeAttribute2(codeModelContext, attribute);
}
[Test]
public void FullName_AttributeWithFullName_ReturnsFullName()
{
CreateAttribute("[System.FlagsAttribute]");
string name = codeAttribute.FullName;
Assert.AreEqual("System.FlagsAttribute", name);
}
[Test]
public void Name_AttributeWithFullName_ReturnsShortName()
{
CreateAttribute("[System.FlagsAttribute]");
string name = codeAttribute.Name;
Assert.AreEqual("Flags", name);
}
[Test]
public void Value_AttributeHasOneStringPositionalArgument_ReturnsStringInQuotes()
{
CreateAttribute("[Test.MyAttribute(\"StringValue\")]");
string attributeValue = codeAttribute.Value;
Assert.AreEqual("\"StringValue\"", attributeValue);
}
[Test]
[Ignore("Why is true expected to be uppercase?")]
public void Value_AttributeHasOneBooleanPositionalArgument_ReturnsBooleanValue()
{
CreateAttribute("[Test.MyAttribute(true)]");
string attributeValue = codeAttribute.Value;
Assert.AreEqual("True", attributeValue);
}
[Test]
[Ignore("Why is true expected to be uppercase?")]
public void Value_AttributeHasStringAndBooleanPositionalArgument_ReturnsArgumentCommandSeparated()
{
CreateAttribute("[Test.MyAttribute(\"Test\", true)]");
string attributeValue = codeAttribute.Value;
Assert.AreEqual("\"Test\", true", attributeValue);
}
// [Test]
// public void Arguments_AttributeHasOneStringPositionalArgument_ReturnsOneAttributeArgumentWithNoName()
// {
@ -170,5 +172,5 @@ @@ -170,5 +172,5 @@
//
// Assert.AreEqual(global::EnvDTE.vsCMElement.vsCMElementAttribute, kind);
// }
// }
//}
}
}

233
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeClass2Tests.cs

@ -1,165 +1,76 @@ @@ -1,165 +1,76 @@
//// 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 ICSharpCode.PackageManagement;
//using ICSharpCode.PackageManagement.EnvDTE;
//using ICSharpCode.SharpDevelop.Dom;
//using NUnit.Framework;
//using PackageManagement.Tests.Helpers;
//using Rhino.Mocks;
//
//namespace PackageManagement.Tests.EnvDTE
//{
// [TestFixture]
// public class CodeClass2Tests
// {
// CodeClass2 codeClass;
// ClassHelper helper;
// IClassKindUpdater classKindUpdater;
//
// void CreateProjectContent()
// {
// helper = new ClassHelper();
// }
//
// void CreateClass(string name)
// {
// helper.CreateClass(name);
// CreateClass();
// }
//
// void CreatePublicClass(string name)
// {
// helper.CreatePublicClass(name);
// CreateClass();
// }
//
// void CreatePrivateClass(string name)
// {
// helper.CreatePrivateClass(name);
// CreateClass();
// }
//
// void CreateClass()
// {
// classKindUpdater = MockRepository.GenerateStub<IClassKindUpdater>();
// codeClass = new CodeClass2(helper.ProjectContentHelper.ProjectContent, helper.Class, classKindUpdater);
// }
//
// void AddInterfaceToProjectContent(string fullName)
// {
// helper.ProjectContentHelper.AddInterfaceToProjectContent(fullName);
// }
//
// void AddClassToProjectContent(string fullName)
// {
// helper.CreateClass(fullName);
// }
//
// void AddInterfaceToClassBaseTypes(string fullName, string dotNetName)
// {
// helper.AddInterfaceToClassBaseTypes(fullName, dotNetName);
// }
//
// void AddClassToClassBaseTypes(string fullName)
// {
// helper.AddClassToClassBaseTypes(fullName);
// }
//
// void AddBaseTypeToClass(string fullName)
// {
// helper.AddBaseTypeToClass(fullName);
// }
//
// void AddMethodToClass(string fullyQualifiedName)
// {
// helper.AddMethodToClass(fullyQualifiedName);
// }
//
// void AddPropertyToClass(string fullyQualifiedName)
// {
// helper.AddPropertyToClass(fullyQualifiedName);
// }
//
// void AddFieldToClass(string fullyQualifiedName)
// {
// helper.AddFieldToClass(fullyQualifiedName);
// }
//
// void ClassIsAbstract()
// {
// helper.MakeClassAbstract();
// }
//
// void ClassIsPartial()
// {
// helper.MakeClassPartial();
// }
//
// void ClassIsGeneric()
// {
// helper.SetDotNetName("MyClass`1");
// }
//
// void ClassIsNotGeneric()
// {
// helper.SetDotNetName("MyClass");
// }
//
// [Test]
// public void Language_CSharpProject_ReturnsCSharpModelLanguage()
// {
// CreateProjectContent();
// helper.ProjectContentHelper.ProjectContentIsForCSharpProject();
// CreateClass("MyClass");
//
// string language = codeClass.Language;
//
// Assert.AreEqual(global::EnvDTE.CodeModelLanguageConstants.vsCMLanguageCSharp, language);
// }
//
// [Test]
// public void Language_VisualBasicProject_ReturnsVisualBasicModelLanguage()
// {
// CreateProjectContent();
// helper.ProjectContentHelper.ProjectContentIsForVisualBasicProject();
// CreateClass("MyClass");
//
// string language = codeClass.Language;
//
// Assert.AreEqual(global::EnvDTE.CodeModelLanguageConstants.vsCMLanguageVB, language);
// }
//
// [Test]
// public void Access_PublicClass_ReturnsPublic()
// {
// CreateProjectContent();
// CreatePublicClass("MyClass");
//
// global::EnvDTE.vsCMAccess access = codeClass.Access;
//
// Assert.AreEqual(global::EnvDTE.vsCMAccess.vsCMAccessPublic, access);
// }
//
// [Test]
// public void Access_PrivateClass_ReturnsPrivate()
// {
// CreateProjectContent();
// CreatePrivateClass("MyClass");
//
// global::EnvDTE.vsCMAccess access = codeClass.Access;
//
// Assert.AreEqual(global::EnvDTE.vsCMAccess.vsCMAccessPrivate, access);
// }
//
// 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 ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class CodeClass2Tests : CodeModelTestBase
{
CodeClass2 codeClass;
void CreateClass(string code)
{
AddCodeFile("class.cs", code);
ITypeDefinitionModel typeModel = topLevelTypeModels.Single();
codeClass = new CodeClass2(codeModelContext, typeModel);
}
[Test]
public void Language_CSharpProject_ReturnsCSharpModelLanguage()
{
CreateClass("class MyClass {}");
string language = codeClass.Language;
Assert.AreEqual(global::EnvDTE.CodeModelLanguageConstants.vsCMLanguageCSharp, language);
}
[Test]
public void Language_VisualBasicProject_ReturnsVisualBasicModelLanguage()
{
projectLanguage = "VB";
CreateClass("class MyClass {}");
string language = codeClass.Language;
Assert.AreEqual(global::EnvDTE.CodeModelLanguageConstants.vsCMLanguageVB, language);
}
[Test]
public void Access_PublicClass_ReturnsPublic()
{
CreateClass("public class MyClass {}");
global::EnvDTE.vsCMAccess access = codeClass.Access;
Assert.AreEqual(global::EnvDTE.vsCMAccess.vsCMAccessPublic, access);
}
[Test]
public void Access_InternalClass_ReturnsPrivate()
{
CreateClass("class MyClass {}");
global::EnvDTE.vsCMAccess access = codeClass.Access;
Assert.AreEqual(global::EnvDTE.vsCMAccess.vsCMAccessPrivate, access);
}
// [Test]
// public void ImplementedInterfaces_ClassImplementsGenericICollectionOfString_ReturnsCodeInterfaceForICollection()
// {
// CreateProjectContent();
// CreatePublicClass("MyClass");
// AddInterfaceToClassBaseTypes("System.Collections.Generic.ICollection", "System.Collections.Generic.ICollection{System.String}");
// CreateClass("using System.Collection.Generic;" +
// "class MyClass : ICollection<string> {}");
//
// global::EnvDTE.CodeElements codeElements = codeClass.ImplementedInterfaces;
// CodeInterface codeInterface = codeElements.FirstCodeInterfaceOrDefault();
@ -404,5 +315,5 @@ @@ -404,5 +315,5 @@
//
// Assert.Throws<NotImplementedException>(() => codeClass.ClassKind = global::EnvDTE.vsCMClassKind.vsCMClassKindMainClass);
// }
// }
//}
}
}

34
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTestBase.cs

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
// 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 ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Refactoring;
using NUnit.Framework;
using Rhino.Mocks;
namespace PackageManagement.Tests.EnvDTE
{
public class CodeModelTestBase : CSharpModelTestBase
{
protected CodeGenerator codeGenerator;
protected CodeModelContext codeModelContext;
protected string projectLanguage = "C#";
public override void SetUp()
{
base.SetUp();
project.Stub(p => p.Language).Return(null).WhenCalled(mi => mi.ReturnValue = projectLanguage);
codeGenerator = MockRepository.GenerateStrictMock<CodeGenerator>();
codeModelContext = new CodeModelContext {
CodeGenerator = codeGenerator,
CurrentProject = project
};
}
}
}

8
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -410,8 +410,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -410,8 +410,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
if (rr == null)
throw new ArgumentNullException("rr");
if (rr is ConversionResolveResult) {
// unpack ConversionResolveResult if necessary
// (e.g. a boxing conversion or string->object reference conversion)
rr = ((ConversionResolveResult)rr).Input;
}
if (rr is TypeOfResolveResult) {
return new TypeOfExpression(ConvertType(((TypeOfResolveResult)rr).Type));
return new TypeOfExpression(ConvertType(rr.Type));
} else if (rr is ArrayCreateResolveResult) {
ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
ArrayCreateExpression ace = new ArrayCreateExpression();

96
src/Main/Base/Test/Dom/CSharpModelTestBase.cs

@ -0,0 +1,96 @@ @@ -0,0 +1,96 @@
// 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.Collections.Specialized;
using System.Linq;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using Rhino.Mocks;
namespace ICSharpCode.SharpDevelop.Dom
{
[TestFixture]
public class CSharpModelTestBase
{
protected IProject project;
protected IProjectContent projectContent;
protected IEntityModelContext context;
protected ITypeDefinitionModelCollection topLevelTypeModels;
protected List<RemovedAndAddedPair<ITypeDefinitionModel>> topLevelChangeEventArgs = new List<RemovedAndAddedPair<ITypeDefinitionModel>>();
protected class RemovedAndAddedPair<T>
{
public IReadOnlyCollection<T> OldItems { get; private set; }
public IReadOnlyCollection<T> NewItems { get; private set; }
public RemovedAndAddedPair(IReadOnlyCollection<T> oldItems, IReadOnlyCollection<T> newItems)
{
this.OldItems = oldItems;
this.NewItems = newItems;
}
}
#region SetUp and other helper methods
[SetUp]
public virtual void SetUp()
{
SD.InitializeForUnitTests();
SD.Services.AddStrictMockService<IParserService>();
project = MockRepository.GenerateStrictMock<IProject>();
projectContent = new CSharpProjectContent().AddAssemblyReferences(AssemblyLoader.Corlib);
context = new ProjectEntityModelContext(project, ".cs");
topLevelTypeModels = new TopLevelTypeDefinitionModelCollection(context);
SD.ParserService.Stub(p => p.GetCompilation(project)).WhenCalled(c => c.ReturnValue = projectContent.CreateCompilation());
topLevelChangeEventArgs.Clear();
topLevelTypeModels.CollectionChanged += (oldItems, newItems) => topLevelChangeEventArgs.Add(new RemovedAndAddedPair<ITypeDefinitionModel>(oldItems, newItems));
}
[TearDown]
public virtual void TearDown()
{
SD.TearDownForUnitTests();
}
protected void AddCodeFile(string fileName, string code)
{
var oldFile = projectContent.GetFile(fileName);
Assert.IsNull(oldFile, "Duplicate file name: " + fileName);
var newFile = Parse(fileName, code);
projectContent = projectContent.AddOrUpdateFiles(newFile);
topLevelTypeModels.Update(oldFile, newFile);
}
IUnresolvedFile Parse(string fileName, string code)
{
var parser = new CSharpParser();
var syntaxTree = parser.Parse(code, fileName);
Assert.IsFalse(parser.HasErrors);
return syntaxTree.ToTypeSystem();
}
protected void UpdateCodeFile(string fileName, string code)
{
var oldFile = projectContent.GetFile(fileName);
Assert.IsNotNull(oldFile, "Could not update file (missing old file): " + fileName);
var newFile = Parse(fileName, code);
projectContent = projectContent.AddOrUpdateFiles(newFile);
topLevelTypeModels.Update(oldFile, newFile);
}
protected void RemoveCodeFile(string fileName)
{
var oldFile = projectContent.GetFile(fileName);
Assert.IsNotNull(oldFile, "Could not remove file (missing old file): " + fileName);
projectContent = projectContent.RemoveFiles(fileName);
topLevelTypeModels.Update(oldFile, null);
}
#endregion
}
}

136
src/Main/Base/Test/Dom/CSharpModelTests.cs → src/Main/Base/Test/Dom/TopLevelTypeModelsTests.cs

@ -5,100 +5,22 @@ using System; @@ -5,100 +5,22 @@ using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using Rhino.Mocks;
namespace ICSharpCode.SharpDevelop.Dom
{
[TestFixture]
public class CSharpModelTests
class TopLevelTypeModelsTests : CSharpModelTestBase
{
IProject project;
IProjectContent projectContent;
IEntityModelContext context;
TopLevelTypeDefinitionModelCollection topLevelTypeModels;
List<RemovedAndAddedPair<ITypeDefinitionModel>> topLevelChangeEventArgs = new List<RemovedAndAddedPair<ITypeDefinitionModel>>();
class RemovedAndAddedPair<T>
{
public IReadOnlyCollection<T> OldItems { get; private set; }
public IReadOnlyCollection<T> NewItems { get; private set; }
public RemovedAndAddedPair(IReadOnlyCollection<T> oldItems, IReadOnlyCollection<T> newItems)
{
this.OldItems = oldItems;
this.NewItems = newItems;
}
}
#region SetUp and other helper methods
[SetUp]
public virtual void SetUp()
{
SD.InitializeForUnitTests();
SD.Services.AddStrictMockService<IParserService>();
project = MockRepository.GenerateStrictMock<IProject>();
projectContent = new CSharpProjectContent().AddAssemblyReferences(AssemblyLoader.Corlib);
context = new ProjectEntityModelContext(project, ".cs");
topLevelTypeModels = new TopLevelTypeDefinitionModelCollection(context);
SD.ParserService.Stub(p => p.GetCompilation(project)).WhenCalled(c => c.ReturnValue = projectContent.CreateCompilation());
topLevelChangeEventArgs.Clear();
topLevelTypeModels.CollectionChanged += (oldItems, newItems) => topLevelChangeEventArgs.Add(new RemovedAndAddedPair<ITypeDefinitionModel>(oldItems, newItems));
}
[TearDown]
public virtual void TearDown()
{
SD.TearDownForUnitTests();
}
protected void AddCodeFile(string fileName, string code)
{
var oldFile = projectContent.GetFile(fileName);
Assert.IsNull(oldFile);
var newFile = Parse(fileName, code);
projectContent = projectContent.AddOrUpdateFiles(newFile);
topLevelTypeModels.Update(oldFile, newFile);
}
IUnresolvedFile Parse(string fileName, string code)
{
var parser = new CSharpParser();
var syntaxTree = parser.Parse(code, fileName);
Assert.IsFalse(parser.HasErrors);
return syntaxTree.ToTypeSystem();
}
protected void UpdateCodeFile(string fileName, string code)
{
var oldFile = projectContent.GetFile(fileName);
Assert.IsNotNull(oldFile);
var newFile = Parse(fileName, code);
projectContent = projectContent.AddOrUpdateFiles(newFile);
topLevelTypeModels.Update(oldFile, newFile);
}
protected void RemoveCodeFile(string fileName)
{
var oldFile = projectContent.GetFile(fileName);
projectContent = projectContent.RemoveFiles(fileName);
topLevelTypeModels.Update(oldFile, null);
}
#endregion
[Test]
public void EmptyProject()
{
Assert.AreEqual(0, topLevelTypeModels.Count);
Assert.IsNull(topLevelTypeModels[new TopLevelTypeName("MissingClass")]);
}
#region Simple class
[Test]
public void AddSimpleClass()
@ -107,10 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -107,10 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom
Assert.AreEqual(1, topLevelTypeModels.Count);
var simpleClass = topLevelTypeModels.Single();
Assert.IsEmpty(topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().NewItems);
topLevelChangeEventArgs.Clear(); // clear for follow-up tests
Assert.AreEqual(new[] {
simpleClass
}, topLevelChangeEventArgs.Single().NewItems);
topLevelChangeEventArgs.Clear();
// clear for follow-up tests
}
[Test]
public void UpdateSimpleClass()
{
@ -122,7 +46,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -122,7 +46,6 @@ namespace ICSharpCode.SharpDevelop.Dom
Assert.AreEqual(1, simpleClass.Members.Count);
Assert.IsEmpty(topLevelChangeEventArgs);
}
[Test]
public void ReplaceSimpleClass()
{
@ -131,10 +54,13 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -131,10 +54,13 @@ namespace ICSharpCode.SharpDevelop.Dom
UpdateCodeFile("test.cs", "class OtherClass { }");
var otherClass = topLevelTypeModels.Single();
Assert.AreNotSame(simpleClass, otherClass);
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] { otherClass }, topLevelChangeEventArgs.Single().NewItems);
Assert.AreEqual(new[] {
simpleClass
}, topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] {
otherClass
}, topLevelChangeEventArgs.Single().NewItems);
}
[Test]
public void RemoveSimpleClassCodeFile()
{
@ -143,14 +69,14 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -143,14 +69,14 @@ namespace ICSharpCode.SharpDevelop.Dom
RemoveCodeFile("test.cs");
Assert.IsEmpty(topLevelTypeModels);
// check removal event
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] {
simpleClass
}, topLevelChangeEventArgs.Single().OldItems);
Assert.IsEmpty(topLevelChangeEventArgs.Single().NewItems);
// test that accessing properties of a removed class still works
Assert.AreEqual(new FullTypeName("SimpleClass"), simpleClass.FullTypeName);
}
#endregion
#region TwoPartsInSingleFile
[Test]
public void TwoPartsInSingleFile()
@ -159,9 +85,9 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -159,9 +85,9 @@ namespace ICSharpCode.SharpDevelop.Dom
partial class SimpleClass { void Member1() {} }
partial class SimpleClass { void Member2() {} }");
Assert.AreEqual(1, topLevelTypeModels.Count);
topLevelChangeEventArgs.Clear(); // clear for follow-up tests
topLevelChangeEventArgs.Clear();
// clear for follow-up tests
}
[Test]
public void UpdateTwoPartsInSingleFile()
{
@ -171,9 +97,11 @@ partial class SimpleClass { void Member2() {} }"); @@ -171,9 +97,11 @@ partial class SimpleClass { void Member2() {} }");
partial class SimpleClass { void Member1b() {} }
partial class SimpleClass { void Member2b() {} }");
Assert.AreSame(simpleClass, topLevelTypeModels.Single());
Assert.AreEqual(new[] { "Member1b", "Member2b" }, simpleClass.Members.Select(m => m.Name).ToArray());
Assert.AreEqual(new[] {
"Member1b",
"Member2b"
}, simpleClass.Members.Select(m => m.Name).ToArray());
}
[Test]
public void RemoveOneOfPartsInSingleFile()
{
@ -184,7 +112,6 @@ partial class SimpleClass { void Member2b() {} }"); @@ -184,7 +112,6 @@ partial class SimpleClass { void Member2b() {} }");
Assert.AreSame(simpleClass, topLevelTypeModels.Single());
Assert.AreSame(member1, simpleClass.Members.Single());
}
[Test]
public void RemoveBothPartsInSingleFile()
{
@ -194,7 +121,6 @@ partial class SimpleClass { void Member2b() {} }"); @@ -194,7 +121,6 @@ partial class SimpleClass { void Member2b() {} }");
Assert.AreNotSame(simpleClass, topLevelTypeModels.Single());
}
#endregion
#region TestRegionIsFromPrimaryPart
[Test]
public void AddingDesignerPartDoesNotChangeRegion()
@ -204,7 +130,6 @@ partial class SimpleClass { void Member2b() {} }"); @@ -204,7 +130,6 @@ partial class SimpleClass { void Member2b() {} }");
AddCodeFile("Form.Designer.cs", "partial class MyForm {}");
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName);
}
[Test]
public void AddingPrimaryPartChangesRegion()
{
@ -213,22 +138,33 @@ partial class SimpleClass { void Member2b() {} }"); @@ -213,22 +138,33 @@ partial class SimpleClass { void Member2b() {} }");
AddCodeFile("Form.cs", "partial class MyForm {}");
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName);
}
[Test]
public void RemovingPrimaryPartChangesRegionToNextBestPart()
{
AddCodeFile("Form.cs", "partial class MyForm { int primaryMember; }");
AddCodeFile("Form.Designer.Designer.cs", "partial class MyForm { int designer2; }");
var form = topLevelTypeModels.Single();
Assert.AreEqual(new[] { "primaryMember", "designer2" }, form.Members.Select(m => m.Name).ToArray());
Assert.AreEqual(new[] {
"primaryMember",
"designer2"
}, form.Members.Select(m => m.Name).ToArray());
AddCodeFile("Form.Designer.cs", "partial class MyForm { int designer; }");
Assert.AreEqual("Form.cs", form.Region.FileName);
Assert.AreEqual(new[] { "primaryMember", "designer", "designer2" }, form.Members.Select(m => m.Name).ToArray());
Assert.AreEqual(new[] {
"primaryMember",
"designer",
"designer2"
}, form.Members.Select(m => m.Name).ToArray());
RemoveCodeFile("Form.cs");
Assert.AreSame(form, topLevelTypeModels.Single());
Assert.AreEqual("Form.Designer.cs", form.Region.FileName);
Assert.AreEqual(new[] { "designer", "designer2" }, form.Members.Select(m => m.Name).ToArray());
Assert.AreEqual(new[] {
"designer",
"designer2"
}, form.Members.Select(m => m.Name).ToArray());
}
#endregion
}
}

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

@ -82,8 +82,9 @@ @@ -82,8 +82,9 @@
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="CodeConverterTests.cs" />
<Compile Include="Dom\CSharpModelTests.cs" />
<Compile Include="Dom\CSharpModelTestBase.cs" />
<Compile Include="Dom\ProjectEntityModelContextTests.cs" />
<Compile Include="Dom\TopLevelTypeModelsTests.cs" />
<Compile Include="Dom\TreeNodeFactoryServiceTests.cs" />
<Compile Include="ExceptionClassOverridesTestFixture.cs" />
<Compile Include="GenerateOverrideMethodTests.cs" />

Loading…
Cancel
Save