Updated on 2026-08-14
This commit is contained in:
parent
3baed1e815
commit
5e3da8cc47
3 changed files with 267 additions and 0 deletions
79
core/ui/src/main/res/drawable/ic_yield_40.xml
Normal file
79
core/ui/src/main/res/drawable/ic_yield_40.xml
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="40dp"
|
||||
android:height="40dp"
|
||||
android:viewportWidth="40"
|
||||
android:viewportHeight="40">
|
||||
<path
|
||||
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
|
||||
android:fillColor="#27B456"/>
|
||||
<path
|
||||
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
|
||||
android:fillAlpha="0.2">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="31"
|
||||
android:startY="9"
|
||||
android:endX="31"
|
||||
android:endY="30.499"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#00FFFFFF"/>
|
||||
<item android:offset="1" android:color="#FFFFFFFF"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:strokeWidth="1"
|
||||
android:pathData="M31,9.5C32.381,9.5 33.5,10.619 33.5,12V31C33.5,32.381 32.381,33.5 31,33.5C29.619,33.5 28.5,32.381 28.5,31V12C28.5,10.619 29.619,9.5 31,9.5Z"
|
||||
android:strokeAlpha="0.15"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
|
||||
android:fillColor="#27B456"/>
|
||||
<path
|
||||
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
|
||||
android:fillAlpha="0.2">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="20"
|
||||
android:startY="16"
|
||||
android:endX="20"
|
||||
android:endY="31.48"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#00FFFFFF"/>
|
||||
<item android:offset="1" android:color="#FFFFFFFF"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:strokeWidth="1"
|
||||
android:pathData="M20,16.5C21.381,16.5 22.5,17.619 22.5,19V31C22.5,32.381 21.381,33.5 20,33.5C18.619,33.5 17.5,32.381 17.5,31V19C17.5,17.619 18.619,16.5 20,16.5Z"
|
||||
android:strokeAlpha="0.15"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
|
||||
android:fillColor="#27B456"/>
|
||||
<path
|
||||
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
|
||||
android:fillAlpha="0.2">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="9"
|
||||
android:startY="22"
|
||||
android:endX="9"
|
||||
android:endY="32.32"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#00FFFFFF"/>
|
||||
<item android:offset="1" android:color="#FFFFFFFF"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:strokeWidth="1"
|
||||
android:pathData="M9,22.5C10.381,22.5 11.5,23.619 11.5,25V31C11.5,32.381 10.381,33.5 9,33.5C7.619,33.5 6.5,32.381 6.5,31V25C6.5,23.619 7.619,22.5 9,22.5Z"
|
||||
android:strokeAlpha="0.15"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#ffffff"/>
|
||||
</vector>
|
||||
64
core/ui/src/main/res/drawable/ic_yield_disabling_40.xml
Normal file
64
core/ui/src/main/res/drawable/ic_yield_disabling_40.xml
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="40dp"
|
||||
android:height="40dp"
|
||||
android:viewportWidth="40"
|
||||
android:viewportHeight="40">
|
||||
<path
|
||||
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
|
||||
android:fillColor="#454545"
|
||||
android:fillAlpha="0.2"/>
|
||||
<path
|
||||
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
|
||||
android:fillAlpha="0.2">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="31"
|
||||
android:startY="-3.608"
|
||||
android:endX="31"
|
||||
android:endY="44.868"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#00FFFFFF"/>
|
||||
<item android:offset="1" android:color="#FFFFFFFF"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
|
||||
android:fillColor="#454545"
|
||||
android:fillAlpha="0.2"/>
|
||||
<path
|
||||
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
|
||||
android:fillAlpha="0.2">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="20"
|
||||
android:startY="6.922"
|
||||
android:endX="20"
|
||||
android:endY="41.825"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#00FFFFFF"/>
|
||||
<item android:offset="1" android:color="#FFFFFFFF"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
|
||||
android:fillColor="#454545"
|
||||
android:fillAlpha="0.2"/>
|
||||
<path
|
||||
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
|
||||
android:fillAlpha="0.2">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="9"
|
||||
android:startY="15.948"
|
||||
android:endX="9"
|
||||
android:endY="39.217"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#00FFFFFF"/>
|
||||
<item android:offset="1" android:color="#FFFFFFFF"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
package com.tangem.features.yield.supply.impl.main.model.converter
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import com.tangem.common.ui.earn.EarnBlockUM
|
||||
import com.tangem.core.ui.extensions.stringReference
|
||||
import com.tangem.features.yield.supply.impl.main.entity.YieldSupplyUM
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
internal class YieldSupplyToEarnBlockConverterTest {
|
||||
|
||||
private val converter = YieldSupplyToEarnBlockConverter()
|
||||
|
||||
@Test
|
||||
fun `GIVEN Initial WHEN convert THEN null`() {
|
||||
val result = converter.convert(YieldSupplyUM.Initial)
|
||||
|
||||
assertThat(result).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN Unavailable WHEN convert THEN null`() {
|
||||
val result = converter.convert(YieldSupplyUM.Unavailable)
|
||||
|
||||
assertThat(result).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN Loading WHEN convert THEN EarnBlockUM Loading`() {
|
||||
val result = converter.convert(YieldSupplyUM.Loading)
|
||||
|
||||
assertThat(result).isEqualTo(EarnBlockUM.Loading)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN Content WHEN convert THEN Content`() {
|
||||
var clicked = false
|
||||
val content = YieldSupplyUM.Content(
|
||||
apy = "5.1",
|
||||
title = stringReference("Yield Mode"),
|
||||
subtitle = stringReference("Interest accrues automatically"),
|
||||
rewardsApy = stringReference("APY 5.1%"),
|
||||
onClick = { clicked = true },
|
||||
showWarningIcon = false,
|
||||
showInfoIcon = false,
|
||||
)
|
||||
|
||||
val result = converter.convert(content)
|
||||
|
||||
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
|
||||
val earnBlock = result as EarnBlockUM.Content
|
||||
assertThat(earnBlock.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
|
||||
assertThat(earnBlock.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.Surface)
|
||||
assertThat(earnBlock.iconUM).isInstanceOf(EarnBlockUM.IconUM.Glowing::class.java)
|
||||
assertThat(earnBlock.titleUM.tone).isEqualTo(EarnBlockUM.TitleUM.Tone.Primary)
|
||||
assertThat((earnBlock.subtitleUM as EarnBlockUM.SubtitleUM.Text).tone)
|
||||
.isEqualTo(EarnBlockUM.SubtitleUM.Tone.Accent)
|
||||
assertThat(earnBlock.trailingUM).isInstanceOf(EarnBlockUM.TrailingUM.Button::class.java)
|
||||
val button = earnBlock.trailingUM as EarnBlockUM.TrailingUM.Button
|
||||
assertThat(button.isEnabled).isTrue()
|
||||
assertThat(earnBlock.onClick).isNotNull()
|
||||
earnBlock.onClick?.invoke()
|
||||
assertThat(clicked).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN Processing Enter WHEN convert THEN Surface Content`() {
|
||||
val result = converter.convert(YieldSupplyUM.Processing.Enter)
|
||||
|
||||
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
|
||||
val earnBlock = result as EarnBlockUM.Content
|
||||
assertThat(earnBlock.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
|
||||
assertThat(earnBlock.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.Surface)
|
||||
assertThat(earnBlock.iconUM).isInstanceOf(EarnBlockUM.IconUM.Glowing::class.java)
|
||||
assertThat(earnBlock.trailingUM).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN Processing Exit WHEN convert THEN Surface Content`() {
|
||||
val result = converter.convert(YieldSupplyUM.Processing.Exit)
|
||||
|
||||
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
|
||||
val earnBlock = result as EarnBlockUM.Content
|
||||
assertThat(earnBlock.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
|
||||
assertThat(earnBlock.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.Surface)
|
||||
assertThat(earnBlock.iconUM).isInstanceOf(EarnBlockUM.IconUM.Plain::class.java)
|
||||
assertThat(earnBlock.trailingUM).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN Available WHEN convert THEN Content with expected structure`() {
|
||||
var clicked = false
|
||||
val available = YieldSupplyUM.Available(
|
||||
apy = "5.1",
|
||||
apyText = stringReference("5.1 % APY"),
|
||||
title = stringReference("Yield Mode"),
|
||||
onClick = { clicked = true },
|
||||
)
|
||||
|
||||
val result = converter.convert(available)
|
||||
|
||||
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
|
||||
val content = result as EarnBlockUM.Content
|
||||
|
||||
assertThat(content.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
|
||||
assertThat(content.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.AccentSoft)
|
||||
assertThat(content.iconUM).isInstanceOf(EarnBlockUM.IconUM.Glowing::class.java)
|
||||
|
||||
assertThat(content.titleUM.style).isEqualTo(EarnBlockUM.TitleUM.Style.Large)
|
||||
assertThat(content.titleUM.tone).isEqualTo(EarnBlockUM.TitleUM.Tone.Primary)
|
||||
|
||||
assertThat(content.subtitleUM).isInstanceOf(EarnBlockUM.SubtitleUM.Text::class.java)
|
||||
val subtitle = content.subtitleUM as EarnBlockUM.SubtitleUM.Text
|
||||
assertThat(subtitle.style).isEqualTo(EarnBlockUM.SubtitleUM.Style.Small)
|
||||
assertThat(subtitle.tone).isEqualTo(EarnBlockUM.SubtitleUM.Tone.Accent)
|
||||
|
||||
assertThat(content.trailingUM).isInstanceOf(EarnBlockUM.TrailingUM.Button::class.java)
|
||||
val button = content.trailingUM as EarnBlockUM.TrailingUM.Button
|
||||
assertThat(button.isEnabled).isTrue()
|
||||
|
||||
assertThat(content.onClick).isNotNull()
|
||||
content.onClick?.invoke()
|
||||
assertThat(clicked).isTrue()
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue