// Copyright 2014 The Cobalt Authors. 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/property_value.h"

#include "base/time.h"
#include "cobalt/cssom/absolute_url_value.h"
#include "cobalt/cssom/filter_function_list_value.h"
#include "cobalt/cssom/font_style_value.h"
#include "cobalt/cssom/font_weight_value.h"
#include "cobalt/cssom/integer_value.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/linear_gradient_value.h"
#include "cobalt/cssom/map_to_mesh_function.h"
#include "cobalt/cssom/matrix_function.h"
#include "cobalt/cssom/media_feature_keyword_value.h"
#include "cobalt/cssom/number_value.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/property_key_list_value.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/radial_gradient_value.h"
#include "cobalt/cssom/ratio_value.h"
#include "cobalt/cssom/resolution_value.h"
#include "cobalt/cssom/rgba_color_value.h"
#include "cobalt/cssom/rotate_function.h"
#include "cobalt/cssom/scale_function.h"
#include "cobalt/cssom/string_value.h"
#include "cobalt/cssom/time_list_value.h"
#include "cobalt/cssom/timing_function.h"
#include "cobalt/cssom/timing_function_list_value.h"
#include "cobalt/cssom/transform_function.h"
#include "cobalt/cssom/transform_function_list_value.h"
#include "cobalt/cssom/translate_function.h"
#include "cobalt/cssom/url_value.h"
#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace cssom {

TEST(PropertyValueToStringTest, AbsoluteURLValue) {
  GURL url("https://www.test.com");
  scoped_refptr<AbsoluteURLValue> property(new AbsoluteURLValue(url));
  EXPECT_EQ(property->ToString(), "url(https://www.test.com/)");
}

TEST(PropertyValueToStringTest, FontStyleValue) {
  scoped_refptr<FontStyleValue> property = FontStyleValue::GetItalic();
  EXPECT_EQ(property->ToString(), "italic");
}

TEST(PropertyValueToStringTest, FontWeightValue) {
  scoped_refptr<FontWeightValue> property = FontWeightValue::GetBoldAka700();
  EXPECT_EQ(property->ToString(), "bold");
}

TEST(PropertyValueToStringTest, IntegerValue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(1024));
  EXPECT_EQ(property->ToString(), "1024");
}

TEST(PropertyValueToStringTest, IntegerValueNegative) {
  scoped_refptr<IntegerValue> property(new IntegerValue(-512));
  EXPECT_EQ(property->ToString(), "-512");
}

TEST(PropertyValueToStringTest, KeywordValue) {
  scoped_refptr<KeywordValue> property = KeywordValue::GetHidden();
  EXPECT_EQ(property->ToString(), "hidden");
}

TEST(PropertyValueToStringTest, LengthValuePx) {
  scoped_refptr<LengthValue> property(new LengthValue(128, kPixelsUnit));
  EXPECT_EQ(property->ToString(), "128px");
}

TEST(PropertyValueToStringTest, LengthValueEm) {
  scoped_refptr<LengthValue> property =
      new LengthValue(1.5f, kFontSizesAkaEmUnit);
  EXPECT_EQ(property->ToString(), "1.5em");
}

TEST(PropertyValueToStringTest, MediaFeatureKeywordValue) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetProgressive();
  EXPECT_EQ(property->ToString(), "progressive");
}

TEST(PropertyValueToStringTest, NumberValue) {
  scoped_refptr<NumberValue> property(new NumberValue(123.0f));
  EXPECT_EQ(property->ToString(), "123");
}

TEST(PropertyValueToStringTest, NumberValueNegative) {
  scoped_refptr<NumberValue> property(new NumberValue(-456.0f));
  EXPECT_EQ(property->ToString(), "-456");
}

TEST(PropertyValueToStringTest, NumberValueDecimal) {
  scoped_refptr<NumberValue> property(new NumberValue(123.45f));
  EXPECT_EQ(property->ToString(), "123.45");
}

TEST(PropertyValueToStringTest, PercentageValue0) {
  scoped_refptr<PercentageValue> property(new PercentageValue(0.0f));
  EXPECT_EQ(property->ToString(), "0%");
}

TEST(PropertyValueToStringTest, PercentageValue50) {
  scoped_refptr<PercentageValue> property(new PercentageValue(0.50f));
  EXPECT_EQ(property->ToString(), "50%");
}

TEST(PropertyValueToStringTest, PercentageValue100) {
  scoped_refptr<PercentageValue> property(new PercentageValue(1.0f));
  EXPECT_EQ(property->ToString(), "100%");
}

TEST(PropertyValueToStringTest, PercentageValueDecimal) {
  scoped_refptr<PercentageValue> property(new PercentageValue(0.505f));
  EXPECT_EQ(property->ToString(), "50.5%");
}

TEST(PropertyValueToStringTest, PropertyListValue) {
  scoped_ptr<PropertyListValue::Builder> property_value_builder(
      new PropertyListValue::Builder());
  property_value_builder->push_back(new PercentageValue(0.50f));
  property_value_builder->push_back(new LengthValue(128, kPixelsUnit));
  scoped_refptr<PropertyListValue> property(
      new PropertyListValue(property_value_builder.Pass()));

  EXPECT_EQ(property->ToString(), "50%, 128px");
}

TEST(PropertyValueToStringTest, PropertyKeyListValue) {
  PropertyKeyListValue::Builder property_list;
  property_list.push_back(kBackgroundColorProperty);
  property_list.push_back(kOpacityProperty);
  scoped_refptr<PropertyKeyListValue> property(new PropertyKeyListValue(
      make_scoped_ptr(new PropertyKeyListValue::Builder(property_list))));

  EXPECT_EQ(property->ToString(), "background-color, opacity");
}

TEST(PropertyValueToStringTest, RadialGradientValueSizeKeyword) {
  ColorStopList color_stop_list;
  scoped_refptr<RGBAColorValue> property_color_1(
      new RGBAColorValue(100, 0, 50, 255));
  scoped_refptr<LengthValue> property_length_1(
      new LengthValue(212, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_1, property_length_1));
  scoped_refptr<RGBAColorValue> property_color_2(
      new RGBAColorValue(55, 66, 77, 255));
  scoped_refptr<LengthValue> property_length_2(
      new LengthValue(42, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_2, property_length_2));

  scoped_ptr<PropertyListValue::Builder> position_value_builder(
      new PropertyListValue::Builder());
  position_value_builder->push_back(new PercentageValue(0.50f));
  position_value_builder->push_back(new LengthValue(128, kPixelsUnit));
  scoped_refptr<PropertyListValue> position_property(
      new PropertyListValue(position_value_builder.Pass()));

  scoped_refptr<RadialGradientValue> property(new RadialGradientValue(
      RadialGradientValue::kEllipse, RadialGradientValue::kClosestCorner,
      position_property, color_stop_list.Pass()));

  EXPECT_EQ(property->ToString(),
            "ellipse closest-corner at 50% 128px, rgb(100, 0, 50) 212px, "
            "rgb(55, 66, 77) 42px");
}

TEST(PropertyValueToStringTest, RadialGradientValueSizeValue) {
  ColorStopList color_stop_list;
  scoped_refptr<RGBAColorValue> property_color_1(
      new RGBAColorValue(100, 0, 50, 255));
  scoped_refptr<LengthValue> property_length_1(
      new LengthValue(212, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_1, property_length_1));
  scoped_refptr<RGBAColorValue> property_color_2(
      new RGBAColorValue(55, 66, 77, 255));
  scoped_refptr<LengthValue> property_length_2(
      new LengthValue(42, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_2, property_length_2));

  scoped_ptr<PropertyListValue::Builder> size_value_builder(
      new PropertyListValue::Builder());
  size_value_builder->push_back(new LengthValue(0.5, kFontSizesAkaEmUnit));
  scoped_refptr<PropertyListValue> size_property(
      new PropertyListValue(size_value_builder.Pass()));

  scoped_ptr<PropertyListValue::Builder> position_value_builder(
      new PropertyListValue::Builder());
  position_value_builder->push_back(KeywordValue::GetCenter());
  position_value_builder->push_back(KeywordValue::GetTop());
  scoped_refptr<PropertyListValue> position_property(
      new PropertyListValue(position_value_builder.Pass()));

  scoped_refptr<RadialGradientValue> property(
      new RadialGradientValue(RadialGradientValue::kCircle, size_property,
                              position_property, color_stop_list.Pass()));

  EXPECT_EQ(property->ToString(),
            "circle 0.5em at center top, rgb(100, 0, 50) 212px, rgb(55, 66, "
            "77) 42px");
}

TEST(PropertyValueToStringTest, RatioValue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  EXPECT_EQ(property->ToString(), "16/9");
}

TEST(PropertyValueToStringTest, ResolutionValue) {
  scoped_refptr<ResolutionValue> property(
      new ResolutionValue(100.0f, kDPIUnit));
  EXPECT_EQ(property->ToString(), "100dpi");
}

TEST(PropertyValueToStringTest, RGBColorValue) {
  scoped_refptr<RGBAColorValue> property(new RGBAColorValue(123, 99, 255, 255));
  EXPECT_EQ(property->ToString(), "rgb(123, 99, 255)");
}

TEST(PropertyValueToStringTest, RGBAColorValue) {
  scoped_refptr<RGBAColorValue> property(new RGBAColorValue(53, 35, 192, 64));
  // Note: The alpha value of 64 specifies an alpha of 64/255 = 0.2509804.
  EXPECT_EQ(property->ToString(), "rgba(53, 35, 192, 0.2509804)");
}

TEST(PropertyValueToStringTest, LinearGradientValueAngle) {
  ColorStopList color_stop_list;
  scoped_refptr<RGBAColorValue> property_color_1(
      new RGBAColorValue(100, 0, 50, 255));
  scoped_refptr<LengthValue> property_length_1(
      new LengthValue(212, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_1, property_length_1));
  scoped_refptr<RGBAColorValue> property_color_2(
      new RGBAColorValue(55, 66, 77, 255));
  scoped_refptr<LengthValue> property_length_2(
      new LengthValue(42, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_2, property_length_2));

  scoped_refptr<LinearGradientValue> property(
      new LinearGradientValue(123.0f, color_stop_list.Pass()));

  EXPECT_EQ(property->ToString(),
            "123rad, rgb(100, 0, 50) 212px, rgb(55, 66, 77) 42px");
}

TEST(PropertyValueToStringTest, LinearGradientValueSideOrCorner) {
  ColorStopList color_stop_list;
  scoped_refptr<RGBAColorValue> property_color_1(
      new RGBAColorValue(100, 0, 50, 255));
  scoped_refptr<LengthValue> property_length_1(
      new LengthValue(212, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_1, property_length_1));
  scoped_refptr<RGBAColorValue> property_color_2(
      new RGBAColorValue(55, 66, 77, 255));
  scoped_refptr<LengthValue> property_length_2(
      new LengthValue(42, kPixelsUnit));
  color_stop_list.push_back(new ColorStop(property_color_2, property_length_2));

  scoped_refptr<LinearGradientValue> property(new LinearGradientValue(
      LinearGradientValue::kBottom, color_stop_list.Pass()));

  EXPECT_EQ(property->ToString(),
            "to bottom, rgb(100, 0, 50) 212px, rgb(55, 66, 77) 42px");
}

TEST(PropertyValueToStringTest, StringValue) {
  scoped_refptr<StringValue> property(new StringValue("cobalt"));
  EXPECT_EQ(property->ToString(), "'cobalt'");
}

TEST(PropertyValueToStringTest, TimeListValue) {
  TimeListValue::Builder time_list;
  time_list.push_back(base::TimeDelta::FromSeconds(3));
  time_list.push_back(base::TimeDelta::FromMilliseconds(14));

  scoped_refptr<TimeListValue> property(new TimeListValue(
      make_scoped_ptr(new TimeListValue::Builder(time_list))));
  EXPECT_EQ(property->ToString(), "3s, 14ms");
}

TEST(PropertyValueToStringTest, TimingFunctionListValue) {
  scoped_ptr<TimingFunctionListValue::Builder> timing_function_list(
      new TimingFunctionListValue::Builder());
  timing_function_list->push_back(
      new CubicBezierTimingFunction(0.0f, 0.5f, 1.0f, 1.0f));
  timing_function_list->push_back(
      new SteppingTimingFunction(3, SteppingTimingFunction::kEnd));
  scoped_refptr<TimingFunctionListValue> property(
      new TimingFunctionListValue(timing_function_list.Pass()));
  EXPECT_EQ(property->ToString(), "cubic-bezier(0,0.5,1,1), steps(3, end)");
}

TEST(PropertyValueToStringTest, MatrixFunction) {
  MatrixFunction function(0.0f, 1.0f, 0.1f, 1.1f, 0.2f, 1.2f);
  EXPECT_EQ(function.ToString(), "matrix(0, 1, 0.1, 1.1, 0.2, 1.2)");
}

TEST(PropertyValueToStringTest, RotateFunction) {
  RotateFunction function(3.1415f);
  EXPECT_EQ(function.ToString(), "rotate(3.1415rad)");
}

TEST(PropertyValueToStringTest, ScaleFunction) {
  ScaleFunction function(12.34f, 56.78f);
  EXPECT_EQ(function.ToString(), "scale(12.34, 56.78)");
}

TEST(PropertyValueToStringTest, TranslateFunction) {
  scoped_refptr<LengthValue> property(new LengthValue(3, kFontSizesAkaEmUnit));
  TranslateFunction function(TranslateFunction::kYAxis, property);
  EXPECT_EQ(function.ToString(), "translateY(3em)");
}

TEST(PropertyValueToStringTest, TransformFunctionListValue) {
  TransformFunctionListValue::Builder transform_list;
  transform_list.push_back(new TranslateFunction(
      TranslateFunction::kXAxis, new LengthValue(1, kPixelsUnit)));
  transform_list.push_back(new ScaleFunction(2.0f, 2.0f));
  transform_list.push_back(new RotateFunction(1.0f));
  scoped_refptr<TransformFunctionListValue> property(
      new TransformFunctionListValue(transform_list.Pass()));

  EXPECT_EQ(property->ToString(), "translateX(1px) scale(2, 2) rotate(1rad)");
}

TEST(PropertyValueToStringTest, URLValue) {
  scoped_refptr<URLValue> property(new URLValue("foo.png"));
  EXPECT_EQ(property->ToString(), "url(foo.png)");
}

TEST(PropertyValueToStringTest, MapToMeshFunctionSingleMesh) {
  scoped_ptr<MapToMeshFunction> function(new MapToMeshFunction(
      new URLValue("-.msh"),
      MapToMeshFunction::ResolutionMatchedMeshListBuilder().Pass(), 2.5f, 3.14f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetMonoscopic()));
  EXPECT_EQ(
      "map-to-mesh(url(-.msh), "
      "2.5rad 3.14rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "monoscopic)",
      function->ToString());
}

TEST(PropertyValueToStringTest, MapToMeshFunctionEquirectangular) {
  scoped_ptr<MapToMeshFunction> function(new MapToMeshFunction(
      MapToMeshFunction::kEquirectangular, 2.5f, 3.14f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetMonoscopic()));
  EXPECT_EQ(
      "map-to-mesh(equirectangular, "
      "2.5rad 3.14rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "monoscopic)",
      function->ToString());
}

TEST(PropertyValueToStringTest, MapToMeshFunctionWithResolutionMatchedMeshes) {
  MapToMeshFunction::ResolutionMatchedMeshListBuilder meshes;
  meshes.push_back(new MapToMeshFunction::ResolutionMatchedMesh(
      1920, 2000000, new URLValue("a.msh")));
  meshes.push_back(new MapToMeshFunction::ResolutionMatchedMesh(
      640, 5, new URLValue("b.msh")));
  scoped_ptr<MapToMeshFunction> function(new MapToMeshFunction(
      new URLValue("-.msh"), meshes.Pass(), 28.5f, 3.14f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetStereoscopicLeftRight()));
  EXPECT_EQ(
      "map-to-mesh(url(-.msh) 1920 2000000 url(a.msh) 640 5 url(b.msh), "
      "28.5rad 3.14rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "stereoscopic-left-right)",
      function->ToString());
}

TEST(PropertyValueToStringTest, FilterFunctionListValue) {
  FilterFunctionListValue::Builder filter_list;
  filter_list.push_back(new MapToMeshFunction(
      new URLValue("-.msh"),
      MapToMeshFunction::ResolutionMatchedMeshListBuilder().Pass(), 8.5f, 3.14f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetMonoscopic()));
  filter_list.push_back(new MapToMeshFunction(
      new URLValue("world.msh"),
      MapToMeshFunction::ResolutionMatchedMeshListBuilder().Pass(), 8.5f, 39.0f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetMonoscopic()));
  filter_list.push_back(new MapToMeshFunction(
      new URLValue("stereoscopic-world.msh"),
      MapToMeshFunction::ResolutionMatchedMeshListBuilder().Pass(), 8.5f, 39.0f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetStereoscopicLeftRight()));
  filter_list.push_back(new MapToMeshFunction(
      new URLValue("stereoscopic-top-bottom-world.msh"),
      MapToMeshFunction::ResolutionMatchedMeshListBuilder().Pass(), 8.5f, 39.0f,
      glm::mat4(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
      KeywordValue::GetStereoscopicTopBottom()));

  scoped_refptr<FilterFunctionListValue> property(
      new FilterFunctionListValue(filter_list.Pass()));

  EXPECT_EQ(
      "map-to-mesh(url(-.msh), "
      "8.5rad 3.14rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "monoscopic) "
      "map-to-mesh(url(world.msh), "
      "8.5rad 39rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "monoscopic) "
      "map-to-mesh(url(stereoscopic-world.msh), "
      "8.5rad 39rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "stereoscopic-left-right) "
      "map-to-mesh(url(stereoscopic-top-bottom-world.msh), "
      "8.5rad 39rad, "
      "matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), "
      "stereoscopic-top-bottom)",
      property->ToString());
}

}  // namespace cssom
}  // namespace cobalt
