Добавлен тест на вертикальное центрирование подписи «Временный диалог» относительно квадрата чекбокса и исправлена стилизация текста в компонентах диалога.
This commit is contained in:
@@ -15,6 +15,7 @@ import androidx.compose.ui.graphics.toPixelMap
|
||||
import androidx.compose.ui.test.ExperimentalTestApi
|
||||
import androidx.compose.ui.test.assertTextEquals
|
||||
import androidx.compose.ui.test.captureToImage
|
||||
import androidx.compose.ui.test.onNodeWithTag
|
||||
import androidx.compose.ui.test.onNodeWithText
|
||||
import androidx.compose.ui.test.onRoot
|
||||
import androidx.compose.ui.test.performClick
|
||||
@@ -367,8 +368,79 @@ class DialogInfoDialogTest {
|
||||
)
|
||||
}
|
||||
|
||||
// ── helpers ────────────────────────────────────────────────────────────
|
||||
/**
|
||||
* Регрессия на вертикальное центрирование подписи «Временный диалог»
|
||||
* относительно квадратика чекбокса. Рендерит строку в битмап и сравнивает
|
||||
* вертикальные центры синего квадратика (accent) и белых глифов текста.
|
||||
*/
|
||||
@OptIn(ExperimentalTestApi::class)
|
||||
@Test
|
||||
fun `temporal checkbox label is vertically centered with the box`() = runComposeUiTest {
|
||||
val conversation = sampleConversation(title = "X", temporal = true)
|
||||
setContent {
|
||||
withAvatarStorage {
|
||||
ProvideAgentikTheme("dark".toAgentikTheme()) {
|
||||
Box(Modifier.fillMaxSize().background(darkAgentikColors.background)) {
|
||||
DialogInfoDialog(
|
||||
conversation = conversation,
|
||||
agentName = null,
|
||||
agentAddress = null,
|
||||
agentColor = null,
|
||||
online = false,
|
||||
onClose = {},
|
||||
onRename = { _, _ -> },
|
||||
onDelete = {},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val pixels = onNodeWithTag("temporal-checkbox").captureToImage().toPixelMap()
|
||||
|
||||
var sqMinY = Int.MAX_VALUE; var sqMaxY = -1
|
||||
var sqMaxX = -1
|
||||
var txMinY = Int.MAX_VALUE; var txMaxY = -1
|
||||
var sawText = false
|
||||
for (y in 0 until pixels.height) {
|
||||
for (x in 0 until pixels.width) {
|
||||
val c = pixels[x, y]
|
||||
val isAccent = kotlin.math.abs(c.red - 0.416f) < 0.12f &&
|
||||
kotlin.math.abs(c.green - 0.698f) < 0.12f &&
|
||||
kotlin.math.abs(c.blue - 0.949f) < 0.12f
|
||||
if (isAccent) {
|
||||
if (y < sqMinY) sqMinY = y
|
||||
if (y > sqMaxY) sqMaxY = y
|
||||
if (x > sqMaxX) sqMaxX = x
|
||||
}
|
||||
}
|
||||
}
|
||||
// Текст ищем только правее квадратика, чтобы ✓ внутри квадрата не мешал.
|
||||
for (y in 0 until pixels.height) {
|
||||
for (x in (sqMaxX + 3) until pixels.width) {
|
||||
val c = pixels[x, y]
|
||||
val isText = c.red > 0.55f && c.green > 0.55f && c.blue > 0.55f &&
|
||||
(maxOf(c.red, c.green, c.blue) - minOf(c.red, c.green, c.blue)) < 0.2f
|
||||
if (isText) {
|
||||
sawText = true
|
||||
if (y < txMinY) txMinY = y
|
||||
if (y > txMaxY) txMaxY = y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assertTrue(sawText, "глифы подписи не найдены в битмапе")
|
||||
val sqCenter = (sqMinY + sqMaxY) / 2f
|
||||
val txCenter = (txMinY + txMaxY) / 2f
|
||||
val delta = txCenter - sqCenter
|
||||
assertTrue(
|
||||
kotlin.math.abs(delta) <= 1.0f,
|
||||
"центр подписи (y=$txCenter) должен совпадать с центром квадратика " +
|
||||
"(y=$sqCenter); смещение=${delta}px (sqY=$sqMinY..$sqMaxY, txY=$txMinY..$txMaxY)",
|
||||
)
|
||||
}
|
||||
|
||||
// ── helpers ────────────────────────────────────────────────────────────
|
||||
private fun sampleConversation(
|
||||
title: String = "Диалог",
|
||||
temporal: Boolean = false,
|
||||
|
||||
Reference in New Issue
Block a user