From 57beacaf3314d8b051a52eccc923488f0dcd2c8c Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Mon, 12 Aug 2019 12:15:35 +0200
Subject: [PATCH] Fixes crash cluster 2e777e9c

---
 viewmodel/build.gradle.kts                    |  4 +-
 .../quasseldroid/viewmodel/ChatViewModel.kt   | 18 ++++----
 .../viewmodel/ChatViewModelTest.kt            | 46 +++++++++++++++++++
 3 files changed, 59 insertions(+), 9 deletions(-)
 create mode 100644 viewmodel/src/test/java/de/kuschku/quasseldroid/viewmodel/ChatViewModelTest.kt

diff --git a/viewmodel/build.gradle.kts b/viewmodel/build.gradle.kts
index 2130a6a62..45aae2105 100644
--- a/viewmodel/build.gradle.kts
+++ b/viewmodel/build.gradle.kts
@@ -39,7 +39,7 @@ android {
 
   lintOptions {
     isWarningsAsErrors = true
-    setLintConfig(file("../lint.xml"))
+    lintConfig = file("../lint.xml")
   }
 }
 
@@ -65,4 +65,6 @@ dependencies {
   implementation(project(":lib")) {
     exclude(group = "org.threeten", module = "threetenbp")
   }
+
+  testImplementation("junit", "junit", "4.12")
 }
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/ChatViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/ChatViewModel.kt
index 2e182483a..d2d70291a 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/ChatViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/ChatViewModel.kt
@@ -150,14 +150,12 @@ open class ChatViewModel : QuasselViewModel() {
     )
   }
 
-  private fun recentMessagesChange(value: Int) {
-    val current = recentlySentMessageIndex.safeValue
-    val size = recentlySentMessages.safeValue.size
-    val nextValue = current + value
-    recentlySentMessageIndex.onNext(
-      if (nextValue < 0) -1
-      else (size + current + value) % size
-    )
+  private fun recentMessagesChange(change: Int) {
+    recentlySentMessageIndex.onNext(recentMessagesChangeInternal(
+      recentlySentMessageIndex.safeValue,
+      recentlySentMessages.safeValue.size,
+      change
+    ))
   }
 
   fun recentMessagesValue() =
@@ -197,5 +195,9 @@ open class ChatViewModel : QuasselViewModel() {
     const val KEY_SELECTED_BUFFER_ID = "model_chat_selectedBufferId"
 
     const val MAX_RECENT_MESSAGES = 20
+
+    fun recentMessagesChangeInternal(current: Int, size: Int, change: Int) =
+      if (current + change < 0 || size == 0) -1
+      else (size + current + change) % size
   }
 }
diff --git a/viewmodel/src/test/java/de/kuschku/quasseldroid/viewmodel/ChatViewModelTest.kt b/viewmodel/src/test/java/de/kuschku/quasseldroid/viewmodel/ChatViewModelTest.kt
new file mode 100644
index 000000000..92791cae3
--- /dev/null
+++ b/viewmodel/src/test/java/de/kuschku/quasseldroid/viewmodel/ChatViewModelTest.kt
@@ -0,0 +1,46 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2019 Janne Mareike Koschinski
+ * Copyright (c) 2019 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.quasseldroid.viewmodel
+
+import de.kuschku.quasseldroid.viewmodel.ChatViewModel.Companion.recentMessagesChangeInternal
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class ChatViewModelTest {
+  @Test
+  fun testRecentMessagesChange() {
+    assertEquals(recentMessagesChangeInternal(0, 0, -1), -1)
+    assertEquals(recentMessagesChangeInternal(0, 0, +1), -1)
+    assertEquals(recentMessagesChangeInternal(-1, 0, -1), -1)
+    assertEquals(recentMessagesChangeInternal(-1, 0, +1), -1)
+    assertEquals(recentMessagesChangeInternal(1, 0, -1), -1)
+    assertEquals(recentMessagesChangeInternal(1, 0, +1), -1)
+
+
+    assertEquals(recentMessagesChangeInternal(0, 5, -1), -1)
+    assertEquals(recentMessagesChangeInternal(0, 5, +1), 1)
+
+    assertEquals(recentMessagesChangeInternal(1, 5, -1), 0)
+    assertEquals(recentMessagesChangeInternal(1, 5, +1), 2)
+
+    assertEquals(recentMessagesChangeInternal(4, 5, -1), 3)
+    assertEquals(recentMessagesChangeInternal(4, 5, +1), 0)
+  }
+}
-- 
GitLab