using System; using System.Globalization; using JetBrains.ProjectModel; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Util; using JetBrains.ReSharper.UnitTestExplorer; namespace MbUnit.ReSharperRunner.Elements { public class MbUnitTestElement : MbUnitTestElementBase, IEquatable { private readonly MbUnitTestFixtureElement fixture; private readonly string methodName; private readonly string testType; public MbUnitTestElement(IUnitTestProvider provider, MbUnitTestFixtureElement fixture, IProjectModelElement project, string declaringTypeName, string methodName, string testType) : base(provider, fixture, project, declaringTypeName) { this.fixture = fixture; this.methodName = methodName; this.testType = testType; } public MbUnitTestElement(IUnitTestProvider provider, UnitTestElement parent, MbUnitTestFixtureElement fixture, IProjectModelElement project, string declaringTypeName, string methodName, string testType) : base(provider, parent, project, declaringTypeName) { this.fixture = fixture; this.methodName = methodName; this.testType = testType; } public MbUnitTestFixtureElement Fixture { get { return fixture; } } public string MethodName { get { return methodName; } } #region IEquatable Members public bool Equals(MbUnitTestElement mbUnitTestElement) { if (mbUnitTestElement == null) { return false; } if (!base.Equals(mbUnitTestElement)) { return false; } if (!Equals(fixture, mbUnitTestElement.fixture)) { return false; } if (!Equals(methodName, mbUnitTestElement.methodName)) { return false; } return true; } #endregion public override string GetTitle() { return string.Format("{0}.{1}", fixture.GetTitle(), methodName); } public override IDeclaredElement GetDeclaredElement() { ITypeElement declaredType = GetDeclaredType(); if (declaredType != null) { foreach (ITypeMember member in MiscUtil.EnumerateMembers(declaredType, methodName, true)) { IMethod method = member as IMethod; if (((method != null) && !method.IsAbstract)) { return member; } } } return null; } public override string GetKind() { if (testType.EndsWith("Attribute", true,CultureInfo.InvariantCulture)) { return string.Format("MbUnit {0}", testType.Substring(0, testType.Length - "Attribute".Length)); } return testType; } public override bool Matches(string filter) { return (Fixture.Matches(filter) || (MethodName.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) != -1)); } public override bool Equals(object obj) { if (ReferenceEquals(this, obj)) { return true; } return Equals(obj as MbUnitTestElement); } public override int GetHashCode() { int result = base.GetHashCode(); result = 29 * result + (fixture != null ? fixture.GetHashCode() : 0); result = 29 * result + (methodName != null ? methodName.GetHashCode() : 0); return result; } public override string ToString() { return MethodName; } public string AssemblyLocation { get { return fixture.AssemblyLocation; } } } }