blob: 74bb450cd60403375c433faedf35981c125eec98 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/headless/screen_info/headless_screen_info.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace headless {
namespace {
TEST(HeadlessScreenInfoTest, Basic) {
EXPECT_EQ(HeadlessScreenInfo::FromString(" \t ").error(),
"Invalid screen info: \t ");
EXPECT_EQ(HeadlessScreenInfo::FromString(" xyz ").error(),
"Invalid screen info: xyz ");
EXPECT_EQ(HeadlessScreenInfo::FromString("{").error(),
"Invalid screen info: {");
EXPECT_EQ(HeadlessScreenInfo::FromString("}").error(),
"Invalid screen info: }");
EXPECT_EQ(HeadlessScreenInfo::FromString("{}").value()[0],
HeadlessScreenInfo({.bounds = gfx::Rect(0, 0, 800, 600)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ }").value()[0],
HeadlessScreenInfo({.bounds = gfx::Rect(0, 0, 800, 600)}));
}
TEST(HeadlessScreenInfoTest, ScreenOrigin) {
// Primary screen does not allow non zero origin, so test the secondary one.
EXPECT_EQ(HeadlessScreenInfo::FromString("{}{100,200}").value()[1],
HeadlessScreenInfo({.bounds = gfx::Rect(100, 200, 800, 600)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{}{ 100,200 }").value()[1],
HeadlessScreenInfo({.bounds = gfx::Rect(100, 200, 800, 600)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{}{-100,200}").value()[1],
HeadlessScreenInfo({.bounds = gfx::Rect(-100, 200, 800, 600)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{}{100,-200}").value()[1],
HeadlessScreenInfo({.bounds = gfx::Rect(100, -200, 800, 600)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{}{-100,-200}").value()[1],
HeadlessScreenInfo({.bounds = gfx::Rect(-100, -200, 800, 600)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{100,200}").error(),
"Primary screen origin can only be at {0,0}");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100, 200}").error(),
"Invalid screen info: 100, 200");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz 100,200}").error(),
"Invalid screen info: xyz 100,200");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz100,200}").error(),
"Invalid screen info: xyz100,200");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100,200 xyz}").error(),
"Invalid screen info: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100,200xyz}").error(),
"Invalid screen info: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100+200 }").error(),
"Invalid screen info: 100+200");
}
TEST(HeadlessScreenInfoTest, ScreenSize) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{100x200}").value()[0],
HeadlessScreenInfo({.bounds = gfx::Rect(100, 200)}));
EXPECT_EQ(HeadlessScreenInfo::FromString(" { 100x200 } ").value()[0],
HeadlessScreenInfo({.bounds = gfx::Rect(100, 200)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100x 200}").error(),
"Invalid screen info: 100x 200");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz 100x200}").error(),
"Invalid screen info: xyz 100x200");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz100x200}").error(),
"Invalid screen info: xyz100x200");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100x200 xyz}").error(),
"Invalid screen info: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100x200xyz}").error(),
"Invalid screen info: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ 100 200 }").error(),
"Invalid screen info: 100 200");
}
TEST(HeadlessScreenInfoTest, ScreenParameters) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{xyz =}").error(),
"Invalid screen info: xyz =");
EXPECT_EQ(HeadlessScreenInfo::FromString("{xyz = 42}").error(),
"Invalid screen info: xyz = 42");
EXPECT_EQ(HeadlessScreenInfo::FromString("{xyz=}").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{xyz=42}").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz=}").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz=42}").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{xyz= }").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{xyz=42 }").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz= }").error(),
"Unknown screen info parameter: xyz");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ xyz=42 }").error(),
"Unknown screen info parameter: xyz");
}
TEST(HeadlessScreenInfoTest, ScreenColorDepth) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{ colorDepth=16 }").value()[0],
HeadlessScreenInfo({.color_depth = 16}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ colorDepth= 16 }").error(),
"Invalid screen color depth: ");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ colorDepth=0 }").error(),
"Invalid screen color depth: 0");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ colorDepth=x24 }").error(),
"Invalid screen color depth: x24");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ colorDepth=24x }").error(),
"Invalid screen color depth: 24x");
}
TEST(HeadlessScreenInfoTest, ScreenDevicePixelRatio) {
EXPECT_EQ(
HeadlessScreenInfo::FromString("{ devicePixelRatio=0.5}").value()[0],
HeadlessScreenInfo({.device_pixel_ratio = 0.5f}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ devicePixelRatio=4 }").value()[0],
HeadlessScreenInfo({.device_pixel_ratio = 4.0f}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ devicePixelRatio=0.1 }").error(),
"Invalid screen device pixel ratio: 0.1");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ devicePixelRatio= 1.0 }").error(),
"Invalid screen device pixel ratio: ");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ devicePixelRatio=x1.0 }").error(),
"Invalid screen device pixel ratio: x1.0");
EXPECT_EQ(HeadlessScreenInfo::FromString("{devicePixelRatio=1.0x }").error(),
"Invalid screen device pixel ratio: 1.0x");
}
TEST(HeadlessScreenInfoTest, ScreenIsInternal) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{ isInternal=1 }").value()[0],
HeadlessScreenInfo({.is_internal = true}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ isInternal=true }").value()[0],
HeadlessScreenInfo({.is_internal = true}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ isInternal=0 }").value()[0],
HeadlessScreenInfo({.is_internal = false}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ isInternal=false }").value()[0],
HeadlessScreenInfo({.is_internal = false}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ isInternal= }").error(),
"Invalid screen is internal: ");
EXPECT_EQ(HeadlessScreenInfo::FromString("{ isInternal=xyz }").error(),
"Invalid screen is internal: xyz");
}
TEST(HeadlessScreenInfoTest, ScreenLabel) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{ label=xyz}").value()[0],
HeadlessScreenInfo({.label = "xyz"}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ label='xyz'}").value()[0],
HeadlessScreenInfo({.label = "xyz"}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ label=''}").value()[0],
HeadlessScreenInfo({.label = ""}));
EXPECT_EQ(
HeadlessScreenInfo::FromString("{ label='primary screen'}").value()[0],
HeadlessScreenInfo({.label = "primary screen"}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ label='my \\'quoted\\' screen'}")
.value()[0],
HeadlessScreenInfo({.label = "my 'quoted' screen"}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ label='\\'quoted\\' screen'}")
.value()[0],
HeadlessScreenInfo({.label = "'quoted' screen"}));
EXPECT_EQ(
HeadlessScreenInfo::FromString("{ label='\\'quoted\\''}").value()[0],
HeadlessScreenInfo({.label = "'quoted'"}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ label='\\'quoted\\'}").error(),
"Invalid screen info: '\\'quoted\\'");
}
TEST(HeadlessScreenInfoTest, MultipleScreens) {
// Explicit screen origin results in overlapped screens.
EXPECT_THAT(HeadlessScreenInfo::FromString("{}{0,0 600x800}").value(),
testing::ElementsAre(
HeadlessScreenInfo(),
HeadlessScreenInfo({.bounds = gfx::Rect(600, 800)})));
// Default screen origin results in side by side screens.
EXPECT_THAT(HeadlessScreenInfo::FromString("{}{}").value(),
testing::ElementsAre(
HeadlessScreenInfo(),
HeadlessScreenInfo({.bounds = gfx::Rect(800, 0, 800, 600)})));
// Screen info separators.
EXPECT_THAT(HeadlessScreenInfo::FromString("{}{}").value(),
testing::SizeIs(2));
EXPECT_THAT(HeadlessScreenInfo::FromString("{} {}").value(),
testing::SizeIs(2));
EXPECT_THAT(HeadlessScreenInfo::FromString("{},{}").value(),
testing::SizeIs(2));
EXPECT_THAT(HeadlessScreenInfo::FromString("{} , {}").value(),
testing::SizeIs(2));
// Malformed.
EXPECT_THAT(HeadlessScreenInfo::FromString("{}{").error(),
"Invalid screen info: {");
EXPECT_THAT(HeadlessScreenInfo::FromString("{}{ xyz").error(),
"Invalid screen info: { xyz");
EXPECT_THAT(HeadlessScreenInfo::FromString("xyz{}").error(),
"Invalid screen info: xyz{}");
EXPECT_THAT(HeadlessScreenInfo::FromString("xyz {}").error(),
"Invalid screen info: xyz {}");
EXPECT_THAT(HeadlessScreenInfo::FromString("{}xyz").error(),
"Invalid screen info: xyz");
EXPECT_THAT(HeadlessScreenInfo::FromString("{} xyz }").error(),
"Invalid screen info: xyz }");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ {}").error(),
"Invalid screen info: {");
EXPECT_THAT(HeadlessScreenInfo::FromString("{} }").error(),
"Invalid screen info: }");
}
TEST(HeadlessScreenInfoTest, WorkArea) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{ workAreaLeft=100 }").value()[0],
HeadlessScreenInfo(
{.work_area_insets = gfx::Insets::TLBR(0, 100, 0, 0)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ workAreaRight=100 }").value()[0],
HeadlessScreenInfo(
{.work_area_insets = gfx::Insets::TLBR(0, 0, 0, 100)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ workAreaTop=100 }").value()[0],
HeadlessScreenInfo(
{.work_area_insets = gfx::Insets::TLBR(100, 0, 0, 0)}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ workAreaBottom=100 }").value()[0],
HeadlessScreenInfo(
{.work_area_insets = gfx::Insets::TLBR(0, 0, 100, 0)}));
EXPECT_EQ(
HeadlessScreenInfo::FromString("{ workAreaLeft=100 workAreaRight=100"
" workAreaTop=100 workAreaBottom=100 }")
.value()[0],
HeadlessScreenInfo(
{.work_area_insets = gfx::Insets::TLBR(100, 100, 100, 100)}));
// Malformed.
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaLeft=abc }").error(),
"Invalid work area inset: abc");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaRight=abc }").error(),
"Invalid work area inset: abc");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaTop=abc }").error(),
"Invalid work area inset: abc");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaBottom=abc }").error(),
"Invalid work area inset: abc");
// Negative.
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaLeft=-42 }").error(),
"Invalid work area inset: -42");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaRight=-42 }").error(),
"Invalid work area inset: -42");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaTop=-42 }").error(),
"Invalid work area inset: -42");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ workAreaBottom=-42 }").error(),
"Invalid work area inset: -42");
}
TEST(HeadlessScreenInfoTest, Rotation) {
EXPECT_EQ(HeadlessScreenInfo::FromString("{ rotation=0 }").value()[0],
HeadlessScreenInfo({.rotation = 0}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ rotation=90 }").value()[0],
HeadlessScreenInfo({.rotation = 90}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ rotation=180 }").value()[0],
HeadlessScreenInfo({.rotation = 180}));
EXPECT_EQ(HeadlessScreenInfo::FromString("{ rotation=270 }").value()[0],
HeadlessScreenInfo({.rotation = 270}));
// Invalid.
EXPECT_THAT(HeadlessScreenInfo::FromString("{ rotation=abc }").error(),
"Invalid rotation: abc");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ rotation=-42 }").error(),
"Invalid rotation: -42");
EXPECT_THAT(HeadlessScreenInfo::FromString("{ rotation=42 }").error(),
"Invalid rotation: 42");
}
} // namespace
} // namespace headless