/* * Copyright 2012 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.errorprone.bugpatterns; import com.google.errorprone.CompilationTestHelper; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Tests for {@link NonOverridingEquals}. */ // TODO(eaftan): Tests for correctness of suggested fix @RunWith(JUnit4.class) public class NonOverridingEqualsTest { private CompilationTestHelper compilationHelper; @Before public void setUp() { compilationHelper = CompilationTestHelper.newInstance(NonOverridingEquals.class, getClass()); } // Positive cases @Test public void testFlagsSimpleCovariantEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains: Did you mean '@Override'", " public boolean equals(Test other) {", " return false;", " }", "}") .doTest(); } // The following two tests are really to help debug the construction of the suggested fixes. @Test public void testFlagsComplicatedCovariantEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " int i, j, k;", " // BUG: Diagnostic contains: Did you mean '@Override'", " public boolean equals(Test other) {", " if (i == other.i && j == other.j && k == other.k) {", " return true;", " }", " return false;", " }", "}") .doTest(); } @Test public void testFlagsAnotherComplicatedCovariantEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " boolean isInVersion;", " String whitelist;", " // BUG: Diagnostic contains: Did you mean '@Override'", " public boolean equals(Test that) {", " return (this.isInVersion == that.isInVersion)", " && this.whitelist.equals(that.whitelist);", " }", "}") .doTest(); } @Test public void testFlagsAbstractCovariantEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public abstract class Test {", " // BUG: Diagnostic contains: Did you mean '@Override'", " public abstract boolean equals(Test other);", "}") .doTest(); } @Test public void testFlagsNativeCovariantEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains: Did you mean '@Override'", " public native boolean equals(Test other);", "}") .doTest(); } @Test public void testFlagsIfMethodTakesUnrelatedType() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains:", " public boolean equals(Integer other) {", " return false;", " }", "}") .doTest(); } @Test public void testFlagsBoxedBooleanReturnType() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains:", " public Boolean equals(Test other) {", " return false;", " }", "}") .doTest(); } @Test public void testFlagsCovariantEqualsMethodInEnum() { compilationHelper .addSourceLines( "Planet.java", "public enum Planet {", " MERCURY,", " VENUS,", " EARTH,", " MARS,", " JUPITER,", " SATURN,", " URANUS,", " NEPTUNE;", // Pluto: never forget " // BUG: Diagnostic contains: enum instances can safely be compared by reference " + "equality", " // Did you mean to remove this line?", " public boolean equals(Planet other) {", " return this == other;", " }", "}") .doTest(); } @Test public void testFlagsPrivateEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains:", " private boolean equals(Test other) {", " return false;", " }", "}") .doTest(); } @Test public void testFlagsEvenIfAnotherMethodOverridesEquals() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains: either inline it into the callers or rename it", " private boolean equals(Test other) {", " return false;", " }", " @Override public boolean equals(Object other) {", " return false;", " }", "}") .doTest(); } /** * A static method can be invoked on an instance, so a static equals method with one argument * could be confused with Object#equals. Though I can't imagine how anyone would define a * single-argument static equals method... */ @Test public void testFlagsStaticEqualsMethod() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " // BUG: Diagnostic contains:", " public static boolean equals(Test other) {", " return false;", " }", "}") .doTest(); } // Negative cases @Test public void testDontFlagMethodThatOverridesEquals() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " @Override public boolean equals(Object other) {", " return false;", " }", "}") .doTest(); } @Test public void testDontFlagEqualsMethodWithMoreThanOneParameter() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " public boolean equals(Test other, String s) {", " return false;", " }", "}") .doTest(); } @Test public void testDontFlagIfWrongReturnType() { compilationHelper .addSourceLines( "Test.java", "public class Test {", " public int equals(Test other) {", " return -1;", " }", "}") .doTest(); } }