// 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/media_query.h"

#include "base/memory/ref_counted.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/media_feature.h"
#include "cobalt/cssom/media_feature_keyword_value.h"
#include "cobalt/cssom/media_feature_names.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace cssom {

TEST(MediaQueryTest, EvaluateEmptyQuery) {
  scoped_refptr<MediaQuery> media_query(new MediaQuery());
  EXPECT_TRUE(media_query->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaQueryTest, EvaluateMediaTypeFalse) {
  scoped_refptr<MediaQuery> media_query(new MediaQuery(false));
  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrue) {
  scoped_refptr<MediaQuery> media_query(new MediaQuery(true));
  EXPECT_TRUE(media_query->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaQueryTest, EvaluateMediaTypeFalseAndMediaFeatureTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetLandscape();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kOrientationMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(false, media_features.Pass()));
  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeFalseAndMediaFeatureFalse) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetPortrait();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kOrientationMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(1920, 108)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(false, media_features.Pass()));
  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrueAndMediaFeatureTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetLandscape();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kOrientationMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(true, media_features.Pass()));
  EXPECT_TRUE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrueAndMediaFeatureFalse) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetPortrait();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kOrientationMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(true, media_features.Pass()));

  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrueAndFeaturesFalseAndFalse) {
  scoped_refptr<MediaFeatureKeywordValue> property_1 =
      MediaFeatureKeywordValue::GetPortrait();
  scoped_refptr<MediaFeature> media_feature_1(
      new MediaFeature(kOrientationMediaFeature, property_1));
  media_feature_1->set_operator(kEquals);
  EXPECT_FALSE(media_feature_1->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_refptr<MediaFeatureKeywordValue> property_2 =
      MediaFeatureKeywordValue::GetInterlace();
  scoped_refptr<MediaFeature> media_feature_2(
      new MediaFeature(kScanMediaFeature, property_2));
  media_feature_2->set_operator(kEquals);
  EXPECT_FALSE(media_feature_2->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature_1);
  media_features->push_back(media_feature_2);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(true, media_features.Pass()));

  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrueAndFeaturesFalseAndTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property_1 =
      MediaFeatureKeywordValue::GetPortrait();
  scoped_refptr<MediaFeature> media_feature_1(
      new MediaFeature(kOrientationMediaFeature, property_1));
  media_feature_1->set_operator(kEquals);
  EXPECT_FALSE(media_feature_1->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_refptr<MediaFeatureKeywordValue> property_2 =
      MediaFeatureKeywordValue::GetProgressive();
  scoped_refptr<MediaFeature> media_feature_2(
      new MediaFeature(kScanMediaFeature, property_2));
  media_feature_2->set_operator(kEquals);
  EXPECT_TRUE(media_feature_2->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature_1);
  media_features->push_back(media_feature_2);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(true, media_features.Pass()));
  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrueAndFeaturesTrueAndFalse) {
  scoped_refptr<MediaFeatureKeywordValue> property_1 =
      MediaFeatureKeywordValue::GetLandscape();
  scoped_refptr<MediaFeature> media_feature_1(
      new MediaFeature(kOrientationMediaFeature, property_1));
  media_feature_1->set_operator(kEquals);
  EXPECT_TRUE(media_feature_1->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_refptr<MediaFeatureKeywordValue> property_2 =
      MediaFeatureKeywordValue::GetInterlace();
  scoped_refptr<MediaFeature> media_feature_2(
      new MediaFeature(kScanMediaFeature, property_2));
  media_feature_2->set_operator(kEquals);
  EXPECT_FALSE(media_feature_2->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature_1);
  media_features->push_back(media_feature_2);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(true, media_features.Pass()));
  EXPECT_FALSE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaQueryTest, EvaluateMediaTypeTrueAndFeaturesTrueAndTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property_1 =
      MediaFeatureKeywordValue::GetLandscape();
  scoped_refptr<MediaFeature> media_feature_1(
      new MediaFeature(kOrientationMediaFeature, property_1));
  media_feature_1->set_operator(kEquals);
  EXPECT_TRUE(media_feature_1->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_refptr<MediaFeatureKeywordValue> property_2 =
      MediaFeatureKeywordValue::GetProgressive();
  scoped_refptr<MediaFeature> media_feature_2(
      new MediaFeature(kScanMediaFeature, property_2));
  media_feature_2->set_operator(kEquals);
  EXPECT_TRUE(media_feature_2->EvaluateConditionValue(math::Size(1920, 1080)));

  scoped_ptr<MediaFeatures> media_features(new MediaFeatures);
  media_features->push_back(media_feature_1);
  media_features->push_back(media_feature_2);
  scoped_refptr<MediaQuery> media_query(
      new MediaQuery(true, media_features.Pass()));
  EXPECT_TRUE(media_query->EvaluateConditionValue(math::Size(1920, 1080)));
}

}  // namespace cssom
}  // namespace cobalt
