Browse Source

Add tests for EnvDTE.CodeClass.AddVariable()

pull/374/merge
Matt Ward 11 years ago
parent
commit
30cac18994
  1. 24
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
  2. 18
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
  3. 16
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
  4. 123
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeClass2Tests.cs
  5. 2
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeInterfaceTests.cs

24
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs

@ -53,7 +53,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -53,7 +53,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual global::EnvDTE.CodeVariable AddVariable(string name, object type, object Position = null, global::EnvDTE.vsCMAccess Access = global::EnvDTE.vsCMAccess.vsCMAccessPublic, object Location = null)
{
IType fieldType = GetFieldType((string)type);
IType fieldType = FindType((string)type);
context.CodeGenerator.AddFieldAtStart(typeDefinition, Access.ToAccessibility(), fieldType, name);
@ -65,27 +65,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -65,27 +65,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
return null;
}
IType GetFieldType(string type)
{
var fieldTypeName = new FullTypeName(type);
IType fieldType = typeDefinition.Compilation.FindType(fieldTypeName);
if (fieldType != null) {
return fieldType;
}
return new UnknownType(fieldTypeName);
}
void ReloadTypeDefinition()
{
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
if (matchedTypeDefinition != null) {
typeDefinition = matchedTypeDefinition;
}
}
}
}

18
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs

@ -35,7 +35,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -35,7 +35,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public global::EnvDTE.CodeFunction AddFunction(string name, global::EnvDTE.vsCMFunction kind, object type, object Position = null, global::EnvDTE.vsCMAccess Access = global::EnvDTE.vsCMAccess.vsCMAccessPublic)
{
IType returnType = GetMethodReturnType((string)type);
IType returnType = FindType((string)type);
context.CodeGenerator.AddMethodAtStart(typeDefinition, Access.ToAccessibility(), returnType, name);
@ -47,21 +47,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -47,21 +47,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
return null;
}
IType GetMethodReturnType(string typeName)
{
var fullTypeName = new FullTypeName(typeName);
return typeDefinition.Compilation.FindType(fullTypeName);
}
void ReloadTypeDefinition()
{
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
if (matchedTypeDefinition != null) {
typeDefinition = matchedTypeDefinition;
}
}
}
}

16
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs

@ -178,5 +178,21 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -178,5 +178,21 @@ namespace ICSharpCode.PackageManagement.EnvDTE
.GetAllBaseTypeDefinitions()
.Any(baseType => baseType.FullName == fullName);
}
protected IType FindType(string type)
{
var fieldTypeName = new FullTypeName(type);
return typeDefinition.Compilation.FindType(fieldTypeName);
}
protected void ReloadTypeDefinition()
{
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
if (matchedTypeDefinition != null) {
typeDefinition = matchedTypeDefinition;
}
}
}
}

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

@ -20,9 +20,7 @@ using System; @@ -20,9 +20,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks;
@ -33,14 +31,26 @@ namespace PackageManagement.Tests.EnvDTE @@ -33,14 +31,26 @@ namespace PackageManagement.Tests.EnvDTE
public class CodeClass2Tests : CodeModelTestBase
{
CodeClass2 codeClass;
ITypeDefinition codeClassTypeDefinition;
void CreateClass(string code)
ITypeDefinition addFieldAtStartTypeDef;
Accessibility addFieldAtStartAccess;
IType addFieldAtStartReturnType;
string addFieldAtStartName;
void CreateClass(string code, string fileName = @"c:\projects\MyProject\class.cs")
{
AddCodeFile("class.cs", code);
CreateCodeModel();
AddCodeFile(fileName, code);
ITypeDefinition typeDefinition = GetFirstTypeDefinition();
CreateClass(typeDefinition);
}
void UpdateCode(string code, string fileName = @"c:\projects\MyProject\class.cs")
{
CreateCompilationForUpdatedCodeFile(fileName, code);
}
ITypeDefinition GetFirstTypeDefinition()
{
return assemblyModel.TopLevelTypeDefinitions.First().Resolve();
@ -48,9 +58,27 @@ namespace PackageManagement.Tests.EnvDTE @@ -48,9 +58,27 @@ namespace PackageManagement.Tests.EnvDTE
void CreateClass(ITypeDefinition typeDefinition)
{
codeClassTypeDefinition = typeDefinition;
codeClass = new CodeClass2(codeModelContext, typeDefinition);
}
void CaptureCodeGeneratorAddFieldAtStartParameters()
{
codeGenerator
.Stub(generator => generator.AddFieldAtStart(
Arg<ITypeDefinition>.Is.Anything,
Arg<Accessibility>.Is.Anything,
Arg<IType>.Is.Anything,
Arg<string>.Is.Anything))
.Callback<ITypeDefinition, Accessibility, IType, string>((typeDef, access, type, name) => {
addFieldAtStartTypeDef = typeDef;
addFieldAtStartAccess = access;
addFieldAtStartReturnType = type;
addFieldAtStartName = name;
return true;
});
}
[Test]
public void Language_CSharpProject_ReturnsCSharpModelLanguage()
{
@ -405,5 +433,92 @@ namespace PackageManagement.Tests.EnvDTE @@ -405,5 +433,92 @@ namespace PackageManagement.Tests.EnvDTE
Assert.That(members.Count, Is.GreaterThan(0));
Assert.IsTrue(members.Any(member => member.Name == "IsDefaultAttribute"));
}
[Test]
public void AddVariable_PublicSystemInt32Variable_AddsFieldWithCodeConverter()
{
CreateClass("class MyClass {}");
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
CaptureCodeGeneratorAddFieldAtStartParameters();
string newCode =
"class MyClass {\r\n" +
" public System.Int32 MyField;\r\n" +
"}";
UpdateCode(newCode);
codeClass.AddVariable("MyField", "System.Int32", null, access, null);
Assert.AreEqual(Accessibility.Public, addFieldAtStartAccess);
Assert.AreEqual("MyField", addFieldAtStartName);
Assert.AreEqual(codeClassTypeDefinition, addFieldAtStartTypeDef);
Assert.AreEqual("System.Int32", addFieldAtStartReturnType.FullName);
Assert.IsTrue(addFieldAtStartReturnType.IsKnownType (KnownTypeCode.Int32));
}
[Test]
public void AddVariable_PrivateVariableOfUnknownType_AddsFieldWithCodeConverter()
{
CreateClass("class MyClass {}");
var access = global::EnvDTE.vsCMAccess.vsCMAccessPrivate;
CaptureCodeGeneratorAddFieldAtStartParameters();
string newCode =
"class MyClass {\r\n" +
" Unknown.UnknownClass MyField;\r\n" +
"}";
UpdateCode(newCode);
codeClass.AddVariable("MyField", "Unknown.UnknownClass", null, access, null);
Assert.AreEqual(Accessibility.Private, addFieldAtStartAccess);
Assert.AreEqual("MyField", addFieldAtStartName);
Assert.AreEqual(codeClassTypeDefinition, addFieldAtStartTypeDef);
Assert.AreEqual("Unknown.UnknownClass", addFieldAtStartReturnType.FullName);
}
[Test]
public void AddVariable_PublicSystemInt32Variable_ReturnsCodeVariableForField()
{
string fileName = @"c:\projects\MyProject\class.cs";
CreateClass("class MyClass {}", fileName);
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
string newCode =
"class MyClass {\r\n" +
" public int MyField;\r\n" +
"}";
UpdateCode(newCode, fileName);
var codeVariable = codeClass.AddVariable("MyField", "System.Int32", null, access, null) as CodeVariable;
Assert.AreEqual("MyField", codeVariable.Name);
}
[Test]
public void AddVariable_FieldNotFoundAfterReloadingTypeDefinition_ReturnsNull()
{
string fileName = @"c:\projects\MyProject\class.cs";
CreateClass("class MyClass {}", fileName);
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
string newCode = "class MyClass {}";
UpdateCode(newCode, fileName);
var codeVariable = codeClass.AddVariable("MyField", "System.Int32", null, access, null) as CodeVariable;
Assert.IsNull(codeVariable);
}
[Test]
public void AddVariable_UnableToFindTypeDefinitionAfterUpdate_ReturnsNull()
{
string fileName = @"c:\projects\MyProject\class.cs";
CreateClass("class MyClass {}", fileName);
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
string newCode = "class MyClass {}";
UpdateCode(newCode, fileName);
var codeVariable = codeClass.AddVariable("MyField", "System.Int32", null, access, null) as CodeVariable;
Assert.IsNull(codeVariable);
Assert.AreEqual("MyClass", codeClass.Name);
}
}
}

2
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeInterfaceTests.cs

@ -79,7 +79,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -79,7 +79,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test]
public void AddFunction_PublicFunctionReturningSystemInt32_AddsPublicFunctionWithCodeConverter()
{
CreateInterface ("interface MyInterface {}");
CreateInterface("interface MyInterface {}");
var kind = global::EnvDTE.vsCMFunction.vsCMFunctionFunction;
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
CaptureCodeGeneratorAddMethodAtStartParameters();

Loading…
Cancel
Save