//
//
//
//
// $Revision$
//
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Reflection;
using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.DefaultEditor.Commands;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.CSharp;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.Utils;
using NUnit.Framework;
namespace ICSharpCode.SharpDevelop.Tests
{
///
/// SD2-1199. Tests the available overrides for the
/// System.Collections.ObjectModel.Collection class.
///
[TestFixture]
public class CollectionClassOverridesTestFixture
{
[TestFixtureSetUp]
public void SetUpFixture()
{
if (!PropertyService.Initialized) {
PropertyService.InitializeService(String.Empty, String.Empty, String.Empty);
}
}
///
/// This shows how to get the list of overridable methods in the
/// Collection class using reflection only.
///
public void GetMethodsThroughReflection()
{
Assembly a = Assembly.Load("mscorlib");
Type t = a.GetType("System.Collections.ObjectModel.Collection`1");
List methodNames = new List();
BindingFlags bindingFlags = BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.DeclaredOnly |
BindingFlags.Public;
foreach (MethodInfo m in t.GetMethods(bindingFlags)) {
if (m.IsVirtual && !m.IsSpecialName && !m.IsFinal) {
methodNames.Add(m.Name);
}
}
List expectedMethodNames = new List();
expectedMethodNames.Add("ClearItems");
expectedMethodNames.Add("InsertItem");
expectedMethodNames.Add("RemoveItem");
expectedMethodNames.Add("SetItem");
StringBuilder sb = new StringBuilder();
foreach (string s in methodNames.ToArray()) {
sb.AppendLine(s);
}
Assert.AreEqual(expectedMethodNames.ToArray(), methodNames.ToArray(), sb.ToString());
}
///
/// Tests that the IsSealed property is set for methods that are
/// flagged as final. The ReflectionMethod class was not setting
/// this correctly.
///
[Test]
public void ExpectedMethodsFromProjectContent()
{
ProjectContentRegistry registry = new ProjectContentRegistry();
IProjectContent mscorlibProjectContent = registry.Mscorlib;
IClass c = mscorlibProjectContent.GetClass("System.Collections.ObjectModel.Collection");
List methodNames = new List();
foreach (IMethod m in c.Methods) {
if (m.IsVirtual && !m.IsSealed) {
methodNames.Add(m.Name);
}
}
List expectedMethodNames = new List();
expectedMethodNames.Add("ClearItems");
expectedMethodNames.Add("InsertItem");
expectedMethodNames.Add("RemoveItem");
expectedMethodNames.Add("SetItem");
methodNames.Sort();
expectedMethodNames.Sort();
Assert.AreEqual(expectedMethodNames.ToArray(), methodNames.ToArray());
}
///
/// Tests that the OverrideMethodsCodeGenerator returns the correct
/// methods for the System.Collections.ObjectModel.Collection type.
///
[Test]
public void CodeGeneratorMethods()
{
ProjectContentRegistry registry = new ProjectContentRegistry();
IProjectContent mscorlibProjectContent = registry.Mscorlib;
IClass collectionClass = mscorlibProjectContent.GetClass("System.Collections.ObjectModel.Collection");
DefaultProjectContent projectContent = new DefaultProjectContent();
DefaultCompilationUnit unit = new DefaultCompilationUnit(projectContent);
DefaultClass c = new DefaultClass(unit, "MyCollection");
c.BaseTypes.Add(new DefaultReturnType(collectionClass));
MockProject project = new MockProject();
ProjectService.CurrentProject = project;
OverrideMethodsCodeGenerator codeGenerator = new OverrideMethodsCodeGenerator();
codeGenerator.Initialize(c);
List methods = new List();
foreach (object o in codeGenerator.Content) {
methods.Add(o.ToString());
}
List expectedMethods = new List();
expectedMethods.Add("ClearItems");
expectedMethods.Add("Equals");
expectedMethods.Add("Finalize");
expectedMethods.Add("GetHashCode");
expectedMethods.Add("InsertItem");
expectedMethods.Add("RemoveItem");
expectedMethods.Add("SetItem");
expectedMethods.Add("ToString");
Assert.AreEqual(expectedMethods.ToArray(), methods.ToArray());
}
}
}