[go: nahoru, domu]

blob: cf00f944a9cd56f107f8c1d6b23a27e7a6559fd6 [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 Mount8baef7a2020-01-21 13:40:57 -080031import org.junit.Assert.assertEquals
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010032import org.junit.Test
33import org.junit.runner.RunWith
34import org.junit.runners.JUnit4
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010035import java.util.concurrent.CountDownLatch
36import java.util.concurrent.TimeUnit
37
38@SmallTest
39@RunWith(JUnit4::class)
40class AspectRatioModifierTest : LayoutTest() {
41 @Test
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +000042 fun testAspectRatioModifier_intrinsicDimensions() = with(density) {
Leland Richardsona5396b42019-10-11 17:34:55 -070043 testIntrinsics(@Composable {
Adam Powell712dc992019-12-04 12:48:30 -080044 Container(modifier = LayoutAspectRatio(2f), width = 30.dp, height = 40.dp) { }
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010045 }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
46 assertEquals(40.ipx, minIntrinsicWidth(20.ipx))
47 assertEquals(40.ipx, maxIntrinsicWidth(20.ipx))
48 assertEquals(20.ipx, minIntrinsicHeight(40.ipx))
49 assertEquals(20.ipx, maxIntrinsicHeight(40.ipx))
50
51 assertEquals(30.dp.toIntPx(), minIntrinsicWidth(IntPx.Infinity))
52 assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(IntPx.Infinity))
53 assertEquals(40.dp.toIntPx(), minIntrinsicHeight(IntPx.Infinity))
54 assertEquals(40.dp.toIntPx(), maxIntrinsicHeight(IntPx.Infinity))
55 }
56 }
57
58 @Test(expected = IllegalArgumentException::class)
59 fun testAspectRatioModifier_zeroRatio() {
60 show {
Adam Powell712dc992019-12-04 12:48:30 -080061 Container(LayoutAspectRatio(0f)) { }
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010062 }
63 }
64
65 @Test(expected = IllegalArgumentException::class)
66 fun testAspectRatioModifier_negativeRatio() {
67 show {
Adam Powell712dc992019-12-04 12:48:30 -080068 Container(LayoutAspectRatio(-2f)) { }
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010069 }
70 }
71
72 @Test
73 fun testAspectRatio_sizesCorrectly() {
George Mount8baef7a2020-01-21 13:40:57 -080074 assertEquals(IntPxSize(30.ipx, 30.ipx), getSize(1f, Constraints(maxWidth = 30.ipx)))
75 assertEquals(IntPxSize(30.ipx, 15.ipx), getSize(2f, Constraints(maxWidth = 30.ipx)))
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010076 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080077 IntPxSize(10.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010078 getSize(1f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
79 )
80 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080081 IntPxSize(20.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010082 getSize(2f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
83 )
84 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080085 IntPxSize(10.ipx, 5.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010086 getSize(2f, Constraints(minWidth = 10.ipx, minHeight = 5.ipx))
87 )
88 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080089 IntPxSize(20.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010090 getSize(2f, Constraints(minWidth = 5.ipx, minHeight = 10.ipx))
91 )
92 }
93
George Mount8baef7a2020-01-21 13:40:57 -080094 private fun getSize(aspectRatio: Float, childContraints: Constraints): IntPxSize {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010095 val positionedLatch = CountDownLatch(1)
George Mount8baef7a2020-01-21 13:40:57 -080096 val size = Ref<IntPxSize>()
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010097 val position = Ref<PxPosition>()
98 show {
Leland Richardsona5396b42019-10-11 17:34:55 -070099 Layout(@Composable {
Adam Powell712dc992019-12-04 12:48:30 -0800100 Container(LayoutAspectRatio(aspectRatio)) {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +0100101 SaveLayoutInfo(size, position, positionedLatch)
102 }
Anastasia Soboleva9474ff82020-02-19 19:02:15 +0000103 }) { measurables, incomingConstraints, _ ->
Anastasia Soboleva1de1d102019-09-30 16:48:31 +0100104 require(measurables.isNotEmpty())
105 val placeable = measurables.first().measure(childContraints)
106 layout(incomingConstraints.maxWidth, incomingConstraints.maxHeight) {
107 placeable.place(0.ipx, 0.ipx)
108 }
109 }
110 }
111 positionedLatch.await(1, TimeUnit.SECONDS)
112 return size.value!!
113 }
114}