import { Duration } from "./utils/duration";
import { Wrapper } from "./common";
import JvmOpenInjectionStep = io.gatling.javaapi.core.OpenInjectionStep;
import JvmOpenInjectionStepRamp = io.gatling.javaapi.core.OpenInjectionStep$Ramp;
import JvmOpenInjectionStepStressPeak = io.gatling.javaapi.core.OpenInjectionStep$StressPeak;
import JvmOpenInjectionStepConstantRate = io.gatling.javaapi.core.OpenInjectionStep$ConstantRate;
import JvmOpenInjectionStepRampRate = io.gatling.javaapi.core.OpenInjectionStep$RampRate;
import JvmOpenInjectionStepRampRateDuring = io.gatling.javaapi.core.RampRate$During;
import JvmOpenInjectionStepStairs = io.gatling.javaapi.core.OpenInjectionStep$Stairs;
import JvmOpenInjectionStepStairsTimes = io.gatling.javaapi.core.Stairs$Times;
/**
 * An injection profile step for using an open workload model where you control the arrival rate of
 * new users. In 99.99% of the cases, the right choice, over closed workload model.
 *
 * <p>Immutable, so all methods return a new occurrence and leave the original unmodified.
 */
export interface OpenInjectionStep extends Wrapper<JvmOpenInjectionStep> {
}
export interface ConstantRateOpenInjectionStep extends OpenInjectionStep {
    randomized(): OpenInjectionStep;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject a stock of users distributed
 * evenly on a given period of time. Strictly equivalent to {@link ConstantRateOpenInjectionStep}
 */
export interface OpenInjectionStepRamp extends Wrapper<JvmOpenInjectionStepRamp> {
    /**
     * Define the duration of the ramp
     *
     * @param duration - the ramp duration
     * @returns a new OpenInjectionStep
     */
    during(duration: Duration): OpenInjectionStep;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject a stock of users distributed
 * with a <a hreh="https://en.wikipedia.org/wiki/Heaviside_step_function">Heaviside</a>
 * distribution on a given period of time. Strictly equivalent to {@link OpenInjectionStepConstantRate}
 */
export interface OpenInjectionStepStressPeak extends Wrapper<JvmOpenInjectionStepStressPeak> {
    /**
     * Define the duration of the Heaviside distribution
     *
     * @param duration - the duration
     * @returns a new OpenInjectionStep
     */
    during(duration: Duration): OpenInjectionStep;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject users at a constant rate for a
 * given duration.
 */
export interface OpenInjectionStepConstantRate extends Wrapper<JvmOpenInjectionStepConstantRate> {
    /**
     * Define the duration of the step
     *
     * @param duration - the duration
     * @returns a new OpenInjectionStep
     */
    during(duration: Duration): ConstantRateOpenInjectionStep;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject users at a rate that will
 * increase linearly for a given duration.
 */
export interface OpenInjectionStepRampRate extends Wrapper<JvmOpenInjectionStepRampRate> {
    /**
     * Define the target rate at the end of the ramp
     *
     * @param to - the target rate
     * @returns the next DSL step
     */
    to(to: number): OpenInjectionStepRampRateDuring;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject users at a rate that will
 * increase linearly for a given duration.
 */
export interface OpenInjectionStepRampRateDuring extends Wrapper<JvmOpenInjectionStepRampRateDuring> {
    /**
     * Define the duration of the ramp
     *
     * @param duration - the duration
     * @returns a new OpenInjectionStep
     */
    during(duration: Duration): RampRateOpenInjectionStep;
}
/**
 * A special {@link OpenInjectionStep} that supports "randomized".
 */
export interface RampRateOpenInjectionStep extends OpenInjectionStep {
    randomized(): OpenInjectionStep;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject users with stairs rates.
 */
export interface OpenInjectionStepStairs extends Wrapper<JvmOpenInjectionStepStairs> {
    /**
     * Define the number of levels
     *
     * @param levels - the number of levels in the stairs
     * @returns the next DSL step
     */
    times(levels: number): OpenInjectionStepStairsTimes;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject users with stairs rates.
 */
export interface OpenInjectionStepStairsTimes extends Wrapper<JvmOpenInjectionStepStairsTimes> {
    /**
     * Define the duration of each level
     *
     * @param duration - the duration
     * @returns the next DSL step
     */
    eachLevelLasting(duration: Duration): OpenInjectionStepStairsComposite;
}
/**
 * A DSL for creating a {@link OpenInjectionStep} that will inject users with stairs rates.
 */
export interface OpenInjectionStepStairsComposite extends OpenInjectionStep {
    /**
     * Define the initial number of users per second rate (optional)
     *
     * @param startingRate - the initial rate
     * @returns a usable {@link OpenInjectionStep}
     */
    startingFrom(startingRate: number): OpenInjectionStepStairsComposite;
    /**
     * Define ramps separating levels (optional)
     *
     * @param duration - the duration
     * @returns a usable {@link OpenInjectionStep}
     */
    separatedByRampsLasting(duration: Duration): OpenInjectionStepStairsComposite;
}
/**
 * Bootstrap a new open workload rampUsers injection profile, see {@link OpenInjectionStepRamp}
 *
 * @param users - the total number of users to inject
 * @returns the next DSL step
 */
export declare const rampUsers: (users: number) => OpenInjectionStepRamp;
/**
 * Bootstrap a new open workload stress peak injection profile, see {@link
 * OpenInjectionStepStressPeak}
 *
 * @param users - the total number of users to inject
 * @returns the next DSL step
 */
export declare const stressPeakUsers: (users: number) => OpenInjectionStepStressPeak;
/**
 * Inject a bunch of users at the same time.
 *
 * @param users - the number of users to inject
 * @returns a new OpenInjectionStep
 */
export declare const atOnceUsers: (users: number) => OpenInjectionStep;
/**
 * Bootstrap a new open workload constantUsersPerSec injection profile, see {@link
 * OpenInjectionStepConstantRate}
 *
 * @param rate - the users per second rate
 * @returns the next DSL step
 */
export declare const constantUsersPerSec: (rate: number) => OpenInjectionStepConstantRate;
/**
 * Bootstrap a new open workload rampUsersPerSec injection profile, see {@link
 * OpenInjectionStepRampRate}
 *
 * @param rate - the users per second start rate
 * @returns the next DSL step
 */
export declare const rampUsersPerSec: (rate: number) => OpenInjectionStepRampRate;
/**
 * Don't inject any new user for a given duration
 *
 * @param duration - the duration
 * @returns a new OpenInjectionStep
 */
export declare const nothingFor: (duration: Duration) => OpenInjectionStep;
/**
 * Bootstrap a new open workload incrementUsersPerSec injection profile, see {@link
 * OpenInjectionStepStairs}
 *
 * @param rateIncrement - the difference of users per second rate between levels of the stairs
 * @returns the next DSL step
 */
export declare const incrementUsersPerSec: (rateIncrement: number) => OpenInjectionStepStairs;
