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 @@
<Compile Include="Src\EnvDTE\CodeFunctionTests.cs" /> <Compile Include="Src\EnvDTE\CodeFunctionTests.cs" />
<Compile Include="Src\EnvDTE\CodeImportTests.cs" /> <Compile Include="Src\EnvDTE\CodeImportTests.cs" />
<Compile Include="Src\EnvDTE\CodeInterfaceTests.cs" /> <Compile Include="Src\EnvDTE\CodeInterfaceTests.cs" />
<Compile Include="Src\EnvDTE\CodeModelTestBase.cs" />
<Compile Include="Src\EnvDTE\CodeModelTests.cs"> <Compile Include="Src\EnvDTE\CodeModelTests.cs">
<DependentUpon>CodeTypeTests.cs</DependentUpon> <DependentUpon>CodeTypeTests.cs</DependentUpon>
</Compile> </Compile>
@ -341,6 +342,10 @@
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project> <Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>
<Name>ICSharpCode.AvalonEdit</Name> <Name>ICSharpCode.AvalonEdit</Name>
</ProjectReference> </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"> <ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project> <Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name> <Name>ICSharpCode.NRefactory</Name>
@ -349,6 +354,10 @@
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project> <Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name> <Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference> </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"> <ProjectReference Include="..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project> <Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name> <Name>ICSharpCode.Core</Name>

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

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

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

@ -1,165 +1,76 @@
//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
//
//using System; using System;
//using System.Collections.Generic; using System.Collections.Generic;
//using ICSharpCode.PackageManagement; using System.Linq;
//using ICSharpCode.PackageManagement.EnvDTE; using ICSharpCode.PackageManagement;
//using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.PackageManagement.EnvDTE;
//using NUnit.Framework; using ICSharpCode.SharpDevelop.Dom;
//using PackageManagement.Tests.Helpers; using NUnit.Framework;
//using Rhino.Mocks; using PackageManagement.Tests.Helpers;
// using Rhino.Mocks;
//namespace PackageManagement.Tests.EnvDTE
//{ namespace PackageManagement.Tests.EnvDTE
// [TestFixture] {
// public class CodeClass2Tests [TestFixture]
// { public class CodeClass2Tests : CodeModelTestBase
// CodeClass2 codeClass; {
// ClassHelper helper; CodeClass2 codeClass;
// IClassKindUpdater classKindUpdater;
// void CreateClass(string code)
// void CreateProjectContent() {
// { AddCodeFile("class.cs", code);
// helper = new ClassHelper(); ITypeDefinitionModel typeModel = topLevelTypeModels.Single();
// } codeClass = new CodeClass2(codeModelContext, typeModel);
// }
// void CreateClass(string name)
// { [Test]
// helper.CreateClass(name); public void Language_CSharpProject_ReturnsCSharpModelLanguage()
// CreateClass(); {
// } CreateClass("class MyClass {}");
//
// void CreatePublicClass(string name) string language = codeClass.Language;
// {
// helper.CreatePublicClass(name); Assert.AreEqual(global::EnvDTE.CodeModelLanguageConstants.vsCMLanguageCSharp, language);
// CreateClass(); }
// }
// [Test]
// void CreatePrivateClass(string name) public void Language_VisualBasicProject_ReturnsVisualBasicModelLanguage()
// { {
// helper.CreatePrivateClass(name); projectLanguage = "VB";
// CreateClass(); CreateClass("class MyClass {}");
// }
// string language = codeClass.Language;
// void CreateClass()
// { Assert.AreEqual(global::EnvDTE.CodeModelLanguageConstants.vsCMLanguageVB, language);
// classKindUpdater = MockRepository.GenerateStub<IClassKindUpdater>(); }
// codeClass = new CodeClass2(helper.ProjectContentHelper.ProjectContent, helper.Class, classKindUpdater);
// } [Test]
// public void Access_PublicClass_ReturnsPublic()
// void AddInterfaceToProjectContent(string fullName) {
// { CreateClass("public class MyClass {}");
// helper.ProjectContentHelper.AddInterfaceToProjectContent(fullName);
// } global::EnvDTE.vsCMAccess access = codeClass.Access;
//
// void AddClassToProjectContent(string fullName) Assert.AreEqual(global::EnvDTE.vsCMAccess.vsCMAccessPublic, access);
// { }
// helper.CreateClass(fullName);
// } [Test]
// public void Access_InternalClass_ReturnsPrivate()
// void AddInterfaceToClassBaseTypes(string fullName, string dotNetName) {
// { CreateClass("class MyClass {}");
// helper.AddInterfaceToClassBaseTypes(fullName, dotNetName);
// } global::EnvDTE.vsCMAccess access = codeClass.Access;
//
// void AddClassToClassBaseTypes(string fullName) Assert.AreEqual(global::EnvDTE.vsCMAccess.vsCMAccessPrivate, access);
// { }
// 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);
// }
//
// [Test] // [Test]
// public void ImplementedInterfaces_ClassImplementsGenericICollectionOfString_ReturnsCodeInterfaceForICollection() // public void ImplementedInterfaces_ClassImplementsGenericICollectionOfString_ReturnsCodeInterfaceForICollection()
// { // {
// CreateProjectContent(); // CreateClass("using System.Collection.Generic;" +
// CreatePublicClass("MyClass"); // "class MyClass : ICollection<string> {}");
// AddInterfaceToClassBaseTypes("System.Collections.Generic.ICollection", "System.Collections.Generic.ICollection{System.String}");
// //
// global::EnvDTE.CodeElements codeElements = codeClass.ImplementedInterfaces; // global::EnvDTE.CodeElements codeElements = codeClass.ImplementedInterfaces;
// CodeInterface codeInterface = codeElements.FirstCodeInterfaceOrDefault(); // CodeInterface codeInterface = codeElements.FirstCodeInterfaceOrDefault();
@ -404,5 +315,5 @@
// //
// Assert.Throws<NotImplementedException>(() => codeClass.ClassKind = global::EnvDTE.vsCMClassKind.vsCMClassKindMainClass); // Assert.Throws<NotImplementedException>(() => codeClass.ClassKind = global::EnvDTE.vsCMClassKind.vsCMClassKindMainClass);
// } // }
// } }
//} }

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

@ -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
{ {
if (rr == null) if (rr == null)
throw new ArgumentNullException("rr"); 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) { if (rr is TypeOfResolveResult) {
return new TypeOfExpression(ConvertType(((TypeOfResolveResult)rr).Type)); return new TypeOfExpression(ConvertType(rr.Type));
} else if (rr is ArrayCreateResolveResult) { } else if (rr is ArrayCreateResolveResult) {
ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr; ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
ArrayCreateExpression ace = new ArrayCreateExpression(); ArrayCreateExpression ace = new ArrayCreateExpression();

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

@ -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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Linq; using System.Linq;
using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework; using NUnit.Framework;
using Rhino.Mocks; using Rhino.Mocks;
namespace ICSharpCode.SharpDevelop.Dom namespace ICSharpCode.SharpDevelop.Dom
{ {
[TestFixture] class TopLevelTypeModelsTests : CSharpModelTestBase
public class CSharpModelTests
{ {
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] [Test]
public void EmptyProject() public void EmptyProject()
{ {
Assert.AreEqual(0, topLevelTypeModels.Count); Assert.AreEqual(0, topLevelTypeModels.Count);
Assert.IsNull(topLevelTypeModels[new TopLevelTypeName("MissingClass")]); Assert.IsNull(topLevelTypeModels[new TopLevelTypeName("MissingClass")]);
} }
#region Simple class #region Simple class
[Test] [Test]
public void AddSimpleClass() public void AddSimpleClass()
@ -107,10 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom
Assert.AreEqual(1, topLevelTypeModels.Count); Assert.AreEqual(1, topLevelTypeModels.Count);
var simpleClass = topLevelTypeModels.Single(); var simpleClass = topLevelTypeModels.Single();
Assert.IsEmpty(topLevelChangeEventArgs.Single().OldItems); Assert.IsEmpty(topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().NewItems); Assert.AreEqual(new[] {
topLevelChangeEventArgs.Clear(); // clear for follow-up tests simpleClass
}, topLevelChangeEventArgs.Single().NewItems);
topLevelChangeEventArgs.Clear();
// clear for follow-up tests
} }
[Test] [Test]
public void UpdateSimpleClass() public void UpdateSimpleClass()
{ {
@ -122,7 +46,6 @@ namespace ICSharpCode.SharpDevelop.Dom
Assert.AreEqual(1, simpleClass.Members.Count); Assert.AreEqual(1, simpleClass.Members.Count);
Assert.IsEmpty(topLevelChangeEventArgs); Assert.IsEmpty(topLevelChangeEventArgs);
} }
[Test] [Test]
public void ReplaceSimpleClass() public void ReplaceSimpleClass()
{ {
@ -131,10 +54,13 @@ namespace ICSharpCode.SharpDevelop.Dom
UpdateCodeFile("test.cs", "class OtherClass { }"); UpdateCodeFile("test.cs", "class OtherClass { }");
var otherClass = topLevelTypeModels.Single(); var otherClass = topLevelTypeModels.Single();
Assert.AreNotSame(simpleClass, otherClass); Assert.AreNotSame(simpleClass, otherClass);
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().OldItems); Assert.AreEqual(new[] {
Assert.AreEqual(new[] { otherClass }, topLevelChangeEventArgs.Single().NewItems); simpleClass
}, topLevelChangeEventArgs.Single().OldItems);
Assert.AreEqual(new[] {
otherClass
}, topLevelChangeEventArgs.Single().NewItems);
} }
[Test] [Test]
public void RemoveSimpleClassCodeFile() public void RemoveSimpleClassCodeFile()
{ {
@ -143,14 +69,14 @@ namespace ICSharpCode.SharpDevelop.Dom
RemoveCodeFile("test.cs"); RemoveCodeFile("test.cs");
Assert.IsEmpty(topLevelTypeModels); Assert.IsEmpty(topLevelTypeModels);
// check removal event // check removal event
Assert.AreEqual(new[] { simpleClass }, topLevelChangeEventArgs.Single().OldItems); Assert.AreEqual(new[] {
simpleClass
}, topLevelChangeEventArgs.Single().OldItems);
Assert.IsEmpty(topLevelChangeEventArgs.Single().NewItems); Assert.IsEmpty(topLevelChangeEventArgs.Single().NewItems);
// test that accessing properties of a removed class still works // test that accessing properties of a removed class still works
Assert.AreEqual(new FullTypeName("SimpleClass"), simpleClass.FullTypeName); Assert.AreEqual(new FullTypeName("SimpleClass"), simpleClass.FullTypeName);
} }
#endregion #endregion
#region TwoPartsInSingleFile #region TwoPartsInSingleFile
[Test] [Test]
public void TwoPartsInSingleFile() public void TwoPartsInSingleFile()
@ -159,9 +85,9 @@ namespace ICSharpCode.SharpDevelop.Dom
partial class SimpleClass { void Member1() {} } partial class SimpleClass { void Member1() {} }
partial class SimpleClass { void Member2() {} }"); partial class SimpleClass { void Member2() {} }");
Assert.AreEqual(1, topLevelTypeModels.Count); Assert.AreEqual(1, topLevelTypeModels.Count);
topLevelChangeEventArgs.Clear(); // clear for follow-up tests topLevelChangeEventArgs.Clear();
// clear for follow-up tests
} }
[Test] [Test]
public void UpdateTwoPartsInSingleFile() public void UpdateTwoPartsInSingleFile()
{ {
@ -171,9 +97,11 @@ partial class SimpleClass { void Member2() {} }");
partial class SimpleClass { void Member1b() {} } partial class SimpleClass { void Member1b() {} }
partial class SimpleClass { void Member2b() {} }"); partial class SimpleClass { void Member2b() {} }");
Assert.AreSame(simpleClass, topLevelTypeModels.Single()); 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] [Test]
public void RemoveOneOfPartsInSingleFile() public void RemoveOneOfPartsInSingleFile()
{ {
@ -184,7 +112,6 @@ partial class SimpleClass { void Member2b() {} }");
Assert.AreSame(simpleClass, topLevelTypeModels.Single()); Assert.AreSame(simpleClass, topLevelTypeModels.Single());
Assert.AreSame(member1, simpleClass.Members.Single()); Assert.AreSame(member1, simpleClass.Members.Single());
} }
[Test] [Test]
public void RemoveBothPartsInSingleFile() public void RemoveBothPartsInSingleFile()
{ {
@ -194,7 +121,6 @@ partial class SimpleClass { void Member2b() {} }");
Assert.AreNotSame(simpleClass, topLevelTypeModels.Single()); Assert.AreNotSame(simpleClass, topLevelTypeModels.Single());
} }
#endregion #endregion
#region TestRegionIsFromPrimaryPart #region TestRegionIsFromPrimaryPart
[Test] [Test]
public void AddingDesignerPartDoesNotChangeRegion() public void AddingDesignerPartDoesNotChangeRegion()
@ -204,7 +130,6 @@ partial class SimpleClass { void Member2b() {} }");
AddCodeFile("Form.Designer.cs", "partial class MyForm {}"); AddCodeFile("Form.Designer.cs", "partial class MyForm {}");
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName); Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName);
} }
[Test] [Test]
public void AddingPrimaryPartChangesRegion() public void AddingPrimaryPartChangesRegion()
{ {
@ -213,22 +138,33 @@ partial class SimpleClass { void Member2b() {} }");
AddCodeFile("Form.cs", "partial class MyForm {}"); AddCodeFile("Form.cs", "partial class MyForm {}");
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName); Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName);
} }
[Test] [Test]
public void RemovingPrimaryPartChangesRegionToNextBestPart() public void RemovingPrimaryPartChangesRegionToNextBestPart()
{ {
AddCodeFile("Form.cs", "partial class MyForm { int primaryMember; }"); AddCodeFile("Form.cs", "partial class MyForm { int primaryMember; }");
AddCodeFile("Form.Designer.Designer.cs", "partial class MyForm { int designer2; }"); AddCodeFile("Form.Designer.Designer.cs", "partial class MyForm { int designer2; }");
var form = topLevelTypeModels.Single(); 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; }"); AddCodeFile("Form.Designer.cs", "partial class MyForm { int designer; }");
Assert.AreEqual("Form.cs", form.Region.FileName); 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"); RemoveCodeFile("Form.cs");
Assert.AreSame(form, topLevelTypeModels.Single()); Assert.AreSame(form, topLevelTypeModels.Single());
Assert.AreEqual("Form.Designer.cs", form.Region.FileName); 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 #endregion
} }
} }

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

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

Loading…
Cancel
Save