1/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.wm.utils;
18
19
20import static android.view.DisplayCutout.NO_CUTOUT;
21import static android.view.DisplayCutout.fromBoundingRect;
22
23import static org.junit.Assert.assertEquals;
24import static org.junit.Assert.assertNotEquals;
25
26import android.graphics.Rect;
27import android.platform.test.annotations.Presubmit;
28import android.support.test.filters.SmallTest;
29import android.support.test.runner.AndroidJUnit4;
30import android.util.Size;
31import android.view.DisplayCutout;
32
33import org.junit.Test;
34import org.junit.runner.RunWith;
35
36import java.util.Arrays;
37
38/**
39 * Tests for {@link WmDisplayCutout}
40 *
41 * Run with: atest WmDisplayCutoutTest
42 */
43@RunWith(AndroidJUnit4.class)
44@SmallTest
45@Presubmit
46public class WmDisplayCutoutTest {
47
48    private final DisplayCutout mCutoutTop = new DisplayCutout(
49            new Rect(0, 100, 0, 0),
50            Arrays.asList(new Rect(50, 0, 75, 100)));
51
52    @Test
53    public void calculateRelativeTo_top() {
54        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
55                fromBoundingRect(0, 0, 100, 20), 200, 400)
56                .calculateRelativeTo(new Rect(5, 5, 95, 195));
57
58        assertEquals(new Rect(0, 15, 0, 0), cutout.getDisplayCutout().getSafeInsets());
59    }
60
61    @Test
62    public void calculateRelativeTo_left() {
63        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
64                fromBoundingRect(0, 0, 20, 100), 400, 200)
65                .calculateRelativeTo(new Rect(5, 5, 195, 95));
66
67        assertEquals(new Rect(15, 0, 0, 0), cutout.getDisplayCutout().getSafeInsets());
68    }
69
70    @Test
71    public void calculateRelativeTo_bottom() {
72        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
73                fromBoundingRect(0, 180, 100, 200), 100, 200)
74                .calculateRelativeTo(new Rect(5, 5, 95, 195));
75
76        assertEquals(new Rect(0, 0, 0, 15), cutout.getDisplayCutout().getSafeInsets());
77    }
78
79    @Test
80    public void calculateRelativeTo_right() {
81        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
82                fromBoundingRect(180, 0, 200, 100), 200, 100)
83                .calculateRelativeTo(new Rect(5, 5, 195, 95));
84
85        assertEquals(new Rect(0, 0, 15, 0), cutout.getDisplayCutout().getSafeInsets());
86    }
87
88    @Test
89    public void calculateRelativeTo_bounds() {
90        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
91                fromBoundingRect(0, 0, 100, 20), 200, 400)
92                .calculateRelativeTo(new Rect(5, 10, 95, 180));
93
94        assertEquals(new Rect(-5, -10, 95, 10), cutout.getDisplayCutout().getBounds().getBounds());
95    }
96
97    @Test
98    public void computeSafeInsets_top() {
99        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
100                fromBoundingRect(0, 0, 100, 20), 200, 400);
101
102        assertEquals(new Rect(0, 20, 0, 0), cutout.getDisplayCutout().getSafeInsets());
103    }
104
105    @Test
106    public void computeSafeInsets_left() {
107        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
108                fromBoundingRect(0, 0, 20, 100), 400, 200);
109
110        assertEquals(new Rect(20, 0, 0, 0), cutout.getDisplayCutout().getSafeInsets());
111    }
112
113    @Test
114    public void computeSafeInsets_bottom() {
115        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
116                fromBoundingRect(0, 180, 100, 200), 100, 200);
117
118        assertEquals(new Rect(0, 0, 0, 20), cutout.getDisplayCutout().getSafeInsets());
119    }
120
121    @Test
122    public void computeSafeInsets_right() {
123        WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets(
124                fromBoundingRect(180, 0, 200, 100), 200, 100);
125
126        assertEquals(new Rect(0, 0, 20, 0), cutout.getDisplayCutout().getSafeInsets());
127    }
128
129    @Test
130    public void computeSafeInsets_bounds() {
131        DisplayCutout cutout = WmDisplayCutout.computeSafeInsets(mCutoutTop, 1000,
132                2000).getDisplayCutout();
133
134        assertEquals(mCutoutTop.getBounds().getBounds(),
135                cutout.getBounds().getBounds());
136    }
137
138    @Test
139    public void test_equals() {
140        assertEquals(new WmDisplayCutout(NO_CUTOUT, null), new WmDisplayCutout(NO_CUTOUT, null));
141        assertEquals(new WmDisplayCutout(mCutoutTop, new Size(1, 2)),
142                new WmDisplayCutout(mCutoutTop, new Size(1, 2)));
143
144        assertNotEquals(new WmDisplayCutout(mCutoutTop, new Size(1, 2)),
145                new WmDisplayCutout(mCutoutTop, new Size(5, 6)));
146        assertNotEquals(new WmDisplayCutout(mCutoutTop, new Size(1, 2)),
147                new WmDisplayCutout(NO_CUTOUT, new Size(1, 2)));
148    }
149
150    @Test
151    public void test_hashCode() {
152        assertEquals(new WmDisplayCutout(NO_CUTOUT, null).hashCode(),
153                new WmDisplayCutout(NO_CUTOUT, null).hashCode());
154        assertEquals(new WmDisplayCutout(mCutoutTop, new Size(1, 2)).hashCode(),
155                new WmDisplayCutout(mCutoutTop, new Size(1, 2)).hashCode());
156    }
157}