/*
 * 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 com.siyeh.ig.classlayout;

import com.intellij.codeInspection.InspectionProfileEntry;
import com.siyeh.ig.LightInspectionTestCase;

/**
 * @author Bas Leijdekkers
 */
public class InterfaceMayBeAnnotatedFunctionalInspectionTest extends LightInspectionTestCase {

  public void testSimple() {
    doTest("interface /*Interface 'Simple' may be annotated with @FunctionalInterface*/Simple/**/ {" +
           "  void f();" +
           "}");
  }

  public void testLessSimple() {
    doTest("interface /*Interface 'F' may be annotated with @FunctionalInterface*/F/**/  {" +
           "    boolean equals(Object o);" +
           "    static void f00() {}\n" +
           "    default void g() {}\n" +
           "    void f();\n" +
           "}");
  }

  public void testNotFunctional() {
    doTest("interface G {" +
           "<T> void f();" +
           "}");
  }

  public void testAlreadyAnnotated() {
    doTest("@FunctionalInterface interface Asd {" +
           "    boolean doSmth();" +
           "}");
  }

  public void testAnnotationType() {
    doTest("@interface A {}");
  }

  @Override
  protected InspectionProfileEntry getInspection() {
    return new InterfaceMayBeAnnotatedFunctionalInspection();
  }
}
