KTB-10 Протестировать функционал и пофиксить баги¶
📝 Описание¶
Ознакомься с видео о тестировании и багфиксах.
// видео
🗒 Задание¶
- Провести тестирование приложения.
- Исправить найденные баги.
❌ Ошибки¶
- не фиксят по видео баг, когда невыученных слов осталось меньше 4
- не выносят магические числа в константы
✏️ Комментарии¶
Давай дополнять список уже выученными словами, если невыученных слов осталось мало (меньше `NUMBER_OF_ANSWERS`).
Передаваемые в конструктор параметры `learnedAnswerCount` и `countOfQuestionWords`, а именно магические числа, стоит вынести в константы.
`APPROVED_LEARN_WORDS` давай теперь сделаем полем класса `LearnWordsTrainer`, тогда можно передавать эти значения в конструктор `LearnWordsTrainer`, а в будущем можно было бы брать их из конфиг-файла, и менять без перекомпиляции приложения.
Вопрос должен формироваться в `LearnWordsTrainer`. Посмотри еще раз видео про рефакторинг, там эта тема поднимается.
⌨️ Решение¶
Index: src/main/kotlin/LearnWordsTrainer.kt
val correctAnswer: Word,
)
-class LearnWordsTrainer {
+class LearnWordsTrainer(private val learnedAnswerCount: Int, private val countOfQuestionWords: Int) {
private var question: Question? = null
private val dictionary = loadDictionary()
fun getStatistics(): Statistics {
val totalCount = dictionary.size
- val learnedCount = dictionary.filter { it.correctAnswersCount >= 3 }.size
+ val learnedCount = dictionary.filter { it.correctAnswersCount >= learnedAnswerCount }.size
val percent = learnedCount * 100 / totalCount
return Statistics(totalCount, learnedCount, percent)
}
fun getNextQuestion(): Question? {
- val notLearnedList = dictionary.filter { it.correctAnswersCount < 3 }
+ val notLearnedList = dictionary.filter { it.correctAnswersCount < learnedAnswerCount }
if (notLearnedList.isEmpty()) return null
- val questionWords = notLearnedList.shuffled().take(4)
+
+ // RA-10 bug fix
+ val questionWords = if (notLearnedList.size < countOfQuestionWords) {
+ val learnedList = dictionary.filter { it.correctAnswersCount >= learnedAnswerCount }.shuffled()
+ notLearnedList.shuffled()
+ .take(countOfQuestionWords) + learnedList
+ .take(countOfQuestionWords - notLearnedList.size)
+ } else {
+ notLearnedList.shuffled().take(countOfQuestionWords)
+ }.shuffled()
+
+ /* Перенесено выше в RA-10
+ val questionWords = notLearnedList.shuffled().take(countOfQuestionWords)
+ */
+
val correctAnswer = questionWords.random()
question = Question(
variants = questionWords,
@@ -64,7 +78,7 @@
dictionary.add(word)
}
return dictionary
- } catch (e: Exception) {
+ } catch (e: IndexOutOfBoundsException) {
throw IllegalStateException("Некорректный файл: $e")
}
}
Index: src/main/kotlin/Main.kt
fun main() {
- val trainer = LearnWordsTrainer()
+ val trainer = try {
+ LearnWordsTrainer(3, 4)
+ } catch (e: Exception) {
+ println("Невозможно загрузить словарь")
+ return
+ }
while (true) {
println(
@@ -38,7 +43,7 @@
*/
if (question == null) { // if (notLearnedList.isEmpty()) {
println("Все слова в словаре выучены")
- continue
+ break
} else {
/* Перенесено в RA-09 в getNextQuestion()