/*
 * Copyright 2015 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_font_face_declaration_data.h"

#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/property_definitions.h"

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

namespace cobalt {
namespace cssom {

TEST(CSSFontFaceDeclarationDataTest, FamilySettersAndGettersAreConsistent) {
  scoped_refptr<CSSFontFaceDeclarationData> font_face =
      new CSSFontFaceDeclarationData();

  EXPECT_FALSE(font_face->family());
  EXPECT_FALSE(font_face->GetPropertyValue(kFontFamilyProperty));

  font_face->set_family(KeywordValue::GetInitial());
  EXPECT_EQ(KeywordValue::GetInitial(), font_face->family());
  EXPECT_EQ(KeywordValue::GetInitial(),
            font_face->GetPropertyValue(kFontFamilyProperty));

  font_face->SetPropertyValue(kFontFamilyProperty, KeywordValue::GetInherit());
  EXPECT_EQ(KeywordValue::GetInherit(), font_face->family());
  EXPECT_EQ(KeywordValue::GetInherit(),
            font_face->GetPropertyValue(kFontFamilyProperty));
}

TEST(CSSFontFaceDeclarationDataTest, SrcSettersAndGettersAreConsistent) {
  scoped_refptr<CSSFontFaceDeclarationData> font_face =
      new CSSFontFaceDeclarationData();

  EXPECT_FALSE(font_face->src());
  EXPECT_FALSE(font_face->GetPropertyValue(kSrcProperty));

  font_face->set_src(KeywordValue::GetInitial());
  EXPECT_EQ(KeywordValue::GetInitial(), font_face->src());
  EXPECT_EQ(KeywordValue::GetInitial(),
            font_face->GetPropertyValue(kSrcProperty));

  font_face->SetPropertyValue(kSrcProperty, KeywordValue::GetInherit());
  EXPECT_EQ(KeywordValue::GetInherit(), font_face->src());
  EXPECT_EQ(KeywordValue::GetInherit(),
            font_face->GetPropertyValue(kSrcProperty));
}

TEST(CSSFontFaceDeclarationDataTest, StyleSettersAndGettersAreConsistent) {
  scoped_refptr<CSSFontFaceDeclarationData> font_face =
      new CSSFontFaceDeclarationData();

  EXPECT_TRUE(font_face->style());
  EXPECT_TRUE(font_face->GetPropertyValue(kFontStyleProperty));

  font_face->set_style(KeywordValue::GetInitial());
  EXPECT_EQ(KeywordValue::GetInitial(), font_face->style());
  EXPECT_EQ(KeywordValue::GetInitial(),
            font_face->GetPropertyValue(kFontStyleProperty));

  font_face->SetPropertyValue(kFontStyleProperty, KeywordValue::GetInherit());
  EXPECT_EQ(KeywordValue::GetInherit(), font_face->style());
  EXPECT_EQ(KeywordValue::GetInherit(),
            font_face->GetPropertyValue(kFontStyleProperty));
}

TEST(CSSFontFaceDeclarationDataTest, WeightSettersAndGettersAreConsistent) {
  scoped_refptr<CSSFontFaceDeclarationData> font_face =
      new CSSFontFaceDeclarationData();

  EXPECT_TRUE(font_face->weight());
  EXPECT_TRUE(font_face->GetPropertyValue(kFontWeightProperty));

  font_face->set_weight(KeywordValue::GetInitial());
  EXPECT_EQ(KeywordValue::GetInitial(), font_face->weight());
  EXPECT_EQ(KeywordValue::GetInitial(),
            font_face->GetPropertyValue(kFontWeightProperty));

  font_face->SetPropertyValue(kFontWeightProperty, KeywordValue::GetInherit());
  EXPECT_EQ(KeywordValue::GetInherit(), font_face->weight());
  EXPECT_EQ(KeywordValue::GetInherit(),
            font_face->GetPropertyValue(kFontWeightProperty));
}

TEST(CSSFontFaceDeclarationDataTest,
     UnicodeRangeSettersAndGettersAreConsistent) {
  scoped_refptr<CSSFontFaceDeclarationData> font_face =
      new CSSFontFaceDeclarationData();

  EXPECT_FALSE(font_face->unicode_range());
  EXPECT_FALSE(font_face->GetPropertyValue(kUnicodeRangeProperty));

  font_face->set_unicode_range(KeywordValue::GetInitial());
  EXPECT_EQ(KeywordValue::GetInitial(), font_face->unicode_range());
  EXPECT_EQ(KeywordValue::GetInitial(),
            font_face->GetPropertyValue(kUnicodeRangeProperty));

  font_face->SetPropertyValue(kUnicodeRangeProperty,
                              KeywordValue::GetInherit());
  EXPECT_EQ(KeywordValue::GetInherit(), font_face->unicode_range());
  EXPECT_EQ(KeywordValue::GetInherit(),
            font_face->GetPropertyValue(kUnicodeRangeProperty));
}

}  // namespace cssom
}  // namespace cobalt
