[go: nahoru, domu]

blob: b18773620b1288e3284768b0fa008654fd316e7c [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
Adam Powell712dc992019-12-04 12:48:30 -080024import androidx.ui.layout.LayoutAspectRatio
George Mount842c8c12020-01-08 16:03:42 -080025import androidx.ui.unit.IntPx
George Mount8baef7a2020-01-21 13:40:57 -080026import androidx.ui.unit.IntPxSize
George Mount842c8c12020-01-08 16:03:42 -080027import androidx.ui.unit.PxPosition
George Mount842c8c12020-01-08 16:03:42 -080028import androidx.ui.unit.dp
29import androidx.ui.unit.ipx
George Mount8baef7a2020-01-21 13:40:57 -080030import org.junit.Assert.assertEquals
Mihai Popa2554ba82020-03-13 19:03:52 +000031import org.junit.Assert.assertTrue
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)
Mihai Popac9af2882020-03-16 17:55:00 +000040class LayoutAspectRatioTest : LayoutTest() {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010041 @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() {
Andrey Kulikov9af8d1c2020-03-12 15:49:34 +000060 LayoutAspectRatio(0f)
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010061 }
62
63 @Test(expected = IllegalArgumentException::class)
64 fun testAspectRatioModifier_negativeRatio() {
Andrey Kulikov9af8d1c2020-03-12 15:49:34 +000065 LayoutAspectRatio(-2f)
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010066 }
67
68 @Test
69 fun testAspectRatio_sizesCorrectly() {
George Mount8baef7a2020-01-21 13:40:57 -080070 assertEquals(IntPxSize(30.ipx, 30.ipx), getSize(1f, Constraints(maxWidth = 30.ipx)))
71 assertEquals(IntPxSize(30.ipx, 15.ipx), getSize(2f, Constraints(maxWidth = 30.ipx)))
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010072 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080073 IntPxSize(10.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010074 getSize(1f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
75 )
76 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080077 IntPxSize(20.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010078 getSize(2f, Constraints(maxWidth = 30.ipx, maxHeight = 10.ipx))
79 )
80 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080081 IntPxSize(10.ipx, 5.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010082 getSize(2f, Constraints(minWidth = 10.ipx, minHeight = 5.ipx))
83 )
84 assertEquals(
George Mount8baef7a2020-01-21 13:40:57 -080085 IntPxSize(20.ipx, 10.ipx),
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010086 getSize(2f, Constraints(minWidth = 5.ipx, minHeight = 10.ipx))
87 )
88 }
89
George Mount8baef7a2020-01-21 13:40:57 -080090 private fun getSize(aspectRatio: Float, childContraints: Constraints): IntPxSize {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010091 val positionedLatch = CountDownLatch(1)
George Mount8baef7a2020-01-21 13:40:57 -080092 val size = Ref<IntPxSize>()
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010093 val position = Ref<PxPosition>()
94 show {
Leland Richardsona5396b42019-10-11 17:34:55 -070095 Layout(@Composable {
George Mount5e1d3f12020-03-09 17:28:35 -070096 Container(LayoutAspectRatio(aspectRatio) +
97 saveLayoutInfo(size, position, positionedLatch)
98 ) {
Anastasia Soboleva1de1d102019-09-30 16:48:31 +010099 }
Anastasia Soboleva9474ff82020-02-19 19:02:15 +0000100 }) { measurables, incomingConstraints, _ ->
Anastasia Soboleva1de1d102019-09-30 16:48:31 +0100101 require(measurables.isNotEmpty())
102 val placeable = measurables.first().measure(childContraints)
103 layout(incomingConstraints.maxWidth, incomingConstraints.maxHeight) {
104 placeable.place(0.ipx, 0.ipx)
105 }
106 }
107 }
Mihai Popa2554ba82020-03-13 19:03:52 +0000108 assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
Anastasia Soboleva1de1d102019-09-30 16:48:31 +0100109 return size.value!!
110 }
111}