diff options
author | Mihai Popa <popam@google.com> | 2019-06-24 14:57:12 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-06-24 14:57:12 +0000 |
commit | a0705c1ef82412601ad9a80eb8ce1e8cd8d82fef (patch) | |
tree | d8c41da12c53b46000c0f2498de2599949b50d79 | |
parent | 1457ddc0d36da418a7a11badf6da252f966deae6 (diff) | |
parent | 4012ebc308cc6c88a77396e5c4074869cfbdde2a (diff) | |
download | support-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.kt | 63 | ||||
-rw-r--r-- | ui/layout/src/main/java/androidx/ui/layout/Stack.kt | 30 |
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 |