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

#include "include/core/SkColor.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRefCnt.h"
#include "include/effects/SkHighContrastFilter.h"
#include "tests/Test.h"

#include <initializer_list>

DEF_TEST(HighContrastFilter_SmokeTest, reporter) {
    SkHighContrastConfig config;
    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
    sk_sp<SkColorFilter> filter = SkHighContrastFilter::Make(config);
    REPORTER_ASSERT(reporter, filter->isAlphaUnchanged());

    SkColorSpace* cs = nullptr;
    SkColor4f white_inverted = filter->filterColor4f(SkColors::kWhite, cs, cs);
    REPORTER_ASSERT(reporter, white_inverted == SkColors::kBlack);

    SkColor4f black_inverted = filter->filterColor4f(SkColors::kBlack, cs, cs);
    REPORTER_ASSERT(reporter, black_inverted == SkColors::kWhite);
}

DEF_TEST(HighContrastFilter_InvalidInputs, reporter) {
    SkHighContrastConfig config;
    REPORTER_ASSERT(reporter, config.isValid());

    // Valid invert style
    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertBrightness;
    REPORTER_ASSERT(reporter, config.isValid());
    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
    REPORTER_ASSERT(reporter, config.isValid());
    sk_sp<SkColorFilter> filter = SkHighContrastFilter::Make(config);
    REPORTER_ASSERT(reporter, filter);

    // Invalid invert style
    config.fInvertStyle = static_cast<SkHighContrastConfig::InvertStyle>(999);
    REPORTER_ASSERT(reporter, !config.isValid());
    filter = SkHighContrastFilter::Make(config);
    REPORTER_ASSERT(reporter, !filter);

    // Valid contrast
    for (float contrast : {0.5f, +1.0f, -1.0f}) {
        config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertBrightness;
        config.fContrast = contrast;
        REPORTER_ASSERT(reporter, config.isValid());
        filter = SkHighContrastFilter::Make(config);
        REPORTER_ASSERT(reporter, filter);
    }

    // Invalid contrast
    config.fContrast = 1.1f;
    REPORTER_ASSERT(reporter, !config.isValid());
    filter = SkHighContrastFilter::Make(config);
    REPORTER_ASSERT(reporter, !filter);
}
