refactor(creator-ranking): 배치 모델을 단순화한다

This commit is contained in:
2026-06-30 02:43:39 +09:00
parent 566f76df6a
commit aac09c14bc
5 changed files with 97 additions and 15 deletions

View File

@@ -1,17 +1,17 @@
package kr.co.vividnext.sodalive.v2.widget.creatorranking
data class CreatorRankingPlacement(
val variant: CreatorRankingCardVariant,
val viewType: CreatorRankingViewType,
val itemsPerRow: Int
) {
companion object {
fun fromRank(rank: Int): CreatorRankingPlacement {
require(rank >= 1) { "rank must be greater than or equal to 1." }
return when (rank) {
1 -> CreatorRankingPlacement(CreatorRankingCardVariant.Large, itemsPerRow = 1)
in 2..7 -> CreatorRankingPlacement(CreatorRankingCardVariant.Compact, itemsPerRow = 2)
in 8..10 -> CreatorRankingPlacement(CreatorRankingCardVariant.Compact, itemsPerRow = 3)
else -> CreatorRankingPlacement(CreatorRankingCardVariant.Horizontal, itemsPerRow = 1)
1 -> CreatorRankingPlacement(CreatorRankingViewType.TopTen, itemsPerRow = 1)
in 2..7 -> CreatorRankingPlacement(CreatorRankingViewType.TopTen, itemsPerRow = 2)
in 8..10 -> CreatorRankingPlacement(CreatorRankingViewType.TopTen, itemsPerRow = 3)
else -> CreatorRankingPlacement(CreatorRankingViewType.Lower, itemsPerRow = 1)
}
}
}

View File

@@ -0,0 +1,27 @@
package kr.co.vividnext.sodalive.v2.widget.creatorranking
data class CreatorRankingTextStyle(
val rankTextSizeSp: Int,
val nameTextSizeSp: Int,
val deltaTextSizeSp: Int
) {
companion object {
fun fromPlacement(placement: CreatorRankingPlacement): CreatorRankingTextStyle {
return when (placement.viewType) {
CreatorRankingViewType.TopTen -> when (placement.itemsPerRow) {
1 -> CreatorRankingTextStyle(rankTextSizeSp = 96, nameTextSizeSp = 32, deltaTextSizeSp = 16)
2 -> CreatorRankingTextStyle(rankTextSizeSp = 54, nameTextSizeSp = 22, deltaTextSizeSp = 16)
3 -> CreatorRankingTextStyle(rankTextSizeSp = 36, nameTextSizeSp = 14, deltaTextSizeSp = 14)
else -> error("Unsupported top-ten row size: ${placement.itemsPerRow}")
}
CreatorRankingViewType.Lower -> CreatorRankingTextStyle(
rankTextSizeSp = 40,
nameTextSizeSp = 18,
deltaTextSizeSp = 16
)
}
}
fun fromRank(rank: Int): CreatorRankingTextStyle = fromPlacement(CreatorRankingPlacement.fromRank(rank))
}
}

View File

@@ -0,0 +1,6 @@
package kr.co.vividnext.sodalive.v2.widget.creatorranking
enum class CreatorRankingViewType {
TopTen,
Lower
}

View File

@@ -6,45 +6,45 @@ import org.junit.Test
class CreatorRankingPlacementTest {
@Test
fun `rank 1 uses large variant and one item row`() {
fun `rank 1은 top ten view type과 1 item row를 사용한다`() {
val placement = CreatorRankingPlacement.fromRank(1)
assertEquals(CreatorRankingCardVariant.Large, placement.variant)
assertEquals(CreatorRankingViewType.TopTen, placement.viewType)
assertEquals(1, placement.itemsPerRow)
}
@Test
fun `rank 2 to 7 uses compact variant and two item row`() {
fun `rank 2부터 7은 top ten view type과 2 item row를 사용한다`() {
(2..7).forEach { rank ->
val placement = CreatorRankingPlacement.fromRank(rank)
assertEquals(CreatorRankingCardVariant.Compact, placement.variant)
assertEquals(CreatorRankingViewType.TopTen, placement.viewType)
assertEquals(2, placement.itemsPerRow)
}
}
@Test
fun `rank 8 to 10 uses compact variant and three item row`() {
fun `rank 8부터 10은 top ten view type과 3 item row를 사용한다`() {
(8..10).forEach { rank ->
val placement = CreatorRankingPlacement.fromRank(rank)
assertEquals(CreatorRankingCardVariant.Compact, placement.variant)
assertEquals(CreatorRankingViewType.TopTen, placement.viewType)
assertEquals(3, placement.itemsPerRow)
}
}
@Test
fun `rank 11 or greater uses horizontal variant and one item row`() {
listOf(11, 12, 100).forEach { rank ->
fun `rank 11부터 20과 20 초과는 lower view type과 1 item row를 사용한다`() {
listOf(11, 12, 20, 21, 100).forEach { rank ->
val placement = CreatorRankingPlacement.fromRank(rank)
assertEquals(CreatorRankingCardVariant.Horizontal, placement.variant)
assertEquals(CreatorRankingViewType.Lower, placement.viewType)
assertEquals(1, placement.itemsPerRow)
}
}
@Test(expected = IllegalArgumentException::class)
fun `rank less than 1 is invalid`() {
fun `rank 1 미만은 유효하지 않다`() {
CreatorRankingPlacement.fromRank(0)
}
}

View File

@@ -0,0 +1,49 @@
package kr.co.vividnext.sodalive.v2.widget.creatorranking
import org.junit.Assert.assertEquals
import org.junit.Test
class CreatorRankingTextStyleTest {
@Test
fun `top 1 item row는 가장 큰 rank name delta text size를 사용한다`() {
val style = CreatorRankingTextStyle.fromRank(1)
assertEquals(96, style.rankTextSizeSp)
assertEquals(32, style.nameTextSizeSp)
assertEquals(16, style.deltaTextSizeSp)
}
@Test
fun `top 2 item row는 중간 rank name delta text size를 사용한다`() {
listOf(2, 7).forEach { rank ->
val style = CreatorRankingTextStyle.fromRank(rank)
assertEquals(54, style.rankTextSizeSp)
assertEquals(22, style.nameTextSizeSp)
assertEquals(16, style.deltaTextSizeSp)
}
}
@Test
fun `top 3 item row는 작은 rank name delta text size를 사용한다`() {
listOf(8, 10).forEach { rank ->
val style = CreatorRankingTextStyle.fromRank(rank)
assertEquals(36, style.rankTextSizeSp)
assertEquals(14, style.nameTextSizeSp)
assertEquals(14, style.deltaTextSizeSp)
}
}
@Test
fun `lower row는 lower 전용 rank name과 기존 delta amount text size를 사용한다`() {
listOf(11, 20, 21).forEach { rank ->
val style = CreatorRankingTextStyle.fromRank(rank)
assertEquals(40, style.rankTextSizeSp)
assertEquals(18, style.nameTextSizeSp)
assertEquals(16, style.deltaTextSizeSp)
}
}
}