refactor(creator-ranking): 배치 모델을 단순화한다
This commit is contained in:
@@ -1,17 +1,17 @@
|
|||||||
package kr.co.vividnext.sodalive.v2.widget.creatorranking
|
package kr.co.vividnext.sodalive.v2.widget.creatorranking
|
||||||
|
|
||||||
data class CreatorRankingPlacement(
|
data class CreatorRankingPlacement(
|
||||||
val variant: CreatorRankingCardVariant,
|
val viewType: CreatorRankingViewType,
|
||||||
val itemsPerRow: Int
|
val itemsPerRow: Int
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
fun fromRank(rank: Int): CreatorRankingPlacement {
|
fun fromRank(rank: Int): CreatorRankingPlacement {
|
||||||
require(rank >= 1) { "rank must be greater than or equal to 1." }
|
require(rank >= 1) { "rank must be greater than or equal to 1." }
|
||||||
return when (rank) {
|
return when (rank) {
|
||||||
1 -> CreatorRankingPlacement(CreatorRankingCardVariant.Large, itemsPerRow = 1)
|
1 -> CreatorRankingPlacement(CreatorRankingViewType.TopTen, itemsPerRow = 1)
|
||||||
in 2..7 -> CreatorRankingPlacement(CreatorRankingCardVariant.Compact, itemsPerRow = 2)
|
in 2..7 -> CreatorRankingPlacement(CreatorRankingViewType.TopTen, itemsPerRow = 2)
|
||||||
in 8..10 -> CreatorRankingPlacement(CreatorRankingCardVariant.Compact, itemsPerRow = 3)
|
in 8..10 -> CreatorRankingPlacement(CreatorRankingViewType.TopTen, itemsPerRow = 3)
|
||||||
else -> CreatorRankingPlacement(CreatorRankingCardVariant.Horizontal, itemsPerRow = 1)
|
else -> CreatorRankingPlacement(CreatorRankingViewType.Lower, itemsPerRow = 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package kr.co.vividnext.sodalive.v2.widget.creatorranking
|
||||||
|
|
||||||
|
enum class CreatorRankingViewType {
|
||||||
|
TopTen,
|
||||||
|
Lower
|
||||||
|
}
|
||||||
@@ -6,45 +6,45 @@ import org.junit.Test
|
|||||||
class CreatorRankingPlacementTest {
|
class CreatorRankingPlacementTest {
|
||||||
|
|
||||||
@Test
|
@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)
|
val placement = CreatorRankingPlacement.fromRank(1)
|
||||||
|
|
||||||
assertEquals(CreatorRankingCardVariant.Large, placement.variant)
|
assertEquals(CreatorRankingViewType.TopTen, placement.viewType)
|
||||||
assertEquals(1, placement.itemsPerRow)
|
assertEquals(1, placement.itemsPerRow)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@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 ->
|
(2..7).forEach { rank ->
|
||||||
val placement = CreatorRankingPlacement.fromRank(rank)
|
val placement = CreatorRankingPlacement.fromRank(rank)
|
||||||
|
|
||||||
assertEquals(CreatorRankingCardVariant.Compact, placement.variant)
|
assertEquals(CreatorRankingViewType.TopTen, placement.viewType)
|
||||||
assertEquals(2, placement.itemsPerRow)
|
assertEquals(2, placement.itemsPerRow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@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 ->
|
(8..10).forEach { rank ->
|
||||||
val placement = CreatorRankingPlacement.fromRank(rank)
|
val placement = CreatorRankingPlacement.fromRank(rank)
|
||||||
|
|
||||||
assertEquals(CreatorRankingCardVariant.Compact, placement.variant)
|
assertEquals(CreatorRankingViewType.TopTen, placement.viewType)
|
||||||
assertEquals(3, placement.itemsPerRow)
|
assertEquals(3, placement.itemsPerRow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `rank 11 or greater uses horizontal variant and one item row`() {
|
fun `rank 11부터 20과 20 초과는 lower view type과 1 item row를 사용한다`() {
|
||||||
listOf(11, 12, 100).forEach { rank ->
|
listOf(11, 12, 20, 21, 100).forEach { rank ->
|
||||||
val placement = CreatorRankingPlacement.fromRank(rank)
|
val placement = CreatorRankingPlacement.fromRank(rank)
|
||||||
|
|
||||||
assertEquals(CreatorRankingCardVariant.Horizontal, placement.variant)
|
assertEquals(CreatorRankingViewType.Lower, placement.viewType)
|
||||||
assertEquals(1, placement.itemsPerRow)
|
assertEquals(1, placement.itemsPerRow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException::class)
|
@Test(expected = IllegalArgumentException::class)
|
||||||
fun `rank less than 1 is invalid`() {
|
fun `rank 1 미만은 유효하지 않다`() {
|
||||||
CreatorRankingPlacement.fromRank(0)
|
CreatorRankingPlacement.fromRank(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user