/*
* Copyright 2015-2017 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.junit.platform.commons.annotation;
import static org.junit.platform.commons.meta.API.Usage.Stable;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.platform.commons.meta.API;
/**
* {@code @Testable} is used to signal to IDEs and tooling vendors that the
* annotated or meta-annotated element is <em>testable</em>.
*
* <p>In this context, the term "testable" means that the annotated method or
* class can be executed by a {@code TestEngine} as a test or test container
* on the JUnit Platform.
*
* <h3>Motivation for {@code @Testable}</h3>
* <p>Some clients of the JUnit Platform, notably IDEs such as IntelliJ IDEA,
* operate only on sources for test discovery. Thus, they cannot use the full
* runtime discovery mechanism of the JUnit Platform since it relies on compiled
* classes. {@code @Testable} therefore serves as an alternative mechanism for
* IDEs to discover tests by analyzing the source code only.
*
* <h3>Common Use Cases</h3>
* <p>{@code @Testable} will typically be used as a meta-annotation in order to
* create a custom <em>composed annotation</em> that inherits the semantics
* of {@code @Testable}. For example, the {@code @Test} and {@code @TestFactory}
* annotations in JUnit Jupiter are meta-annotated with {@code @Testable}.
* <p>For test programming models that do not rely on annotations, test classes
* or test methods may be directly annotated with {@code @Testable}. Alternatively,
* if concrete test classes extend from a base class, the base class can be
* annotated with {@code @Testable}. Note that {@code @Testable} is an
* {@link Inherited @Inherited} annotation.
*
* <h3>Requirements for IDEs and Tooling Vendors</h3>
* <ul>
* <li>If a top-level class, static nested class, or inner class is not
* annotated or meta-annotated with {@code @Testable} but contains a method
* that is annotated or meta-annotated with {@code @Testable}, the class must
* be considered to be a <em>testable</em> class.</li>
* <li>If annotation hierarchies containing {@code @Testable} are present on
* classes or methods in compiled byte code (e.g., in JARs in the user's
* classpath), IDEs and tooling vendors must also take such annotation
* hierarchies into consideration when performing annotation processing for
* source code.</li>
* </ul>
*
* <h3>Restrictions for TestEngine Implementations</h3>
* <p>A {@code TestEngine} must <strong>not</strong> in any way perform
* <em>discovery</em> based on the presence of {@code @Testable}. In terms of
* discovery, the presence of {@code @Testable} should only be meaningful to
* clients such as IDEs and tooling vendors. A {@code TestEngine} implementation
* is therefore required to discover tests based on information specific to
* that test engine (e.g., annotations specific to that test engine).
*
* @since 1.0
*/
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@API(Stable)
public @interface Testable {
}