diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c647f36d..980ce52e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import org.gradle.kotlin.dsl.testRuntimeOnly + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) @@ -51,6 +53,13 @@ android { buildFeatures { viewBinding = true } + + testOptions { + unitTests.all { + it.useJUnitPlatform() + } + } + } dependencies { @@ -81,7 +90,11 @@ dependencies { implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) - testImplementation(libs.junit) + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter-api") + testImplementation("org.junit.jupiter:junit-jupiter-params") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") + testImplementation("org.assertj:assertj-core:3.27.6") androidTestImplementation(libs.androidx.junit) androidTestImplementation("org.assertj:assertj-core:3.27.6") androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/com/example/egobook_frontent/ui/home/HomeFragment.kt b/app/src/main/java/com/example/egobook_frontent/ui/home/HomeFragment.kt index 1e148582..3c4d9e8f 100644 --- a/app/src/main/java/com/example/egobook_frontent/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/example/egobook_frontent/ui/home/HomeFragment.kt @@ -1,7 +1,52 @@ package com.example.egobook_frontent.ui.home +import android.os.Bundle + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.example.egobook_frontent.R +import com.example.egobook_frontent.databinding.FragmentHomeBinding +import kotlinx.coroutines.launch -class HomeFragment : Fragment(R.layout.fragment_home) { +class HomeFragment : Fragment() { + private lateinit var binding: FragmentHomeBinding + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentHomeBinding.inflate(inflater) + return binding.root + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val viewModel: HomeViewModel by viewModels() + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.uiState.collect { userState -> + binding.tvLevel.text = "Lv ${userState.level.number}" + binding.ivLevelType.setImageResource(userState.level.type.getResId()) + binding.tvInk.text = "${userState.ink.value}" + } + } + } + } + private fun LevelType.getResId(): Int { + return when(this) { + LevelType.ONE -> R.drawable.level_type_1 + LevelType.TWO -> R.drawable.level_type_2 + LevelType.THREE -> R.drawable.level_type_3 + LevelType.FOUR -> R.drawable.level_type_4 + LevelType.FIVE -> R.drawable.level_type_5 + LevelType.SIX -> R.drawable.level_type_6 + LevelType.SEVEN -> R.drawable.level_type_7 + LevelType.EIGHT -> R.drawable.level_type_8 + } + } } diff --git a/app/src/main/java/com/example/egobook_frontent/ui/home/HomeViewModel.kt b/app/src/main/java/com/example/egobook_frontent/ui/home/HomeViewModel.kt new file mode 100644 index 00000000..00b08706 --- /dev/null +++ b/app/src/main/java/com/example/egobook_frontent/ui/home/HomeViewModel.kt @@ -0,0 +1,13 @@ +package com.example.egobook_frontent.ui.home + +import android.R.attr.level +import androidx.lifecycle.ViewModel +import com.example.egobook_frontent.R +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class HomeViewModel: ViewModel() { + private val _uiState = MutableStateFlow(UserState(Level(1), Ink(9999))) + val uiState: StateFlow = _uiState.asStateFlow() +} diff --git a/app/src/main/java/com/example/egobook_frontent/ui/home/Ink.kt b/app/src/main/java/com/example/egobook_frontent/ui/home/Ink.kt new file mode 100644 index 00000000..ae7552b1 --- /dev/null +++ b/app/src/main/java/com/example/egobook_frontent/ui/home/Ink.kt @@ -0,0 +1,11 @@ +package com.example.egobook_frontent.ui.home + +data class Ink(val value: Int) { + init { + check(value >= MINIMUM_INK) { "잉크는 음수가 될 수 없습니다." } + } + + companion object { + const val MINIMUM_INK = 0 + } +} diff --git a/app/src/main/java/com/example/egobook_frontent/ui/home/Level.kt b/app/src/main/java/com/example/egobook_frontent/ui/home/Level.kt new file mode 100644 index 00000000..00e8f852 --- /dev/null +++ b/app/src/main/java/com/example/egobook_frontent/ui/home/Level.kt @@ -0,0 +1,12 @@ +package com.example.egobook_frontent.ui.home + +data class Level(val number: Int) { + val type: LevelType = LevelType.of(number) + init { + check(number in MINIMUM_LEVEL..MAXIMUM_LEVEL) { "올바른 레벨 범위가 아닙니다." } + } + companion object { + const val MAXIMUM_LEVEL = 1500 + const val MINIMUM_LEVEL = 0 + } +} diff --git a/app/src/main/java/com/example/egobook_frontent/ui/home/LevelType.kt b/app/src/main/java/com/example/egobook_frontent/ui/home/LevelType.kt new file mode 100644 index 00000000..2ca424e9 --- /dev/null +++ b/app/src/main/java/com/example/egobook_frontent/ui/home/LevelType.kt @@ -0,0 +1,18 @@ +package com.example.egobook_frontent.ui.home + +enum class LevelType(val range: IntRange) { + ONE(0..99), + TWO(100..299), + THREE(300..499), + FOUR(500..699), + FIVE(700..999), + SIX(1000..1299), + SEVEN(1300..1499), + EIGHT(1500..1500); + + companion object { + fun of(number: Int): LevelType = checkNotNull(entries.find { number in it.range }) { + "잘못된 레벨 값입니다." + } + } +} diff --git a/app/src/main/java/com/example/egobook_frontent/ui/home/UserState.kt b/app/src/main/java/com/example/egobook_frontent/ui/home/UserState.kt new file mode 100644 index 00000000..4c459194 --- /dev/null +++ b/app/src/main/java/com/example/egobook_frontent/ui/home/UserState.kt @@ -0,0 +1,3 @@ +package com.example.egobook_frontent.ui.home + +data class UserState(val level: Level, val ink: Ink) diff --git a/app/src/main/res/drawable/level_type_2.png b/app/src/main/res/drawable/level_type_2.png new file mode 100644 index 00000000..8b34de39 Binary files /dev/null and b/app/src/main/res/drawable/level_type_2.png differ diff --git a/app/src/main/res/drawable/level_type_3.png b/app/src/main/res/drawable/level_type_3.png new file mode 100644 index 00000000..44acfe23 Binary files /dev/null and b/app/src/main/res/drawable/level_type_3.png differ diff --git a/app/src/main/res/drawable/level_type_4.png b/app/src/main/res/drawable/level_type_4.png new file mode 100644 index 00000000..ae09a6a5 Binary files /dev/null and b/app/src/main/res/drawable/level_type_4.png differ diff --git a/app/src/main/res/drawable/level_type_5.png b/app/src/main/res/drawable/level_type_5.png new file mode 100644 index 00000000..a4d70f28 Binary files /dev/null and b/app/src/main/res/drawable/level_type_5.png differ diff --git a/app/src/main/res/drawable/level_type_6.png b/app/src/main/res/drawable/level_type_6.png new file mode 100644 index 00000000..4ab554fe Binary files /dev/null and b/app/src/main/res/drawable/level_type_6.png differ diff --git a/app/src/main/res/drawable/level_type_7.png b/app/src/main/res/drawable/level_type_7.png new file mode 100644 index 00000000..d02461f6 Binary files /dev/null and b/app/src/main/res/drawable/level_type_7.png differ diff --git a/app/src/main/res/drawable/level_type_8.png b/app/src/main/res/drawable/level_type_8.png new file mode 100644 index 00000000..c69f4fb5 Binary files /dev/null and b/app/src/main/res/drawable/level_type_8.png differ diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8c4293e8..37c40040 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -48,6 +48,7 @@ android:src="@drawable/ink_icon" /> { + return listOf( + Arguments.of(Level(1), LevelType.ONE), + Arguments.of(Level(99), LevelType.ONE), + Arguments.of(Level(100), LevelType.TWO), + Arguments.of(Level(299), LevelType.TWO), + Arguments.of(Level(300), LevelType.THREE), + Arguments.of(Level(499), LevelType.THREE), + Arguments.of(Level(500), LevelType.FOUR), + Arguments.of(Level(699), LevelType.FOUR), + Arguments.of(Level(700), LevelType.FIVE), + Arguments.of(Level(999), LevelType.FIVE), + Arguments.of(Level(1000), LevelType.SIX), + Arguments.of(Level(1299), LevelType.SIX), + Arguments.of(Level(1300), LevelType.SEVEN), + Arguments.of(Level(1499), LevelType.SEVEN), + Arguments.of(Level(1500), LevelType.EIGHT), + ) + } + } +}