Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 30cac18

Browse files
committed
Add tests for EnvDTE.CodeClass.AddVariable()
1 parent 19cf43b commit 30cac18

5 files changed

Lines changed: 138 additions & 45 deletions

File tree

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

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public CodeClass()
5353

5454
public virtual global::EnvDTE.CodeVariable AddVariable(string name, object type, object Position = null, global::EnvDTE.vsCMAccess Access = global::EnvDTE.vsCMAccess.vsCMAccessPublic, object Location = null)
5555
{
56-
IType fieldType = GetFieldType((string)type);
56+
IType fieldType = FindType((string)type);
5757

5858
context.CodeGenerator.AddFieldAtStart(typeDefinition, Access.ToAccessibility(), fieldType, name);
5959

@@ -65,27 +65,5 @@ public CodeClass()
6565
}
6666
return null;
6767
}
68-
69-
IType GetFieldType(string type)
70-
{
71-
var fieldTypeName = new FullTypeName(type);
72-
73-
IType fieldType = typeDefinition.Compilation.FindType(fieldTypeName);
74-
if (fieldType != null) {
75-
return fieldType;
76-
}
77-
78-
return new UnknownType(fieldTypeName);
79-
}
80-
81-
void ReloadTypeDefinition()
82-
{
83-
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
84-
85-
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
86-
if (matchedTypeDefinition != null) {
87-
typeDefinition = matchedTypeDefinition;
88-
}
89-
}
9068
}
9169
}

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public CodeInterface(CodeModelContext context, ITypeDefinition typeDefinition, p
3535

3636
public global::EnvDTE.CodeFunction AddFunction(string name, global::EnvDTE.vsCMFunction kind, object type, object Position = null, global::EnvDTE.vsCMAccess Access = global::EnvDTE.vsCMAccess.vsCMAccessPublic)
3737
{
38-
IType returnType = GetMethodReturnType((string)type);
38+
IType returnType = FindType((string)type);
3939

4040
context.CodeGenerator.AddMethodAtStart(typeDefinition, Access.ToAccessibility(), returnType, name);
4141

@@ -47,21 +47,5 @@ public CodeInterface(CodeModelContext context, ITypeDefinition typeDefinition, p
4747
}
4848
return null;
4949
}
50-
51-
IType GetMethodReturnType(string typeName)
52-
{
53-
var fullTypeName = new FullTypeName(typeName);
54-
return typeDefinition.Compilation.FindType(fullTypeName);
55-
}
56-
57-
void ReloadTypeDefinition()
58-
{
59-
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
60-
61-
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
62-
if (matchedTypeDefinition != null) {
63-
typeDefinition = matchedTypeDefinition;
64-
}
65-
}
6650
}
6751
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,5 +178,21 @@ protected override bool GetIsDerivedFrom(string fullName)
178178
.GetAllBaseTypeDefinitions()
179179
.Any(baseType => baseType.FullName == fullName);
180180
}
181+
182+
protected IType FindType(string type)
183+
{
184+
var fieldTypeName = new FullTypeName(type);
185+
return typeDefinition.Compilation.FindType(fieldTypeName);
186+
}
187+
188+
protected void ReloadTypeDefinition()
189+
{
190+
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
191+
192+
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
193+
if (matchedTypeDefinition != null) {
194+
typeDefinition = matchedTypeDefinition;
195+
}
196+
}
181197
}
182198
}

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

Lines changed: 119 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020
using System.Collections.Generic;
2121
using System.Linq;
2222
using ICSharpCode.NRefactory.TypeSystem;
23-
using ICSharpCode.PackageManagement;
2423
using ICSharpCode.PackageManagement.EnvDTE;
25-
using ICSharpCode.SharpDevelop.Dom;
2624
using NUnit.Framework;
2725
using PackageManagement.Tests.Helpers;
2826
using Rhino.Mocks;
@@ -33,24 +31,54 @@ namespace PackageManagement.Tests.EnvDTE
3331
public class CodeClass2Tests : CodeModelTestBase
3432
{
3533
CodeClass2 codeClass;
34+
ITypeDefinition codeClassTypeDefinition;
3635

37-
void CreateClass(string code)
36+
ITypeDefinition addFieldAtStartTypeDef;
37+
Accessibility addFieldAtStartAccess;
38+
IType addFieldAtStartReturnType;
39+
string addFieldAtStartName;
40+
41+
void CreateClass(string code, string fileName = @"c:\projects\MyProject\class.cs")
3842
{
39-
AddCodeFile("class.cs", code);
43+
CreateCodeModel();
44+
AddCodeFile(fileName, code);
4045
ITypeDefinition typeDefinition = GetFirstTypeDefinition();
4146
CreateClass(typeDefinition);
4247
}
4348

49+
void UpdateCode(string code, string fileName = @"c:\projects\MyProject\class.cs")
50+
{
51+
CreateCompilationForUpdatedCodeFile(fileName, code);
52+
}
53+
4454
ITypeDefinition GetFirstTypeDefinition()
4555
{
4656
return assemblyModel.TopLevelTypeDefinitions.First().Resolve();
4757
}
4858

4959
void CreateClass(ITypeDefinition typeDefinition)
5060
{
61+
codeClassTypeDefinition = typeDefinition;
5162
codeClass = new CodeClass2(codeModelContext, typeDefinition);
5263
}
5364

65+
void CaptureCodeGeneratorAddFieldAtStartParameters()
66+
{
67+
codeGenerator
68+
.Stub(generator => generator.AddFieldAtStart(
69+
Arg<ITypeDefinition>.Is.Anything,
70+
Arg<Accessibility>.Is.Anything,
71+
Arg<IType>.Is.Anything,
72+
Arg<string>.Is.Anything))
73+
.Callback<ITypeDefinition, Accessibility, IType, string>((typeDef, access, type, name) => {
74+
addFieldAtStartTypeDef = typeDef;
75+
addFieldAtStartAccess = access;
76+
addFieldAtStartReturnType = type;
77+
addFieldAtStartName = name;
78+
return true;
79+
});
80+
}
81+
5482
[Test]
5583
public void Language_CSharpProject_ReturnsCSharpModelLanguage()
5684
{
@@ -405,5 +433,92 @@ public void Members_ClassIsSystemAttributeAsReturnTypeFromClassMethod_HasMembers
405433
Assert.That(members.Count, Is.GreaterThan(0));
406434
Assert.IsTrue(members.Any(member => member.Name == "IsDefaultAttribute"));
407435
}
436+
437+
[Test]
438+
public void AddVariable_PublicSystemInt32Variable_AddsFieldWithCodeConverter()
439+
{
440+
CreateClass("class MyClass {}");
441+
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
442+
CaptureCodeGeneratorAddFieldAtStartParameters();
443+
string newCode =
444+
"class MyClass {\r\n" +
445+
" public System.Int32 MyField;\r\n" +
446+
"}";
447+
UpdateCode(newCode);
448+
449+
codeClass.AddVariable("MyField", "System.Int32", null, access, null);
450+
451+
Assert.AreEqual(Accessibility.Public, addFieldAtStartAccess);
452+
Assert.AreEqual("MyField", addFieldAtStartName);
453+
Assert.AreEqual(codeClassTypeDefinition, addFieldAtStartTypeDef);
454+
Assert.AreEqual("System.Int32", addFieldAtStartReturnType.FullName);
455+
Assert.IsTrue(addFieldAtStartReturnType.IsKnownType (KnownTypeCode.Int32));
456+
}
457+
458+
[Test]
459+
public void AddVariable_PrivateVariableOfUnknownType_AddsFieldWithCodeConverter()
460+
{
461+
CreateClass("class MyClass {}");
462+
var access = global::EnvDTE.vsCMAccess.vsCMAccessPrivate;
463+
CaptureCodeGeneratorAddFieldAtStartParameters();
464+
string newCode =
465+
"class MyClass {\r\n" +
466+
" Unknown.UnknownClass MyField;\r\n" +
467+
"}";
468+
UpdateCode(newCode);
469+
470+
codeClass.AddVariable("MyField", "Unknown.UnknownClass", null, access, null);
471+
472+
Assert.AreEqual(Accessibility.Private, addFieldAtStartAccess);
473+
Assert.AreEqual("MyField", addFieldAtStartName);
474+
Assert.AreEqual(codeClassTypeDefinition, addFieldAtStartTypeDef);
475+
Assert.AreEqual("Unknown.UnknownClass", addFieldAtStartReturnType.FullName);
476+
}
477+
478+
[Test]
479+
public void AddVariable_PublicSystemInt32Variable_ReturnsCodeVariableForField()
480+
{
481+
string fileName = @"c:\projects\MyProject\class.cs";
482+
CreateClass("class MyClass {}", fileName);
483+
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
484+
string newCode =
485+
"class MyClass {\r\n" +
486+
" public int MyField;\r\n" +
487+
"}";
488+
UpdateCode(newCode, fileName);
489+
490+
var codeVariable = codeClass.AddVariable("MyField", "System.Int32", null, access, null) as CodeVariable;
491+
492+
Assert.AreEqual("MyField", codeVariable.Name);
493+
}
494+
495+
[Test]
496+
public void AddVariable_FieldNotFoundAfterReloadingTypeDefinition_ReturnsNull()
497+
{
498+
string fileName = @"c:\projects\MyProject\class.cs";
499+
CreateClass("class MyClass {}", fileName);
500+
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
501+
string newCode = "class MyClass {}";
502+
UpdateCode(newCode, fileName);
503+
504+
var codeVariable = codeClass.AddVariable("MyField", "System.Int32", null, access, null) as CodeVariable;
505+
506+
Assert.IsNull(codeVariable);
507+
}
508+
509+
[Test]
510+
public void AddVariable_UnableToFindTypeDefinitionAfterUpdate_ReturnsNull()
511+
{
512+
string fileName = @"c:\projects\MyProject\class.cs";
513+
CreateClass("class MyClass {}", fileName);
514+
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
515+
string newCode = "class MyClass {}";
516+
UpdateCode(newCode, fileName);
517+
518+
var codeVariable = codeClass.AddVariable("MyField", "System.Int32", null, access, null) as CodeVariable;
519+
520+
Assert.IsNull(codeVariable);
521+
Assert.AreEqual("MyClass", codeClass.Name);
522+
}
408523
}
409524
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void Kind_Interface_ReturnsInterface()
7979
[Test]
8080
public void AddFunction_PublicFunctionReturningSystemInt32_AddsPublicFunctionWithCodeConverter()
8181
{
82-
CreateInterface ("interface MyInterface {}");
82+
CreateInterface("interface MyInterface {}");
8383
var kind = global::EnvDTE.vsCMFunction.vsCMFunctionFunction;
8484
var access = global::EnvDTE.vsCMAccess.vsCMAccessPublic;
8585
CaptureCodeGeneratorAddMethodAtStartParameters();

0 commit comments

Comments
 (0)