// Copyright (c) 2011 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 "base/memory/scoped_ptr.h"
#include "content/common/gpu/gpu_info.h"
#include "content/gpu/gpu_idirect3d9_mock_win.h"
#include "content/gpu/gpu_info_collector.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::_;
using ::testing::Return;
using ::testing::SetArgumentPointee;

class GPUInfoTest : public testing::Test {
 public:
  GPUInfoTest() { }
  virtual ~GPUInfoTest() { }

 protected:
  void SetUp() {
    // Test variables taken from Lenovo T61
    test_identifier_.VendorId = 0x10de;
    test_identifier_.DeviceId = 0x429;
    test_identifier_.DriverVersion.QuadPart = 0x6000e000b1e23;  // 6.14.11.7715
    test_caps_.PixelShaderVersion = 0xffff0300;  // 3.0
    test_caps_.VertexShaderVersion = 0xfffe0300;  // 3.0

    EXPECT_CALL(d3d_, GetDeviceCaps(_, _, _))
        .WillOnce(DoAll(SetArgumentPointee<2>(test_caps_),
                        Return(D3D_OK)));
    EXPECT_CALL(d3d_, QueryInterface(__uuidof(IDirect3D9Ex), _))
        .WillOnce(Return(E_NOINTERFACE));
    EXPECT_CALL(d3d_, Release());
  }
  void TearDown() {
  }

 public:
  IDirect3D9Mock d3d_;
 private:
  D3DADAPTER_IDENTIFIER9 test_identifier_;
  D3DCAPS9 test_caps_;
};

TEST_F(GPUInfoTest, PixelShaderVersionD3D) {
  GPUInfo gpu_info;
  ASSERT_TRUE(gpu_info_collector::CollectGraphicsInfoD3D(&d3d_, &gpu_info));
  EXPECT_EQ(gpu_info.pixel_shader_version, "3.0");
}

TEST_F(GPUInfoTest, VertexShaderVersionD3D) {
  GPUInfo gpu_info;
  ASSERT_TRUE(gpu_info_collector::CollectGraphicsInfoD3D(&d3d_, &gpu_info));
  EXPECT_EQ(gpu_info.vertex_shader_version, "3.0");
}
