// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/color/color_recipe.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "ui/color/color_mixer.h"
#include "ui/color/color_set.h"
#include "ui/color/color_unittest_utils.h"
#include "ui/gfx/color_palette.h"

namespace ui {
namespace {

// Tests that a recipe with no transforms passes through its input color
// unchanged.
TEST(ColorRecipeTest, EmptyRecipeIsPassthrough) {
  const ColorRecipe recipe;
  const auto verify_passthrough = [&](SkColor input) {
    EXPECT_EQ(input, recipe.GenerateResult(input, ColorMixer()));
  };
  verify_passthrough(SK_ColorBLACK);
  verify_passthrough(SK_ColorWHITE);
  verify_passthrough(SK_ColorRED);
}

// Tests that a transform in a recipe has an effect.
TEST(ColorRecipeTest, OneTransform) {
  constexpr SkColor kOutput = SK_ColorGREEN;
  ColorRecipe recipe;
  recipe.AddTransform(FromColor(kOutput));
  const auto verify_transform = [&](SkColor input) {
    EXPECT_EQ(kOutput, recipe.GenerateResult(input, ColorMixer()));
  };
  verify_transform(SK_ColorBLACK);
  verify_transform(SK_ColorWHITE);
  verify_transform(SK_ColorRED);
}

// Tests that in a recipe with multiple transforms, each is applied.
TEST(ColorRecipeTest, ChainedTransforms) {
  ColorRecipe recipe;
  recipe.AddTransform(DeriveDefaultIconColor())
      .AddTransform(BlendForMinContrast(kColorTest0));
  constexpr SkColor kBackground = SK_ColorWHITE;
  ColorMixer mixer;
  mixer.AddSet({kColorSetTest0, {{kColorTest0, kBackground}}});
  const auto verify_chain = [&](SkColor input) {
    const SkColor color = recipe.GenerateResult(input, mixer);
    // The DeriveDefaultIconColor transform should change the output color even
    // when the BlendForMinContrast transform takes no action.
    EXPECT_NE(input, color);
    // The BlendForMinContrast transform should always be able to guarantee
    // readable contrast against white.
    EXPECT_GE(color_utils::GetContrastRatio(color, kBackground),
              color_utils::kMinimumReadableContrastRatio);
  };
  verify_chain(SK_ColorBLACK);
  verify_chain(SK_ColorWHITE);
  verify_chain(SK_ColorRED);
}

}  // namespace
}  // namespace ui
