aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMihai Popa <popam@google.com>2019-06-24 14:57:12 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2019-06-24 14:57:12 +0000
commita0705c1ef82412601ad9a80eb8ce1e8cd8d82fef (patch)
treed8c41da12c53b46000c0f2498de2599949b50d79
parent1457ddc0d36da418a7a11badf6da252f966deae6 (diff)
parent4012ebc308cc6c88a77396e5c4074869cfbdde2a (diff)
downloadsupport-a0705c1ef82412601ad9a80eb8ce1e8cd8d82fef.tar.gz
Merge "Add tests for Stack intrinsic measurements" into androidx-master-dev
-rw-r--r--ui/layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt63
-rw-r--r--ui/layout/src/main/java/androidx/ui/layout/Stack.kt30
2 files changed, 79 insertions, 14 deletions
diff --git a/ui/layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt b/ui/layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt
index 3e047200103..d5491373188 100644
--- a/ui/layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt
+++ b/ui/layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt
@@ -18,6 +18,7 @@ package androidx.ui.layout.test
import androidx.test.filters.SmallTest
import androidx.ui.core.OnChildPositioned
+import androidx.ui.core.IntPx
import androidx.ui.core.PxPosition
import androidx.ui.core.PxSize
import androidx.ui.core.Ref
@@ -26,12 +27,14 @@ import androidx.ui.core.ipx
import androidx.ui.core.px
import androidx.ui.core.withDensity
import androidx.ui.layout.Align
+import androidx.ui.layout.AspectRatio
import androidx.ui.layout.Alignment
+import androidx.ui.layout.ConstrainedBox
import androidx.ui.layout.Container
+import androidx.ui.layout.DpConstraints
import androidx.ui.layout.Stack
import androidx.compose.Composable
import androidx.compose.composer
-import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@@ -250,4 +253,62 @@ class StackTest : LayoutTest() {
assertEquals(PxSize(halfSize, halfSize), childSize[6].value)
assertEquals(PxPosition(halfSize, size - inset - halfSize), childPosition[6].value)
}
+
+ @Test
+ fun testStack_hasCorrectIntrinsicMeasurements() = withDensity(density) {
+ testIntrinsics(@Composable {
+ Stack {
+ aligned(Alignment.TopLeft) {
+ AspectRatio(2f) { }
+ }
+ aligned(Alignment.BottomCenter) {
+ ConstrainedBox(DpConstraints.tightConstraints(90.dp, 80.dp)) { }
+ }
+ positioned(10.dp, 10.dp, 10.dp, 10.dp) {
+ ConstrainedBox(DpConstraints.tightConstraints(200.dp, 200.dp)) { }
+ }
+ }
+ }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+ // Min width.
+ assertEquals(90.dp.toIntPx(), minIntrinsicWidth(0.dp.toIntPx()))
+ assertEquals(100.dp.toIntPx(), minIntrinsicWidth(50.dp.toIntPx()))
+ assertEquals(90.dp.toIntPx(), minIntrinsicWidth(IntPx.Infinity))
+ // Min height.
+ assertEquals(80.dp.toIntPx(), minIntrinsicHeight(0.dp.toIntPx()))
+ assertEquals(200.dp.toIntPx() / 2, minIntrinsicHeight(200.dp.toIntPx()))
+ assertEquals(80.dp.toIntPx(), minIntrinsicHeight(IntPx.Infinity))
+ // Max width.
+ assertEquals(90.dp.toIntPx(), maxIntrinsicWidth(0.dp.toIntPx()))
+ assertEquals(100.dp.toIntPx(), maxIntrinsicWidth(50.dp.toIntPx()))
+ assertEquals(90.dp.toIntPx(), maxIntrinsicWidth(IntPx.Infinity))
+ // Max height.
+ assertEquals(80.dp.toIntPx(), maxIntrinsicHeight(0.dp.toIntPx()))
+ assertEquals(200.dp.toIntPx() / 2, maxIntrinsicHeight(200.dp.toIntPx()))
+ assertEquals(80.dp.toIntPx(), maxIntrinsicHeight(IntPx.Infinity))
+ }
+ }
+
+ @Test
+ fun testStack_hasCorrectIntrinsicMeasurements_withNoAlignedChildren() = withDensity(density) {
+ testIntrinsics(@Composable {
+ Stack {
+ positioned(10.dp, 10.dp, 10.dp, 10.dp) {
+ ConstrainedBox(DpConstraints.tightConstraints(200.dp, 200.dp)) { }
+ }
+ }
+ }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
+ // Min width.
+ assertEquals(0.dp.toIntPx(), minIntrinsicWidth(50.dp.toIntPx()))
+ assertEquals(0.dp.toIntPx(), minIntrinsicWidth(IntPx.Infinity))
+ // Min height.
+ assertEquals(0.dp.toIntPx(), minIntrinsicHeight(50.dp.toIntPx()))
+ assertEquals(0.dp.toIntPx(), minIntrinsicHeight(IntPx.Infinity))
+ // Max width.
+ assertEquals(0.dp.toIntPx(), maxIntrinsicWidth(50.dp.toIntPx()))
+ assertEquals(0.dp.toIntPx(), maxIntrinsicWidth(IntPx.Infinity))
+ // Max height.
+ assertEquals(0.dp.toIntPx(), maxIntrinsicHeight(50.dp.toIntPx()))
+ assertEquals(0.dp.toIntPx(), maxIntrinsicHeight(IntPx.Infinity))
+ }
+ }
}
diff --git a/ui/layout/src/main/java/androidx/ui/layout/Stack.kt b/ui/layout/src/main/java/androidx/ui/layout/Stack.kt
index 04298346f0d..a0b71fc64ef 100644
--- a/ui/layout/src/main/java/androidx/ui/layout/Stack.kt
+++ b/ui/layout/src/main/java/androidx/ui/layout/Stack.kt
@@ -29,6 +29,9 @@ import androidx.ui.core.max
import androidx.compose.Children
import androidx.compose.Composable
import androidx.compose.composer
+import androidx.ui.core.coerceAtLeast
+import androidx.ui.core.ipx
+import androidx.ui.core.isFinite
/**
* Collects information about the children of a [Stack] when its body is executed
@@ -126,24 +129,25 @@ fun Stack(
(0 until measurables.size).filter { i -> measurables[i].positioned }.forEach { i ->
val childData = measurables[i].stackChildData
// Obtain width constraints.
- val childMaxWidth =
- stackWidth - (childData.leftInset?.toIntPx() ?: IntPx.Zero) -
- (childData.rightInset?.toIntPx() ?: IntPx.Zero)
- val childMinWidth = if (childData.leftInset != null && childData.rightInset != null) {
+ val childMaxWidth = (stackWidth -
+ (childData.leftInset?.toIntPx() ?: IntPx.Zero) -
+ (childData.rightInset?.toIntPx() ?: IntPx.Zero)).coerceAtLeast(0.ipx)
+ val childMinWidth = if (childData.leftInset != null && childData.rightInset != null &&
+ childMaxWidth.isFinite()) {
childMaxWidth
} else {
IntPx.Zero
}
// Obtain height constraints.
- val childMaxHeight =
- stackHeight - (childData.topInset?.toIntPx() ?: IntPx.Zero) -
- (childData.bottomInset?.toIntPx() ?: IntPx.Zero)
- val childMinHeight =
- if (childData.topInset != null && childData.bottomInset != null) {
- childMaxHeight
- } else {
- IntPx.Zero
- }
+ val childMaxHeight = (stackHeight -
+ (childData.topInset?.toIntPx() ?: IntPx.Zero) -
+ (childData.bottomInset?.toIntPx() ?: IntPx.Zero)).coerceAtLeast(0.ipx)
+ val childMinHeight = if (childData.topInset != null && childData.bottomInset != null &&
+ childMaxHeight.isFinite()) {
+ childMaxHeight
+ } else {
+ IntPx.Zero
+ }
measurables[i].measure(
Constraints(
childMinWidth, childMaxWidth, childMinHeight, childMaxHeight