forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shadow_unittest.cc
130 lines (112 loc) · 4.25 KB
/
shadow_unittest.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2014 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 "ui/compositor_extra/shadow.h"
#include "base/macros.h"
#include "base/test/test_discardable_memory_allocator.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/shadow_util.h"
#include "ui/gfx/shadow_value.h"
namespace ui {
namespace {
constexpr int kElevationLarge = 24;
constexpr int kElevationSmall = 6;
gfx::Insets InsetsForElevation(int elevation) {
return -gfx::Insets(2 * elevation) + gfx::Insets(elevation, 0, -elevation, 0);
}
gfx::Size NineboxImageSizeForElevationAndCornerRadius(int elevation,
int corner_radius) {
auto values = gfx::ShadowValue::MakeMdShadowValues(elevation);
gfx::Rect bounds(0, 0, 1, 1);
bounds.Inset(-gfx::ShadowValue::GetBlurRegion(values));
bounds.Inset(-gfx::Insets(corner_radius));
return bounds.size();
}
class ShadowTest : public testing::Test {
protected:
ShadowTest() {}
~ShadowTest() override {}
void SetUp() override {
base::DiscardableMemoryAllocator::SetInstance(
&discardable_memory_allocator_);
}
void TearDown() override {
base::DiscardableMemoryAllocator::SetInstance(nullptr);
}
private:
base::TestDiscardableMemoryAllocator discardable_memory_allocator_;
DISALLOW_COPY_AND_ASSIGN(ShadowTest);
};
// Test if the proper content bounds is calculated based on the current style.
TEST_F(ShadowTest, SetContentBounds) {
ScopedAnimationDurationScaleMode zero_duration_mode(
ScopedAnimationDurationScaleMode::ZERO_DURATION);
// Verify that layer bounds are outset from content bounds.
Shadow shadow;
{
shadow.Init(kElevationLarge);
gfx::Rect content_bounds(100, 100, 300, 300);
shadow.SetContentBounds(content_bounds);
EXPECT_EQ(content_bounds, shadow.content_bounds());
gfx::Rect shadow_bounds(content_bounds);
shadow_bounds.Inset(InsetsForElevation(kElevationLarge));
EXPECT_EQ(shadow_bounds, shadow.layer()->bounds());
}
{
shadow.SetElevation(kElevationSmall);
gfx::Rect content_bounds(100, 100, 300, 300);
shadow.SetContentBounds(content_bounds);
EXPECT_EQ(content_bounds, shadow.content_bounds());
gfx::Rect shadow_bounds(content_bounds);
shadow_bounds.Inset(InsetsForElevation(kElevationSmall));
EXPECT_EQ(shadow_bounds, shadow.layer()->bounds());
}
}
// Test that the elevation is reduced when the contents are too small to handle
// the full elevation.
TEST_F(ShadowTest, AdjustElevationForSmallContents) {
Shadow shadow;
shadow.Init(kElevationLarge);
{
gfx::Rect content_bounds(100, 100, 300, 300);
shadow.SetContentBounds(content_bounds);
gfx::Rect shadow_bounds(content_bounds);
shadow_bounds.Inset(InsetsForElevation(kElevationLarge));
EXPECT_EQ(shadow_bounds, shadow.layer()->bounds());
}
{
constexpr int kWidth = 80;
gfx::Rect content_bounds(100, 100, kWidth, 300);
shadow.SetContentBounds(content_bounds);
gfx::Rect shadow_bounds(content_bounds);
shadow_bounds.Inset(InsetsForElevation((kWidth - 4) / 4));
EXPECT_EQ(shadow_bounds, shadow.layer()->bounds());
}
{
constexpr int kHeight = 80;
gfx::Rect content_bounds(100, 100, 300, kHeight);
shadow.SetContentBounds(content_bounds);
gfx::Rect shadow_bounds(content_bounds);
shadow_bounds.Inset(InsetsForElevation((kHeight - 4) / 4));
EXPECT_EQ(shadow_bounds, shadow.layer()->bounds());
}
}
// Test that rounded corner radius is handled correctly.
TEST_F(ShadowTest, AdjustRoundedCornerRadius) {
Shadow shadow;
shadow.Init(kElevationSmall);
gfx::Rect content_bounds(100, 100, 300, 300);
shadow.SetContentBounds(content_bounds);
EXPECT_EQ(content_bounds, shadow.content_bounds());
shadow.SetRoundedCornerRadius(0);
gfx::Rect shadow_bounds(content_bounds);
shadow_bounds.Inset(InsetsForElevation(kElevationSmall));
EXPECT_EQ(shadow_bounds, shadow.layer()->bounds());
EXPECT_EQ(NineboxImageSizeForElevationAndCornerRadius(6, 0),
shadow.details_for_testing()->ninebox_image.size());
}
} // namespace
} // namespace ui