[go: nahoru, domu]

blob: fbeafa0e25cdf96c759739cf20954a2cfb64329b [file] [log] [blame]
Anastasia Soboleva1de1d102019-09-30 16:48:31 +01001/*
2 * Copyright 2019 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 androidx.ui.layout.test
18
Leland Richardsona5396b42019-10-11 17:34:55 -070019import androidx.compose.Composable
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010020import androidx.test.filters.SmallTest
21import androidx.ui.core.Constraints
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010022import androidx.ui.core.Layout
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010023import androidx.ui.core.Ref
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010024import androidx.ui.layout.Container
Adam Powell712dc992019-12-04 12:48:30 -080025import androidx.ui.layout.LayoutAspectRatio
George Mount842c8c12020-01-08 16:03:42 -080026import androidx.ui.unit.IntPx
George Mount8baef7a2020-01-21 13:40:57 -080027import androidx.ui.unit.IntPxSize
George Mount842c8c12020-01-08 16:03:42 -080028import androidx.ui.unit.PxPosition
George Mount842c8c12020-01-08 16:03:42 -080029import androidx.ui.unit.dp
30import androidx.ui.unit.ipx
George Mount842c8c12020-01-08 16:03:42 -080031import androidx.ui.unit.withDensity
George Mount8baef7a2020-01-21 13:40:57 -080032import org.junit.Assert.assertEquals
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010033import org.junit.Test
34import org.junit.runner.RunWith
35import org.junit.runners.JUnit4
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010036import java.util.concurrent.CountDownLatch
37import java.util.concurrent.TimeUnit
38
39@SmallTest
40@RunWith(JUnit4::class)
41class AspectRatioModifierTest : LayoutTest() {
42 @Test
43 fun testAspectRatioModifier_intrinsicDimensions() = withDensity(density) {
Leland Richardsona5396b42019-10-11 17:34:55 -070044 testIntrinsics(@Composable {
Adam Powell712dc992019-12-04 12:48:30 -080045 Container(modifier = LayoutAspectRatio(2f), width = 30.dp, height = 40.dp) { }
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010046 }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
47 assertEquals(40.ipx, minIntrinsicWidth(20.ipx))
48 assertEquals(40.ipx, maxIntrinsicWidth(20.ipx))
49 assertEquals(20.ipx, minIntrinsicHeight(40.ipx))
50 assertEquals(20.ipx, maxIntrinsicHeight(40.ipx))
51
52 assertEquals(30.dp.toIntPx(), minIntrinsicWidth(IntPx.Infinity))
53 assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(IntPx.Infinity))
54 assertEquals(40.dp.toIntPx(), minIntrinsicHeight(IntPx.Infinity))
55 assertEquals(40.dp.toIntPx(), maxIntrinsicHeight(IntPx.Infinity))
56 }
57 }
58
59 @Test(expected = IllegalArgumentException::class)
60 fun testAspectRatioModifier_zeroRatio() {
61 show {
Adam Powell712dc992019-12-04 12:48:30 -080062 Container(LayoutAspectRatio(0f)) { }
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010063 }
64 }
65
66 @Test(expected = IllegalArgumentException::class)
67 fun testAspectRatioModifier_negativeRatio() {
68 show {
Adam Powell712dc992019-12-04 12:48:30 -080069 Container(LayoutAspectRatio(-2f)) { }
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010070 }
71 }
72
73 @Test
74 fun testAspectRatio_sizesCorrectly() {
George Mount8baef7a2020-01-21 13:40:57 -080075 assertEquals(IntPxSize(30.ipx, 30.ipx), getSize(1f, Constraints(maxWidth = 30.ipx)))
76 assertEquals(IntPxSize(30.ipx, 15.ipx), getSize(2f, Constraints(maxWidth = 30.ipx)))
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010077 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080078 IntPxSize(10.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010079 getSize(1f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
80 )
81 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080082 IntPxSize(20.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010083 getSize(2f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
84 )
85 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080086 IntPxSize(10.ipx, 5.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010087 getSize(2f, Constraints(minWidth = 10.ipx, minHeight = 5.ipx))
88 )
89 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080090 IntPxSize(20.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010091 getSize(2f, Constraints(minWidth = 5.ipx, minHeight = 10.ipx))
92 )
93 }
94
George Mount8baef7a2020-01-21 13:40:57 -080095 private fun getSize(aspectRatio: Float, childContraints: Constraints): IntPxSize {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010096 val positionedLatch = CountDownLatch(1)
George Mount8baef7a2020-01-21 13:40:57 -080097 val size = Ref<IntPxSize>()
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010098 val position = Ref<PxPosition>()
99 show {
Leland Richardsona5396b42019-10-11 17:34:55 -0700100 Layout(@Composable {
Adam Powell712dc992019-12-04 12:48:30 -0800101 Container(LayoutAspectRatio(aspectRatio)) {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +0100102 SaveLayoutInfo(size, position, positionedLatch)
103 }
104 }) { measurables, incomingConstraints ->
105 require(measurables.isNotEmpty())
106 val placeable = measurables.first().measure(childContraints)
107 layout(incomingConstraints.maxWidth, incomingConstraints.maxHeight) {
108 placeable.place(0.ipx, 0.ipx)
109 }
110 }
111 }
112 positionedLatch.await(1, TimeUnit.SECONDS)
113 return size.value!!
114 }
115}