// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/host/screen_resolution.h"

#include <stdint.h>

#include <limits>

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

namespace remoting {

TEST(ScreenResolutionTest, Empty) {
  ScreenResolution resolution1(
      webrtc::DesktopSize(100, 100), webrtc::DesktopVector(10, 10));
  EXPECT_FALSE(resolution1.IsEmpty());

  ScreenResolution resolution2(
      webrtc::DesktopSize(), webrtc::DesktopVector(10, 10));
  EXPECT_TRUE(resolution2.IsEmpty());

  ScreenResolution resolution3(
      webrtc::DesktopSize(1, 1), webrtc::DesktopVector(0, 0));
  EXPECT_TRUE(resolution3.IsEmpty());
}

TEST(ScreenResolutionTest, Scaling) {
  ScreenResolution resolution(
      webrtc::DesktopSize(100, 100), webrtc::DesktopVector(10, 10));

  EXPECT_TRUE(webrtc::DesktopSize(50, 50).equals(
      resolution.ScaleDimensionsToDpi(webrtc::DesktopVector(5, 5))));

  EXPECT_TRUE(webrtc::DesktopSize(200, 200).equals(
      resolution.ScaleDimensionsToDpi(webrtc::DesktopVector(20, 20))));
}

TEST(ScreenResolutionTest, ScalingSaturation) {
  ScreenResolution resolution(
      webrtc::DesktopSize(10000000, 1000000), webrtc::DesktopVector(1, 1));

  int32_t max_int = std::numeric_limits<int32_t>::max();
  EXPECT_TRUE(webrtc::DesktopSize(max_int, max_int).equals(
      resolution.ScaleDimensionsToDpi(
          webrtc::DesktopVector(1000000, 1000000))));
}

}  // namespace remoting
