From 2565788d62de5ae98f251b472298a7d3fddeca3d Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 14 Dec 2018 11:12:06 +0100
Subject: [PATCH] Fixes and unifies implementation of HostmaskHelper

---
 .../libquassel/util/irc/HostmaskHelper.kt     |  18 ++-
 .../libquassel/util/irc/HostmaskHelperTest.kt | 119 ++++++++++++++++--
 2 files changed, 113 insertions(+), 24 deletions(-)

diff --git a/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt
index c4fff7431..f4156afa7 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt
@@ -21,27 +21,23 @@ package de.kuschku.libquassel.util.irc
 
 object HostmaskHelper {
   fun nick(mask: String) = mask
-    .substringBefore('!', missingDelimiterValue = mask)
+    .substringBeforeLast('@')
+    .substringBefore('!')
 
   fun user(mask: String) = mask
-    .substringBeforeLast('@', missingDelimiterValue = mask)
+    .substringBeforeLast('@')
     .substringAfter('!', missingDelimiterValue = "")
 
   fun host(mask: String) = mask
     .substringAfterLast('@', missingDelimiterValue = "")
 
   fun split(mask: String): Triple<String, String, String> {
-    val userPartHostSplit = mask.split("@", limit = 2)
-    if (userPartHostSplit.size < 2)
-      return Triple(mask, "", "")
+    val userPart = mask.substringBeforeLast('@')
+    val host = mask.substringAfterLast('@', missingDelimiterValue = "")
 
-    val (userPart, host) = userPartHostSplit
+    val user = userPart.substringAfter('!', missingDelimiterValue = "")
+    val nick = userPart.substringBefore('!')
 
-    val nickUserSplit = userPart.split('!', limit = 2)
-    if (nickUserSplit.size < 2)
-      return Triple(mask, "", host)
-
-    val (nick, user) = nickUserSplit
     return Triple(nick, user, host)
   }
 }
diff --git a/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt b/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt
index 51c406e0b..e227b110a 100644
--- a/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt
@@ -6,34 +6,127 @@ import org.junit.Test
 class HostmaskHelperTest {
   @Test
   fun testNormal() {
-    assertEquals("justJanne", HostmaskHelper.nick("justJanne!kuschku@lithium.kuschku.de"))
-    assertEquals("kuschku", HostmaskHelper.user("justJanne!kuschku@lithium.kuschku.de"))
-    assertEquals("lithium.kuschku.de", HostmaskHelper.host("justJanne!kuschku@lithium.kuschku.de"))
+    assertEquals("justJanne",
+                 HostmaskHelper.nick("justJanne!kuschku@lithium.kuschku.de"))
+    assertEquals("justJanne",
+                 HostmaskHelper.split("justJanne!kuschku@lithium.kuschku.de").first)
+
+    assertEquals("kuschku",
+                 HostmaskHelper.user("justJanne!kuschku@lithium.kuschku.de"))
+    assertEquals("kuschku",
+                 HostmaskHelper.split("justJanne!kuschku@lithium.kuschku.de").second)
+
+    assertEquals("lithium.kuschku.de",
+                 HostmaskHelper.host("justJanne!kuschku@lithium.kuschku.de"))
+    assertEquals("lithium.kuschku.de",
+                 HostmaskHelper.split("justJanne!kuschku@lithium.kuschku.de").third)
   }
 
   @Test
   fun testUnvalidatedIdent() {
-    assertEquals("justJanne", HostmaskHelper.nick("justJanne!~kuschku@lithium.kuschku.de"))
-    assertEquals("~kuschku", HostmaskHelper.user("justJanne!~kuschku@lithium.kuschku.de"))
-    assertEquals("lithium.kuschku.de", HostmaskHelper.host("justJanne!~kuschku@lithium.kuschku.de"))
+    assertEquals("justJanne",
+                 HostmaskHelper.nick("justJanne!~kuschku@lithium.kuschku.de"))
+    assertEquals("justJanne",
+                 HostmaskHelper.split("justJanne!~kuschku@lithium.kuschku.de").first)
+
+    assertEquals("~kuschku",
+                 HostmaskHelper.user("justJanne!~kuschku@lithium.kuschku.de"))
+    assertEquals("~kuschku",
+                 HostmaskHelper.split("justJanne!~kuschku@lithium.kuschku.de").second)
+
+    assertEquals("lithium.kuschku.de",
+                 HostmaskHelper.host("justJanne!~kuschku@lithium.kuschku.de"))
+    assertEquals("lithium.kuschku.de",
+                 HostmaskHelper.split("justJanne!~kuschku@lithium.kuschku.de").third)
   }
 
   @Test
   fun testUnicode() {
-    assertEquals("bärlauch", HostmaskHelper.nick("bärlauch!maße@flüge.de"))
-    assertEquals("maße", HostmaskHelper.user("bärlauch!maße@flüge.de"))
-    assertEquals("flüge.de", HostmaskHelper.host("bärlauch!maße@flüge.de"))
+    assertEquals("bärlauch",
+                 HostmaskHelper.nick("bärlauch!maße@flüge.de"))
+    assertEquals("bärlauch",
+                 HostmaskHelper.split("bärlauch!maße@flüge.de").first)
+
+    assertEquals("maße",
+                 HostmaskHelper.user("bärlauch!maße@flüge.de"))
+    assertEquals("maße",
+                 HostmaskHelper.split("bärlauch!maße@flüge.de").second)
+
+    assertEquals("flüge.de",
+                 HostmaskHelper.host("bärlauch!maße@flüge.de"))
+    assertEquals("flüge.de",
+                 HostmaskHelper.split("bärlauch!maße@flüge.de").third)
   }
 
   @Test
   fun testServer() {
-    assertEquals("irc.freenode.org", HostmaskHelper.nick("irc.freenode.org"))
+    assertEquals("irc.freenode.org",
+                 HostmaskHelper.nick("irc.freenode.org"))
+    assertEquals("irc.freenode.org",
+                 HostmaskHelper.split("irc.freenode.org").first)
+
+    assertEquals("",
+                 HostmaskHelper.user("irc.freenode.org"))
+    assertEquals("",
+                 HostmaskHelper.split("irc.freenode.org").second)
+
+    assertEquals("",
+                 HostmaskHelper.host("irc.freenode.org"))
+    assertEquals("",
+                 HostmaskHelper.split("irc.freenode.org").third)
+  }
+
+  @Test
+  fun testAtNick() {
+    assertEquals("@nick",
+                 HostmaskHelper.nick("@nick!~ident@example.org"))
+    assertEquals("@nick",
+                 HostmaskHelper.split("@nick!~ident@example.org").first)
+
+    assertEquals("~ident",
+                 HostmaskHelper.user("@nick!~ident@example.org"))
+    assertEquals("~ident",
+                 HostmaskHelper.split("@nick!~ident@example.org").second)
+
+    assertEquals("example.org",
+                 HostmaskHelper.host("@nick!~ident@example.org"))
+    assertEquals("example.org",
+                 HostmaskHelper.split("@nick!~ident@example.org").third)
+  }
+
+  @Test
+  fun testReversedDelimiters() {
+    assertEquals("a",
+                 HostmaskHelper.nick("a@a!"))
+    assertEquals("a",
+                 HostmaskHelper.split("a@a!").first)
+
+    assertEquals("",
+                 HostmaskHelper.user("a@a!"))
+    assertEquals("",
+                 HostmaskHelper.split("a@a!").second)
+
+    assertEquals("a!",
+                 HostmaskHelper.host("a@a!"))
+    assertEquals("a!",
+                 HostmaskHelper.split("a@a!").third)
   }
 
   @Test
   fun testDiscord() {
-    assertEquals("Gin_", HostmaskHelper.nick("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
-    assertEquals("Gin_!♡♅ƸӜƷ♅♡!", HostmaskHelper.user("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
-    assertEquals("discord", HostmaskHelper.host("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
+    assertEquals("Gin_",
+                 HostmaskHelper.nick("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
+    assertEquals("Gin_",
+                 HostmaskHelper.split("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord").first)
+
+    assertEquals("Gin_!♡♅ƸӜƷ♅♡!",
+                 HostmaskHelper.user("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
+    assertEquals("Gin_!♡♅ƸӜƷ♅♡!",
+                 HostmaskHelper.split("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord").second)
+
+    assertEquals("discord",
+                 HostmaskHelper.host("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
+    assertEquals("discord",
+                 HostmaskHelper.split("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord").third)
   }
 }
-- 
GitLab