Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(832)

Unified Diff: resolution_selector_test.cc

Issue 3304011: monitor_reconfig: Handle external monitors and add tests. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222//monitor_reconfig.git
Patch Set: apply review feedback Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « resolution_selector.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: resolution_selector_test.cc
diff --git a/resolution_selector_test.cc b/resolution_selector_test.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7cbfb129ace82f1801616c2a4d8566b34d6543aa
--- /dev/null
+++ b/resolution_selector_test.cc
@@ -0,0 +1,165 @@
+// Copyright (c) 2010 The Chromium OS 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 <vector>
+
+#include <gflags/gflags.h>
+#include <gtest/gtest.h>
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "monitor_reconfig/resolution_selector.h"
+
+DEFINE_bool(logtostderr, false,
+ "Print debugging messages to stderr (suppressed otherwise)");
+
+namespace monitor_reconfig {
+
+using std::string;
+using std::vector;
+
+class ResolutionSelectorTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {}
+
+ // Add a mode to |lcd_modes_|.
+ void AddLcdMode(int width, int height) {
+ lcd_modes_.push_back(
+ ResolutionSelector::Mode(
+ width, height, StringPrintf("%dx%d", width, height)));
+ }
+
+ // Add a mode to |external_modes_|.
+ void AddExternalMode(int width, int height) {
+ external_modes_.push_back(
+ ResolutionSelector::Mode(
+ width, height, StringPrintf("%dx%d", width, height)));
+ }
+
+ // Ask |selector_| for the best resolutions and store them in
+ // |lcd_resolution_|, |external_resolution_|, and |screen_resolution_|.
+ // The return value from |FindBestResolutions()| is returned.
+ bool GetResolutions() {
+ return selector_.FindBestResolutions(lcd_modes_,
+ external_modes_,
+ &lcd_resolution_,
+ &external_resolution_,
+ &screen_resolution_);
+ }
+
+ ResolutionSelector selector_;
+
+ vector<ResolutionSelector::Mode> lcd_modes_;
+ vector<ResolutionSelector::Mode> external_modes_;
+
+ string lcd_resolution_;
+ string external_resolution_;
+ string screen_resolution_;
+};
+
+// We should use the LCD's max resolution when there's no external output
+// connected.
+TEST_F(ResolutionSelectorTest, NoExternalOutput) {
+ AddLcdMode(1024, 768);
+ AddLcdMode(800, 600);
+ ASSERT_TRUE(GetResolutions());
+ EXPECT_EQ("1024x768", lcd_resolution_);
+ EXPECT_EQ("", external_resolution_);
+ EXPECT_EQ("1024x768", screen_resolution_);
+}
+
+// When both outputs have the same max resolution, we should use it.
+TEST_F(ResolutionSelectorTest, MatchingTopResolutions) {
+ AddLcdMode(1024, 768);
+ AddLcdMode(800, 600);
+ AddExternalMode(1024, 768);
+ AddExternalMode(800, 600);
+ ASSERT_TRUE(GetResolutions());
+ EXPECT_EQ("1024x768", lcd_resolution_);
+ EXPECT_EQ("1024x768", external_resolution_);
+ EXPECT_EQ("1024x768", screen_resolution_);
+}
+
+// We should use the highest shared resolution when the LCD has the higher
+// max resolution.
+TEST_F(ResolutionSelectorTest, LcdHasHigherResolution) {
+ AddLcdMode(1024, 768);
+ AddLcdMode(800, 600);
+ AddLcdMode(640, 480);
+ AddExternalMode(800, 600);
+ AddExternalMode(640, 480);
+ ASSERT_TRUE(GetResolutions());
+ EXPECT_EQ("800x600", lcd_resolution_);
+ EXPECT_EQ("800x600", external_resolution_);
+ EXPECT_EQ("800x600", screen_resolution_);
+}
+
+// We should use the highest shared resolution when the external output has
+// the higher max resolution.
+TEST_F(ResolutionSelectorTest, ExternalHasHigherResolution) {
+ AddLcdMode(800, 600);
+ AddLcdMode(640, 480);
+ AddExternalMode(1024, 768);
+ AddExternalMode(800, 600);
+ AddExternalMode(640, 480);
+ ASSERT_TRUE(GetResolutions());
+ EXPECT_EQ("800x600", lcd_resolution_);
+ EXPECT_EQ("800x600", external_resolution_);
+ EXPECT_EQ("800x600", screen_resolution_);
+}
+
+// When the maximum resolution offered by the two outputs is different, we
+// should use the max resolution from the lower-res output.
+TEST_F(ResolutionSelectorTest, MismatchedMaxResolution) {
+ AddLcdMode(1024, 600);
+ AddLcdMode(800, 600);
+ AddExternalMode(1280, 720);
+ AddExternalMode(1024, 768);
+ AddExternalMode(800, 600);
+ ASSERT_TRUE(GetResolutions());
+ EXPECT_EQ("1024x600", lcd_resolution_);
+ EXPECT_EQ("1024x768", external_resolution_);
+ EXPECT_EQ("1024x600", screen_resolution_);
+}
+
+// When the external output is large enough that we think it's a monitor,
+// we should just use its maximum resolution instead of trying to find a
+// size that'll also work for the LCD output.
+TEST_F(ResolutionSelectorTest, ExternalOutputIsMonitor) {
+ AddLcdMode(1024, 768);
+ AddLcdMode(800, 600);
+ AddExternalMode(1600, 1200);
+ AddExternalMode(1280, 960);
+ AddExternalMode(1024, 768);
+ ASSERT_GE(external_modes_[0].width * external_modes_[0].height,
+ ResolutionSelector::kMaxProjectorPixels);
+ ASSERT_TRUE(GetResolutions());
+ EXPECT_EQ("1024x768", lcd_resolution_);
+ EXPECT_EQ("1600x1200", external_resolution_);
+ EXPECT_EQ("1600x1200", screen_resolution_);
+}
+
+// We should just fail if there's no common resolution between the two
+// outputs.
+TEST_F(ResolutionSelectorTest, FailIfNoCommonResolution) {
+ AddLcdMode(1024, 768);
+ AddExternalMode(1280, 600);
+ EXPECT_FALSE(GetResolutions());
+}
+
+} // namespace monitor_reconfig
+
+int main(int argc, char** argv) {
+ google::ParseCommandLineFlags(&argc, &argv, true);
+ CommandLine::Init(argc, argv);
+ logging::InitLogging(NULL,
+ FLAGS_logtostderr ?
+ logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG :
+ logging::LOG_NONE,
+ logging::DONT_LOCK_LOG_FILE,
+ logging::APPEND_TO_OLD_LOG_FILE);
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
« no previous file with comments | « resolution_selector.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698