/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * 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 org.jetbrains.generate.tostring.inspection;

import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NonNls;

/**
 * @author Bas Leijdekkers
 */
public class FieldNotUsedInToStringInspectionTest extends LightCodeInsightFixtureTestCase {

  public void testBasic() {
    doTest("class X {" +
           "  private int <warning descr=\"Field 'i' is not used in 'toString()' method\">i</warning> = 0;" +
           "  public String toString() {" +
           "    return null;" +
           "  }" +
           "}");
  }

  public void testGetterUsed() {
    doTest(" class ToStringTest3 {" +
           "" +
           "    int number;" +
           "" +
           "    public int getNumber() {" +
           "        return number;" +
           "    }" +
           "" +
           "    @Override" +
           "    public String toString() {" +
           "        final StringBuilder sb = new StringBuilder();" +
           "        sb.append(\"ToStringTest3\");" +
           "        sb.append(\"{number=\").append(getNumber());" +
           "        sb.append('}');" +
           "        return sb.toString();" +
           "    }" +
           "}");
  }

  public void testReflectionUsed() {
    myFixture.addClass("package java.util;" +
                       "public class Objects {" +
                       "  public static String toString(Object object) {" +
                       "    return null;" +
                       "  }" +
                       "}");
    doTest("import java.util.Objects;" +
           "class X {" +
           "  private int i = 0;" +
           "  " +
           "  public String toString() {" +
           "    return Objects.toString(this);" +
           "  }" +
           "}");
  }

  private void doTest(@NonNls String text) {
    myFixture.configureByText("X.java", text);
    myFixture.enableInspections(new FieldNotUsedInToStringInspection());
    myFixture.testHighlighting(true, false, false);
  }
}
