Skip to content

Commit

Permalink
Add test that first frame is drawn for Dialog of unspecified size, an…
Browse files Browse the repository at this point in the history
…d validate the size at which the Window/Dialog are drawn.
  • Loading branch information
m-sasha committed Mar 20, 2023
1 parent 7c37379 commit da58c9c
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,16 @@ import androidx.compose.ui.sendKeyEvent
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogState
import androidx.compose.ui.window.rememberDialogState
import androidx.compose.ui.window.runApplicationTest
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import java.awt.Dimension
import java.awt.event.KeyEvent
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import kotlin.test.assertEquals
import org.junit.Test

@OptIn(ExperimentalComposeUiApi::class)
class DialogTest {
Expand Down Expand Up @@ -527,7 +529,11 @@ class DialogTest {
var isVisibleOnFirstDraw = false

launchTestApplication {
Dialog(onCloseRequest = ::exitApplication) {
val dialogSize = DpSize(400.dp, 300.dp)
Dialog(
onCloseRequest = ::exitApplication,
state = DialogState(size = dialogSize)
) {
if (!isComposed) {
isVisibleOnFirstComposition = window.isVisible
isComposed = true
Expand All @@ -538,6 +544,52 @@ class DialogTest {
isVisibleOnFirstDraw = window.isVisible
isDrawn = true
}

// Make sure we're drawn at the correct size
val dialogInsets = window.insets.let {
// The AWT coordinates are scaled, so they're Dp
DpSize(
width = (it.left + it.right).dp,
height = (it.top + it.bottom).dp
)
}
val expectedSizePx = (dialogSize - dialogInsets).toSize()
assertEquals(expectedSizePx, size)
}
}
}

awaitIdle()
assertThat(isVisibleOnFirstComposition).isFalse()
assertThat(isVisibleOnFirstDraw).isFalse()
}

@Test(timeout = 30000)
fun `should draw before dialog is visible with unspecified size`() = runApplicationTest {
var isComposed = false
var isDrawn = false
var isVisibleOnFirstComposition = false
var isVisibleOnFirstDraw = false

launchTestApplication {
Dialog(
onCloseRequest = ::exitApplication,
state = DialogState(size = DpSize.Unspecified)
) {
if (!isComposed) {
isVisibleOnFirstComposition = window.isVisible
isComposed = true
}

val canvasSize = DpSize(400.dp, 300.dp)
Canvas(Modifier.size(canvasSize)) {
if (!isDrawn) {
isVisibleOnFirstDraw = window.isVisible
isDrawn = true
}

// Make sure we're drawn at the correct size
assertEquals(size, canvasSize.toSize())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.rememberWindowState
import androidx.compose.ui.window.runApplicationTest
import com.google.common.truth.Truth.assertThat
Expand Down Expand Up @@ -442,7 +443,11 @@ class WindowTest {
var isVisibleOnFirstDraw = false

launchTestApplication {
Window(onCloseRequest = ::exitApplication) {
val windowSize = DpSize(400.dp, 300.dp)
Window(
onCloseRequest = ::exitApplication,
state = WindowState(size = windowSize)
) {
if (!isComposed) {
isVisibleOnFirstComposition = window.isVisible
isComposed = true
Expand All @@ -453,10 +458,22 @@ class WindowTest {
isVisibleOnFirstDraw = window.isVisible
isDrawn = true
}

// Make sure we're drawn at the correct size
val windowInsets = window.insets.let {
// The AWT coordinates are scaled, so they're Dp
DpSize(
width = (it.left + it.right).dp,
height = (it.top + it.bottom).dp
)
}
val expectedSizePx = (windowSize - windowInsets).toSize()
assertEquals(expectedSizePx, size)
}
}
}


awaitIdle()
assertThat(isVisibleOnFirstComposition).isFalse()
assertThat(isVisibleOnFirstDraw).isFalse()
Expand All @@ -470,21 +487,24 @@ class WindowTest {
var isVisibleOnFirstDraw = false

launchTestApplication {
val windowState = rememberWindowState(size = DpSize.Unspecified)
Window(
onCloseRequest = ::exitApplication,
state = windowState
state = WindowState(size = DpSize.Unspecified)
) {
if (!isComposed) {
isVisibleOnFirstComposition = window.isVisible
isComposed = true
}

Canvas(Modifier.size(400.dp, 400.dp)) {
val canvasSize = DpSize(400.dp, 300.dp)
Canvas(Modifier.size(canvasSize)) {
if (!isDrawn) {
isVisibleOnFirstDraw = window.isVisible
isDrawn = true
}

// Make sure we're drawn at the correct size
assertEquals(size, canvasSize.toSize())
}
}
}
Expand Down

0 comments on commit da58c9c

Please sign in to comment.