// Copyright 2016 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 "modules/csspaint/PaintRenderingContext2D.h"

#include "platform/graphics/ImageBuffer.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace blink {
namespace {

static const int kWidth = 50;
static const int kHeight = 75;
static const float kZoom = 1.0;

class PaintRenderingContext2DTest : public ::testing::Test {
 protected:
  void SetUp() override;

  Persistent<PaintRenderingContext2D> ctx_;
};

void PaintRenderingContext2DTest::SetUp() {
  PaintRenderingContext2DSettings context_settings;
  context_settings.setAlpha(false);
  ctx_ = PaintRenderingContext2D::Create(
      ImageBuffer::Create(IntSize(kWidth, kHeight)), context_settings, kZoom);
}

void TrySettingStrokeStyle(PaintRenderingContext2D* ctx,
                           const String& expected,
                           const String& value) {
  StringOrCanvasGradientOrCanvasPattern result, arg, dummy;
  dummy.setString("red");
  arg.setString(value);
  ctx->setStrokeStyle(dummy);
  ctx->setStrokeStyle(arg);
  ctx->strokeStyle(result);
  EXPECT_EQ(expected, result.getAsString());
}

TEST_F(PaintRenderingContext2DTest, testParseColorOrCurrentColor) {
  TrySettingStrokeStyle(ctx_.Get(), "#0000ff", "blue");
  TrySettingStrokeStyle(ctx_.Get(), "#000000", "currentColor");
}

TEST_F(PaintRenderingContext2DTest, testWidthAndHeight) {
  EXPECT_EQ(kWidth, ctx_->Width());
  EXPECT_EQ(kHeight, ctx_->Height());
}

TEST_F(PaintRenderingContext2DTest, testBasicState) {
  const double kShadowBlurBefore = 2;
  const double kShadowBlurAfter = 3;

  const String line_join_before = "bevel";
  const String line_join_after = "round";

  ctx_->setShadowBlur(kShadowBlurBefore);
  ctx_->setLineJoin(line_join_before);
  EXPECT_EQ(kShadowBlurBefore, ctx_->shadowBlur());
  EXPECT_EQ(line_join_before, ctx_->lineJoin());

  ctx_->save();

  ctx_->setShadowBlur(kShadowBlurAfter);
  ctx_->setLineJoin(line_join_after);
  EXPECT_EQ(kShadowBlurAfter, ctx_->shadowBlur());
  EXPECT_EQ(line_join_after, ctx_->lineJoin());

  ctx_->restore();

  EXPECT_EQ(kShadowBlurBefore, ctx_->shadowBlur());
  EXPECT_EQ(line_join_before, ctx_->lineJoin());
}

}  // namespace
}  // namespace blink
