display_util_unittest.cc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/display/util/display_util.h"
  5. #include "base/test/metrics/histogram_tester.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "ui/display/test/display_test_util.h"
  8. #include "ui/display/util/edid_parser.h"
  9. namespace display {
  10. namespace {
  11. // HP z32x monitor.
  12. const unsigned char kHPz32x[] =
  13. "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x22\xF0\x75\x32\x01\x01\x01\x01"
  14. "\x1B\x1B\x01\x04\xB5\x46\x27\x78\x3A\x8D\x15\xAC\x51\x32\xB8\x26"
  15. "\x0B\x50\x54\x21\x08\x00\xD1\xC0\xA9\xC0\x81\xC0\xD1\x00\xB3\x00"
  16. "\x95\x00\xA9\x40\x81\x80\x4D\xD0\x00\xA0\xF0\x70\x3E\x80\x30\x20"
  17. "\x35\x00\xB9\x88\x21\x00\x00\x1A\x00\x00\x00\xFD\x00\x18\x3C\x1E"
  18. "\x87\x3C\x00\x0A\x20\x20\x20\x20\x20\x20\x00\x00\x00\xFC\x00\x48"
  19. "\x50\x20\x5A\x33\x32\x78\x0A\x20\x20\x20\x20\x20\x00\x00\x00\xFF"
  20. "\x00\x43\x4E\x43\x37\x32\x37\x30\x4D\x57\x30\x0A\x20\x20\x01\x46"
  21. "\x02\x03\x18\xF1\x4B\x10\x1F\x04\x13\x03\x12\x02\x11\x01\x05\x14"
  22. "\x23\x09\x07\x07\x83\x01\x00\x00\xA3\x66\x00\xA0\xF0\x70\x1F\x80"
  23. "\x30\x20\x35\x00\xB9\x88\x21\x00\x00\x1A\x56\x5E\x00\xA0\xA0\xA0"
  24. "\x29\x50\x30\x20\x35\x00\xB9\x88\x21\x00\x00\x1A\xEF\x51\x00\xA0"
  25. "\xF0\x70\x19\x80\x30\x20\x35\x00\xB9\x88\x21\x00\x00\x1A\xE2\x68"
  26. "\x00\xA0\xA0\x40\x2E\x60\x20\x30\x63\x00\xB9\x88\x21\x00\x00\x1C"
  27. "\x28\x3C\x80\xA0\x70\xB0\x23\x40\x30\x20\x36\x00\xB9\x88\x21\x00"
  28. "\x00\x1A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E";
  29. // Chromebook Samus internal display.
  30. const unsigned char kSamus[] =
  31. "\x00\xff\xff\xff\xff\xff\xff\x00\x30\xe4\x2e\x04\x00\x00\x00\x00"
  32. "\x00\x18\x01\x04\xa5\x1b\x12\x96\x02\x4f\xd5\xa2\x59\x52\x93\x26"
  33. "\x17\x50\x54\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
  34. "\x01\x01\x01\x01\x01\x01\x6d\x6f\x00\x9e\xa0\xa4\x31\x60\x30\x20"
  35. "\x3a\x00\x10\xb5\x10\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00"
  36. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x4c"
  37. "\x47\x20\x44\x69\x73\x70\x6c\x61\x79\x0a\x20\x20\x00\x00\x00\xfe"
  38. "\x00\x4c\x50\x31\x32\x39\x51\x45\x32\x2d\x53\x50\x41\x31\x00\x6c";
  39. // Chromebook Eve internal display.
  40. const unsigned char kEve[] =
  41. "\x00\xff\xff\xff\xff\xff\xff\x00\x4d\x10\x8a\x14\x00\x00\x00\x00"
  42. "\x16\x1b\x01\x04\xa5\x1a\x11\x78\x06\xde\x50\xa3\x54\x4c\x99\x26"
  43. "\x0f\x50\x54\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
  44. "\x01\x01\x01\x01\x01\x01\xbb\x62\x60\xa0\x90\x40\x2e\x60\x30\x20"
  45. "\x3a\x00\x03\xad\x10\x00\x00\x18\x00\x00\x00\x10\x00\x00\x00\x00"
  46. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00"
  47. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc"
  48. "\x00\x4c\x51\x31\x32\x33\x50\x31\x4a\x58\x33\x32\x0a\x20\x00\xb6";
  49. // Invalid EDID: too short to contain chromaticity nor gamma information.
  50. const unsigned char kInvalidEdid[] =
  51. "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x22\xF0\x76\x26\x01\x01\x01\x01"
  52. "\x02\x12\x01\x03\x80\x34\x21";
  53. // Partially valid EDID: gamma information is marked as non existent.
  54. const unsigned char kEdidWithNoGamma[] =
  55. "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x22\xF0\x76\x26\x01\x01\x01\x01"
  56. "\x02\x12\x01\x03\x80\x34\x21\xFF\xEE\xEF\x95\xA3\x54\x4C\x9B\x26"
  57. "\x0F\x50\x54\xA5\x6B\x80\x81\x40\x81\x80\x81\x99\x71\x00\xA9\x00";
  58. // Chromebook Samsung Galaxy (kohaku) that supports HDR metadata.
  59. constexpr unsigned char kHDR[] =
  60. "\x00\xff\xff\xff\xff\xff\xff\x00\x4c\x83\x42\x41\x00\x00\x00\x00"
  61. "\x13\x1d\x01\x04\xb5\x1d\x11\x78\x02\x38\xd1\xae\x51\x3b\xb8\x23"
  62. "\x0b\x50\x54\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
  63. "\x01\x01\x01\x01\x01\x01\xb9\xd5\x00\x40\xf1\x70\x20\x80\x30\x20"
  64. "\x88\x00\x26\xa5\x10\x00\x00\x1b\xb9\xd5\x00\x40\xf1\x70\x20\x80"
  65. "\x30\x20\x88\x00\x26\xa5\x10\x00\x00\x1b\x00\x00\x00\x0f\x00\xff"
  66. "\x09\x3c\xff\x09\x3c\x2c\x80\x00\x00\x00\x00\x00\x00\x00\x00\xfe"
  67. "\x00\x41\x54\x4e\x41\x33\x33\x54\x50\x30\x34\x2d\x30\x20\x01\xba"
  68. "\x02\x03\x0f\x00\xe3\x05\x80\x00\xe6\x06\x05\x01\x73\x6d\x07\x00"
  69. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  70. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  71. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  72. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  73. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  74. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  75. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab";
  76. // EDID collected in the wild: valid but with primaries in the wrong order.
  77. const unsigned char kSST210[] =
  78. "\xff\x00\xff\xff\xff\xff\x00\xff\x2d\x4c\x42\x52\x32\x31\x50\x43"
  79. "\x0c\x2b\x03\x01\x33\x80\xa2\x20\x56\x2a\x9c\x4e\x50\x5b\x26\x95"
  80. "\x50\x23\xbf\x59\x80\xef\x80\x81\x59\x61\x59\x45\x59\x31\x40\x31"
  81. "\x01\x01\x01\x01\x01\x01\x32\x8c\xa0\x40\xb0\x60\x40\x19\x32\x1e"
  82. "\x00\x13\x44\x06\x00\x21\x1e\x00\x00\x00\xfd\x00\x38\x00\x1e\x55"
  83. "\x0f\x51\x0a\x00\x20\x20\x20\x20\x20\x20\x00\x00\xfc\x00\x32\x00"
  84. "\x30\x31\x20\x54\x69\x44\x69\x67\x61\x74\x0a\x6c\x00\x00\xff\x00"
  85. "\x48\x00\x4b\x34\x41\x54\x30\x30\x32\x38\x0a\x38\x20\x20\xf8\x00";
  86. // EDID of |kSST210| with the order of the primaries corrected. Still invalid
  87. // because the triangle of primaries is too small.
  88. const unsigned char kSST210Corrected[] =
  89. "\xff\x00\xff\xff\xff\xff\x00\xff\x2d\x4c\x42\x52\x32\x31\x50\x43"
  90. "\x0c\x2b\x03\x01\x33\x80\xa2\x20\x56\x2a\x9c\x95\x50\x4e\x50\x5b"
  91. "\x26\x23\xbf\x59\x80\xef\x80\x81\x59\x61\x59\x45\x59\x31\x40\x31"
  92. "\x01\x01\x01\x01\x01\x01\x32\x8c\xa0\x40\xb0\x60\x40\x19\x32\x1e"
  93. "\x00\x13\x44\x06\x00\x21\x1e\x00\x00\x00\xfd\x00\x38\x00\x1e\x55"
  94. "\x0f\x51\x0a\x00\x20\x20\x20\x20\x20\x20\x00\x00\xfc\x00\x32\x00"
  95. "\x30\x31\x20\x54\x69\x44\x69\x67\x61\x74\x0a\x6c\x00\x00\xff\x00"
  96. "\x48\x00\x4b\x34\x41\x54\x30\x30\x32\x38\x0a\x38\x20\x20\xf8\x00";
  97. // This EDID produces blue primary coordinates too far off the expected point,
  98. // which would paint blue colors as purple. See https://crbug.com/809909.
  99. const unsigned char kBrokenBluePrimaries[] =
  100. "\x00\xff\xff\xff\xff\xff\xff\x00\x4c\x83\x4d\x83\x00\x00\x00\x00"
  101. "\x00\x19\x01\x04\x95\x1d\x10\x78\x0a\xee\x25\xa3\x54\x4c\x99\x29"
  102. "\x26\x50\x54\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
  103. "\x01\x01\x01\x01\x01\x01\xd2\x37\x80\xa2\x70\x38\x40\x40\x30\x20"
  104. "\x25\x00\x25\xa5\x10\x00\x00\x1a\xa6\x2c\x80\xa2\x70\x38\x40\x40"
  105. "\x30\x20\x25\x00\x25\xa5\x10\x00\x00\x1a\x00\x00\x00\xfe\x00\x56"
  106. "\x59\x54\x39\x36\x80\x31\x33\x33\x48\x4c\x0a\x20\x00\x00\x00\x00";
  107. } // namespace
  108. TEST(DisplayUtilTest, TestValidDisplaySize) {
  109. EXPECT_FALSE(IsDisplaySizeValid(gfx::Size(10, 10)));
  110. EXPECT_FALSE(IsDisplaySizeValid(gfx::Size(40, 30)));
  111. EXPECT_FALSE(IsDisplaySizeValid(gfx::Size(50, 40)));
  112. EXPECT_FALSE(IsDisplaySizeValid(gfx::Size(160, 90)));
  113. EXPECT_FALSE(IsDisplaySizeValid(gfx::Size(160, 100)));
  114. EXPECT_TRUE(IsDisplaySizeValid(gfx::Size(50, 60)));
  115. EXPECT_TRUE(IsDisplaySizeValid(gfx::Size(100, 70)));
  116. EXPECT_TRUE(IsDisplaySizeValid(gfx::Size(272, 181)));
  117. }
  118. TEST(DisplayUtilTest, GetColorSpaceFromEdid) {
  119. base::HistogramTester histogram_tester;
  120. // Test with HP z32x monitor.
  121. constexpr SkColorSpacePrimaries expected_hpz32x_primaries = {
  122. .fRX = 0.673828f,
  123. .fRY = 0.316406f,
  124. .fGX = 0.198242f,
  125. .fGY = 0.719727f,
  126. .fBX = 0.148438f,
  127. .fBY = 0.043945f,
  128. .fWX = 0.313477f,
  129. .fWY = 0.329102f};
  130. skcms_Matrix3x3 expected_hpz32x_toXYZ50_matrix;
  131. expected_hpz32x_primaries.toXYZD50(&expected_hpz32x_toXYZ50_matrix);
  132. const std::vector<uint8_t> hpz32x_edid(kHPz32x,
  133. kHPz32x + std::size(kHPz32x) - 1);
  134. const gfx::ColorSpace expected_hpz32x_color_space =
  135. gfx::ColorSpace::CreateCustom(
  136. expected_hpz32x_toXYZ50_matrix,
  137. skcms_TransferFunction({2.2, 1, 0, 0, 0, 0, 0}));
  138. EXPECT_EQ(expected_hpz32x_color_space.ToString(),
  139. GetColorSpaceFromEdid(display::EdidParser(hpz32x_edid)).ToString());
  140. histogram_tester.ExpectBucketCount(
  141. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  142. static_cast<base::HistogramBase::Sample>(
  143. EdidColorSpaceChecksOutcome::kSuccess),
  144. 1);
  145. // Test with Chromebook Samus internal display.
  146. constexpr SkColorSpacePrimaries expected_samus_primaries = {.fRX = 0.633789f,
  147. .fRY = 0.347656f,
  148. .fGX = 0.323242f,
  149. .fGY = 0.577148f,
  150. .fBX = 0.151367f,
  151. .fBY = 0.090820f,
  152. .fWX = 0.313477f,
  153. .fWY = 0.329102f};
  154. skcms_Matrix3x3 expected_samus_toXYZ50_matrix;
  155. expected_samus_primaries.toXYZD50(&expected_samus_toXYZ50_matrix);
  156. const std::vector<uint8_t> samus_edid(kSamus, kSamus + std::size(kSamus) - 1);
  157. const gfx::ColorSpace expected_samus_color_space =
  158. gfx::ColorSpace::CreateCustom(
  159. expected_samus_toXYZ50_matrix,
  160. skcms_TransferFunction({2.5, 1, 0, 0, 0, 0, 0}));
  161. EXPECT_EQ(expected_samus_color_space.ToString(),
  162. GetColorSpaceFromEdid(display::EdidParser(samus_edid)).ToString());
  163. histogram_tester.ExpectBucketCount(
  164. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  165. static_cast<base::HistogramBase::Sample>(
  166. EdidColorSpaceChecksOutcome::kSuccess),
  167. 2);
  168. // Test with Chromebook Eve internal display. The SkColorSpacePrimaries:
  169. // SkColorSpacePrimaries expected_eve_primaries = {.fRX = 0.639648f,
  170. // .fRY = 0.329102f,
  171. // .fGX = 0.299805f,
  172. // .fGY = 0.599609f,
  173. // .fBX = 0.149414f,
  174. // .fBY = 0.059570f,
  175. // .fWX = 0.312500f,
  176. // .fWY = 0.328125f};
  177. // are very close to the BT.709/sRGB ones, so they'll be rounded to those.
  178. const skcms_TransferFunction eve_transfer({2.2, 1, 0, 0, 0, 0, 0});
  179. const gfx::ColorSpace expected_eve_color_space(
  180. gfx::ColorSpace::PrimaryID::BT709, gfx::ColorSpace::TransferID::CUSTOM,
  181. gfx::ColorSpace::MatrixID::RGB, gfx::ColorSpace::RangeID::FULL,
  182. /*custom_primary_matrix=*/nullptr, &eve_transfer);
  183. const std::vector<uint8_t> eve_edid(kEve, kEve + std::size(kEve) - 1);
  184. EXPECT_EQ(expected_eve_color_space.ToString(),
  185. GetColorSpaceFromEdid(display::EdidParser(eve_edid)).ToString());
  186. histogram_tester.ExpectBucketCount(
  187. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  188. static_cast<base::HistogramBase::Sample>(
  189. EdidColorSpaceChecksOutcome::kSuccess),
  190. 3);
  191. // Test with a display that supports HDR: Chromebook Samsung Galaxy (kohaku).
  192. constexpr SkColorSpacePrimaries expected_hdr_primaries = {.fRX = 0.67960f,
  193. .fRY = 0.31930f,
  194. .fGX = 0.23240f,
  195. .fGY = 0.71870f,
  196. .fBX = 0.13965f,
  197. .fBY = 0.04400f,
  198. .fWX = 0.31250f,
  199. .fWY = 0.32910f};
  200. skcms_Matrix3x3 expected_hdr_toXYZ50_matrix;
  201. expected_hdr_primaries.toXYZD50(&expected_hdr_toXYZ50_matrix);
  202. const std::vector<uint8_t> hdr_edid(kHDR, kHDR + std::size(kHDR) - 1);
  203. const gfx::ColorSpace expected_hdr_color_space =
  204. gfx::ColorSpace::CreateCustom(expected_hdr_toXYZ50_matrix,
  205. gfx::ColorSpace::TransferID::PQ);
  206. EXPECT_TRUE(expected_hdr_color_space.IsHDR());
  207. EXPECT_EQ(expected_hdr_color_space.ToString(),
  208. GetColorSpaceFromEdid(display::EdidParser(hdr_edid)).ToString());
  209. histogram_tester.ExpectBucketCount(
  210. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  211. static_cast<base::HistogramBase::Sample>(
  212. EdidColorSpaceChecksOutcome::kSuccess),
  213. 4);
  214. // Test with gamma marked as non-existent.
  215. const std::vector<uint8_t> no_gamma_edid(
  216. kEdidWithNoGamma, kEdidWithNoGamma + std::size(kEdidWithNoGamma) - 1);
  217. const gfx::ColorSpace no_gamma_color_space =
  218. GetColorSpaceFromEdid(display::EdidParser(no_gamma_edid));
  219. EXPECT_FALSE(no_gamma_color_space.IsValid());
  220. histogram_tester.ExpectBucketCount(
  221. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  222. static_cast<base::HistogramBase::Sample>(
  223. EdidColorSpaceChecksOutcome::kErrorBadGamma),
  224. 1);
  225. histogram_tester.ExpectTotalCount(
  226. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome", 5);
  227. }
  228. TEST(DisplayUtilTest, GetInvalidColorSpaceFromEdid) {
  229. base::HistogramTester histogram_tester;
  230. const std::vector<uint8_t> empty_edid;
  231. EXPECT_EQ(gfx::ColorSpace(),
  232. GetColorSpaceFromEdid(display::EdidParser(empty_edid)));
  233. histogram_tester.ExpectBucketCount(
  234. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  235. static_cast<base::HistogramBase::Sample>(
  236. EdidColorSpaceChecksOutcome::kErrorPrimariesAreaTooSmall),
  237. 1);
  238. const std::vector<uint8_t> invalid_edid(
  239. kInvalidEdid, kInvalidEdid + std::size(kInvalidEdid) - 1);
  240. const gfx::ColorSpace invalid_color_space =
  241. GetColorSpaceFromEdid(display::EdidParser(invalid_edid));
  242. EXPECT_FALSE(invalid_color_space.IsValid());
  243. histogram_tester.ExpectBucketCount(
  244. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  245. static_cast<base::HistogramBase::Sample>(
  246. EdidColorSpaceChecksOutcome::kErrorPrimariesAreaTooSmall),
  247. 2);
  248. const std::vector<uint8_t> sst210_edid(kSST210,
  249. kSST210 + std::size(kSST210) - 1);
  250. const gfx::ColorSpace sst210_color_space =
  251. GetColorSpaceFromEdid(display::EdidParser(sst210_edid));
  252. EXPECT_FALSE(sst210_color_space.IsValid()) << sst210_color_space.ToString();
  253. histogram_tester.ExpectBucketCount(
  254. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  255. static_cast<base::HistogramBase::Sample>(
  256. EdidColorSpaceChecksOutcome::kErrorBadCoordinates),
  257. 1);
  258. const std::vector<uint8_t> sst210_edid_2(
  259. kSST210Corrected, kSST210Corrected + std::size(kSST210Corrected) - 1);
  260. const gfx::ColorSpace sst210_color_space_2 =
  261. GetColorSpaceFromEdid(display::EdidParser(sst210_edid_2));
  262. EXPECT_FALSE(sst210_color_space_2.IsValid())
  263. << sst210_color_space_2.ToString();
  264. histogram_tester.ExpectBucketCount(
  265. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  266. static_cast<base::HistogramBase::Sample>(
  267. EdidColorSpaceChecksOutcome::kErrorPrimariesAreaTooSmall),
  268. 3);
  269. const std::vector<uint8_t> broken_blue_edid(
  270. kBrokenBluePrimaries,
  271. kBrokenBluePrimaries + std::size(kBrokenBluePrimaries) - 1);
  272. const gfx::ColorSpace broken_blue_color_space =
  273. GetColorSpaceFromEdid(display::EdidParser(broken_blue_edid));
  274. EXPECT_FALSE(broken_blue_color_space.IsValid())
  275. << broken_blue_color_space.ToString();
  276. histogram_tester.ExpectBucketCount(
  277. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome",
  278. static_cast<base::HistogramBase::Sample>(
  279. EdidColorSpaceChecksOutcome::kErrorBluePrimaryIsBroken),
  280. 1);
  281. histogram_tester.ExpectTotalCount(
  282. "DrmUtil.GetColorSpaceFromEdid.ChecksOutcome", 5);
  283. }
  284. TEST(DisplayUtilTest, MultipleInternalDisplayIds) {
  285. // using base::flat_set as base::FixedFlatSet with different N are different
  286. // types.
  287. const base::flat_set<int64_t> kTestIdsList[] = {
  288. base::flat_set<int64_t>({1}),
  289. base::flat_set<int64_t>({2, 3}),
  290. base::flat_set<int64_t>({4, 5, 6}),
  291. base::flat_set<int64_t>(
  292. {7, 10, 100, std::numeric_limits<int64_t>::max()}),
  293. };
  294. int64_t from_last_set = 0;
  295. for (const auto& id_set : kTestIdsList) {
  296. SetInternalDisplayIds(id_set);
  297. for (int64_t id : id_set)
  298. EXPECT_TRUE(IsInternalDisplayId(id));
  299. EXPECT_FALSE(IsInternalDisplayId(from_last_set));
  300. from_last_set = *id_set.rbegin();
  301. }
  302. // Reset the internal display.
  303. SetInternalDisplayIds({});
  304. for (auto id_set : kTestIdsList) {
  305. for (int64_t id : id_set)
  306. EXPECT_FALSE(IsInternalDisplayId(id));
  307. }
  308. }
  309. TEST(DisplayUtilTest, CompareDisplayIdsWithMultipleDisplays) {
  310. // Internal display is always first.
  311. EXPECT_TRUE(CompareDisplayIds(10, 12));
  312. {
  313. ScopedSetInternalDisplayIds set_internal(10);
  314. EXPECT_TRUE(CompareDisplayIds(10, 12));
  315. EXPECT_TRUE(CompareDisplayIds(10, 9));
  316. EXPECT_TRUE(CompareDisplayIds(10, 15));
  317. EXPECT_FALSE(CompareDisplayIds(12, 10));
  318. EXPECT_FALSE(CompareDisplayIds(12, 9));
  319. EXPECT_TRUE(CompareDisplayIds(12, 15));
  320. }
  321. {
  322. ScopedSetInternalDisplayIds set_internal(12);
  323. EXPECT_FALSE(CompareDisplayIds(10, 12));
  324. EXPECT_FALSE(CompareDisplayIds(10, 9));
  325. EXPECT_TRUE(CompareDisplayIds(10, 15));
  326. EXPECT_TRUE(CompareDisplayIds(12, 10));
  327. EXPECT_TRUE(CompareDisplayIds(12, 9));
  328. EXPECT_TRUE(CompareDisplayIds(12, 15));
  329. }
  330. // Internal displays are always first but compares values between internal
  331. // displays.
  332. {
  333. ScopedSetInternalDisplayIds set_internal({12, 10});
  334. EXPECT_TRUE(CompareDisplayIds(10, 12));
  335. EXPECT_TRUE(CompareDisplayIds(10, 9));
  336. EXPECT_TRUE(CompareDisplayIds(10, 15));
  337. EXPECT_FALSE(CompareDisplayIds(12, 10));
  338. EXPECT_TRUE(CompareDisplayIds(12, 9));
  339. EXPECT_TRUE(CompareDisplayIds(12, 15));
  340. }
  341. }
  342. } // namespace display