// Copyright 2014 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 "core/style/ComputedStyle.h"

#include "core/style/ClipPathOperation.h"
#include "core/style/ShapeValue.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace blink {

TEST(ComputedStyleTest, ShapeOutsideBoxEqual) {
  ShapeValue* shape1 = ShapeValue::createBoxShapeValue(ContentBox);
  ShapeValue* shape2 = ShapeValue::createBoxShapeValue(ContentBox);
  RefPtr<ComputedStyle> style1 = ComputedStyle::create();
  RefPtr<ComputedStyle> style2 = ComputedStyle::create();
  style1->setShapeOutside(shape1);
  style2->setShapeOutside(shape2);
  ASSERT_EQ(*style1, *style2);
}

TEST(ComputedStyleTest, ShapeOutsideCircleEqual) {
  RefPtr<BasicShapeCircle> circle1 = BasicShapeCircle::create();
  RefPtr<BasicShapeCircle> circle2 = BasicShapeCircle::create();
  ShapeValue* shape1 = ShapeValue::createShapeValue(circle1, ContentBox);
  ShapeValue* shape2 = ShapeValue::createShapeValue(circle2, ContentBox);
  RefPtr<ComputedStyle> style1 = ComputedStyle::create();
  RefPtr<ComputedStyle> style2 = ComputedStyle::create();
  style1->setShapeOutside(shape1);
  style2->setShapeOutside(shape2);
  ASSERT_EQ(*style1, *style2);
}

TEST(ComputedStyleTest, ClipPathEqual) {
  RefPtr<BasicShapeCircle> shape = BasicShapeCircle::create();
  RefPtr<ShapeClipPathOperation> path1 = ShapeClipPathOperation::create(shape);
  RefPtr<ShapeClipPathOperation> path2 = ShapeClipPathOperation::create(shape);
  RefPtr<ComputedStyle> style1 = ComputedStyle::create();
  RefPtr<ComputedStyle> style2 = ComputedStyle::create();
  style1->setClipPath(path1);
  style2->setClipPath(path2);
  ASSERT_EQ(*style1, *style2);
}

TEST(ComputedStyleTest, FocusRingWidth) {
  RefPtr<ComputedStyle> style = ComputedStyle::create();
  style->setEffectiveZoom(3.5);
#if OS(MACOSX)
  style->setOutlineStyle(BorderStyleSolid);
  ASSERT_EQ(3, style->getOutlineStrokeWidthForFocusRing());
#else
  ASSERT_EQ(3.5, style->getOutlineStrokeWidthForFocusRing());
  style->setEffectiveZoom(0.5);
  ASSERT_EQ(1, style->getOutlineStrokeWidthForFocusRing());
#endif
}

TEST(ComputedStyleTest, FocusRingOutset) {
  RefPtr<ComputedStyle> style = ComputedStyle::create();
  style->setOutlineStyle(BorderStyleSolid);
  style->setOutlineStyleIsAuto(OutlineIsAutoOn);
  style->setEffectiveZoom(4.75);
#if OS(MACOSX)
  ASSERT_EQ(4, style->outlineOutsetExtent());
#else
  ASSERT_EQ(3, style->outlineOutsetExtent());
#endif
}

TEST(ComputedStyleTest, Preserve3dForceStackingContext) {
  RefPtr<ComputedStyle> style = ComputedStyle::create();
  style->setTransformStyle3D(TransformStyle3DPreserve3D);
  style->setOverflowX(EOverflow::Hidden);
  style->setOverflowY(EOverflow::Hidden);
  style->updateIsStackingContext(false, false);
  EXPECT_EQ(TransformStyle3DFlat, style->usedTransformStyle3D());
  EXPECT_TRUE(style->isStackingContext());
}

}  // namespace blink
