OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/display/output_util.h" | 5 #include "chromeos/display/output_util.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
| 10 #include <X11/extensions/Xrandr.h> |
| 11 |
10 namespace chromeos { | 12 namespace chromeos { |
11 | 13 |
12 namespace { | 14 namespace { |
13 | 15 |
14 // Returns the number of characters in the string literal but doesn't count its | 16 // Returns the number of characters in the string literal but doesn't count its |
15 // terminator NULL byte. | 17 // terminator NULL byte. |
16 #define charsize(str) (arraysize(str) - 1) | 18 #define charsize(str) (arraysize(str) - 1) |
17 | 19 |
18 // Sample EDID data extracted from real devices. | 20 // Sample EDID data extracted from real devices. |
19 const unsigned char kNormalDisplay[] = | 21 const unsigned char kNormalDisplay[] = |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 kInternalDisplay, charsize(kInternalDisplay), 0, &id)); | 239 kInternalDisplay, charsize(kInternalDisplay), 0, &id)); |
238 EXPECT_NE(-1, id); | 240 EXPECT_NE(-1, id); |
239 } | 241 } |
240 | 242 |
241 TEST(OutputUtilTest, GetDisplayIdFailure) { | 243 TEST(OutputUtilTest, GetDisplayIdFailure) { |
242 int64 id = -1; | 244 int64 id = -1; |
243 EXPECT_FALSE(GetDisplayIdFromEDID(NULL, 0, 0, &id)); | 245 EXPECT_FALSE(GetDisplayIdFromEDID(NULL, 0, 0, &id)); |
244 EXPECT_EQ(-1, id); | 246 EXPECT_EQ(-1, id); |
245 } | 247 } |
246 | 248 |
| 249 TEST(OutputUtilTest, FindOutputModeMatchingSize) { |
| 250 XRRScreenResources resources = {0}; |
| 251 RROutput outputs[] = {1}; |
| 252 resources.noutput = arraysize(outputs); |
| 253 resources.outputs = outputs; |
| 254 XRRModeInfo modes[] = { |
| 255 // id, width, height, interlaced, refresh rate |
| 256 test::CreateModeInfo(11, 1920, 1200, false, 60.0f), |
| 257 |
| 258 // different rates |
| 259 test::CreateModeInfo(12, 1920, 1080, false, 30.0f), |
| 260 test::CreateModeInfo(13, 1920, 1080, false, 50.0f), |
| 261 test::CreateModeInfo(14, 1920, 1080, false, 40.0f), |
| 262 test::CreateModeInfo(15, 1920, 1080, false, 0.0f), |
| 263 |
| 264 // interlace vs non interlace |
| 265 test::CreateModeInfo(16, 1280, 720, true, 60.0f), |
| 266 test::CreateModeInfo(17, 1280, 720, false, 40.0f), |
| 267 |
| 268 // interlace only |
| 269 test::CreateModeInfo(18, 1024, 768, true, 0.0f), |
| 270 test::CreateModeInfo(19, 1024, 768, true, 40.0f), |
| 271 test::CreateModeInfo(20, 1024, 768, true, 60.0f), |
| 272 |
| 273 // mixed |
| 274 test::CreateModeInfo(21, 1024, 600, true, 60.0f), |
| 275 test::CreateModeInfo(22, 1024, 600, false, 40.0f), |
| 276 test::CreateModeInfo(23, 1024, 600, false, 50.0f), |
| 277 |
| 278 // just one interlaced mode |
| 279 test::CreateModeInfo(24, 640, 480, true, 60.0f), |
| 280 |
| 281 // refresh rate not available. |
| 282 test::CreateModeInfo(25, 320, 200, false, 0.0f), |
| 283 }; |
| 284 resources.nmode = arraysize(modes); |
| 285 resources.modes = modes; |
| 286 |
| 287 XRROutputInfo output_info = {0}; |
| 288 RRMode output_modes[] = { |
| 289 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 |
| 290 }; |
| 291 output_info.nmode = arraysize(output_modes); |
| 292 output_info.modes = output_modes; |
| 293 |
| 294 EXPECT_EQ(11u, FindOutputModeMatchingSize(&resources, |
| 295 &output_info, |
| 296 1920, 1200)); |
| 297 |
| 298 // Should pick highest refresh rate. |
| 299 EXPECT_EQ(13u, FindOutputModeMatchingSize(&resources, |
| 300 &output_info, |
| 301 1920, 1080)); |
| 302 |
| 303 // Should pick non interlaced mode. |
| 304 EXPECT_EQ(17u, FindOutputModeMatchingSize(&resources, |
| 305 &output_info, |
| 306 1280, 720)); |
| 307 |
| 308 // Interlaced only. Should pick one with the highest refresh rate in |
| 309 // interlaced mode. |
| 310 EXPECT_EQ(20u, FindOutputModeMatchingSize(&resources, |
| 311 &output_info, |
| 312 1024, 768)); |
| 313 |
| 314 // Mixed: Should pick one with the highest refresh rate in |
| 315 // interlaced mode. |
| 316 EXPECT_EQ(23u, FindOutputModeMatchingSize(&resources, |
| 317 &output_info, |
| 318 1024, 600)); |
| 319 |
| 320 // Just one interlaced mode. |
| 321 EXPECT_EQ(24u, FindOutputModeMatchingSize(&resources, |
| 322 &output_info, |
| 323 640, 480)); |
| 324 |
| 325 // Refresh rate not available. |
| 326 EXPECT_EQ(25u, FindOutputModeMatchingSize(&resources, |
| 327 &output_info, |
| 328 320, 200)); |
| 329 |
| 330 // No mode found. |
| 331 EXPECT_EQ(static_cast<XID>(None), |
| 332 FindOutputModeMatchingSize(&resources, |
| 333 &output_info, |
| 334 1440, 900)); |
| 335 } |
| 336 |
247 } // namespace chromeos | 337 } // namespace chromeos |
OLD | NEW |