Updated on 2026-08-14
This commit is contained in:
parent
96a3074bdb
commit
d616571df4
29 changed files with 421 additions and 19 deletions
|
|
@ -16,6 +16,7 @@ import androidx.compose.runtime.Immutable
|
|||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.text.input.TextFieldValue
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
|
|
@ -29,6 +30,7 @@ import com.tangem.core.ui.components.fields.SimpleDialogTextField
|
|||
import com.tangem.core.ui.extensions.stringResourceSafe
|
||||
import com.tangem.core.ui.res.TangemTheme
|
||||
import com.tangem.core.ui.res.TangemThemePreview
|
||||
import com.tangem.core.ui.test.DialogTestTags
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
|
|
@ -216,7 +218,8 @@ private fun TangemDialog(
|
|||
shape = TangemTheme.shapes.roundedCornersLarge,
|
||||
color = TangemTheme.colors.background.primary,
|
||||
)
|
||||
.padding(vertical = TangemTheme.dimens.spacing24),
|
||||
.padding(vertical = TangemTheme.dimens.spacing24)
|
||||
.testTag(DialogTestTags.DIALOG_CONTAINER),
|
||||
) {
|
||||
if (title != null) {
|
||||
Text(
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.composed
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
|
|
@ -24,6 +25,7 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.unit.sp
|
||||
import com.tangem.core.ui.components.ResizableText
|
||||
import com.tangem.core.ui.res.TangemTheme
|
||||
import com.tangem.core.ui.test.DialogTestTags
|
||||
import com.tangem.core.ui.utils.MultipleClickPreventer
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
|
|
@ -47,7 +49,9 @@ fun TangemButton(
|
|||
val multipleClickPreventer = remember { MultipleClickPreventer.get() }
|
||||
|
||||
Button(
|
||||
modifier = modifier.heightIn(min = size.toHeightDp()),
|
||||
modifier = modifier
|
||||
.heightIn(min = size.toHeightDp())
|
||||
.testTag(DialogTestTags.BUTTON),
|
||||
onClick = {
|
||||
multipleClickPreventer.processEvent { if (!showProgress) onClick() }
|
||||
},
|
||||
|
|
|
|||
|
|
@ -7,12 +7,14 @@ import androidx.compose.foundation.layout.padding
|
|||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.tangem.core.ui.R
|
||||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.core.ui.extensions.resolveReference
|
||||
import com.tangem.core.ui.res.TangemTheme
|
||||
import com.tangem.core.ui.res.TangemThemePreview
|
||||
import com.tangem.core.ui.test.PopUpMenuTestTags
|
||||
|
||||
@Suppress("ComposableEventParameterNaming")
|
||||
@Composable
|
||||
|
|
@ -23,7 +25,8 @@ fun TangemDropdownItem(item: TangemDropdownMenuItem, dismissParent: () -> Unit,
|
|||
dismissParent()
|
||||
item.onClick()
|
||||
}
|
||||
.padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16),
|
||||
.padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16)
|
||||
.testTag(PopUpMenuTestTags.BUTTON),
|
||||
text = item.title.resolveReference(),
|
||||
style = TangemTheme.typography.button.copy(color = item.textColorProvider()),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.graphics.TransformOrigin
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.unit.*
|
||||
import androidx.compose.ui.window.Popup
|
||||
import androidx.compose.ui.window.PopupPositionProvider
|
||||
import androidx.compose.ui.window.PopupProperties
|
||||
import com.tangem.core.ui.res.TangemTheme
|
||||
import com.tangem.core.ui.test.PopUpMenuTestTags
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
||||
|
|
@ -138,7 +140,8 @@ private fun DropdownMenuContent(
|
|||
Column(
|
||||
modifier = modifier
|
||||
.width(IntrinsicSize.Max)
|
||||
.verticalScroll(rememberScrollState()),
|
||||
.verticalScroll(rememberScrollState())
|
||||
.testTag(PopUpMenuTestTags.CONTAINER),
|
||||
content = content,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import androidx.compose.ui.layout.Measurable
|
|||
import androidx.compose.ui.layout.Placeable
|
||||
import androidx.compose.ui.layout.layoutId
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
|
||||
|
|
@ -30,6 +31,7 @@ import com.tangem.core.ui.extensions.stringReference
|
|||
import com.tangem.core.ui.res.TangemColorPalette
|
||||
import com.tangem.core.ui.res.TangemTheme
|
||||
import com.tangem.core.ui.res.TangemThemePreview
|
||||
import com.tangem.core.ui.test.MainScreenTestTags
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import org.burnoutcrew.reorderable.ReorderableLazyListState
|
||||
import java.util.UUID
|
||||
|
|
@ -100,7 +102,8 @@ fun TokenItem(
|
|||
state = state.iconState,
|
||||
modifier = Modifier
|
||||
.layoutId(layoutId = LayoutId.ICON)
|
||||
.padding(end = TangemTheme.dimens.spacing8),
|
||||
.padding(end = TangemTheme.dimens.spacing8)
|
||||
.testTag(MainScreenTestTags.TOKEN_ICON),
|
||||
)
|
||||
|
||||
TokenTitle(
|
||||
|
|
@ -108,7 +111,8 @@ fun TokenItem(
|
|||
modifier = Modifier
|
||||
.layoutId(layoutId = LayoutId.TITLE)
|
||||
.padding(end = TangemTheme.dimens.spacing8)
|
||||
.padding(bottom = betweenRowsMargin),
|
||||
.padding(bottom = betweenRowsMargin)
|
||||
.testTag(MainScreenTestTags.TOKEN_TITLE),
|
||||
)
|
||||
|
||||
TokenFiatAmount(
|
||||
|
|
@ -116,26 +120,32 @@ fun TokenItem(
|
|||
isBalanceHidden = isBalanceHidden,
|
||||
modifier = Modifier
|
||||
.layoutId(layoutId = LayoutId.FIAT_AMOUNT)
|
||||
.padding(bottom = betweenRowsMargin),
|
||||
.padding(bottom = betweenRowsMargin)
|
||||
.testTag(MainScreenTestTags.TOKEN_FIAT_AMOUNT),
|
||||
)
|
||||
|
||||
TokenPrice(
|
||||
state = state.subtitleState,
|
||||
modifier = Modifier
|
||||
.layoutId(layoutId = LayoutId.CRYPTO_PRICE)
|
||||
.padding(end = TangemTheme.dimens.spacing8),
|
||||
.padding(end = TangemTheme.dimens.spacing8)
|
||||
.testTag(MainScreenTestTags.TOKEN_PRICE),
|
||||
)
|
||||
|
||||
TokenCryptoAmount(
|
||||
state = state.subtitle2State,
|
||||
isBalanceHidden = isBalanceHidden,
|
||||
modifier = Modifier.layoutId(layoutId = LayoutId.CRYPTO_AMOUNT),
|
||||
modifier = Modifier
|
||||
.layoutId(layoutId = LayoutId.CRYPTO_AMOUNT)
|
||||
.testTag(MainScreenTestTags.TOKEN_CRYPTO_AMOUNT),
|
||||
)
|
||||
|
||||
NonFiatContentBlock(
|
||||
state = state,
|
||||
reorderableTokenListState = reorderableTokenListState,
|
||||
modifier = Modifier.layoutId(layoutId = LayoutId.NON_FIAT_CONTENT),
|
||||
modifier = Modifier
|
||||
.layoutId(layoutId = LayoutId.NON_FIAT_CONTENT)
|
||||
.testTag(MainScreenTestTags.TOKEN_NO_ADDRESS),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
package com.tangem.core.ui.test
|
||||
|
||||
object DialogTestTags {
|
||||
const val DIALOG_CONTAINER = "DIALOG_CONTAINER"
|
||||
const val BUTTON = "DIALOG_BUTTON"
|
||||
}
|
||||
|
|
@ -4,4 +4,13 @@ object MainScreenTestTags {
|
|||
const val SCREEN_CONTAINER = "MAIN_SCREEN_CONTAINER"
|
||||
const val MORE_BUTTON = "MAIN_SCREEN_MORE_BUTTON"
|
||||
const val TOP_BAR = "MAIN_SCREEN_TOP_BAR"
|
||||
const val TOKEN_LIST_ITEM = "MAIN_SCREEN_TOKEN_LIST_ITEM"
|
||||
const val TOKEN_TITLE = "MAIN_SCREEN_TOKEN_TITLE"
|
||||
const val TOKEN_ICON = "MAIN_SCREEN_TOKEN_ICON"
|
||||
const val TOKEN_PRICE = "MAIN_SCREEN_TOKEN_PRICE"
|
||||
const val TOKEN_FIAT_AMOUNT = "MAIN_SCREEN_TOKEN_FIAT_AMOUNT"
|
||||
const val TOKEN_CRYPTO_AMOUNT = "MAIN_SCREEN_TOKEN_CRYPTO_AMOUNT"
|
||||
const val TOKEN_NO_ADDRESS = "MAIN_SCREEN_TOKEN_NO_ADDRESS"
|
||||
const val WALLET_BALANCE = "MAIN_SCREEN_WALLET_BALANCE"
|
||||
const val WALLET_LIST_ITEM = "MAIN_SCREEN_WALLET_LIST_ITEM"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.tangem.core.ui.test
|
||||
|
||||
object MarketTooltipTestTags {
|
||||
const val CONTAINER = "MARKETS_TOOLTIP_CONTAINER"
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package com.tangem.core.ui.test
|
||||
|
||||
object PopUpMenuTestTags {
|
||||
const val CONTAINER = "POP_UP_MENU_CONTAINER"
|
||||
const val BUTTON = "POP_UP_MENU_BUTTON"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.tangem.core.ui.test
|
||||
|
||||
object TokenDetailsScreenTestTags {
|
||||
const val SCREEN_CONTAINER = "TOKEN_DETAILS_SCREEN_CONTAINER"
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package com.tangem.core.ui.test
|
||||
|
||||
object TokenDetailsTopBarTestTags {
|
||||
const val MORE_BUTTON = "TOKEN_DETAILS_TOP_BAR_MORE_BUTTON"
|
||||
const val BACK_BUTTON = "TOKEN_DETAILS_TOP_BAR_BACK_BUTTON"
|
||||
}
|
||||
29
core/ui/src/main/java/com/tangem/core/ui/utils/LazyList.kt
Normal file
29
core/ui/src/main/java/com/tangem/core/ui/utils/LazyList.kt
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package com.tangem.core.ui.utils
|
||||
|
||||
import androidx.compose.ui.semantics.SemanticsPropertyKey
|
||||
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
|
||||
|
||||
/**
|
||||
* Semantics key for storing and retrieving the visual position
|
||||
* of an item within a LazyList. Used to verify item ordering
|
||||
* and visibility in UI tests.
|
||||
*/
|
||||
val LazyListItemPositionSemantics = SemanticsPropertyKey<Int>("LazyListItemPosition")
|
||||
|
||||
/**
|
||||
* Provides access to the item position semantics property
|
||||
* through semantics property receiver DSL.
|
||||
*/
|
||||
var SemanticsPropertyReceiver.lazyListItemPosition by LazyListItemPositionSemantics
|
||||
|
||||
/**
|
||||
* Semantics key for storing the total length/count of items
|
||||
* in a LazyList. Enables validation of list completeness in tests.
|
||||
*/
|
||||
val LazyListLengthSemantics = SemanticsPropertyKey<Int>("LazyListLength")
|
||||
|
||||
/**
|
||||
* Provides access to the list length semantics property
|
||||
* through semantics property receiver DSL.
|
||||
*/
|
||||
var SemanticsPropertyReceiver.lazyListLength by LazyListLengthSemantics
|
||||
Loading…
Add table
Add a link
Reference in a new issue