/*
 * Copyright 2022 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef CtsEnforcement_DEFINED
#define CtsEnforcement_DEFINED

#include "include/core/SkTypes.h"

#include <climits>
#include <cstdint>

/**
 * Determines how unit tests are enforced by CTS. Depending on the ApiLevel, a test will be run
 * in one of 3 states: run without workarounds, run with workarounds or skipped.
 */
class CtsEnforcement {
public:
    enum ApiLevel : int32_t {
        /* When used as fStrictVersion, always skip this test. It is not relevant to CTS.
         * When used as fWorkaroundsVersion, there are no api levels that should run the
         * test with workarounds.
         */
        kNever = INT32_MAX,
        /* The kApiLevel_* values are directly correlated with Android API levels.  Every new
         * CTS/SkQP release has a corresponding Android API level that will be captured by these
         * enum values.
         */
        kApiLevel_T = 33,
        kApiLevel_U = 34,
        kApiLevel_V = 35,
        /* kNextRelease is a placeholder value that all new unit tests should use.  It implies that
         * this test will be enforced in the next Android release.  At the time of the release a
         * new kApiLevel_* value will be added and all current kNextRelease values will be replaced
         * with that new value.
         */
        kNextRelease = kApiLevel_V + 1
    };

    /**
     * Tests will run in strict (no workarounds) mode if the device API level is >= strictVersion
     */
    constexpr CtsEnforcement(ApiLevel strictVersion)
            : fStrictVersion(strictVersion), fWorkaroundsVersion(kNever) {}

    /**
     * Test will run with workarounds if the device API level is >= workaroundVersion
     * and < strictVersion
     */
    constexpr CtsEnforcement& withWorkarounds(ApiLevel workaroundVersion) {
        SkASSERT(workaroundVersion <= fStrictVersion);
        fWorkaroundsVersion = workaroundVersion;
        return *this;
    }

    enum class RunMode { kSkip = 0, kRunWithWorkarounds = 1, kRunStrict = 2 };
    RunMode eval(int apiLevel) const;

private:
    ApiLevel fStrictVersion;
    ApiLevel fWorkaroundsVersion;
};

#endif
