|
|
|
@ -15,23 +15,35 @@ namespace ICSharpCode.SharpDevelop.Dom
@@ -15,23 +15,35 @@ namespace ICSharpCode.SharpDevelop.Dom
|
|
|
|
|
{ |
|
|
|
|
class TopLevelTypeModelsTests : CSharpModelTestBase |
|
|
|
|
{ |
|
|
|
|
protected List<RemovedAndAddedPair<ITypeDefinitionModel>> topLevelChangeEventArgs; |
|
|
|
|
protected List<RemovedAndAddedPair<INamespaceModel>> namespaceChangeEventArgs; |
|
|
|
|
|
|
|
|
|
[SetUp] |
|
|
|
|
public override void SetUp() |
|
|
|
|
{ |
|
|
|
|
base.SetUp(); |
|
|
|
|
topLevelChangeEventArgs = ListenForChanges(assemblyModel.TopLevelTypeDefinitions); |
|
|
|
|
namespaceChangeEventArgs = ListenForChanges(assemblyModel.Namespaces); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void EmptyProject() |
|
|
|
|
{ |
|
|
|
|
Assert.AreEqual(0, topLevelTypeModels.Count); |
|
|
|
|
Assert.IsNull(topLevelTypeModels[new TopLevelTypeName("MissingClass")]); |
|
|
|
|
Assert.AreEqual(0, assemblyModel.TopLevelTypeDefinitions.Count); |
|
|
|
|
Assert.IsNull(assemblyModel.TopLevelTypeDefinitions[new TopLevelTypeName("MissingClass")]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#region Simple class
|
|
|
|
|
[Test] |
|
|
|
|
public void AddSimpleClass() |
|
|
|
|
{ |
|
|
|
|
AddCodeFile("test.cs", @"class SimpleClass {}"); |
|
|
|
|
Assert.AreEqual(1, topLevelTypeModels.Count); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
Assert.AreEqual(1, assemblyModel.TopLevelTypeDefinitions.Count); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
Assert.IsEmpty(topLevelChangeEventArgs.Single().OldItems); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
simpleClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().NewItems); |
|
|
|
|
simpleClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().NewItems); |
|
|
|
|
topLevelChangeEventArgs.Clear(); |
|
|
|
|
// clear for follow-up tests
|
|
|
|
|
} |
|
|
|
@ -39,10 +51,10 @@ namespace ICSharpCode.SharpDevelop.Dom
@@ -39,10 +51,10 @@ namespace ICSharpCode.SharpDevelop.Dom
|
|
|
|
|
public void UpdateSimpleClass() |
|
|
|
|
{ |
|
|
|
|
AddSimpleClass(); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
Assert.AreEqual(0, simpleClass.Members.Count); |
|
|
|
|
UpdateCodeFile("test.cs", "class SimpleClass { void Method() {} }"); |
|
|
|
|
Assert.AreSame(simpleClass, topLevelTypeModels.Single()); |
|
|
|
|
Assert.AreSame(simpleClass, assemblyModel.TopLevelTypeDefinitions.Single()); |
|
|
|
|
Assert.AreEqual(1, simpleClass.Members.Count); |
|
|
|
|
Assert.IsEmpty(topLevelChangeEventArgs); |
|
|
|
|
} |
|
|
|
@ -50,33 +62,34 @@ namespace ICSharpCode.SharpDevelop.Dom
@@ -50,33 +62,34 @@ namespace ICSharpCode.SharpDevelop.Dom
|
|
|
|
|
public void ReplaceSimpleClass() |
|
|
|
|
{ |
|
|
|
|
AddSimpleClass(); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
UpdateCodeFile("test.cs", "class OtherClass { }"); |
|
|
|
|
var otherClass = topLevelTypeModels.Single(); |
|
|
|
|
var otherClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
Assert.AreNotSame(simpleClass, otherClass); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
simpleClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().OldItems); |
|
|
|
|
simpleClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().OldItems); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
otherClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().NewItems); |
|
|
|
|
otherClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().NewItems); |
|
|
|
|
} |
|
|
|
|
[Test] |
|
|
|
|
public void RemoveSimpleClassCodeFile() |
|
|
|
|
{ |
|
|
|
|
AddSimpleClass(); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
RemoveCodeFile("test.cs"); |
|
|
|
|
Assert.IsEmpty(topLevelTypeModels); |
|
|
|
|
Assert.IsEmpty(assemblyModel.TopLevelTypeDefinitions); |
|
|
|
|
// check removal event
|
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
simpleClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().OldItems); |
|
|
|
|
simpleClass |
|
|
|
|
}, topLevelChangeEventArgs.Single().OldItems); |
|
|
|
|
Assert.IsEmpty(topLevelChangeEventArgs.Single().NewItems); |
|
|
|
|
// test that accessing properties of a removed class still works
|
|
|
|
|
Assert.AreEqual(new FullTypeName("SimpleClass"), simpleClass.FullTypeName); |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region TwoPartsInSingleFile
|
|
|
|
|
[Test] |
|
|
|
|
public void TwoPartsInSingleFile() |
|
|
|
@ -84,7 +97,7 @@ namespace ICSharpCode.SharpDevelop.Dom
@@ -84,7 +97,7 @@ namespace ICSharpCode.SharpDevelop.Dom
|
|
|
|
|
AddCodeFile("test.cs", @"
|
|
|
|
|
partial class SimpleClass { void Member1() {} } |
|
|
|
|
partial class SimpleClass { void Member2() {} }");
|
|
|
|
|
Assert.AreEqual(1, topLevelTypeModels.Count); |
|
|
|
|
Assert.AreEqual(1, assemblyModel.TopLevelTypeDefinitions.Count); |
|
|
|
|
topLevelChangeEventArgs.Clear(); |
|
|
|
|
// clear for follow-up tests
|
|
|
|
|
} |
|
|
|
@ -92,76 +105,77 @@ partial class SimpleClass { void Member2() {} }");
@@ -92,76 +105,77 @@ partial class SimpleClass { void Member2() {} }");
|
|
|
|
|
public void UpdateTwoPartsInSingleFile() |
|
|
|
|
{ |
|
|
|
|
TwoPartsInSingleFile(); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
UpdateCodeFile("test.cs", @"
|
|
|
|
|
partial class SimpleClass { void Member1b() {} } |
|
|
|
|
partial class SimpleClass { void Member2b() {} }");
|
|
|
|
|
Assert.AreSame(simpleClass, topLevelTypeModels.Single()); |
|
|
|
|
Assert.AreSame(simpleClass, assemblyModel.TopLevelTypeDefinitions.Single()); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
"Member1b", |
|
|
|
|
"Member2b" |
|
|
|
|
}, simpleClass.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
"Member1b", |
|
|
|
|
"Member2b" |
|
|
|
|
}, simpleClass.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
} |
|
|
|
|
[Test] |
|
|
|
|
public void RemoveOneOfPartsInSingleFile() |
|
|
|
|
{ |
|
|
|
|
TwoPartsInSingleFile(); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
var member1 = simpleClass.Members.First(); |
|
|
|
|
UpdateCodeFile("test.cs", "class SimpleClass { void Member1() {} }"); |
|
|
|
|
Assert.AreSame(simpleClass, topLevelTypeModels.Single()); |
|
|
|
|
Assert.AreSame(simpleClass, assemblyModel.TopLevelTypeDefinitions.Single()); |
|
|
|
|
Assert.AreSame(member1, simpleClass.Members.Single()); |
|
|
|
|
} |
|
|
|
|
[Test] |
|
|
|
|
public void RemoveBothPartsInSingleFile() |
|
|
|
|
{ |
|
|
|
|
TwoPartsInSingleFile(); |
|
|
|
|
var simpleClass = topLevelTypeModels.Single(); |
|
|
|
|
var simpleClass = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
UpdateCodeFile("test.cs", "class OtherClass {}"); |
|
|
|
|
Assert.AreNotSame(simpleClass, topLevelTypeModels.Single()); |
|
|
|
|
Assert.AreNotSame(simpleClass, assemblyModel.TopLevelTypeDefinitions.Single()); |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region TestRegionIsFromPrimaryPart
|
|
|
|
|
[Test] |
|
|
|
|
public void AddingDesignerPartDoesNotChangeRegion() |
|
|
|
|
{ |
|
|
|
|
AddCodeFile("Form.cs", "partial class MyForm {}"); |
|
|
|
|
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName); |
|
|
|
|
Assert.AreEqual("Form.cs", assemblyModel.TopLevelTypeDefinitions.Single().Region.FileName); |
|
|
|
|
AddCodeFile("Form.Designer.cs", "partial class MyForm {}"); |
|
|
|
|
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName); |
|
|
|
|
Assert.AreEqual("Form.cs", assemblyModel.TopLevelTypeDefinitions.Single().Region.FileName); |
|
|
|
|
} |
|
|
|
|
[Test] |
|
|
|
|
public void AddingPrimaryPartChangesRegion() |
|
|
|
|
{ |
|
|
|
|
AddCodeFile("Form.Designer.cs", "partial class MyForm {}"); |
|
|
|
|
Assert.AreEqual("Form.Designer.cs", topLevelTypeModels.Single().Region.FileName); |
|
|
|
|
Assert.AreEqual("Form.Designer.cs", assemblyModel.TopLevelTypeDefinitions.Single().Region.FileName); |
|
|
|
|
AddCodeFile("Form.cs", "partial class MyForm {}"); |
|
|
|
|
Assert.AreEqual("Form.cs", topLevelTypeModels.Single().Region.FileName); |
|
|
|
|
Assert.AreEqual("Form.cs", assemblyModel.TopLevelTypeDefinitions.Single().Region.FileName); |
|
|
|
|
} |
|
|
|
|
[Test] |
|
|
|
|
public void RemovingPrimaryPartChangesRegionToNextBestPart() |
|
|
|
|
{ |
|
|
|
|
AddCodeFile("Form.cs", "partial class MyForm { int primaryMember; }"); |
|
|
|
|
AddCodeFile("Form.Designer.Designer.cs", "partial class MyForm { int designer2; }"); |
|
|
|
|
var form = topLevelTypeModels.Single(); |
|
|
|
|
var form = assemblyModel.TopLevelTypeDefinitions.Single(); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
"primaryMember", |
|
|
|
|
"designer2" |
|
|
|
|
}, form.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
"primaryMember", |
|
|
|
|
"designer2" |
|
|
|
|
}, form.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
AddCodeFile("Form.Designer.cs", "partial class MyForm { int designer; }"); |
|
|
|
|
Assert.AreEqual("Form.cs", form.Region.FileName); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
"primaryMember", |
|
|
|
|
"designer", |
|
|
|
|
"designer2" |
|
|
|
|
}, form.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
"primaryMember", |
|
|
|
|
"designer", |
|
|
|
|
"designer2" |
|
|
|
|
}, form.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
RemoveCodeFile("Form.cs"); |
|
|
|
|
Assert.AreSame(form, topLevelTypeModels.Single()); |
|
|
|
|
Assert.AreSame(form, assemblyModel.TopLevelTypeDefinitions.Single()); |
|
|
|
|
Assert.AreEqual("Form.Designer.cs", form.Region.FileName); |
|
|
|
|
Assert.AreEqual(new[] { |
|
|
|
|
"designer", |
|
|
|
|
"designer2" |
|
|
|
|
}, form.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
"designer", |
|
|
|
|
"designer2" |
|
|
|
|
}, form.Members.Select(m => m.Name).ToArray()); |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
} |
|
|
|
|