package cz.moneta.test.harness.support.greenscreen;

import cz.moneta.test.harness.context.StoreAccessor;
import cz.moneta.test.harness.endpoints.greenscreen.GreenScreenEndpoint;

/**
 * This is the marker interface of green screen flow builder proxies.
 * <p/>
 * The builders are usually accessed via {@code harness.withGreenScreen()} or similar method where the proxy
 * is instantiated by calling the respective
 * {@link Builders#newGreenScreenFlowBuilder(Class, GreenScreenEndpoint, StoreAccessor)} method.
 * <p/>
 * An example green screen builder may look as follows:
 * <pre>{@code
 * @literal @CheckScreenContains(row = 2, column = 37, text = "WELCOME")
 *  public interface WELCOME_WelcomeScreen extends GreenScreenFlow<WELCOME_WelcomeScreen> {
 *
 *     @literal @Type(row = 1, column = 9, text = "ARCL")
 *     @literal @KeyPress(Key.ENTER)
 *      ARCL00_CustomerSearchScreen openCustomerSearch();
 *
 *     @literal @Type(row = 1, column = 9, text = "AZXI")
 *     @literal @KeyPress(Key.ENTER)
 *      AZXI00_CustomerViewLocateScreen openCustomerViewLocateScreen();
 *  }
 * }</pre>
 * Please note that if the return type of the method is a different GreenScreenFlow builder, a new proxy is instantiated
 * based on the return type
 * <p/>
 * And the usage would be as follows:
 * <pre>{@code
 *  harness.withGreenScreen()
 *      .logIn()
 *      .openCustomerSearch()
 *      .searchByIdentificationNumber("8106179257")
 *      .checkCustomerNumber("0008611000200026460")
 *      .openCustomerDetail()
 *      .checkCardAccountNumber("0008614700200000624")
 *      ...
 * }</pre>
 *
 * @see KeyPress
 * @see Type
 * @see CheckScreenContains
 * @see StoreContent
 * @see Log
 */
public interface GreenScreenFlow<A extends GreenScreenFlow<A>> extends Builder {
}
