1 // Copyright 2019 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 
5 package org.chromium.chrome.browser.feed.library.piet.ui;
6 
7 import static com.google.common.truth.Truth.assertThat;
8 
9 import android.app.Activity;
10 import android.content.Context;
11 import android.graphics.Paint;
12 import android.graphics.Rect;
13 
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.junit.runner.RunWith;
17 import org.robolectric.Robolectric;
18 import org.robolectric.annotation.Config;
19 
20 import org.chromium.chrome.browser.feed.library.common.ui.LayoutUtils;
21 import org.chromium.components.feed.core.proto.ui.piet.StylesProto.Borders;
22 import org.chromium.components.feed.core.proto.ui.piet.StylesProto.Borders.Edges;
23 import org.chromium.testing.local.LocalRobolectricTestRunner;
24 
25 /** Tests for the {@link BorderDrawable}. */
26 @RunWith(LocalRobolectricTestRunner.class)
27 @Config(manifest = Config.NONE)
28 public class BorderDrawableTest {
29     private static final float[] ZERO_RADII = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
30     private static final boolean LEFT_TO_RIGHT = false;
31     private static final boolean RIGHT_TO_LEFT = true;
32 
33     private static final int COLOR = 0xFFFF0000;
34     private static final int WIDTH_DP = 8;
35     private int mWidthPx;
36 
37     private static final Borders DEFAULT_BORDER =
38             Borders.newBuilder().setWidth(WIDTH_DP).setColor(COLOR).build();
39 
40     private Context mContext;
41 
42     @Before
setUp()43     public void setUp() {
44         mContext = Robolectric.buildActivity(Activity.class).get();
45         mWidthPx = (int) LayoutUtils.dpToPx(WIDTH_DP, mContext);
46     }
47 
48     @Test
testBorders_setsPaintParams()49     public void testBorders_setsPaintParams() {
50         BorderDrawable borderDrawable =
51                 new BorderDrawable(mContext, DEFAULT_BORDER, ZERO_RADII, LEFT_TO_RIGHT);
52 
53         assertThat(borderDrawable.getPaint().getStyle()).isEqualTo(Paint.Style.STROKE);
54         assertThat(borderDrawable.getPaint().getStrokeWidth()).isEqualTo((float) mWidthPx * 2);
55         assertThat(borderDrawable.getPaint().getColor()).isEqualTo(COLOR);
56     }
57 
58     @Test
testBorders_allSides_default()59     public void testBorders_allSides_default() {
60         BorderDrawable borderDrawable =
61                 new BorderDrawable(mContext, DEFAULT_BORDER, ZERO_RADII, LEFT_TO_RIGHT);
62 
63         assertThat(borderDrawable.getPaint().getStyle()).isEqualTo(Paint.Style.STROKE);
64         assertThat(borderDrawable.getPaint().getStrokeWidth()).isEqualTo((float) mWidthPx * 2);
65         assertThat(borderDrawable.getPaint().getColor()).isEqualTo(COLOR);
66 
67         borderDrawable.setBounds(1, 2, 3, 4);
68         Rect bounds = borderDrawable.getBounds();
69         assertThat(bounds).isEqualTo(new Rect(1, 2, 3, 4));
70     }
71 
72     @Test
testBorders_allSides_explicit()73     public void testBorders_allSides_explicit() {
74         BorderDrawable borderDrawable = new BorderDrawable(mContext,
75                 DEFAULT_BORDER.toBuilder()
76                         .setBitmask(Edges.BOTTOM.getNumber() | Edges.TOP.getNumber()
77                                 | Edges.START.getNumber() | Edges.END.getNumber())
78                         .build(),
79                 ZERO_RADII, LEFT_TO_RIGHT);
80 
81         borderDrawable.setBounds(1, 2, 3, 4);
82         Rect bounds = borderDrawable.getBounds();
83         assertThat(bounds).isEqualTo(new Rect(1, 2, 3, 4));
84     }
85 
86     @Test
testBorders_topLeft()87     public void testBorders_topLeft() {
88         BorderDrawable borderDrawable = new BorderDrawable(mContext,
89                 DEFAULT_BORDER.toBuilder()
90                         .setBitmask(Edges.TOP.getNumber() | Edges.START.getNumber())
91                         .build(),
92                 ZERO_RADII, LEFT_TO_RIGHT);
93 
94         borderDrawable.setBounds(1, 2, 3, 4);
95         Rect bounds = borderDrawable.getBounds();
96         assertThat(bounds).isEqualTo(new Rect(1, 2, 3 + mWidthPx, 4 + mWidthPx));
97     }
98 
99     @Test
testBorders_bottomRight()100     public void testBorders_bottomRight() {
101         BorderDrawable borderDrawable = new BorderDrawable(mContext,
102                 DEFAULT_BORDER.toBuilder()
103                         .setBitmask(Edges.BOTTOM.getNumber() | Edges.END.getNumber())
104                         .build(),
105                 ZERO_RADII, LEFT_TO_RIGHT);
106 
107         borderDrawable.setBounds(1, 2, 3, 4);
108         Rect bounds = borderDrawable.getBounds();
109         assertThat(bounds).isEqualTo(new Rect(1 - mWidthPx, 2 - mWidthPx, 3, 4));
110     }
111 
112     @Test
testBorders_someSides_RtL()113     public void testBorders_someSides_RtL() {
114         BorderDrawable borderDrawable = new BorderDrawable(mContext,
115                 DEFAULT_BORDER.toBuilder()
116                         .setBitmask(Edges.TOP.getNumber() | Edges.BOTTOM.getNumber()
117                                 | Edges.END.getNumber())
118                         .build(),
119                 ZERO_RADII, RIGHT_TO_LEFT);
120 
121         borderDrawable.setBounds(1, 2, 3, 4);
122         Rect bounds = borderDrawable.getBounds();
123         assertThat(bounds).isEqualTo(new Rect(1, 2, 3 + mWidthPx, 4));
124 
125         borderDrawable = new BorderDrawable(mContext,
126                 DEFAULT_BORDER.toBuilder()
127                         .setBitmask(Edges.TOP.getNumber() | Edges.BOTTOM.getNumber()
128                                 | Edges.START.getNumber())
129                         .build(),
130                 ZERO_RADII, RIGHT_TO_LEFT);
131 
132         borderDrawable.setBounds(1, 2, 3, 4);
133         bounds = borderDrawable.getBounds();
134         assertThat(bounds).isEqualTo(new Rect(1 - mWidthPx, 2, 3, 4));
135     }
136 
137     @Test
testSetBoundsRect()138     public void testSetBoundsRect() {
139         BorderDrawable borderDrawable = new BorderDrawable(mContext,
140                 DEFAULT_BORDER.toBuilder()
141                         .setBitmask(Edges.TOP.getNumber() | Edges.END.getNumber())
142                         .build(),
143                 ZERO_RADII, LEFT_TO_RIGHT);
144 
145         borderDrawable.setBounds(new Rect(1, 2, 3, 4));
146         Rect bounds = borderDrawable.getBounds();
147         assertThat(bounds).isEqualTo(new Rect(1 - mWidthPx, 2, 3, 4 + mWidthPx));
148     }
149 }
150