feat(feed): 피드 크기 계산 계약을 추가한다
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
package kr.co.vividnext.sodalive.v2.widget.feed
|
||||||
|
|
||||||
|
data class FeedContentImageSize(
|
||||||
|
val widthDp: Int,
|
||||||
|
val heightDp: Int
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
fun from(widthDp: Int, category: FeedContentCategory): FeedContentImageSize {
|
||||||
|
require(widthDp > 0) { "widthDp must be greater than 0." }
|
||||||
|
val height = (widthDp * category.ratioHeight.toFloat() / category.ratioWidth).toInt()
|
||||||
|
return FeedContentImageSize(widthDp = widthDp, heightDp = height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package kr.co.vividnext.sodalive.v2.widget.feed
|
||||||
|
|
||||||
|
data class FeedSize(
|
||||||
|
val rootWidthDp: Int
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
private const val FIGMA_ROOT_WIDTH_DP = 374
|
||||||
|
|
||||||
|
fun from(
|
||||||
|
variant: FeedVariant,
|
||||||
|
widthMode: FeedWidthMode,
|
||||||
|
parentAvailableWidthDp: Int,
|
||||||
|
horizontalItemDecorationDp: Int = 0
|
||||||
|
): FeedSize {
|
||||||
|
val width = when (widthMode) {
|
||||||
|
FeedWidthMode.FigmaFixed -> FIGMA_ROOT_WIDTH_DP
|
||||||
|
FeedWidthMode.ParentAvailable -> {
|
||||||
|
require(parentAvailableWidthDp > 0) { "parentAvailableWidthDp must be greater than 0." }
|
||||||
|
require(horizontalItemDecorationDp >= 0) { "horizontalItemDecorationDp must be 0 or greater." }
|
||||||
|
parentAvailableWidthDp - horizontalItemDecorationDp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require(width > 0) { "rootWidthDp must be greater than 0." }
|
||||||
|
return FeedSize(rootWidthDp = width)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package kr.co.vividnext.sodalive.v2.widget.feed
|
||||||
|
|
||||||
|
enum class FeedWidthMode {
|
||||||
|
FigmaFixed,
|
||||||
|
ParentAvailable
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package kr.co.vividnext.sodalive.v2.widget.feed
|
||||||
|
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import kr.co.vividnext.sodalive.R
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class FeedContentImageSizeTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `content category keeps one to one ratio`() {
|
||||||
|
val size = FeedContentImageSize.from(widthDp = 163, category = FeedContentCategory.Content)
|
||||||
|
|
||||||
|
assertEquals(163, size.widthDp)
|
||||||
|
assertEquals(163, size.heightDp)
|
||||||
|
assertEquals(R.string.feed_content_category_content, FeedContentCategory.Content.labelResId)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `series category keeps configured width and uses 163 by 230 ratio`() {
|
||||||
|
val size = FeedContentImageSize.from(widthDp = 163, category = FeedContentCategory.Series)
|
||||||
|
|
||||||
|
assertEquals(163, size.widthDp)
|
||||||
|
assertEquals(230, size.heightDp)
|
||||||
|
assertEquals(R.string.feed_content_category_series, FeedContentCategory.Series.labelResId)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `magazine category keeps configured width and uses 163 by 218 ratio`() {
|
||||||
|
val size = FeedContentImageSize.from(widthDp = 163, category = FeedContentCategory.Magazine)
|
||||||
|
|
||||||
|
assertEquals(163, size.widthDp)
|
||||||
|
assertEquals(218, size.heightDp)
|
||||||
|
assertEquals(R.string.feed_content_category_magazine, FeedContentCategory.Magazine.labelResId)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException::class)
|
||||||
|
fun `image width must be positive`() {
|
||||||
|
FeedContentImageSize.from(widthDp = 0, category = FeedContentCategory.Content)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package kr.co.vividnext.sodalive.v2.widget.feed
|
||||||
|
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class FeedSizeTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `horizontal scroll uses figma width`() {
|
||||||
|
val size = FeedSize.from(
|
||||||
|
variant = FeedVariant.Rank,
|
||||||
|
widthMode = FeedWidthMode.FigmaFixed,
|
||||||
|
parentAvailableWidthDp = 320
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(374, size.rootWidthDp)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `multi item row uses figma width`() {
|
||||||
|
val size = FeedSize.from(
|
||||||
|
variant = FeedVariant.Content,
|
||||||
|
widthMode = FeedWidthMode.FigmaFixed,
|
||||||
|
parentAvailableWidthDp = 720
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(374, size.rootWidthDp)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `single item row uses parent available width`() {
|
||||||
|
val size = FeedSize.from(
|
||||||
|
variant = FeedVariant.Live,
|
||||||
|
widthMode = FeedWidthMode.ParentAvailable,
|
||||||
|
parentAvailableWidthDp = 328
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(328, size.rootWidthDp)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `single item row subtracts horizontal item decoration from parent available width`() {
|
||||||
|
val size = FeedSize.from(
|
||||||
|
variant = FeedVariant.Live,
|
||||||
|
widthMode = FeedWidthMode.ParentAvailable,
|
||||||
|
parentAvailableWidthDp = 328,
|
||||||
|
horizontalItemDecorationDp = 24
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(304, size.rootWidthDp)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException::class)
|
||||||
|
fun `parent available width must be positive for parent available mode`() {
|
||||||
|
FeedSize.from(
|
||||||
|
variant = FeedVariant.Community,
|
||||||
|
widthMode = FeedWidthMode.ParentAvailable,
|
||||||
|
parentAvailableWidthDp = 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user