/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "gtest/gtest.h"
#include "GfxInfoBase.h"

using namespace mozilla::widget;

TEST(GfxInfo, GfxVersionEx)
{
  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                            DRIVER_LESS_THAN));
  EXPECT_TRUE(GfxVersionEx(9, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN));
  EXPECT_TRUE(GfxVersionEx(10, 2, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN));
  EXPECT_TRUE(GfxVersionEx(10, 3, 3, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 999)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 1001)
                   .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                            DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(9, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 2, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 3, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 999)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_LESS_THAN_OR_EQUAL));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                            DRIVER_GREATER_THAN));
  EXPECT_TRUE(GfxVersionEx(11, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN));
  EXPECT_TRUE(GfxVersionEx(10, 4, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN));
  EXPECT_TRUE(GfxVersionEx(10, 3, 5, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1001)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 999)
                   .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                            DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(11, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 4, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 5, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1001)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_GREATER_THAN_OR_EQUAL));

  EXPECT_TRUE(
      GfxVersionEx(10, 3, 4, 1000)
          .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(), DRIVER_EQUAL));
  EXPECT_FALSE(
      GfxVersionEx(11, 3, 4, 1000)
          .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(), DRIVER_EQUAL));
  EXPECT_FALSE(
      GfxVersionEx(10, 4, 4, 1000)
          .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(), DRIVER_EQUAL));
  EXPECT_FALSE(
      GfxVersionEx(10, 3, 5, 1000)
          .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(), DRIVER_EQUAL));
  EXPECT_FALSE(
      GfxVersionEx(10, 3, 4, 1001)
          .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(), DRIVER_EQUAL));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                            DRIVER_NOT_EQUAL));
  EXPECT_TRUE(GfxVersionEx(11, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_NOT_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 4, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_NOT_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 5, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_NOT_EQUAL));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1001)
                  .Compare(GfxVersionEx(10, 3, 4, 1000), GfxVersionEx(),
                           DRIVER_NOT_EQUAL));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_FALSE(GfxVersionEx(10, 5, 6, 1100)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_FALSE(GfxVersionEx(9, 5, 6, 1100)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_FALSE(GfxVersionEx(11, 5, 6, 1100)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 3, 6, 1100)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1100)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1001)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 5, 6, 1099)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 4, 6, 1100)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_EXCLUSIVE));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 999)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_FALSE(GfxVersionEx(9, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_FALSE(GfxVersionEx(11, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1101)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 4, 5, 1050)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 3, 6, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 5, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxVersionEx(10, 5, 6, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE));

  EXPECT_FALSE(GfxVersionEx(10, 3, 4, 999)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_FALSE(GfxVersionEx(9, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_FALSE(GfxVersionEx(11, 3, 4, 1000)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_FALSE(GfxVersionEx(10, 5, 6, 1100)
                   .Compare(GfxVersionEx(10, 3, 4, 1000),
                            GfxVersionEx(10, 5, 6, 1100),
                            DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1101)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxVersionEx(10, 3, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxVersionEx(10, 4, 5, 1050)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxVersionEx(10, 3, 6, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxVersionEx(10, 5, 4, 1000)
                  .Compare(GfxVersionEx(10, 3, 4, 1000),
                           GfxVersionEx(10, 5, 6, 1100),
                           DRIVER_BETWEEN_INCLUSIVE_START));

  GfxVersionEx noParts;
  EXPECT_TRUE(noParts.Parse(""_ns));
  EXPECT_EQ(noParts.Compare(GfxVersionEx(0, 0, 0, 0)), 0);

  GfxVersionEx onePart;
  EXPECT_TRUE(onePart.Parse("9"_ns));
  EXPECT_EQ(onePart.Compare(GfxVersionEx(9, 0, 0, 0)), 0);

  GfxVersionEx twoParts;
  EXPECT_TRUE(twoParts.Parse("1000.1"_ns));
  EXPECT_EQ(twoParts.Compare(GfxVersionEx(1000, 1, 0, 0)), 0);

  GfxVersionEx threeParts;
  EXPECT_TRUE(threeParts.Parse("44.1000.33"_ns));
  EXPECT_EQ(threeParts.Compare(GfxVersionEx(44, 1000, 33, 0)), 0);

  GfxVersionEx fourParts;
  EXPECT_TRUE(fourParts.Parse("10.5.4.1000"_ns));
  EXPECT_EQ(fourParts.Compare(GfxVersionEx(10, 5, 4, 1000)), 0);

  GfxVersionEx fiveParts;
  EXPECT_TRUE(fiveParts.Parse("10.5.4.1000.87"_ns));
  EXPECT_EQ(fiveParts.Compare(GfxVersionEx(10, 5, 4, 1000)), 0);

  GfxVersionEx badParts;
  EXPECT_FALSE(badParts.Parse("10.5.abc.25"_ns));
  EXPECT_EQ(badParts.Compare(GfxVersionEx(10, 5, 0, 0)), 0);
}

TEST(GfxInfo, MatchingRefreshRateStatus)
{
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(RefreshRateStatus::Single,
                                                     RefreshRateStatus::Any));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::MultipleSame, RefreshRateStatus::Any));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(RefreshRateStatus::Mixed,
                                                     RefreshRateStatus::Any));

  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Single, RefreshRateStatus::AnySame));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::MultipleSame, RefreshRateStatus::AnySame));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Mixed, RefreshRateStatus::AnySame));

  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Single, RefreshRateStatus::Single));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::MultipleSame, RefreshRateStatus::Single));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Mixed, RefreshRateStatus::Single));

  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Single, RefreshRateStatus::MultipleSame));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::MultipleSame, RefreshRateStatus::MultipleSame));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Mixed, RefreshRateStatus::MultipleSame));

  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::Single, RefreshRateStatus::Mixed));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRateStatus(
      RefreshRateStatus::MultipleSame, RefreshRateStatus::Mixed));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRateStatus(RefreshRateStatus::Mixed,
                                                     RefreshRateStatus::Mixed));
}

TEST(GfxInfo, MatchingRefreshRates)
{
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(60, 60, 0, DRIVER_LESS_THAN));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(59, 60, 0, DRIVER_LESS_THAN));

  EXPECT_FALSE(
      GfxInfoBase::MatchingRefreshRates(61, 60, 0, DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(
      GfxInfoBase::MatchingRefreshRates(60, 60, 0, DRIVER_LESS_THAN_OR_EQUAL));
  EXPECT_TRUE(
      GfxInfoBase::MatchingRefreshRates(59, 60, 0, DRIVER_LESS_THAN_OR_EQUAL));

  EXPECT_FALSE(
      GfxInfoBase::MatchingRefreshRates(60, 60, 0, DRIVER_GREATER_THAN));
  EXPECT_TRUE(
      GfxInfoBase::MatchingRefreshRates(61, 60, 0, DRIVER_GREATER_THAN));

  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(59, 60, 0,
                                                 DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(60, 60, 0,
                                                DRIVER_GREATER_THAN_OR_EQUAL));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(61, 60, 0,
                                                DRIVER_GREATER_THAN_OR_EQUAL));

  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(59, 60, 0, DRIVER_EQUAL));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(60, 60, 0, DRIVER_EQUAL));

  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(60, 60, 0, DRIVER_NOT_EQUAL));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(59, 60, 0, DRIVER_NOT_EQUAL));

  EXPECT_FALSE(
      GfxInfoBase::MatchingRefreshRates(60, 60, 120, DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(120, 60, 120,
                                                 DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(
      GfxInfoBase::MatchingRefreshRates(61, 60, 120, DRIVER_BETWEEN_EXCLUSIVE));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(119, 60, 120,
                                                DRIVER_BETWEEN_EXCLUSIVE));

  EXPECT_FALSE(
      GfxInfoBase::MatchingRefreshRates(59, 60, 120, DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(121, 60, 120,
                                                 DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(
      GfxInfoBase::MatchingRefreshRates(60, 60, 120, DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(
      GfxInfoBase::MatchingRefreshRates(61, 60, 120, DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(119, 60, 120,
                                                DRIVER_BETWEEN_INCLUSIVE));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(120, 60, 120,
                                                DRIVER_BETWEEN_INCLUSIVE));

  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(
      59, 60, 120, DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(
      120, 60, 120, DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_FALSE(GfxInfoBase::MatchingRefreshRates(
      121, 60, 120, DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(
      60, 60, 120, DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(
      61, 60, 120, DRIVER_BETWEEN_INCLUSIVE_START));
  EXPECT_TRUE(GfxInfoBase::MatchingRefreshRates(
      119, 60, 120, DRIVER_BETWEEN_INCLUSIVE_START));
}
