blob: 4c8424f943b7010a29994cb02fcfe931c443c122 [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.core.view;
import static org.junit.Assert.assertEquals;
import android.graphics.Rect;
import android.os.Build;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.support.v4.testutils.TestUtils;
import android.view.Gravity;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class GravityCompatTest {
@Test
public void testConstants() {
// Compat constants must match core constants since they can be OR'd with
// other core constants.
assertEquals("Start constants", Gravity.START, GravityCompat.START);
assertEquals("End constants", Gravity.END, GravityCompat.END);
}
@Test
public void testGetAbsoluteGravity() {
assertEquals("Left under LTR",
GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_LTR),
Gravity.LEFT);
assertEquals("Right under LTR",
GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_LTR),
Gravity.RIGHT);
assertEquals("Left under RTL",
GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_RTL),
Gravity.LEFT);
assertEquals("Right under RTL",
GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_RTL),
Gravity.RIGHT);
assertEquals("Start under LTR",
GravityCompat.getAbsoluteGravity(GravityCompat.START,
ViewCompat.LAYOUT_DIRECTION_LTR),
Gravity.LEFT);
assertEquals("End under LTR",
GravityCompat.getAbsoluteGravity(GravityCompat.END,
ViewCompat.LAYOUT_DIRECTION_LTR),
Gravity.RIGHT);
if (Build.VERSION.SDK_INT >= 17) {
// The following tests are only expected to pass on v17+ devices
assertEquals("Start under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.START,
ViewCompat.LAYOUT_DIRECTION_RTL),
Gravity.RIGHT);
assertEquals("End under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.END,
ViewCompat.LAYOUT_DIRECTION_RTL),
Gravity.LEFT);
} else {
// And on older devices START is always LEFT, END is always RIGHT
assertEquals("Start under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.START,
ViewCompat.LAYOUT_DIRECTION_RTL),
Gravity.LEFT);
assertEquals("End under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.END,
ViewCompat.LAYOUT_DIRECTION_RTL),
Gravity.RIGHT);
}
}
@Test
public void testApplyNoOffsetsLtr() {
Rect outRect = new Rect();
// Left / top aligned under LTR direction
GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Left / top aligned under LTR: ",
outRect, 0, 0, 100, 50);
// Center / top aligned under LTR direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Center / top aligned under LTR: ",
outRect, 50, 0, 150, 50);
// Right / top aligned under LTR direction
GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Right / top aligned under LTR: ",
outRect, 100, 0, 200, 50);
// Left / center aligned under LTR direction
GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Left / center aligned under LTR: ",
outRect, 0, 25, 100, 75);
// Center / center aligned under LTR direction
GravityCompat.apply(Gravity.CENTER, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Center / center aligned under LTR: ",
outRect, 50, 25, 150, 75);
// Right / center aligned under LTR direction
GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Right / center aligned under LTR: ",
outRect, 100, 25, 200, 75);
// Left / bottom aligned under LTR direction
GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Left / bottom aligned under LTR: ",
outRect, 0, 50, 100, 100);
// Center / bottom aligned under LTR direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Center / bottom aligned under LTR: ",
outRect, 50, 50, 150, 100);
// Right / bottom aligned under LTR direction
GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Right / bottom aligned under LTR: ",
outRect, 100, 50, 200, 100);
// The following tests are expected to pass on all devices since START under LTR is LEFT
// and END under LTR is RIGHT on pre-v17 and v17+ versions of the platform.
// Start / top aligned under LTR direction
GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Start / top aligned under LTR: ",
outRect, 0, 0, 100, 50);
// End / top aligned under LTR direction
GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("End / top aligned under LTR: ",
outRect, 100, 0, 200, 50);
// Start / center aligned under LTR direction
GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Start / center aligned under LTR: ",
outRect, 0, 25, 100, 75);
// End / center aligned under LTR direction
GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("End / center aligned under LTR: ",
outRect, 100, 25, 200, 75);
// Start / bottom aligned under LTR direction
GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Start / bottom aligned under LTR: ",
outRect, 0, 50, 100, 100);
// End / bottom aligned under LTR direction
GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("End / bottom aligned under LTR: ",
outRect, 100, 50, 200, 100);
}
@Test
public void testApplyNoOffsetsRtl() {
Rect outRect = new Rect();
// The following tests are expected to pass on all devices since they are using
// Gravity constants that are not RTL-aware
// Left / top aligned under RTL direction
GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Left / top aligned under RTL: ",
outRect, 0, 0, 100, 50);
// Center / top aligned under RTL direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Center / top aligned under RTL: ",
outRect, 50, 0, 150, 50);
// Right / top aligned under RTL direction
GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Right / top aligned under RTL: ",
outRect, 100, 0, 200, 50);
// Left / center aligned under RTL direction
GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Left / center aligned under RTL: ",
outRect, 0, 25, 100, 75);
// Center / center aligned under RTL direction
GravityCompat.apply(Gravity.CENTER, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Center / center aligned under RTL: ",
outRect, 50, 25, 150, 75);
// Right / center aligned under RTL direction
GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Right / center aligned under RTL: ",
outRect, 100, 25, 200, 75);
// Left / bottom aligned under RTL direction
GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Left / bottom aligned under RTL: ",
outRect, 0, 50, 100, 100);
// Center / bottom aligned under RTL direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Center / bottom aligned under RTL: ",
outRect, 50, 50, 150, 100);
// Right / bottom aligned under RTL direction
GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Right / bottom aligned under RTL: ",
outRect, 100, 50, 200, 100);
if (Build.VERSION.SDK_INT >= 17) {
// The following tests are only expected to pass on v17+ devices since START under
// RTL is RIGHT and END under RTL is LEFT only on those devices.
// Start / top aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
outRect, 100, 0, 200, 50);
// End / top aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
outRect, 0, 0, 100, 50);
// Start / center aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
outRect, 100, 25, 200, 75);
// End / center aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
outRect, 0, 25, 100, 75);
// Start / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
outRect, 100, 50, 200, 100);
// End / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
outRect, 0, 50, 100, 100);
} else {
// And on older devices START is always LEFT, END is always RIGHT
// Start / top aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
outRect, 0, 0, 100, 50);
// End / top aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
outRect, 100, 0, 200, 50);
// Start / center aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
outRect, 0, 25, 100, 75);
// End / center aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
outRect, 100, 25, 200, 75);
// Start / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
outRect, 0, 50, 100, 100);
// End / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
outRect, 100, 50, 200, 100);
}
}
}