Skip to content

Commit 5c8acb2

Browse files
committed
Fix failing tests. Add more.
1 parent 808f3a8 commit 5c8acb2

File tree

2 files changed

+202
-14
lines changed

2 files changed

+202
-14
lines changed

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerItemViewModel.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,20 @@ public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewMod
2828

2929
public class CompareByType : Comparer<CodeExplorerItemViewModel>
3030
{
31-
private static Dictionary<DeclarationType, int> _sortOrder = new Dictionary<DeclarationType, int>
31+
private static readonly Dictionary<DeclarationType, int> SortOrder = new Dictionary<DeclarationType, int>
3232
{
3333
{DeclarationType.LibraryFunction, 0},
3434
{DeclarationType.LibraryProcedure, 1},
3535
{DeclarationType.UserDefinedType, 2},
3636
{DeclarationType.Enumeration, 3},
3737
{DeclarationType.Event, 4},
38-
{DeclarationType.Variable, 5},
39-
{DeclarationType.PropertyGet, 6},
40-
{DeclarationType.PropertyLet, 7},
41-
{DeclarationType.PropertySet, 8},
42-
{DeclarationType.Function, 9},
43-
{DeclarationType.Procedure, 10}
38+
{DeclarationType.Constant, 5},
39+
{DeclarationType.Variable, 6},
40+
{DeclarationType.PropertyGet, 7},
41+
{DeclarationType.PropertyLet, 8},
42+
{DeclarationType.PropertySet, 9},
43+
{DeclarationType.Function, 10},
44+
{DeclarationType.Procedure, 11}
4445
};
4546

4647
public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewModel y)
@@ -69,7 +70,15 @@ public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewMod
6970
// keep separate types separate
7071
if (xNode.Declaration.DeclarationType != yNode.Declaration.DeclarationType)
7172
{
72-
return _sortOrder[xNode.Declaration.DeclarationType] < _sortOrder[yNode.Declaration.DeclarationType] ? -1 : 1;
73+
int xValue, yValue;
74+
75+
if (SortOrder.TryGetValue(xNode.Declaration.DeclarationType, out xValue) &&
76+
SortOrder.TryGetValue(yNode.Declaration.DeclarationType, out yValue))
77+
{
78+
return xValue < yValue ? -1 : 1;
79+
}
80+
81+
return xNode.Declaration.DeclarationType < yNode.Declaration.DeclarationType ? -1 : 1;
7382
}
7483

7584
// keep types with different icons and the same declaration type (document/class module) separate

RubberduckTests/CodeExplorer/CodeExplorerTests.cs

Lines changed: 185 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,13 +1038,192 @@ public void CompareByType_ReturnsZeroForErrorNodes()
10381038
}
10391039

10401040
[TestMethod]
1041-
public void CompareByType_ReturnsFieldBelowSub()
1041+
public void CompareByType_ReturnsEventAboveConst()
10421042
{
10431043
var inputCode =
1044-
@"Public Foo As Boolean
1044+
@"Public Event Foo(ByVal arg1 As Integer, ByVal arg2 As String)
1045+
Public Const Bar = 0";
10451046

1046-
Sub Bar()
1047-
End Sub";
1047+
var builder = new MockVbeBuilder();
1048+
VBComponent component;
1049+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1050+
var mockHost = new Mock<IHostApplication>();
1051+
mockHost.SetupAllProperties();
1052+
1053+
var state = new RubberduckParserState();
1054+
var commands = new List<ICommand>();
1055+
1056+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1057+
1058+
var parser = MockParser.Create(vbe.Object, state);
1059+
parser.Parse();
1060+
1061+
var eventNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo");
1062+
var constNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar = 0");
1063+
1064+
Assert.AreEqual(-1, new CompareByType().Compare(eventNode, constNode));
1065+
}
1066+
1067+
[TestMethod]
1068+
public void CompareByType_ReturnsConstAboveField()
1069+
{
1070+
var inputCode =
1071+
@"Public Const Foo = 0
1072+
Public Bar As Boolean";
1073+
1074+
var builder = new MockVbeBuilder();
1075+
VBComponent component;
1076+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1077+
var mockHost = new Mock<IHostApplication>();
1078+
mockHost.SetupAllProperties();
1079+
1080+
var state = new RubberduckParserState();
1081+
var commands = new List<ICommand>();
1082+
1083+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1084+
1085+
var parser = MockParser.Create(vbe.Object, state);
1086+
parser.Parse();
1087+
1088+
var constNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo = 0");
1089+
var fieldNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1090+
1091+
Assert.AreEqual(-1, new CompareByType().Compare(constNode, fieldNode));
1092+
}
1093+
1094+
[TestMethod]
1095+
public void CompareByType_ReturnsFieldAbovePropertyGet()
1096+
{
1097+
var inputCode =
1098+
@"Private Bar As Boolean
1099+
1100+
Public Property Get Foo() As Variant
1101+
End Property
1102+
";
1103+
1104+
var builder = new MockVbeBuilder();
1105+
VBComponent component;
1106+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1107+
var mockHost = new Mock<IHostApplication>();
1108+
mockHost.SetupAllProperties();
1109+
1110+
var state = new RubberduckParserState();
1111+
var commands = new List<ICommand>();
1112+
1113+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1114+
1115+
var parser = MockParser.Create(vbe.Object, state);
1116+
parser.Parse();
1117+
1118+
var fieldNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1119+
var propertyGetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Get)");
1120+
1121+
Assert.AreEqual(-1, new CompareByType().Compare(fieldNode, propertyGetNode));
1122+
}
1123+
1124+
[TestMethod]
1125+
public void CompareByType_ReturnsPropertyGetAbovePropertyLet()
1126+
{
1127+
var inputCode =
1128+
@"Public Property Get Foo() As Variant
1129+
End Property
1130+
1131+
Public Property Let Foo(ByVal Value As Variant)
1132+
End Property
1133+
";
1134+
1135+
var builder = new MockVbeBuilder();
1136+
VBComponent component;
1137+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1138+
var mockHost = new Mock<IHostApplication>();
1139+
mockHost.SetupAllProperties();
1140+
1141+
var state = new RubberduckParserState();
1142+
var commands = new List<ICommand>();
1143+
1144+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1145+
1146+
var parser = MockParser.Create(vbe.Object, state);
1147+
parser.Parse();
1148+
1149+
var propertyGetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Get)");
1150+
var propertyLetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Let)");
1151+
1152+
Assert.AreEqual(-1, new CompareByType().Compare(propertyGetNode, propertyLetNode));
1153+
}
1154+
1155+
[TestMethod]
1156+
public void CompareByType_ReturnsPropertyLetAbovePropertySet()
1157+
{
1158+
var inputCode =
1159+
@"Public Property Let Foo(ByVal Value As Variant)
1160+
End Property
1161+
1162+
Public Property Set Foo(ByVal Value As Variant)
1163+
End Property
1164+
";
1165+
1166+
var builder = new MockVbeBuilder();
1167+
VBComponent component;
1168+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1169+
var mockHost = new Mock<IHostApplication>();
1170+
mockHost.SetupAllProperties();
1171+
1172+
var state = new RubberduckParserState();
1173+
var commands = new List<ICommand>();
1174+
1175+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1176+
1177+
var parser = MockParser.Create(vbe.Object, state);
1178+
parser.Parse();
1179+
1180+
var propertyLetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Let)");
1181+
var propertySetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Set)");
1182+
1183+
Assert.AreEqual(-1, new CompareByType().Compare(propertyLetNode, propertySetNode));
1184+
}
1185+
1186+
[TestMethod]
1187+
public void CompareByType_ReturnsPropertySetAboveFunction()
1188+
{
1189+
var inputCode =
1190+
@"Public Property Set Foo(ByVal Value As Variant)
1191+
End Property
1192+
1193+
Public Function Bar() As Boolean
1194+
End Function
1195+
";
1196+
1197+
var builder = new MockVbeBuilder();
1198+
VBComponent component;
1199+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1200+
var mockHost = new Mock<IHostApplication>();
1201+
mockHost.SetupAllProperties();
1202+
1203+
var state = new RubberduckParserState();
1204+
var commands = new List<ICommand>();
1205+
1206+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1207+
1208+
var parser = MockParser.Create(vbe.Object, state);
1209+
parser.Parse();
1210+
1211+
var propertySetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Set)");
1212+
var functionNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1213+
1214+
Assert.AreEqual(-1, new CompareByType().Compare(propertySetNode, functionNode));
1215+
}
1216+
1217+
[TestMethod]
1218+
public void CompareByType_ReturnsFunctionAboveSub()
1219+
{
1220+
var inputCode =
1221+
@"Public Function Foo() As Boolean
1222+
End Function
1223+
1224+
Public Sub Bar()
1225+
End Sub
1226+
";
10481227

10491228
var builder = new MockVbeBuilder();
10501229
VBComponent component;
@@ -1060,10 +1239,10 @@ Sub Bar()
10601239
var parser = MockParser.Create(vbe.Object, state);
10611240
parser.Parse();
10621241

1242+
var functionNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo");
10631243
var subNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1064-
var fieldNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo");
10651244

1066-
Assert.AreEqual(-1, new CompareByType().Compare(subNode, fieldNode));
1245+
Assert.AreEqual(-1, new CompareByType().Compare(functionNode, subNode));
10671246
}
10681247

10691248
[TestMethod]

0 commit comments

Comments
 (0)