Skip to content

Commit 30afa7e

Browse files
committed
Added two failing tests and resolutions
1 parent 9d0fcb2 commit 30afa7e

File tree

6 files changed

+109
-18
lines changed

6 files changed

+109
-18
lines changed

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldValidator.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ private List<string> PotentialConflictIdentifiers(IEncapsulateFieldCandidate can
9393
var members = DeclarationFinder.Members(candidate.QualifiedModuleName)
9494
.Where(d => d != candidate.Declaration);
9595

96+
if (candidate.ConvertFieldToUDTMember)
97+
{
98+
var membersToRemove = FieldCandidates.Where(fc => fc.EncapsulateFlag && fc.Declaration.DeclarationType.HasFlag(DeclarationType.Variable))
99+
.Select(fc => fc.Declaration);
100+
101+
members = members.Except(membersToRemove);
102+
}
103+
96104
var nameConflictCandidates = members
97105
.Where(d => !IsAlwaysIgnoreNameConflictType(d, declarationType)).ToList();
98106

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/EncapsulateFieldCandidate.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ protected virtual bool TryValidateAsUDTMemberEncapsulationAttributes(out string
139139
{
140140
return false;
141141
}
142+
143+
if (!TryValidateEncapsulationAttributes(DeclarationType.Property, out errorMessage, isArray))
144+
{
145+
return false;
146+
}
147+
142148
return TryValidateEncapsulationAttributes(Declaration.DeclarationType, out errorMessage, isArray);
143149
}
144150

@@ -161,6 +167,7 @@ protected bool TryValidateEncapsulationAttributes(DeclarationType declarationTyp
161167
{
162168
return false;
163169
}
170+
164171
return true;
165172
}
166173

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/ObjectStateUDT.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public ObjectStateUDT(IUserDefinedTypeCandidate udt)
4444

4545
FieldIdentifier = udt.IdentifierName;
4646
_wrappedUDT = udt;
47-
udt.EncapsulateFlag = false;
4847
_hashCode = ($"{_qmn.Name}.{_wrappedUDT.IdentifierName}").GetHashCode();
4948
}
5049

@@ -65,7 +64,19 @@ private ObjectStateUDT(string typeIdentifier)
6564

6665
public string AsTypeName => _wrappedUDT?.AsTypeName ?? TypeIdentifier;
6766

68-
public bool IsSelected { set; get; }
67+
private bool _isSelected;
68+
public bool IsSelected
69+
{
70+
set
71+
{
72+
_isSelected = value;
73+
if (_isSelected && IsExistingDeclaration)
74+
{
75+
_wrappedUDT.EncapsulateFlag = false;
76+
}
77+
}
78+
get => _isSelected;
79+
}
6980

7081
public IEnumerable<IUserDefinedTypeMemberCandidate> ExistingMembers
7182
{

RubberduckTests/Refactoring/EncapsulateField/EncapsulateFieldValidatorTests.cs

Lines changed: 71 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,7 @@ End Property
155155

156156
var presenterAction = Support.SetParameters(userInput);
157157

158-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
159-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, fieldUT, DeclarationType.Variable, presenterAction);
158+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, fieldUT, DeclarationType.Variable, presenterAction);
160159

161160
Assert.IsFalse(model["fizz"].TryValidateEncapsulationAttributes(out _));
162161
}
@@ -188,8 +187,7 @@ Public Property Get Test() As Integer
188187

189188
var presenterAction = Support.SetParameters(userInput);
190189

191-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
192-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, fieldUT, DeclarationType.Variable, presenterAction);
190+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, fieldUT, DeclarationType.Variable, presenterAction);
193191

194192
Assert.AreEqual(fizz_expectedResult, model["fizz"].TryValidateEncapsulationAttributes(out _), "fizz failed");
195193
Assert.AreEqual(bazz_expectedResult, model["bazz"].TryValidateEncapsulationAttributes(out _), "bazz failed");
@@ -221,8 +219,7 @@ End Type
221219

222220
var presenterAction = Support.SetParameters(userInput);
223221

224-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
225-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, fieldUT, DeclarationType.Variable, presenterAction);
222+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, fieldUT, DeclarationType.Variable, presenterAction);
226223

227224
Assert.AreEqual(true, model[fieldUT].TryValidateEncapsulationAttributes(out var message), message);
228225
}
@@ -244,8 +241,7 @@ Public wholeNumber As String
244241

245242
var presenterAction = Support.SetParameters(userInput);
246243

247-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
248-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, fieldUT, DeclarationType.Variable, presenterAction);
244+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, fieldUT, DeclarationType.Variable, presenterAction);
249245

250246
Assert.AreEqual(false, model[fieldUT].TryValidateEncapsulationAttributes(out _));
251247
}
@@ -310,8 +306,7 @@ public void DefaultPropertyNameConflictsResolved()
310306

311307
var presenterAction = Support.UserAcceptsDefaults(fieldUT, "strTest");
312308

313-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
314-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, fieldUT, DeclarationType.Variable, presenterAction);
309+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, fieldUT, DeclarationType.Variable, presenterAction);
315310

316311
Assert.AreEqual(true, model[fieldUT].TryValidateEncapsulationAttributes(out var errorMsg), errorMsg);
317312
}
@@ -363,8 +358,7 @@ End Function
363358

364359
var presenterAction = Support.SetParameters(userInput);
365360

366-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
367-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, fieldUT, DeclarationType.Variable, presenterAction);
361+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, fieldUT, DeclarationType.Variable, presenterAction);
368362

369363
Assert.AreEqual(false, model[fieldUT].TryValidateEncapsulationAttributes(out _));
370364
}
@@ -521,6 +515,71 @@ public void UDTReservedMemberArrayIdentifier()
521515
Assert.AreEqual(false, model[fieldName].TryValidateEncapsulationAttributes(out var message), message);
522516
}
523517

518+
[Test]
519+
[Category("Refactorings")]
520+
[Category("Encapsulate Field")]
521+
public void UserEntersUDTMemberPropertyNameInConflictWithExistingField()
522+
{
523+
const string inputCode =
524+
@"
525+
526+
Private Type TVehicle
527+
Wheels As Integer
528+
MPG As Double
529+
End Type
530+
531+
Private vehicle As TVehicle
532+
533+
Private seats As Integer
534+
535+
Private foo As String
536+
";
537+
var userInput = new UserInputDataObject()
538+
.UserSelectsField("seats", "Foo");
539+
540+
userInput.ConvertFieldsToUDTMembers = true;
541+
userInput.ObjectStateUDTTargetID = "TVehicle";
542+
543+
var presenterAction = Support.SetParameters(userInput);
544+
545+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, "seats", DeclarationType.Variable, presenterAction);
546+
Assert.AreEqual(false, model["seats"].TryValidateEncapsulationAttributes(out var errorMessage), errorMessage);
547+
}
548+
549+
[Test]
550+
[Category("Refactorings")]
551+
[Category("Encapsulate Field")]
552+
public void UserClearsConflictingNameByEncapsulatingConflictingVariable()
553+
{
554+
const string inputCode =
555+
@"
556+
557+
Private Type TVehicle
558+
Wheels As Integer
559+
MPG As Double
560+
End Type
561+
562+
Private mVehicle As TVehicle
563+
564+
Private seats As Integer
565+
566+
Private foo As String
567+
";
568+
//By encapsulating variable mVehicle, the variable disappears and
569+
//is converted to UDTMember name "Vehicle" and "Vehicle" properties
570+
// - thus removing the conflict created by the user editing the "seats" property
571+
var userInput = new UserInputDataObject()
572+
.UserSelectsField("seats", "MVehicle")
573+
.UserSelectsField("mVehicle");
574+
575+
userInput.ConvertFieldsToUDTMembers = true;
576+
577+
var presenterAction = Support.SetParameters(userInput);
578+
579+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, "seats", DeclarationType.Variable, presenterAction);
580+
Assert.AreEqual(true, model["seats"].TryValidateEncapsulationAttributes(out var errorMessage), errorMessage);
581+
}
582+
524583
protected override IRefactoring TestRefactoring(IRewritingManager rewritingManager, RubberduckParserState state, IRefactoringPresenterFactory factory, ISelectionService selectionService)
525584
{
526585
return Support.SupportTestRefactoring(rewritingManager, state, factory, selectionService);

RubberduckTests/Refactoring/EncapsulateField/EncapsulateUsingStateUDTTests.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,7 @@ Public myBar As TBar
281281
userInput.EncapsulateUsingUDTField();
282282

283283
var presenterAction = Support.SetParameters(userInput);
284-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
285-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, "myBar", DeclarationType.Variable, presenterAction);
284+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, "myBar", DeclarationType.Variable, presenterAction);
286285

287286
Assert.AreEqual(1, model.ObjectStateUDTCandidates.Count());
288287
}
@@ -431,8 +430,7 @@ Private mFizz
431430

432431
var presenterAction = Support.SetParameters(userInput);
433432

434-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
435-
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(vbe, "mFizz", DeclarationType.Variable, presenterAction);
433+
var model = Support.RetrieveUserModifiedModelPriorToRefactoring(inputCode, "mFizz", DeclarationType.Variable, presenterAction);
436434
var test = model.ObjectStateUDTCandidates;
437435

438436
Assert.AreEqual(2, model.ObjectStateUDTCandidates.Count());

RubberduckTests/Refactoring/EncapsulateField/TestSupport.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ public IEncapsulateFieldCandidate RetrieveEncapsulateFieldCandidate(IVBE vbe, st
139139
}
140140
}
141141

142+
143+
144+
public EncapsulateFieldModel RetrieveUserModifiedModelPriorToRefactoring(string inputCode, string declarationName, DeclarationType declarationType, Func<EncapsulateFieldModel, EncapsulateFieldModel> presenterAdjustment)
145+
{
146+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _).Object;
147+
return RetrieveUserModifiedModelPriorToRefactoring(vbe, declarationName, declarationType, presenterAdjustment);
148+
}
149+
142150
public EncapsulateFieldModel RetrieveUserModifiedModelPriorToRefactoring(IVBE vbe, string declarationName, DeclarationType declarationType, Func<EncapsulateFieldModel, EncapsulateFieldModel> presenterAdjustment)
143151
{
144152
var (state, rewritingManager) = MockParser.CreateAndParseWithRewritingManager(vbe);

0 commit comments

Comments
 (0)