/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/cssom/css_declared_style_data.h"

#include "cobalt/cssom/css_style_sheet.h"
#include "cobalt/cssom/font_weight_value.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/rgba_color_value.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace cssom {

TEST(CSSDeclaredStyleDataTest, BackgroundColorSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBackgroundColorProperty));

  style->SetPropertyValueAndImportance(kBackgroundColorProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBackgroundColorProperty));
}

TEST(CSSDeclaredStyleDataTest, BackgroundImageSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBackgroundImageProperty));

  style->SetPropertyValueAndImportance(kBackgroundImageProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBackgroundImageProperty));
}

TEST(CSSDeclaredStyleDataTest,
     BackgroundPositionSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBackgroundPositionProperty));

  style->SetPropertyValueAndImportance(kBackgroundPositionProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBackgroundPositionProperty));
}

TEST(CSSDeclaredStyleDataTest, BackgroundRepeatSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBackgroundRepeatProperty));

  style->SetPropertyValueAndImportance(kBackgroundRepeatProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBackgroundRepeatProperty));
}

TEST(CSSDeclaredStyleDataTest, BackgroundSizeSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBackgroundSizeProperty));

  style->SetPropertyValueAndImportance(kBackgroundSizeProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBackgroundSizeProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderRadiusSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderRadiusProperty));

  style->SetPropertyValueAndImportance(kBorderRadiusProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderRadiusProperty));
}

TEST(CSSDeclaredStyleDataTest, ColorSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kColorProperty));

  style->SetPropertyValueAndImportance(kColorProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kColorProperty));
}

TEST(CSSDeclaredStyleDataTest, ContentSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kContentProperty));

  style->SetPropertyValueAndImportance(kContentProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kContentProperty));
}

TEST(CSSDeclaredStyleDataTest, DisplaySettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kDisplayProperty));

  style->SetPropertyValueAndImportance(kDisplayProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kDisplayProperty));
}

TEST(CSSDeclaredStyleDataTest, FontFamilySettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kFontFamilyProperty));

  style->SetPropertyValueAndImportance(kFontFamilyProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kFontFamilyProperty));
}

TEST(CSSDeclaredStyleDataTest, FontSizeSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kFontSizeProperty));

  style->SetPropertyValueAndImportance(kFontSizeProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kFontSizeProperty));
}

TEST(CSSDeclaredStyleDataTest, FontStyleSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kFontStyleProperty));

  style->SetPropertyValueAndImportance(kFontStyleProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kFontStyleProperty));
}

TEST(CSSDeclaredStyleDataTest, FontWeightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kFontWeightProperty));

  style->SetPropertyValueAndImportance(kFontWeightProperty,
                                       FontWeightValue::GetBoldAka700(), false);
  EXPECT_EQ(FontWeightValue::GetBoldAka700(),
            style->GetPropertyValue(kFontWeightProperty));
}

TEST(CSSDeclaredStyleDataTest, HeightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kHeightProperty));

  style->SetPropertyValueAndImportance(kHeightProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kHeightProperty));
}

TEST(CSSDeclaredStyleDataTest, LineHeightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kLineHeightProperty));

  style->SetPropertyValueAndImportance(kLineHeightProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kLineHeightProperty));
}

TEST(CSSDeclaredStyleDataTest, MarginBottomSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMarginBottomProperty));

  style->SetPropertyValueAndImportance(kMarginBottomProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMarginBottomProperty));
}

TEST(CSSDeclaredStyleDataTest, MarginLeftSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMarginLeftProperty));

  style->SetPropertyValueAndImportance(kMarginLeftProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMarginLeftProperty));
}

TEST(CSSDeclaredStyleDataTest, MarginRightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMarginRightProperty));

  style->SetPropertyValueAndImportance(kMarginRightProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMarginRightProperty));
}

TEST(CSSDeclaredStyleDataTest, MarginTopSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMarginTopProperty));

  style->SetPropertyValueAndImportance(kMarginTopProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMarginTopProperty));
}

TEST(CSSDeclaredStyleDataTest, MaxHeightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMaxHeightProperty));

  style->SetPropertyValueAndImportance(kMaxHeightProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMaxHeightProperty));
}

TEST(CSSDeclaredStyleDataTest, MaxWidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMaxWidthProperty));

  style->SetPropertyValueAndImportance(kMaxWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMaxWidthProperty));
}

TEST(CSSDeclaredStyleDataTest, MinHeightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMinHeightProperty));

  style->SetPropertyValueAndImportance(kMinHeightProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMinHeightProperty));
}

TEST(CSSDeclaredStyleDataTest, MinWidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kMinWidthProperty));

  style->SetPropertyValueAndImportance(kMinWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kMinWidthProperty));
}

TEST(CSSDeclaredStyleDataTest, OpacitySettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kOpacityProperty));

  style->SetPropertyValueAndImportance(kOpacityProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kOpacityProperty));
}

TEST(CSSDeclaredStyleDataTest, OverflowSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kOverflowProperty));

  style->SetPropertyValueAndImportance(kOverflowProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kOverflowProperty));
}

TEST(CSSDeclaredStyleDataTest, OverflowWrapSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kOverflowWrapProperty));

  style->SetPropertyValueAndImportance(kOverflowWrapProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kOverflowWrapProperty));
}

TEST(CSSDeclaredStyleDataTest, PaddingBottomSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kPaddingBottomProperty));

  style->SetPropertyValueAndImportance(kPaddingBottomProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kPaddingBottomProperty));
}

TEST(CSSDeclaredStyleDataTest, PaddingLeftSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kPaddingLeftProperty));

  style->SetPropertyValueAndImportance(kPaddingLeftProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kPaddingLeftProperty));
}

TEST(CSSDeclaredStyleDataTest, PaddingRightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kPaddingRightProperty));

  style->SetPropertyValueAndImportance(kPaddingRightProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kPaddingRightProperty));
}

TEST(CSSDeclaredStyleDataTest, PaddingTopSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kPaddingTopProperty));

  style->SetPropertyValueAndImportance(kPaddingTopProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kPaddingTopProperty));
}

TEST(CSSDeclaredStyleDataTest, PositionSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kPositionProperty));

  style->SetPropertyValueAndImportance(kPositionProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kPositionProperty));
}

TEST(CSSDeclaredStyleDataTest, TextAlignSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTextAlignProperty));

  style->SetPropertyValueAndImportance(kTextAlignProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTextAlignProperty));
}

TEST(CSSDeclaredStyleDataTest, TextIndentSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTextIndentProperty));

  style->SetPropertyValueAndImportance(kTextIndentProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTextIndentProperty));
}

TEST(CSSDeclaredStyleDataTest, TextOverflowSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTextOverflowProperty));

  style->SetPropertyValueAndImportance(kTextOverflowProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTextOverflowProperty));
}

TEST(CSSDeclaredStyleDataTest, TextTransformSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTextTransformProperty));

  style->SetPropertyValueAndImportance(kTextTransformProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTextTransformProperty));
}

TEST(CSSDeclaredStyleDataTest, TransformSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTransformProperty));

  style->SetPropertyValueAndImportance(kTransformProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTransformProperty));
}

TEST(CSSDeclaredStyleDataTest, TransitionDelaySettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTransitionDelayProperty));

  style->SetPropertyValueAndImportance(kTransitionDelayProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTransitionDelayProperty));
}

TEST(CSSDeclaredStyleDataTest,
     TransitionDurationSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTransitionDurationProperty));

  style->SetPropertyValueAndImportance(kTransitionDurationProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTransitionDurationProperty));
}

TEST(CSSDeclaredStyleDataTest,
     TransitionPropertySettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTransitionPropertyProperty));

  style->SetPropertyValueAndImportance(kTransitionPropertyProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTransitionPropertyProperty));
}

TEST(CSSDeclaredStyleDataTest,
     TransitionTimingFunctionSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kTransitionTimingFunctionProperty));

  style->SetPropertyValueAndImportance(kTransitionTimingFunctionProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kTransitionTimingFunctionProperty));
}

TEST(CSSDeclaredStyleDataTest, VerticalAlignSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kVerticalAlignProperty));

  style->SetPropertyValueAndImportance(kVerticalAlignProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kVerticalAlignProperty));
}

TEST(CSSDeclaredStyleDataTest, VisibilitySettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kVisibilityProperty));

  style->SetPropertyValueAndImportance(kVisibilityProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kVisibilityProperty));
}

TEST(CSSDeclaredStyleDataTest, WhiteSpaceSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kWhiteSpaceProperty));

  style->SetPropertyValueAndImportance(kWhiteSpaceProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kWhiteSpaceProperty));
}

TEST(CSSDeclaredStyleDataTest, WidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kWidthProperty));

  style->SetPropertyValueAndImportance(kWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kWidthProperty));
}

TEST(CSSDeclaredStyleDataTest, ZIndexSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kZIndexProperty));

  style->SetPropertyValueAndImportance(kZIndexProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kZIndexProperty));
}

TEST(CSSDeclaredStyleDataTest,
     PropertyValueSetterAndImportanceGetterAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->IsDeclaredPropertyImportant(kBackgroundColorProperty));
  EXPECT_FALSE(style->IsDeclaredPropertyImportant(kVerticalAlignProperty));

  style->SetPropertyValueAndImportance(kBackgroundColorProperty,
                                       new RGBAColorValue(0x000000ff), true);
  style->SetPropertyValueAndImportance(kVerticalAlignProperty,
                                       KeywordValue::GetBaseline(), false);

  EXPECT_TRUE(style->IsDeclaredPropertyImportant(kBackgroundColorProperty));
  EXPECT_FALSE(style->IsDeclaredPropertyImportant(kVerticalAlignProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderTopColorSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderTopColorProperty));

  style->SetPropertyValueAndImportance(kBorderTopColorProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderTopColorProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderRightColorSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderRightColorProperty));

  style->SetPropertyValueAndImportance(kBorderRightColorProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderRightColorProperty));
}

TEST(CSSDeclaredStyleDataTest,
     BorderBottomColorSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderBottomColorProperty));

  style->SetPropertyValueAndImportance(kBorderBottomColorProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderBottomColorProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderLeftColorSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderLeftColorProperty));

  style->SetPropertyValueAndImportance(kBorderLeftColorProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderLeftColorProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderTopWidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderTopWidthProperty));

  style->SetPropertyValueAndImportance(kBorderTopWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderTopWidthProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderRightWidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderRightWidthProperty));

  style->SetPropertyValueAndImportance(kBorderRightWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderRightWidthProperty));
}

TEST(CSSDeclaredStyleDataTest,
     BorderBottomWidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderBottomWidthProperty));

  style->SetPropertyValueAndImportance(kBorderBottomWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderBottomWidthProperty));
}

TEST(CSSDeclaredStyleDataTest, BorderLeftWidthSettersAndGettersAreConsistent) {
  scoped_refptr<CSSDeclaredStyleData> style = new CSSDeclaredStyleData();

  EXPECT_FALSE(style->GetPropertyValue(kBorderLeftWidthProperty));

  style->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                       KeywordValue::GetInherit(), false);
  EXPECT_EQ(KeywordValue::GetInherit(),
            style->GetPropertyValue(kBorderLeftWidthProperty));
}

TEST(CSSDeclaredStyleDataTest, TwoDeclaredStyleDataWithSamePropertiesAreEqual) {
  scoped_refptr<CSSDeclaredStyleData> style1 = new CSSDeclaredStyleData();
  style1->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), false);
  scoped_refptr<CSSDeclaredStyleData> style2 = new CSSDeclaredStyleData();
  style2->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), false);

  EXPECT_EQ(*style1, *style2);
}

TEST(CSSDeclaredStyleDataTest,
     TwoDeclaredStyleDataWithDifferentImportanceAreUnequal) {
  scoped_refptr<CSSDeclaredStyleData> style1 = new CSSDeclaredStyleData();
  style1->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), false);
  scoped_refptr<CSSDeclaredStyleData> style2 = new CSSDeclaredStyleData();
  style2->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), true);

  EXPECT_EQ(*style1 == *style2, false);
}

TEST(CSSDeclaredStyleDataTest,
     TwoDeclaredStyleDataWithDifferentPropertiesAreUnequal) {
  scoped_refptr<CSSDeclaredStyleData> style1 = new CSSDeclaredStyleData();
  style1->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), true);
  scoped_refptr<CSSDeclaredStyleData> style2 = new CSSDeclaredStyleData();
  style2->SetPropertyValueAndImportance(kBorderRightWidthProperty,
                                        KeywordValue::GetInherit(), true);

  EXPECT_EQ(*style1 == *style2, false);
}

TEST(CSSDeclaredStyleDataTest,
     DeclaredStyleDataIsUnequalToDeclaredStyleDataWithPropertySuperset) {
  scoped_refptr<CSSDeclaredStyleData> style1 = new CSSDeclaredStyleData();
  style1->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), true);
  scoped_refptr<CSSDeclaredStyleData> style2 = new CSSDeclaredStyleData();
  style2->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), true);
  style2->SetPropertyValueAndImportance(kBorderRightWidthProperty,
                                        KeywordValue::GetInherit(), true);

  EXPECT_EQ(*style1 == *style2, false);
}

TEST(CSSDeclaredStyleDataTest,
     DeclaredStyleDataIsUnequalToDeclaredStyleDataWithPropertySubset) {
  scoped_refptr<CSSDeclaredStyleData> style1 = new CSSDeclaredStyleData();
  style1->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), true);
  style1->SetPropertyValueAndImportance(kBorderRightWidthProperty,
                                        KeywordValue::GetInherit(), true);
  scoped_refptr<CSSDeclaredStyleData> style2 = new CSSDeclaredStyleData();
  style2->SetPropertyValueAndImportance(kBorderLeftWidthProperty,
                                        KeywordValue::GetInherit(), true);

  EXPECT_EQ(*style1 == *style2, false);
}

}  // namespace cssom
}  // namespace cobalt
