@@ -623,5 +623,281 @@ public override int GetHashCode()
623623 VerifyDiagnostic ( original , string . Format ( ImplementEqualsAndGetHashCodeAnalyzer . Rule . MessageFormat . ToString ( ) , "MyClass" ) ) ;
624624 VerifyFix ( original , result ) ;
625625 }
626+
627+ [ TestMethod ]
628+ public void ImplementEqualsAndGetHashCode_ClassDoesNotImplementEither_HasBaseClassImplementingEquals_HasInterface ( )
629+ {
630+ var original = @"
631+ namespace ConsoleApplication1
632+ {
633+ interface IClass { }
634+
635+ class MyBaseClass
636+ {
637+ public override bool Equals(object obj) => true;
638+ }
639+
640+ class MyClass : MyBaseClass, IClass
641+ {
642+ string _foo = ""test"";
643+ static string _bar = ""test"";
644+ }
645+ }" ;
646+
647+ var result = @"
648+ namespace ConsoleApplication1
649+ {
650+ interface IClass { }
651+
652+ class MyBaseClass
653+ {
654+ public override bool Equals(object obj) => true;
655+ }
656+
657+ class MyClass : MyBaseClass, IClass
658+ {
659+ string _foo = ""test"";
660+ static string _bar = ""test"";
661+
662+ public override bool Equals(object obj)
663+ {
664+ if (obj == null || typeof(MyClass) != obj.GetType())
665+ {
666+ return false;
667+ }
668+
669+ var value = (MyClass)obj;
670+ return base.Equals(obj) &&
671+ _foo == value._foo;
672+ }
673+
674+ public override int GetHashCode()
675+ {
676+ return _foo.GetHashCode();
677+ }
678+ }
679+ }" ;
680+
681+ VerifyDiagnostic ( original , string . Format ( ImplementEqualsAndGetHashCodeAnalyzer . Rule . MessageFormat . ToString ( ) , "MyClass" ) ) ;
682+ VerifyFix ( original , result ) ;
683+ }
684+
685+ [ TestMethod ]
686+ public void ImplementEqualsAndGetHashCode_StructDoesNotImplementEither_ImplementsInterface ( )
687+ {
688+ var original = @"
689+ namespace ConsoleApplication1
690+ {
691+ interface IStruct { }
692+
693+ struct MyStruct : IStruct
694+ {
695+ string _foo;
696+ static string _bar;
697+ }
698+ }" ;
699+
700+ var result = @"
701+ namespace ConsoleApplication1
702+ {
703+ interface IStruct { }
704+
705+ struct MyStruct : IStruct
706+ {
707+ string _foo;
708+ static string _bar;
709+
710+ public override bool Equals(object obj)
711+ {
712+ if (obj == null || typeof(MyStruct) != obj.GetType())
713+ {
714+ return false;
715+ }
716+
717+ var value = (MyStruct)obj;
718+ return _foo == value._foo;
719+ }
720+
721+ public override int GetHashCode()
722+ {
723+ return _foo.GetHashCode();
724+ }
725+ }
726+ }" ;
727+
728+ VerifyDiagnostic ( original , string . Format ( ImplementEqualsAndGetHashCodeAnalyzer . Rule . MessageFormat . ToString ( ) , "MyStruct" ) ) ;
729+ VerifyFix ( original , result ) ;
730+ }
731+
732+ [ TestMethod ]
733+ public void ImplementEqualsAndGetHashCode_ClassDoesNotImplementEither_HasBaseClassImplementingEquals_BaseClassHasField ( )
734+ {
735+ var original = @"
736+ namespace ConsoleApplication1
737+ {
738+ class MyBaseClass
739+ {
740+ public string foo;
741+ public override bool Equals(object obj) => true;
742+ }
743+
744+ class MyClass : MyBaseClass
745+ {
746+ string _foo = ""test"";
747+ static string _bar = ""test"";
748+ }
749+ }" ;
750+
751+ var result = @"
752+ namespace ConsoleApplication1
753+ {
754+ class MyBaseClass
755+ {
756+ public string foo;
757+ public override bool Equals(object obj) => true;
758+ }
759+
760+ class MyClass : MyBaseClass
761+ {
762+ string _foo = ""test"";
763+ static string _bar = ""test"";
764+
765+ public override bool Equals(object obj)
766+ {
767+ if (obj == null || typeof(MyClass) != obj.GetType())
768+ {
769+ return false;
770+ }
771+
772+ var value = (MyClass)obj;
773+ return base.Equals(obj) &&
774+ _foo == value._foo;
775+ }
776+
777+ public override int GetHashCode()
778+ {
779+ return _foo.GetHashCode();
780+ }
781+ }
782+ }" ;
783+
784+ VerifyDiagnostic ( original , string . Format ( ImplementEqualsAndGetHashCodeAnalyzer . Rule . MessageFormat . ToString ( ) , "MyClass" ) ) ;
785+ VerifyFix ( original , result ) ;
786+ }
787+
788+ [ TestMethod ]
789+ public void ImplementEqualsAndGetHashCode_ClassDoesNotImplementEither_HasBaseClassNotImplementingEquals ( )
790+ {
791+ var original = @"
792+ namespace ConsoleApplication1
793+ {
794+ class MyBaseClass
795+ {
796+ public string foo;
797+ public override int GetHashCode() => 1; // disable analyzer for this
798+ }
799+
800+ class MyClass : MyBaseClass
801+ {
802+ string _foo = ""test"";
803+ static string _bar = ""test"";
804+ }
805+ }" ;
806+
807+ var result = @"
808+ namespace ConsoleApplication1
809+ {
810+ class MyBaseClass
811+ {
812+ public string foo;
813+ public override int GetHashCode() => 1; // disable analyzer for this
814+ }
815+
816+ class MyClass : MyBaseClass
817+ {
818+ string _foo = ""test"";
819+ static string _bar = ""test"";
820+
821+ public override bool Equals(object obj)
822+ {
823+ if (obj == null || typeof(MyClass) != obj.GetType())
824+ {
825+ return false;
826+ }
827+
828+ var value = (MyClass)obj;
829+ return _foo == value._foo;
830+ }
831+
832+ public override int GetHashCode()
833+ {
834+ return _foo.GetHashCode();
835+ }
836+ }
837+ }" ;
838+
839+ VerifyDiagnostic ( original , string . Format ( ImplementEqualsAndGetHashCodeAnalyzer . Rule . MessageFormat . ToString ( ) , "MyClass" ) ) ;
840+ VerifyFix ( original , result ) ;
841+ }
842+
843+ [ TestMethod ]
844+ public void ImplementEqualsAndGetHashCode_ClassDoesImplementsEquals_OverridesPropertyInBaseClass ( )
845+ {
846+ var original = @"
847+ namespace ConsoleApplication1
848+ {
849+ class MyBaseClass
850+ {
851+ public virtual string Bar { get; set; }
852+ public override bool Equals(object obj) => true;
853+ }
854+
855+ class MyClass : MyBaseClass
856+ {
857+ string _foo = ""test"";
858+ static string _bar = ""test"";
859+ public override string Bar { get; set; }
860+ }
861+ }" ;
862+
863+ var result = @"
864+ namespace ConsoleApplication1
865+ {
866+ class MyBaseClass
867+ {
868+ public virtual string Bar { get; set; }
869+ public override bool Equals(object obj) => true;
870+ }
871+
872+ class MyClass : MyBaseClass
873+ {
874+ string _foo = ""test"";
875+ static string _bar = ""test"";
876+ public override string Bar { get; set; }
877+
878+ public override bool Equals(object obj)
879+ {
880+ if (obj == null || typeof(MyClass) != obj.GetType())
881+ {
882+ return false;
883+ }
884+
885+ var value = (MyClass)obj;
886+ return base.Equals(obj) &&
887+ _foo == value._foo &&
888+ Bar == value.Bar;
889+ }
890+
891+ public override int GetHashCode()
892+ {
893+ return _foo.GetHashCode() ^
894+ Bar.GetHashCode();
895+ }
896+ }
897+ }" ;
898+
899+ VerifyDiagnostic ( original , string . Format ( ImplementEqualsAndGetHashCodeAnalyzer . Rule . MessageFormat . ToString ( ) , "MyClass" ) ) ;
900+ VerifyFix ( original , result ) ;
901+ }
626902 }
627903}
0 commit comments