/*
 * 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_declared_style_declaration.h"
#include "cobalt/cssom/css_parser.h"
#include "cobalt/cssom/css_style_rule.h"
#include "cobalt/cssom/css_style_sheet.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/mutation_observer.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/testing/mock_css_parser.h"
#include "cobalt/script/exception_state.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace cssom {

using ::testing::_;
using ::testing::Return;

namespace {
class MockMutationObserver : public MutationObserver {
 public:
  MOCK_METHOD0(OnCSSMutation, void());
};
}  // namespace

TEST(CSSDeclaredStyleDeclarationTest, BackgroundSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBackgroundProperty), background, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_background(background, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BackgroundColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background_color = "#fff";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBackgroundColorProperty),
                              background_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_background_color(background_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BackgroundImageSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background_image = "url('images/sample.png')";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBackgroundImageProperty),
                              background_image, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_background_image(background_image, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BackgroundPositionSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background_position = "50% 50%";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBackgroundPositionProperty),
                              background_position, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_background_position(background_position, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BackgroundRepeatSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background_repeat = "no-repeat";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBackgroundRepeatProperty),
                              background_repeat, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_background_repeat(background_repeat, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BackgroundSizeSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background_size = "cover";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBackgroundSizeProperty),
                              background_size, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_background_size(background_size, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderProperty), border, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border(border, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderBottomSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_bottom = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderBottomProperty), border_bottom, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_bottom(border_bottom, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderBottomColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_bottom_color = "#010203";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderBottomColorProperty),
                              border_bottom_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_bottom_color(border_bottom_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderBottomStyleSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_bottom_style = "solid";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderBottomStyleProperty),
                              border_bottom_style, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_bottom_style(border_bottom_style, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderBottomWidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> width =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_bottom_width = "10px";
  MockMutationObserver observer;
  width->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderBottomWidthProperty),
                              border_bottom_width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  width->set_border_bottom_width(border_bottom_width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_color = "#010203";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderColorProperty), border_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_color(border_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderLeftSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_left = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderLeftProperty), border_left, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_left(border_left, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderLeftColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_left_color = "#010203";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderLeftColorProperty),
                              border_left_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_left_color(border_left_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderLeftStyleSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_left_style = "solid";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderLeftStyleProperty),
                              border_left_style, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_left_style(border_left_style, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderLeftWidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> width =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_left_width = "10px";
  MockMutationObserver observer;
  width->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderLeftWidthProperty),
                              border_left_width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  width->set_border_left_width(border_left_width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderRadiusSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_radius = "0.2em";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderRadiusProperty), border_radius, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_radius(border_radius, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderRightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_right = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderRightProperty), border_right, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_right(border_right, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderRightColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_right_color = "#010203";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderRightColorProperty),
                              border_right_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_right_color(border_right_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderRightStyleSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_right_style = "solid";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderRightStyleProperty),
                              border_right_style, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_right_style(border_right_style, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderRightWidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> width =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_right_width = "10px";
  MockMutationObserver observer;
  width->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderRightWidthProperty),
                              border_right_width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  width->set_border_right_width(border_right_width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderStyleSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_style = "solid";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderStyleProperty), border_style, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_style(border_style, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderTopSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_top = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBorderTopProperty), border_top, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_top(border_top, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderTopColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_top_color = "#010203";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderTopColorProperty),
                              border_top_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_top_color(border_top_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderTopStyleSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_top_style = "solid";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderTopStyleProperty),
                              border_top_style, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_border_top_style(border_top_style, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BorderTopWidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> width =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string border_top_width = "10px";
  MockMutationObserver observer;
  width->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBorderTopWidthProperty),
                              border_top_width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  width->set_border_top_width(border_top_width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BottomSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string bottom = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kBottomProperty), bottom, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_bottom(bottom, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, BoxShadowSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string box_shadow = "none";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBoxShadowProperty), box_shadow, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_box_shadow(box_shadow, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, ColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string color = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kColorProperty), color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_color(color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, ContentSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string content = "url(foo.png)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kContentProperty), content, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_content(content, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, DisplaySetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string display = "inline-block";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kDisplayProperty), display, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_display(display, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, FilterSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string filter =
      "-cobalt-mtm(url(p.msh), 1rad 1rad, "
      "matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1))";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kFilterProperty), filter, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_filter(filter, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, FontSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string font = "inherit";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kFontProperty), font, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_font(font, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, FontFamilySetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string font_family = "Roboto";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kFontFamilyProperty), font_family, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_font_family(font_family, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, FontSizeSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string font_size = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kFontSizeProperty), font_size, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_font_size(font_size, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, FontStyleSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string font_style = "italic";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kFontStyleProperty), font_style, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_font_style(font_style, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, FontWeightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string font_weight = "normal";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kFontWeightProperty), font_weight, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_font_weight(font_weight, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, HeightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string height = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kHeightProperty), height, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_height(height, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, LeftSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string left = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kLeftProperty), left, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_left(left, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, LineHeightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string line_height = "1.5em";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kLineHeightProperty), line_height, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_line_height(line_height, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MarginSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string margin = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kMarginProperty), margin, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_margin(margin, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MarginBottomSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string margin_bottom = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMarginBottomProperty), margin_bottom, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_margin_bottom(margin_bottom, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MarginLeftSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string margin_left = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMarginLeftProperty), margin_left, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_margin_left(margin_left, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MarginRightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string margin_right = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMarginRightProperty), margin_right, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_margin_right(margin_right, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MarginTopSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string margin_top = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMarginTopProperty), margin_top, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_margin_top(margin_top, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MaxHeightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string max_height = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMaxHeightProperty), max_height, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_max_height(max_height, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MaxWidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string max_width = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMaxWidthProperty), max_width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_max_width(max_width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MinHeightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string min_height = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMinHeightProperty), min_height, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_min_height(min_height, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, MinWidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string min_width = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kMinWidthProperty), min_width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_min_width(min_width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, OpacitySetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string opacity = "0.5";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kOpacityProperty), opacity, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_opacity(opacity, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, OverflowSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string overflow = "visible";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kOverflowProperty), overflow, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_overflow(overflow, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, OverflowWrapSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string overflow_wrap = "break-word";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kOverflowWrapProperty), overflow_wrap, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_overflow_wrap(overflow_wrap, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PaddingSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string padding = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kPaddingProperty), padding, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_padding(padding, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PaddingBottomSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string padding_bottom = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kPaddingBottomProperty),
                              padding_bottom, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_padding_bottom(padding_bottom, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PaddingLeftSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string padding_left = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kPaddingLeftProperty), padding_left, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_padding_left(padding_left, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PaddingRightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string padding_right = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kPaddingRightProperty), padding_right, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_padding_right(padding_right, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PaddingTopSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string padding_top = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kPaddingTopProperty), padding_top, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_padding_top(padding_top, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PositionSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string position = "static";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kPositionProperty), position, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_position(position, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, RightSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string right = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kRightProperty), right, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_right(right, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextAlignSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_align = "center";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTextAlignProperty), text_align, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_text_align(text_align, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextDecorationColorSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_decoration_color = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTextDecorationColorProperty),
                              text_decoration_color, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_text_decoration_color(text_decoration_color, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextDecorationLineSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_decoration_line = "line-through";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTextDecorationLineProperty),
                              text_decoration_line, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_text_decoration_line(text_decoration_line, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextIndentSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_indent = "4em";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTextIndentProperty), text_indent, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_text_indent(text_indent, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextOverflowSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_overflow = "ellipsis";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTextOverflowProperty), text_overflow, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_text_overflow(text_overflow, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextShadowSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_shadow = "inherit";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTextShadowProperty), text_shadow, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_text_shadow(text_shadow, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TextTransformSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string text_transform = "uppercase";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTextTransformProperty),
                              text_transform, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_text_transform(text_transform, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TopSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string top = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTopProperty), top, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_top(top, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransformSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transform = "scale(1.5)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTransformProperty), transform, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transform(transform, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransformOriginSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transform_origin = "20% 40%";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTransformOriginProperty),
                              transform_origin, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transform_origin(transform_origin, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransitionSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transition = "inherit";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTransitionProperty), transition, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transition(transition, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransitionDelaySetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transition_delay = "2s";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTransitionDelayProperty),
                              transition_delay, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transition_delay(transition_delay, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransitionDurationSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transition_duration = "2s";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTransitionDurationProperty),
                              transition_duration, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transition_duration(transition_duration, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransitionPropertySetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transition_property = "width";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kTransitionPropertyProperty),
                              transition_property, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transition_property(transition_property, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, TransitionTimingFunctionSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string transition_timing_function = "linear";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kTransitionTimingFunctionProperty),
                  transition_timing_function, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_transition_timing_function(transition_timing_function, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, VerticalAlignSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string vertical_align = "middle";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kVerticalAlignProperty),
                              vertical_align, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_vertical_align(vertical_align, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, VisibilitySetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string visibility = "hidden";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kVisibilityProperty), visibility, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_visibility(visibility, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, WhiteSpaceSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string white_space = "pre";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kWhiteSpaceProperty), white_space, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_white_space(white_space, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, WidthSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string width = "100px";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kWidthProperty), width, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_width(width, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, WordWrapSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string word_wrap = "break-word";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kWordWrapProperty), word_wrap, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_word_wrap(word_wrap, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, ZIndexSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string z_index = "-1";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser, ParsePropertyIntoDeclarationData(
                              GetPropertyName(kZIndexProperty), z_index, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);

  style->set_z_index(z_index, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, CSSTextSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string css_text = "font-size: 100px; color: #0047ab;";

  EXPECT_CALL(css_parser, ParseStyleDeclarationList(css_text, _))
      .WillOnce(Return(scoped_refptr<CSSDeclaredStyleData>()));
  style->set_css_text(css_text, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, CSSTextSetterEmptyString) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleData> initial_style =
      new CSSDeclaredStyleData();
  initial_style->SetPropertyValueAndImportance(
      kDisplayProperty, KeywordValue::GetInline(), false);
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(initial_style, &css_parser);

  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  const std::string css_text = "";

  EXPECT_CALL(css_parser, ParseStyleDeclarationList(css_text, _))
      .WillOnce(Return(scoped_refptr<CSSDeclaredStyleData>()));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->set_css_text(css_text, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, CSSTextGetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<PercentageValue> background_size = new PercentageValue(0.50f);
  scoped_refptr<LengthValue> bottom = new LengthValue(16, kPixelsUnit);

  scoped_refptr<CSSDeclaredStyleData> style_data = new CSSDeclaredStyleData();
  style_data->SetPropertyValueAndImportance(kBackgroundSizeProperty,
                                            background_size, false);
  style_data->SetPropertyValueAndImportance(kBottomProperty, bottom, true);

  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(style_data, &css_parser);
  EXPECT_EQ(style->css_text(NULL),
            "background-size: 50%; bottom: 16px !important;");
}

// TODO: Add GetPropertyValue tests, property getter tests and tests
// that checking if the attributes' setter and the getter are consistent when
// fully support converting PropertyValue to std::string.
TEST(CSSDeclaredStyleDeclarationTest, PropertyValueSetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBackgroundProperty), background, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->SetPropertyValue(GetPropertyName(kBackgroundProperty), background,
                          NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PropertyValueSetterTwice) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBackgroundProperty), background, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->SetPropertyValue(GetPropertyName(kBackgroundProperty), background,
                          NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PropertySetterWithTwoValues) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBackgroundProperty), background, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->SetProperty(GetPropertyName(kBackgroundProperty), background, NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PropertySetterWithThreeValues) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  const std::string background = "rgba(0, 0, 0, .8)";
  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kBackgroundProperty), background, _, _));
  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  style->SetProperty(GetPropertyName(kBackgroundProperty), background,
                     std::string(), NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, PropertyValueGetter) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleData> initial_style =
      new CSSDeclaredStyleData();
  initial_style->SetPropertyValueAndImportance(
      kTextAlignProperty, KeywordValue::GetCenter(), false);
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(initial_style, &css_parser);

  EXPECT_EQ(style->GetPropertyValue(GetPropertyName(kTextAlignProperty)),
            "center");
}

TEST(CSSDeclaredStyleDeclarationTest,
     UnknownDeclaredStylePropertyValueShouldBeEmpty) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleData> initial_style =
      new CSSDeclaredStyleData();
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(initial_style, &css_parser);

  EXPECT_EQ(style->GetPropertyValue("cobalt_cobalt_cobalt"), "");
}

TEST(CSSDeclaredStyleDeclarationTest, RemoveProperty) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleData> initial_style =
      new CSSDeclaredStyleData();
  initial_style->SetPropertyValueAndImportance(
      kDisplayProperty, KeywordValue::GetInline(), false);
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(initial_style, &css_parser);

  MockMutationObserver observer;
  style->set_mutation_observer(&observer);

  EXPECT_CALL(observer, OnCSSMutation()).Times(1);
  EXPECT_CALL(css_parser,
              ParsePropertyIntoDeclarationData(
                  GetPropertyName(kDisplayProperty), std::string(""), _, _));
  style->RemoveProperty(GetPropertyName(kDisplayProperty), NULL);
}

TEST(CSSDeclaredStyleDeclarationTest, LengthAttributeGetterEmpty) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  EXPECT_EQ(style->length(), 0);
}

TEST(CSSDeclaredStyleDeclarationTest, LengthAttributeGetterNotEmpty) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleData> initial_style =
      new CSSDeclaredStyleData();
  initial_style->SetPropertyValueAndImportance(
      kDisplayProperty, KeywordValue::GetInline(), false);
  initial_style->SetPropertyValueAndImportance(
      kTextAlignProperty, KeywordValue::GetCenter(), false);
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(initial_style, &css_parser);

  EXPECT_EQ(style->length(), 2);
}

TEST(CSSDeclaredStyleDeclarationTest, ItemGetterEmpty) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(&css_parser);

  EXPECT_FALSE(style->Item(0));
}

TEST(CSSDeclaredStyleDeclarationTest, ItemGetterNotEmpty) {
  testing::MockCSSParser css_parser;
  scoped_refptr<CSSDeclaredStyleData> initial_style =
      new CSSDeclaredStyleData();
  initial_style->SetPropertyValueAndImportance(
      kDisplayProperty, KeywordValue::GetInline(), false);
  initial_style->SetPropertyValueAndImportance(
      kTextAlignProperty, KeywordValue::GetCenter(), false);
  scoped_refptr<CSSDeclaredStyleDeclaration> style =
      new CSSDeclaredStyleDeclaration(initial_style, &css_parser);

  EXPECT_TRUE(style->Item(0));
  EXPECT_TRUE(style->Item(1));
  EXPECT_FALSE(style->Item(2));

  // The order is not important, as long as declared properties are represented.
  if (style->Item(0).value() == GetPropertyName(kDisplayProperty)) {
    EXPECT_EQ(style->Item(1).value(), GetPropertyName(kTextAlignProperty));
  } else {
    EXPECT_EQ(style->Item(0).value(), GetPropertyName(kTextAlignProperty));
    EXPECT_EQ(style->Item(1).value(), GetPropertyName(kDisplayProperty));
  }
}

}  // namespace cssom
}  // namespace cobalt
