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

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

namespace cobalt {
namespace cssom {

TEST(MediaFeatureTest, AspectRatioNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, AspectRatioEqualsShouldEvaluateTrue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, AspectRatioEqualsShouldEvaluateFalse) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(640, 480)));
}

TEST(MediaFeatureTest, AspectRatioMinimumShouldEvaluateTrue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(4, 3)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, AspectRatioMinimumShouldEvaluateFalse) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(640, 480)));
}

TEST(MediaFeatureTest, AspectRatioMaximumShouldEvaluateTrue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(640, 480)));
}

TEST(MediaFeatureTest, AspectRatioMaximumShouldEvaluateFalse) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(4, 3)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kAspectRatioMediaFeature, property));
  media_feature->set_operator(kMaximum);

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

TEST(MediaFeatureTest, ColorIndexNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorIndexMediaFeature));
  media_feature->set_operator(kNonZero);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorIndexEqualsShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorIndexMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorIndexEqualsShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(256));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorIndexMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorIndexMinimumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorIndexMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorIndexMinimumShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(256));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorIndexMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorIndexMaximumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorIndexMediaFeature, property));
  media_feature->set_operator(kMaximum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature));
  media_feature->set_operator(kNonZero);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorEqualsShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(8));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorEqualsShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(12));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorMinimumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(8));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorMinimumShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(12));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorMaximumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(8));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature, property));
  media_feature->set_operator(kMaximum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ColorMaximumShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(1));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kColorMediaFeature, property));
  media_feature->set_operator(kMaximum);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, DeviceAspectRatioNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, DeviceAspectRatioEqualsShouldEvaluateTrue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, DeviceAspectRatioEqualsShouldEvaluateFalse) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(640, 480)));
}

TEST(MediaFeatureTest, DeviceAspectRatioMinimumShouldEvaluateTrue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(4, 3)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, DeviceAspectRatioMinimumShouldEvaluateFalse) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(640, 480)));
}

TEST(MediaFeatureTest, DeviceAspectRatioMaximumShouldEvaluateTrue) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(16, 9)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(640, 480)));
}

TEST(MediaFeatureTest, DeviceAspectRatioMaximumShouldEvaluateFalse) {
  scoped_refptr<RatioValue> property(new RatioValue(math::Rational(4, 3)));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceAspectRatioMediaFeature, property));
  media_feature->set_operator(kMaximum);

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

TEST(MediaFeatureTest, DeviceHeightNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, DeviceHeightZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, DeviceHeightEqualsShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1080, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, DeviceHeightEqualsShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1080, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 480)));
}

TEST(MediaFeatureTest, DeviceHeightMinimumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(720, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, DeviceHeightMinimumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1080, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 720)));
}

TEST(MediaFeatureTest, DeviceHeightMaximumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(720, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 480)));
}

TEST(MediaFeatureTest, DeviceHeightMaximumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(720, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceHeightMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, DeviceWidthNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, DeviceWidthNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, DeviceWidthEqualsShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1920, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, DeviceWidthEqualsShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1920, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(640, 0)));
}

TEST(MediaFeatureTest, DeviceWidthMinimumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1280, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, DeviceWidthMinimumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1920, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(1280, 0)));
}

TEST(MediaFeatureTest, DeviceWidthMaximumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1280, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(640, 0)));
}

TEST(MediaFeatureTest, DeviceWidthMaximumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1280, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kDeviceWidthMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, GridNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kGridMediaFeature));
  media_feature->set_operator(kNonZero);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, GridEqualsShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kGridMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, GridEqualsShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(1));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kGridMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, GridMinimumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kGridMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, GridMinimumShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(1));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kGridMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, GridMaximumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kGridMediaFeature, property));
  media_feature->set_operator(kMaximum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, HeightNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, HeightNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, HeightEqualsShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1080, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, HeightEqualsShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1080, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 480)));
}

TEST(MediaFeatureTest, HeightMinimumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(720, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, HeightMinimumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1080, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 720)));
}

TEST(MediaFeatureTest, HeightMaximumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(720, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 480)));
}

TEST(MediaFeatureTest, HeightMaximumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(720, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kHeightMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 1080)));
}

TEST(MediaFeatureTest, MonochromeNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kMonochromeMediaFeature));
  media_feature->set_operator(kNonZero);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, MonochromeEqualsShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kMonochromeMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, MonochromeEqualsShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(8));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kMonochromeMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, MonochromeMinimumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kMonochromeMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, MonochromeMinimumShouldEvaluateFalse) {
  scoped_refptr<IntegerValue> property(new IntegerValue(8));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kMonochromeMediaFeature, property));
  media_feature->set_operator(kMinimum);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, MonochromeMaximumShouldEvaluateTrue) {
  scoped_refptr<IntegerValue> property(new IntegerValue(0));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kMonochromeMediaFeature, property));
  media_feature->set_operator(kMaximum);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, OrientationNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetPortrait();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kOrientationMediaFeature, property));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, OrientationEqualsShouldEvaluateTrue) {
  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)));
}

TEST(MediaFeatureTest, OrientationEqualsShouldEvaluateFalse) {
  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)));
}

TEST(MediaFeatureTest, ResolutionNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, ResolutionNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ResolutionEqualsShouldEvaluateTrue) {
  scoped_refptr<ResolutionValue> property(new ResolutionValue(100, kDPIUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(5500, 0)));
}

TEST(MediaFeatureTest, ResolutionEqualsShouldEvaluateFalse) {
  scoped_refptr<ResolutionValue> property(new ResolutionValue(120, kDPIUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature, property));
  media_feature->set_operator(kEquals);

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

TEST(MediaFeatureTest, ResolutionMinimumShouldEvaluateTrue) {
  scoped_refptr<ResolutionValue> property(new ResolutionValue(20, kDPIUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, ResolutionMinimumShouldEvaluateFalse) {
  scoped_refptr<ResolutionValue> property(new ResolutionValue(100, kDPIUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature, property));
  media_feature->set_operator(kMinimum);

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

TEST(MediaFeatureTest, ResolutionMaximumShouldEvaluateTrue) {
  scoped_refptr<ResolutionValue> property(new ResolutionValue(100, kDPIUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 1080)));
}

TEST(MediaFeatureTest, ResolutionMaximumShouldEvaluateFalse) {
  scoped_refptr<ResolutionValue> property(new ResolutionValue(20, kDPIUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kResolutionMediaFeature, property));
  media_feature->set_operator(kMaximum);

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

TEST(MediaFeatureTest, ScanNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetPortrait();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kScanMediaFeature, property));
  media_feature->set_operator(kNonZero);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ScanEqualsShouldEvaluateTrue) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetProgressive();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kScanMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, ScanEqualsShouldEvaluateFalse) {
  scoped_refptr<MediaFeatureKeywordValue> property =
      MediaFeatureKeywordValue::GetInterlace();
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kScanMediaFeature, property));
  media_feature->set_operator(kEquals);
  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, WidthNonZeroShouldEvaluateTrue) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, WidthNonZeroShouldEvaluateFalse) {
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature));
  media_feature->set_operator(kNonZero);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(0, 0)));
}

TEST(MediaFeatureTest, WidthEqualsShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1920, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, WidthEqualsShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1920, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature, property));
  media_feature->set_operator(kEquals);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(640, 0)));
}

TEST(MediaFeatureTest, WidthMinimumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1280, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

TEST(MediaFeatureTest, WidthMinimumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1920, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature, property));
  media_feature->set_operator(kMinimum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(1280, 0)));
}

TEST(MediaFeatureTest, WidthMaximumShouldEvaluateTrue) {
  scoped_refptr<LengthValue> property(new LengthValue(1280, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_TRUE(media_feature->EvaluateConditionValue(math::Size(640, 0)));
}

TEST(MediaFeatureTest, WidthMaximumShouldEvaluateFalse) {
  scoped_refptr<LengthValue> property(new LengthValue(1280, kPixelsUnit));
  scoped_refptr<MediaFeature> media_feature(
      new MediaFeature(kWidthMediaFeature, property));
  media_feature->set_operator(kMaximum);

  EXPECT_FALSE(media_feature->EvaluateConditionValue(math::Size(1920, 0)));
}

}  // namespace cssom
}  // namespace cobalt
