diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt
index d0b1726242284c794cc612157d104985ab2c1a62..c92022c794b7259311f6b598a5b0c69b69f7a3fb 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/io/ChainedByteBuffer.kt
@@ -204,3 +204,11 @@ class ChainedByteBuffer(
       buffer.bufferList[index++].duplicate().flip()
   }
 }
+
+inline fun ChainedByteBuffer.use(
+  function: (ChainedByteBuffer) -> Unit
+): ByteBuffer {
+  val buffer = ChainedByteBuffer()
+  function(buffer)
+  return buffer.toBuffer()
+}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
index 30760330b53568c8c71077dce5ef318f8c55cc1b..3af0e4bfd63805b69cab3ea49bbd82c047f54632 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
@@ -29,7 +29,6 @@ import org.junit.jupiter.api.Test
 class ClientInitSerializerTest {
   @Test
   fun testSimple() = handshakeSerializerTest(
-    ClientInitSerializer,
     HandshakeMessage.ClientInit(
       clientVersion = "Quasseldroid test",
       buildDate = "Never",
@@ -68,7 +67,6 @@ class ClientInitSerializerTest {
 
   @Test
   fun testRealistic() = handshakeSerializerTest(
-    ClientInitSerializer,
     HandshakeMessage.ClientInit(
       clientVersion = "Quasseldroid <a href=\"https://git.kuschku.de/justJanne/QuasselDroid-ng/commit/" +
         "b622ad63056b6054b06e09f8e1f1ef2b0c3aaf9a\">v1.3.3</a>",
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializerTest.kt
index 02eff4c69692827a69cb8c15b22d74af4b2d25eb..21a99551c6201f10459d26e2b667cc7697afd2b9 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/BoolSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,14 +34,14 @@ class BoolSerializerTest {
   }
 
   @Test
-  fun testTrue() = qtSerializerTest(
+  fun testTrue() = primitiveSerializerTest(
     BoolSerializer,
     true,
     byteBufferOf(1)
   )
 
   @Test
-  fun testFalse() = qtSerializerTest(
+  fun testFalse() = primitiveSerializerTest(
     BoolSerializer,
     false,
     byteBufferOf(0)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializerTest.kt
index 89e14f82e3c545b61d78fb33dd77cc61cfb407ce..20917e596e2c744a6fe9c0667e8364d0bac15763 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteBufferSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import java.nio.ByteBuffer
@@ -36,7 +36,7 @@ class ByteBufferSerializerTest {
   }
 
   @Test
-  fun testBaseCase() = qtSerializerTest(
+  fun testBaseCase() = primitiveSerializerTest(
     ByteBufferSerializer,
     byteBufferOf(0),
     byteBufferOf(0, 0, 0, 1, 0),
@@ -44,7 +44,7 @@ class ByteBufferSerializerTest {
   )
 
   @Test
-  fun testNormal() = qtSerializerTest(
+  fun testNormal() = primitiveSerializerTest(
     ByteBufferSerializer,
     byteBufferOf(1, 2, 3, 4, 5, 6, 7, 8, 9),
     byteBufferOf(0, 0, 0, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9),
@@ -52,7 +52,7 @@ class ByteBufferSerializerTest {
   )
 
   @Test
-  fun testEmpty() = qtSerializerTest(
+  fun testEmpty() = primitiveSerializerTest(
     ByteBufferSerializer,
     ByteBuffer.allocate(0),
     byteBufferOf(0, 0, 0, 0),
@@ -61,7 +61,7 @@ class ByteBufferSerializerTest {
 
   @Test
   fun testNull() {
-    qtSerializerTest(
+    primitiveSerializerTest(
       ByteBufferSerializer,
       null,
       byteBufferOf(0, 0, 0, 0),
@@ -69,7 +69,7 @@ class ByteBufferSerializerTest {
       serializeFeatureSet = null
     )
 
-    qtSerializerTest(
+    primitiveSerializerTest(
       ByteBufferSerializer,
       null,
       byteBufferOf(-1, -1, -1, -1),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializerTest.kt
index 91d293f7d422e97715a8bed216d5f8076d1a68d0..28548e966f9cf15edac050a2a8fb6f010640d008 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ByteSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import kotlin.experimental.inv
@@ -35,28 +35,28 @@ class ByteSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     ByteSerializer,
     0.toByte(),
     byteBufferOf(0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     ByteSerializer,
     Byte.MIN_VALUE,
     byteBufferOf(-128)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     ByteSerializer,
     Byte.MAX_VALUE,
     byteBufferOf(127)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     ByteSerializer,
     0.toByte().inv(),
     byteBufferOf(-1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializerTest.kt
index 29ad800186cb5b0f36859e6ead573b1b3f10ae85..f3dc9afc086ae86d5b8efb9afef4b748720e4c18 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/DoubleSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,42 +34,42 @@ class DoubleSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     DoubleSerializer,
     0.0,
     byteBufferOf(0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     DoubleSerializer,
     Double.MIN_VALUE,
     byteBufferOf(0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x01u)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     DoubleSerializer,
     Double.MAX_VALUE,
     byteBufferOf(0x7Fu, 0xEFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu)
   )
 
   @Test
-  fun testInfinityPositive() = qtSerializerTest(
+  fun testInfinityPositive() = primitiveSerializerTest(
     DoubleSerializer,
     Double.POSITIVE_INFINITY,
     byteBufferOf(0x7Fu, 0xF0u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u)
   )
 
   @Test
-  fun testInfinityNegative() = qtSerializerTest(
+  fun testInfinityNegative() = primitiveSerializerTest(
     DoubleSerializer,
     Double.NEGATIVE_INFINITY,
     byteBufferOf(0xFFu, 0xF0u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u)
   )
 
   @Test
-  fun testNotANumber() = qtSerializerTest(
+  fun testNotANumber() = primitiveSerializerTest(
     DoubleSerializer,
     Double.NaN,
     byteBufferOf(0x7Fu, 0xF8u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializerTest.kt
index 942343e107113a44aa6bd874949671857672ee0f..7b6b445be4ce52ae51597b05387ae8c4687f5fc2 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/FloatSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,42 +34,42 @@ class FloatSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     FloatSerializer,
     0f,
     byteBufferOf(0x00u, 0x00u, 0x00u, 0x00u)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     FloatSerializer,
     Float.MIN_VALUE,
     byteBufferOf(0x00u, 0x00u, 0x00u, 0x01u)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     FloatSerializer,
     Float.MAX_VALUE,
     byteBufferOf(0x7Fu, 0x7Fu, 0xFFu, 0xFFu)
   )
 
   @Test
-  fun testInfinityPositive() = qtSerializerTest(
+  fun testInfinityPositive() = primitiveSerializerTest(
     FloatSerializer,
     Float.POSITIVE_INFINITY,
     byteBufferOf(0x7Fu, 0x80u, 0x00u, 0x00u)
   )
 
   @Test
-  fun testInfinityNegative() = qtSerializerTest(
+  fun testInfinityNegative() = primitiveSerializerTest(
     FloatSerializer,
     Float.NEGATIVE_INFINITY,
     byteBufferOf(0xFFu, 0x80u, 0x00u, 0x00u)
   )
 
   @Test
-  fun testNotANumber() = qtSerializerTest(
+  fun testNotANumber() = primitiveSerializerTest(
     FloatSerializer,
     Float.NaN,
     byteBufferOf(0x7Fu, 0xC0u, 0x00u, 0x00u)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializerTest.kt
index 2add2ed98851288d993567e9d0e5eadb42cdb44f..108d4f544c8cc5c554784822cd25640b42c1efb9 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/HandshakeMapSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.MapMatcher
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import de.justjanne.libquassel.protocol.variant.qVariant
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
@@ -36,14 +36,14 @@ class HandshakeMapSerializerTest {
   }
 
   @Test
-  fun testEmpty() = qtSerializerTest(
+  fun testEmpty() = primitiveSerializerTest(
     HandshakeMapSerializer,
     mapOf(),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testNormal() = qtSerializerTest(
+  fun testNormal() = primitiveSerializerTest(
     HandshakeMapSerializer,
     mapOf(
       "Username" to qVariant("AzureDiamond", QtType.QString),
@@ -74,7 +74,7 @@ class HandshakeMapSerializerTest {
   )
 
   @Test
-  fun testNullKey() = qtSerializerTest(
+  fun testNullKey() = primitiveSerializerTest(
     HandshakeMapSerializer,
     mapOf(
       "" to qVariant<String?>(null, QtType.QString)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializerTest.kt
index 8deb51a49f5994b9b1e5c353e5eb09f7ef998693..913163533d98f43a7434cf905691952617c81cdb 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/IntSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,28 +34,28 @@ class IntSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     IntSerializer,
     0,
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     IntSerializer,
     Int.MIN_VALUE,
     byteBufferOf(-128, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     IntSerializer,
     Int.MAX_VALUE,
     byteBufferOf(127, -1, -1, -1)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     IntSerializer,
     0.inv(),
     byteBufferOf(-1, -1, -1, -1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializerTest.kt
index 69f019141aca49f1704e54b0f4b93e8733c4a87e..ea5455a6d47002d3a30980b9f8a6be6233f91ee7 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/LongSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,28 +34,28 @@ class LongSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     LongSerializer,
     0L,
     byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     LongSerializer,
     Long.MIN_VALUE,
     byteBufferOf(-128, 0, 0, 0, 0, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     LongSerializer,
     Long.MAX_VALUE,
     byteBufferOf(127, -1, -1, -1, -1, -1, -1, -1)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     LongSerializer,
     0L.inv(),
     byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializerTest.kt
index fa99dff9eff96acb8bb383801a9bd27315d3d5c5..4fa348e859d58e0af99b4ede03c56fdef84ab2b5 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QCharSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.BomMatcherChar
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,7 +35,7 @@ class QCharSerializerTest {
   }
 
   @Test
-  fun testNull() = qtSerializerTest(
+  fun testNull() = primitiveSerializerTest(
     QCharSerializer,
     '\u0000',
     byteBufferOf(0, 0),
@@ -43,7 +43,7 @@ class QCharSerializerTest {
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     QCharSerializer,
     '\uFFFF',
     byteBufferOf(-1, -1),
@@ -51,7 +51,7 @@ class QCharSerializerTest {
   )
 
   @Test
-  fun testBOM1() = qtSerializerTest(
+  fun testBOM1() = primitiveSerializerTest(
     QCharSerializer,
     '\uFFFE',
     byteBufferOf(-1, -2),
@@ -59,7 +59,7 @@ class QCharSerializerTest {
   )
 
   @Test
-  fun testBOM2() = qtSerializerTest(
+  fun testBOM2() = primitiveSerializerTest(
     QCharSerializer,
     '\uFEFF',
     byteBufferOf(-2, -1),
@@ -68,17 +68,17 @@ class QCharSerializerTest {
 
   @Test
   fun testAlphabet() {
-    for (value in 'a'..'z') qtSerializerTest(
+    for (value in 'a'..'z') primitiveSerializerTest(
       QCharSerializer,
       value,
       byteBufferOf(0, value.toByte())
     )
-    for (value in 'A'..'Z') qtSerializerTest(
+    for (value in 'A'..'Z') primitiveSerializerTest(
       QCharSerializer,
       value,
       byteBufferOf(0, value.toByte())
     )
-    for (value in '0'..'9') qtSerializerTest(
+    for (value in '0'..'9') primitiveSerializerTest(
       QCharSerializer,
       value,
       byteBufferOf(0, value.toByte())
@@ -87,7 +87,7 @@ class QCharSerializerTest {
 
   @Test
   fun testAlphabetExtended() {
-    for (value in listOf('ä', 'ö', 'ü', 'ß', 'æ', 'ø', 'µ')) qtSerializerTest(
+    for (value in listOf('ä', 'ö', 'ü', 'ß', 'æ', 'ø', 'µ')) primitiveSerializerTest(
       QCharSerializer,
       value
     )
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateSerializerTest.kt
index f5a2b9a76ef5aedae084bf377ff49f2b19aa64e4..02a3b23f21f45c36c18a671a8c11f92ac9dd1ab8 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.TemporalMatcher
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.threeten.bp.LocalDate
@@ -37,7 +37,7 @@ class QDateSerializerTest {
   }
 
   @Test
-  fun testEpoch() = qtSerializerTest(
+  fun testEpoch() = primitiveSerializerTest(
     QDateSerializer,
     LocalDate
       .of(1970, 1, 1),
@@ -46,7 +46,7 @@ class QDateSerializerTest {
   )
 
   @Test
-  fun testNormalCase() = qtSerializerTest(
+  fun testNormalCase() = primitiveSerializerTest(
     QDateSerializer,
     LocalDate
       .of(2019, Month.JANUARY, 15),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializerTest.kt
index 6aa5104ba1df65632c5261ff5ba19a6caa66801b..872359bc70c170eb657312152625eabdf07b3504 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.TemporalMatcher
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.assertThrows
@@ -43,7 +43,7 @@ class QDateTimeSerializerTest {
   }
 
   @Test
-  fun testEpoch() = qtSerializerTest(
+  fun testEpoch() = primitiveSerializerTest(
     QDateTimeSerializer,
     Instant.EPOCH,
     byteBufferOf(0, 37, 61, -116, 0, 0, 0, 0, 2),
@@ -51,7 +51,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testEpochAtTimezone() = qtSerializerTest(
+  fun testEpochAtTimezone() = primitiveSerializerTest(
     QDateTimeSerializer,
     Instant.EPOCH.atOffset(ZoneOffset.ofTotalSeconds(1234)),
     byteBufferOf(0x00u, 0x25u, 0x3Du, 0x8Cu, 0x00u, 0x12u, 0xD4u, 0x50u, 0x03u, 0x00u, 0x00u, 0x04u, 0xD2u),
@@ -59,7 +59,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testEpochByCalendarAtTimezone() = qtSerializerTest(
+  fun testEpochByCalendarAtTimezone() = primitiveSerializerTest(
     QDateTimeSerializer,
     LocalDateTime
       .of(1970, 1, 1, 0, 0)
@@ -70,7 +70,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testNormalCase() = qtSerializerTest(
+  fun testNormalCase() = primitiveSerializerTest(
     QDateTimeSerializer,
     LocalDateTime
       .of(2019, Month.JANUARY, 15, 20, 25)
@@ -81,7 +81,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testLocalDateTime() = qtSerializerTest(
+  fun testLocalDateTime() = primitiveSerializerTest(
     QDateTimeSerializer,
     LocalDateTime
       .of(2019, Month.JANUARY, 15, 20, 25),
@@ -90,7 +90,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testZonedDateTime() = qtSerializerTest(
+  fun testZonedDateTime() = primitiveSerializerTest(
     QDateTimeSerializer,
     LocalDateTime
       .of(2019, Month.JANUARY, 15, 20, 25)
@@ -99,7 +99,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testUnknownDateTime() = qtSerializerTest(
+  fun testUnknownDateTime() = primitiveSerializerTest(
     QDateTimeSerializer,
     LocalDateTime
       .of(2019, Month.JANUARY, 15, 20, 25),
@@ -108,7 +108,7 @@ class QDateTimeSerializerTest {
   )
 
   @Test
-  fun testInvalidDateTime() = qtSerializerTest(
+  fun testInvalidDateTime() = primitiveSerializerTest(
     QDateTimeSerializer,
     LocalDateTime
       .of(2019, Month.JANUARY, 15, 20, 25),
@@ -121,7 +121,7 @@ class QDateTimeSerializerTest {
   @Test
   fun testOldJavaDate() {
     assertThrows<IllegalArgumentException>("Unsupported Format: org.threeten.bp.chrono.JapaneseDate") {
-      qtSerializerTest(
+      primitiveSerializerTest(
         QDateTimeSerializer,
         JapaneseDate.now(),
         matcher = ::TemporalMatcher
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QTimeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QTimeSerializerTest.kt
index e7a3ffdc15afb2d2a0ba1760dfa8df2e1e6ae2ea..22a12aa29e89aba9f20b5c3e69afe917b898f8da 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QTimeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QTimeSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.TemporalMatcher
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.threeten.bp.LocalTime
@@ -36,7 +36,7 @@ class QTimeSerializerTest {
   }
 
   @Test
-  fun testEpoch() = qtSerializerTest(
+  fun testEpoch() = primitiveSerializerTest(
     QTimeSerializer,
     LocalTime
       .of(0, 0),
@@ -45,7 +45,7 @@ class QTimeSerializerTest {
   )
 
   @Test
-  fun testNormalCase() = qtSerializerTest(
+  fun testNormalCase() = primitiveSerializerTest(
     QTimeSerializer,
     LocalTime
       .of(20, 25),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializerTest.kt
index ce824fcb23da889124a441dd75bb43fcb9e99a29..68cf64602a6232b77296dd3bcc9f2470ff5fbe2c 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantListSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import de.justjanne.libquassel.protocol.variant.QVariantList
 import de.justjanne.libquassel.protocol.variant.qVariant
 import org.junit.jupiter.api.Assertions.assertEquals
@@ -36,14 +36,14 @@ class QVariantListSerializerTest {
   }
 
   @Test
-  fun testEmpty() = qtSerializerTest(
+  fun testEmpty() = primitiveSerializerTest(
     QVariantListSerializer,
     listOf(),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testNormal() = qtSerializerTest(
+  fun testNormal() = primitiveSerializerTest(
     QVariantListSerializer,
     listOf(
       qVariant("AzureDiamond", QtType.QString),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializerTest.kt
index 3a1715a5a178749d247515f124bbe823eb1076ea..5f3b816514d9a0eb6122a5fd24bca016d08bafd3 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantMapSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.matchers.MapMatcher
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import de.justjanne.libquassel.protocol.variant.QVariantMap
 import de.justjanne.libquassel.protocol.variant.qVariant
 import org.junit.jupiter.api.Assertions.assertEquals
@@ -37,14 +37,14 @@ class QVariantMapSerializerTest {
   }
 
   @Test
-  fun testEmpty() = qtSerializerTest(
+  fun testEmpty() = primitiveSerializerTest(
     QVariantMapSerializer,
     mapOf(),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testNormal() = qtSerializerTest(
+  fun testNormal() = primitiveSerializerTest(
     QVariantMapSerializer,
     mapOf(
       "Username" to qVariant("AzureDiamond", QtType.QString),
@@ -156,7 +156,7 @@ class QVariantMapSerializerTest {
   )
 
   @Test
-  fun testNullKey() = qtSerializerTest(
+  fun testNullKey() = primitiveSerializerTest(
     QVariantMapSerializer,
     mapOf(
       "" to qVariant<String?>(null, QtType.QString)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializerTest.kt
index 13584d06ba9fa57404daa58887f7279bd1c592d1..832f9cc9e5a130e320f7bb0a143a00bd4039cc18 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QVariantSerializerTest.kt
@@ -18,10 +18,10 @@
  */
 package de.justjanne.libquassel.protocol.serializers.qt
 
+import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.serializers.NoSerializerForTypeException
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.deserialize
 import de.justjanne.libquassel.protocol.variant.QVariant_
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
@@ -39,9 +39,9 @@ class QVariantSerializerTest {
   @Test
   fun testUnregisteredQtType() {
     assertThrows<NoSerializerForTypeException> {
-      deserialize(
-        QVariantSerializer,
-        byteBufferOf(0x00u, 0x00u, 0x01u, 0x00u, 0x00u)
+      QVariantSerializer.deserialize(
+        byteBufferOf(0x00u, 0x00u, 0x01u, 0x00u, 0x00u),
+        FeatureSet.all()
       )
     }
   }
@@ -49,9 +49,9 @@ class QVariantSerializerTest {
   @Test
   fun testUnknownQtType() {
     assertThrows<NoSerializerForTypeException> {
-      deserialize(
-        QVariantSerializer,
-        byteBufferOf(0x00u, 0xFFu, 0x00u, 0x00u, 0x00u)
+      QVariantSerializer.deserialize(
+        byteBufferOf(0x00u, 0xFFu, 0x00u, 0x00u, 0x00u),
+        FeatureSet.all()
       )
     }
   }
@@ -59,8 +59,7 @@ class QVariantSerializerTest {
   @Test
   fun testUnregisteredQuasselType() {
     assertThrows<NoSerializerForTypeException> {
-      deserialize(
-        QVariantSerializer,
+      QVariantSerializer.deserialize(
         byteBufferOf(
           // QtType
           0x00u, 0x00u, 0x00u, 0x7Fu,
@@ -68,7 +67,8 @@ class QVariantSerializerTest {
           0x00u,
           // QuasselType length
           0x00u, 0x00u, 0x00u, 0x00u,
-        )
+        ),
+        FeatureSet.all()
       )
     }
   }
@@ -76,8 +76,7 @@ class QVariantSerializerTest {
   @Test
   fun testUnknownQuasselType() {
     assertThrows<NoSerializerForTypeException> {
-      deserialize(
-        QVariantSerializer,
+      QVariantSerializer.deserialize(
         byteBufferOf(
           // QtType
           0x00u, 0x00u, 0x00u, 0x7Fu,
@@ -87,7 +86,8 @@ class QVariantSerializerTest {
           0x00u, 0x00u, 0x00u, 0x03u,
           // "foo"
           0x66u, 0x6fu, 0x6fu
-        )
+        ),
+        FeatureSet.all()
       )
     }
   }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializerTest.kt
index 37bb3e5ab6f0e23d9691a7cdd18a57dfa9816cbc..ddd083390a85c0364e990fac9e3a8ecfddfc88ab 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ShortSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import kotlin.experimental.inv
@@ -35,28 +35,28 @@ class ShortSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     ShortSerializer,
     0.toShort(),
     byteBufferOf(0, 0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     ShortSerializer,
     Short.MIN_VALUE,
     byteBufferOf(-128, 0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     ShortSerializer,
     Short.MAX_VALUE,
     byteBufferOf(127, -1)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     ShortSerializer,
     0.toShort().inv(),
     byteBufferOf(-1, -1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerTest.kt
index acdccf8cccd7b104d0beb445384ee0be8584eafb..e89b2c94a757a7beee9c4c51c63654f9533f806e 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/StringSerializerTest.kt
@@ -18,13 +18,13 @@
  */
 package de.justjanne.libquassel.protocol.serializers.qt
 
+import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.deserialize
 import de.justjanne.libquassel.protocol.testutil.matchers.BomMatcherString
 import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import de.justjanne.libquassel.protocol.testutil.testPrimitiveSerializerDirect
-import de.justjanne.libquassel.protocol.testutil.testQtSerializerVariant
+import de.justjanne.libquassel.protocol.testutil.testPrimitiveSerializerVariant
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
@@ -45,16 +45,16 @@ class StringSerializerTest {
       if (!it.startsWith('#')) {
         testPrimitiveSerializerDirect(StringSerializerUtf8, it, matcher = BomMatcherString(it))
         testPrimitiveSerializerDirect(StringSerializerUtf16, it, matcher = BomMatcherString(it))
-        testQtSerializerVariant(QtType.QString, it, matcher = BomMatcherString(it))
+        testPrimitiveSerializerVariant(QtType.QString, it, matcher = BomMatcherString(it))
 
         val bufferUtf8 = StringSerializerUtf8.serializeRaw(it)
         testPrimitiveSerializerDirect(ByteBufferSerializer, bufferUtf8, matcher = ByteBufferMatcher(bufferUtf8))
-        testQtSerializerVariant(QtType.QByteArray, bufferUtf8, matcher = ByteBufferMatcher(bufferUtf8))
+        testPrimitiveSerializerVariant(QtType.QByteArray, bufferUtf8, matcher = ByteBufferMatcher(bufferUtf8))
         assertEquals(it, StringSerializerUtf8.deserializeRaw(bufferUtf8.rewind()))
 
         val bufferUtf16 = StringSerializerUtf16.serializeRaw(it)
         testPrimitiveSerializerDirect(ByteBufferSerializer, bufferUtf16, matcher = ByteBufferMatcher(bufferUtf16))
-        testQtSerializerVariant(QtType.QByteArray, bufferUtf16, matcher = ByteBufferMatcher(bufferUtf16))
+        testPrimitiveSerializerVariant(QtType.QByteArray, bufferUtf16, matcher = ByteBufferMatcher(bufferUtf16))
         assertThat(StringSerializerUtf16.deserializeRaw(bufferUtf16.rewind()), BomMatcherString(it))
       }
     }
@@ -79,7 +79,7 @@ class StringSerializerTest {
 
     val bufferAscii = StringSerializerAscii.serializeRaw(data)
     testPrimitiveSerializerDirect(ByteBufferSerializer, bufferAscii, matcher = ByteBufferMatcher(bufferAscii))
-    testQtSerializerVariant(QtType.QByteArray, bufferAscii, matcher = ByteBufferMatcher(bufferAscii))
+    testPrimitiveSerializerVariant(QtType.QByteArray, bufferAscii, matcher = ByteBufferMatcher(bufferAscii))
     assertEquals(data, StringSerializerAscii.deserializeRaw(bufferAscii.rewind()))
 
     testUtf(data)
@@ -1301,8 +1301,8 @@ class StringSerializerTest {
       46
     )
 
-    assertEquals(value, deserialize(StringSerializerUtf8, utf8Buffer))
-    assertEquals(value, deserialize(StringSerializerUtf16, utf16Buffer))
+    assertEquals(value, StringSerializerUtf8.deserialize(utf8Buffer, FeatureSet.all()))
+    assertEquals(value, StringSerializerUtf16.deserialize(utf16Buffer, FeatureSet.all()))
   }
 
   @Test
@@ -1313,7 +1313,7 @@ class StringSerializerTest {
 
     val bufferAscii = StringSerializerAscii.serializeRaw(data)
     testPrimitiveSerializerDirect(ByteBufferSerializer, bufferAscii, matcher = ByteBufferMatcher(bufferAscii))
-    testQtSerializerVariant(QtType.QByteArray, bufferAscii, matcher = ByteBufferMatcher(bufferAscii))
+    testPrimitiveSerializerVariant(QtType.QByteArray, bufferAscii, matcher = ByteBufferMatcher(bufferAscii))
     assertEquals(data, StringSerializerAscii.deserializeRaw(bufferAscii.rewind()))
   }
 
@@ -1322,15 +1322,15 @@ class StringSerializerTest {
 
     val bufferUtf8 = StringSerializerUtf8.serializeRaw(data)
     testPrimitiveSerializerDirect(ByteBufferSerializer, bufferUtf8, matcher = ByteBufferMatcher(bufferUtf8))
-    testQtSerializerVariant(QtType.QByteArray, bufferUtf8, matcher = ByteBufferMatcher(bufferUtf8))
+    testPrimitiveSerializerVariant(QtType.QByteArray, bufferUtf8, matcher = ByteBufferMatcher(bufferUtf8))
     assertEquals(data, StringSerializerUtf8.deserializeRaw(bufferUtf8.rewind()))
 
     // testPrimitiveSerializerDirect(StringSerializerUtf16, data, matcher = BomMatcherString(data))
-    // testQtSerializerVariant(StringSerializerUtf16, data, matcher = BomMatcherString(data))
+    // testPrimitiveSerializerVariant(StringSerializerUtf16, data, matcher = BomMatcherString(data))
 
     // val bufferUtf16 = StringSerializerUtf16.serializeRaw(data)
     // testPrimitiveSerializerDirect(ByteBufferSerializer, bufferUtf16, matcher = ByteBufferMatcher(bufferUtf16))
-    // testQtSerializerVariant(ByteBufferSerializer, bufferUtf16, matcher = ByteBufferMatcher(bufferUtf16))
+    // testPrimitiveSerializerVariant(ByteBufferSerializer, bufferUtf16, matcher = ByteBufferMatcher(bufferUtf16))
     // assertEquals(data, StringSerializerUtf16.deserializeRaw(bufferUtf16.rewind()))
   }
 }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializerTest.kt
index ce5a2d76aae2ff806daf06f78819c8d6577e984f..7f388a60f70b031078911d8d3fcaff77466fcc79 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UByteSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,28 +34,28 @@ class UByteSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     UByteSerializer,
     0.toUByte(),
     byteBufferOf(0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     UByteSerializer,
     UByte.MIN_VALUE,
     byteBufferOf(0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     UByteSerializer,
     UByte.MAX_VALUE,
     byteBufferOf(255u)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     UByteSerializer,
     0.toUByte().inv(),
     byteBufferOf(255u)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializerTest.kt
index 0bbae1cceeaa688fe121d7bd672c695aaec05ddc..843ca87030663daa72461f9125b60dfb63f4ac71 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UIntSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,28 +34,28 @@ class UIntSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     UIntSerializer,
     0.toUInt(),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     UIntSerializer,
     UInt.MIN_VALUE,
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     UIntSerializer,
     UInt.MAX_VALUE,
     byteBufferOf(255u, 255u, 255u, 255u)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     UIntSerializer,
     0.toUInt().inv(),
     byteBufferOf(255u, 255u, 255u, 255u)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializerTest.kt
index 714e57cc1a78adc6de1d938798a24f7a327119ec..071663b09d533d4611139bbe3e9999b87b54adce 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/ULongSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,28 +34,28 @@ class ULongSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     ULongSerializer,
     0.toULong(),
     byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     ULongSerializer,
     ULong.MIN_VALUE,
     byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     ULongSerializer,
     ULong.MAX_VALUE,
     byteBufferOf(255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     ULongSerializer,
     0.toULong().inv(),
     byteBufferOf(255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializerTest.kt
index 121d451553b907e40b146ee803291337ed8acc99..0471334ce24b80d62ea806f40812ace45937fe31 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/UShortSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,28 +34,28 @@ class UShortSerializerTest {
   }
 
   @Test
-  fun testZero() = qtSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     UShortSerializer,
     0.toUShort(),
     byteBufferOf(0, 0)
   )
 
   @Test
-  fun testMinimal() = qtSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     UShortSerializer,
     UShort.MIN_VALUE,
     byteBufferOf(0, 0)
   )
 
   @Test
-  fun testMaximal() = qtSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     UShortSerializer,
     UShort.MAX_VALUE,
     byteBufferOf(255u, 255u)
   )
 
   @Test
-  fun testAllOnes() = qtSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     UShortSerializer,
     0.toUShort().inv(),
     byteBufferOf(255u, 255u)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializerTest.kt
index 78103b36f1ca7ed6898e8549c94c361ddcc44e72..cccac8525c09ebd885f9589c1e12190477b6a9d8 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/qt/VoidSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.qt
 
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.qtSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -34,7 +34,7 @@ class VoidSerializerTest {
   }
 
   @Test
-  fun test() = qtSerializerTest(
+  fun test() = primitiveSerializerTest(
     VoidSerializer,
     Unit,
     byteBufferOf()
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializerTest.kt
index 8d2c3088c8f932de44cd2aaa405005d08727fed7..5a8ef9bab9144c72be1a07544c2893337c8a2cc3 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferIdSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 import de.justjanne.libquassel.protocol.models.ids.BufferId
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,28 +35,28 @@ class BufferIdSerializerTest {
   }
 
   @Test
-  fun testZero() = quasselSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     BufferIdSerializer,
     BufferId(0),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = quasselSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     BufferIdSerializer,
     BufferId.MIN_VALUE,
     byteBufferOf(-128, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = quasselSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     BufferIdSerializer,
     BufferId.MAX_VALUE,
     byteBufferOf(127, -1, -1, -1)
   )
 
   @Test
-  fun testAllOnes() = quasselSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     BufferIdSerializer,
     BufferId(0.inv()),
     byteBufferOf(-1, -1, -1, -1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializerTest.kt
index ecd3283bc3b48fa0d6862ca4e234d639c3c3cd96..7860f42d41cffa31ccb79cb353b282ed571445f5 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/BufferInfoSerializerTest.kt
@@ -26,7 +26,7 @@ import de.justjanne.libquassel.protocol.models.ids.BufferId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -40,7 +40,7 @@ class BufferInfoSerializerTest {
   }
 
   @Test
-  fun testBaseCase() = quasselSerializerTest(
+  fun testBaseCase() = primitiveSerializerTest(
     BufferInfoSerializer,
     BufferInfo(
       BufferId(-1),
@@ -72,7 +72,7 @@ class BufferInfoSerializerTest {
   )
 
   @Test
-  fun testNormal() = quasselSerializerTest(
+  fun testNormal() = primitiveSerializerTest(
     BufferInfoSerializer,
     BufferInfo(
       BufferId.MAX_VALUE,
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt
index 3751192feac302e50913b38bc05b576f06d68d96..474287231a4cf71cf6b8f3188ad82885685e49fb 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 import de.justjanne.libquassel.protocol.models.DccIpDetectionMode
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,21 +35,21 @@ class DccIpDetectionModeSerializerTest {
   }
 
   @Test
-  fun testAutomatic() = quasselSerializerTest(
+  fun testAutomatic() = primitiveSerializerTest(
     DccIpDetectionModeSerializer,
     DccIpDetectionMode.Automatic,
     byteBufferOf(0x00u)
   )
 
   @Test
-  fun testManual() = quasselSerializerTest(
+  fun testManual() = primitiveSerializerTest(
     DccIpDetectionModeSerializer,
     DccIpDetectionMode.Manual,
     byteBufferOf(0x01u)
   )
 
   @Test
-  fun testNull() = quasselSerializerTest(
+  fun testNull() = primitiveSerializerTest(
     DccIpDetectionModeSerializer,
     null,
     byteBufferOf(0x00u),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt
index 571d7db18fb44ba05ea3d926d96e1f342050107a..0d8dbc5ec078f944641ed9e2a1f0c288d65beb65 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 import de.justjanne.libquassel.protocol.models.DccPortSelectionMode
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,21 +35,21 @@ class DccPortSelectionModeSerializerTest {
   }
 
   @Test
-  fun testAutomatic() = quasselSerializerTest(
+  fun testAutomatic() = primitiveSerializerTest(
     DccPortSelectionModeSerializer,
     DccPortSelectionMode.Automatic,
     byteBufferOf(0x00u)
   )
 
   @Test
-  fun testManual() = quasselSerializerTest(
+  fun testManual() = primitiveSerializerTest(
     DccPortSelectionModeSerializer,
     DccPortSelectionMode.Manual,
     byteBufferOf(0x01u)
   )
 
   @Test
-  fun testNull() = quasselSerializerTest(
+  fun testNull() = primitiveSerializerTest(
     DccPortSelectionModeSerializer,
     null,
     byteBufferOf(0x00u),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializerTest.kt
index 7f2eec3ca8a5dca363743bf40c82ed32143fffd4..2b2d56e7b84caa18aa6e37bbc5184c337ea1504e 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/IdentityIdSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,28 +35,28 @@ class IdentityIdSerializerTest {
   }
 
   @Test
-  fun testZero() = quasselSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     IdentityIdSerializer,
     IdentityId(0),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = quasselSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     IdentityIdSerializer,
     IdentityId.MIN_VALUE,
     byteBufferOf(-128, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = quasselSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     IdentityIdSerializer,
     IdentityId.MAX_VALUE,
     byteBufferOf(127, -1, -1, -1)
   )
 
   @Test
-  fun testAllOnes() = quasselSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     IdentityIdSerializer,
     IdentityId(0.inv()),
     byteBufferOf(-1, -1, -1, -1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializerTest.kt
index 66016ad7e07dab63b0f8e0ece6b1dad72aefee1e..e9d770dbccafa2a371e62e76871ac0a708ff561f 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MessageSerializerTest.kt
@@ -32,7 +32,7 @@ import de.justjanne.libquassel.protocol.models.ids.MsgId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.threeten.bp.Instant
@@ -47,7 +47,7 @@ class MessageSerializerTest {
   }
 
   @Test
-  fun testEmpty() = quasselSerializerTest(
+  fun testEmpty() = primitiveSerializerTest(
     MessageSerializer,
     Message(
       MsgId(-1),
@@ -102,7 +102,7 @@ class MessageSerializerTest {
   )
 
   @Test
-  fun testBaseCase() = quasselSerializerTest(
+  fun testBaseCase() = primitiveSerializerTest(
     MessageSerializer,
     Message(
       MsgId(-1),
@@ -168,7 +168,7 @@ class MessageSerializerTest {
   )
 
   @Test
-  fun testNormal() = quasselSerializerTest(
+  fun testNormal() = primitiveSerializerTest(
     MessageSerializer,
     Message(
       MsgId(Int.MAX_VALUE.toLong()),
@@ -261,7 +261,7 @@ class MessageSerializerTest {
   )
 
   @Test
-  fun testExtreme() = quasselSerializerTest(
+  fun testExtreme() = primitiveSerializerTest(
     MessageSerializer,
     Message(
       MsgId.MAX_VALUE,
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializerTest.kt
index 8407a42549af2cd471f714114b77ca6f349053d2..03b58bc6aaa137ff401bb3217bf1be0e7b34225d 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/MsgIdSerializerTest.kt
@@ -22,7 +22,7 @@ import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.models.ids.MsgId
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -36,7 +36,7 @@ class MsgIdSerializerTest {
   }
 
   @Test
-  fun testZero() = quasselSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     MsgIdSerializer,
     MsgId(0),
     byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
@@ -44,7 +44,7 @@ class MsgIdSerializerTest {
   )
 
   @Test
-  fun testMinimal() = quasselSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     MsgIdSerializer,
     MsgId.MIN_VALUE,
     byteBufferOf(-128, 0, 0, 0, 0, 0, 0, 0),
@@ -52,7 +52,7 @@ class MsgIdSerializerTest {
   )
 
   @Test
-  fun testMaximal() = quasselSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     MsgIdSerializer,
     MsgId.MAX_VALUE,
     byteBufferOf(127, -1, -1, -1, -1, -1, -1, -1),
@@ -60,7 +60,7 @@ class MsgIdSerializerTest {
   )
 
   @Test
-  fun testAllOnes() = quasselSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     MsgIdSerializer,
     MsgId(0.inv()),
     byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializerTest.kt
index 79edb0845a45c2bd8fae8ba65b55e8389bcabbc0..33e9f220eea4590c2ee84b1252b85eadbb02ac0e 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkIdSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,28 +35,28 @@ class NetworkIdSerializerTest {
   }
 
   @Test
-  fun testZero() = quasselSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     NetworkIdSerializer,
     NetworkId(0),
     byteBufferOf(0, 0, 0, 0)
   )
 
   @Test
-  fun testMinimal() = quasselSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     NetworkIdSerializer,
     NetworkId.MIN_VALUE,
     byteBufferOf(-128, 0, 0, 0)
   )
 
   @Test
-  fun testMaximal() = quasselSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     NetworkIdSerializer,
     NetworkId.MAX_VALUE,
     byteBufferOf(127, -1, -1, -1)
   )
 
   @Test
-  fun testAllOnes() = quasselSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     NetworkIdSerializer,
     NetworkId(0.inv()),
     byteBufferOf(-1, -1, -1, -1)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializerTest.kt
index a43539667c4535041465f405c9ae9bb6ff5832c1..9659e02b4f5cc3baf61d3eee1726d3ca7ee900e8 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/PeerPtrSerializerTest.kt
@@ -21,7 +21,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -35,7 +35,7 @@ class PeerPtrSerializerTest {
   }
 
   @Test
-  fun testZero() = quasselSerializerTest(
+  fun testZero() = primitiveSerializerTest(
     PeerPtrSerializer,
     0uL,
     byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
@@ -43,7 +43,7 @@ class PeerPtrSerializerTest {
   )
 
   @Test
-  fun testMinimal() = quasselSerializerTest(
+  fun testMinimal() = primitiveSerializerTest(
     PeerPtrSerializer,
     ULong.MIN_VALUE,
     byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
@@ -51,7 +51,7 @@ class PeerPtrSerializerTest {
   )
 
   @Test
-  fun testMaximal() = quasselSerializerTest(
+  fun testMaximal() = primitiveSerializerTest(
     PeerPtrSerializer,
     ULong.MAX_VALUE,
     byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
@@ -59,7 +59,7 @@ class PeerPtrSerializerTest {
   )
 
   @Test
-  fun testAllOnes() = quasselSerializerTest(
+  fun testAllOnes() = primitiveSerializerTest(
     PeerPtrSerializer,
     0uL.inv(),
     byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializerTest.kt
index 794be1e5a0df82d3172b279c3562f56ce6372e86..d93835680288d13248e80156f7c5518751b5fff5 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializerTest.kt
@@ -20,7 +20,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
-import de.justjanne.libquassel.protocol.testutil.quasselSerializerTest
+import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import java.net.Inet4Address
@@ -37,7 +37,7 @@ class QHostAddressSerializerTest {
   }
 
   @Test
-  fun testIpv4() = quasselSerializerTest(
+  fun testIpv4() = primitiveSerializerTest(
     QHostAddressSerializer,
     Inet4Address.getByAddress(
       byteArrayOf(
@@ -51,7 +51,7 @@ class QHostAddressSerializerTest {
   )
 
   @Test
-  fun testIpv6() = quasselSerializerTest(
+  fun testIpv6() = primitiveSerializerTest(
     QHostAddressSerializer,
     Inet6Address.getByAddress(
       ubyteArrayOf(
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt
deleted file mode 100644
index a4f64c131999dfed506d0efec059e494d6c5a8ed..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/deserialize.kt
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.models.HandshakeMessage
-import de.justjanne.libquassel.protocol.models.SignalProxyMessage
-import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer
-import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
-import de.justjanne.libquassel.protocol.serializers.SignalProxySerializer
-import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer
-import de.justjanne.libquassel.protocol.serializers.qt.QVariantListSerializer
-import org.hamcrest.Matcher
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.jupiter.api.Assertions.assertEquals
-import java.nio.ByteBuffer
-
-fun <T> deserialize(
-  serializer: PrimitiveSerializer<T>,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-): T {
-  val result = serializer.deserialize(buffer, featureSet)
-  assertEquals(0, buffer.remaining())
-  return result
-}
-
-fun <T> testDeserialize(
-  serializer: PrimitiveSerializer<T>,
-  matcher: Matcher<in T>,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val after = deserialize(serializer, buffer, featureSet)
-  assertThat(after, matcher)
-}
-
-fun <T> testDeserialize(
-  serializer: PrimitiveSerializer<T>,
-  data: T,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val after = deserialize(serializer, buffer, featureSet)
-  assertEquals(data, after)
-}
-
-fun <T : HandshakeMessage> testDeserialize(
-  serializer: HandshakeSerializer<T>,
-  matcher: Matcher<in T>,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val map = deserialize(HandshakeMapSerializer, buffer, featureSet)
-  val after = serializer.deserialize(map)
-  assertThat(after, matcher)
-}
-
-fun <T : HandshakeMessage> testDeserialize(
-  serializer: HandshakeSerializer<T>,
-  data: T,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val map = deserialize(HandshakeMapSerializer, buffer, featureSet)
-  val after = serializer.deserialize(map)
-  assertEquals(data, after)
-}
-
-fun <T : SignalProxyMessage> testDeserialize(
-  serializer: SignalProxySerializer<T>,
-  matcher: Matcher<in T>,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val list = deserialize(QVariantListSerializer, buffer, featureSet)
-  val after = serializer.deserialize(list)
-  assertThat(after, matcher)
-}
-
-fun <T : SignalProxyMessage> testDeserialize(
-  serializer: SignalProxySerializer<T>,
-  data: T,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val list = deserialize(QVariantListSerializer, buffer, featureSet)
-  val after = serializer.deserialize(list)
-  assertEquals(data, after)
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt
index 3e7c49f0cf0cadb1fba972126934ac06e793f10a..59e47afbc2f54b558cc694fdbd8e56157440772d 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/handshakeSerializerTest.kt
@@ -19,34 +19,53 @@
 package de.justjanne.libquassel.protocol.testutil
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
+import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
+import de.justjanne.libquassel.protocol.io.use
 import de.justjanne.libquassel.protocol.models.HandshakeMessage
-import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer
+import de.justjanne.libquassel.protocol.serializers.HandshakeMessageSerializer
+import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import org.hamcrest.Matcher
+import org.hamcrest.MatcherAssert.assertThat
 import java.nio.ByteBuffer
+import kotlin.test.assertEquals
 
-fun <T : HandshakeMessage> handshakeSerializerTest(
-  serializer: HandshakeSerializer<T>,
+inline fun <reified T : HandshakeMessage> handshakeSerializerTest(
   value: T,
   encoded: ByteBuffer? = null,
-  matcher: ((T) -> Matcher<T>)? = null,
+  noinline matcher: ((T?) -> Matcher<T?>)? = null,
   featureSets: List<FeatureSet> = listOf(FeatureSet.none(), FeatureSet.all()),
   deserializeFeatureSet: FeatureSet? = FeatureSet.all(),
   serializeFeatureSet: FeatureSet? = FeatureSet.all(),
 ) {
   if (encoded != null) {
     if (deserializeFeatureSet != null) {
+      val after = HandshakeMessageSerializer.deserialize(encoded, deserializeFeatureSet) as? T
       if (matcher != null) {
-        testDeserialize(serializer, matcher(value), encoded.rewind(), deserializeFeatureSet)
+        assertThat(after, matcher(value))
       } else {
-        testDeserialize(serializer, value, encoded.rewind(), deserializeFeatureSet)
+        assertEquals(after, value)
       }
     }
     if (serializeFeatureSet != null) {
-      testSerialize(serializer, value, encoded.rewind(), serializeFeatureSet)
+      assertThat(
+        ChainedByteBuffer().use {
+          HandshakeMessageSerializer.serialize(it, value, serializeFeatureSet)
+        },
+        ByteBufferMatcher(encoded.rewind())
+      )
     }
   }
   for (featureSet in featureSets) {
-    testHandshakeSerializerDirect(serializer, value)
-    testHandshakeSerializerEncoded(serializer, value, featureSet)
+    val after = HandshakeMessageSerializer.deserialize(
+      ChainedByteBuffer().use {
+        HandshakeMessageSerializer.serialize(it, value, featureSet)
+      },
+      featureSet
+    ) as? T
+    if (matcher != null) {
+      assertThat(after, matcher(value))
+    } else {
+      assertEquals(value, after)
+    }
   }
 }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/quasselSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt
similarity index 57%
rename from libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/quasselSerializerTest.kt
rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt
index effe9827d19a4ca6c2e00aaa30d83dd2fa5bc2c1..eefbafbdb28414556112033fdb262670187f2b95 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/quasselSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/primitiveSerializerTest.kt
@@ -19,12 +19,36 @@
 package de.justjanne.libquassel.protocol.testutil
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
+import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
+import de.justjanne.libquassel.protocol.io.use
+import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
+import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import org.hamcrest.Matcher
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.jupiter.api.Assertions.assertEquals
 import java.nio.ByteBuffer
 
-inline fun <reified T : Any?> quasselSerializerTest(
+inline fun <reified T : Any?> primitiveSerializerTest(
+  type: QtType,
+  value: T,
+  encoded: ByteBuffer? = null,
+  noinline matcher: ((T) -> Matcher<T>)? = null,
+  featureSets: List<FeatureSet> = listOf(FeatureSet.none(), FeatureSet.all()),
+  deserializeFeatureSet: FeatureSet? = FeatureSet.all(),
+  serializeFeatureSet: FeatureSet? = FeatureSet.all(),
+) = primitiveSerializerTest(
+  type.serializer(),
+  value,
+  encoded,
+  matcher,
+  featureSets,
+  deserializeFeatureSet,
+  serializeFeatureSet
+)
+
+inline fun <reified T : Any?> primitiveSerializerTest(
   type: QuasselType,
   value: T,
   encoded: ByteBuffer? = null,
@@ -32,26 +56,17 @@ inline fun <reified T : Any?> quasselSerializerTest(
   featureSets: List<FeatureSet> = listOf(FeatureSet.none(), FeatureSet.all()),
   deserializeFeatureSet: FeatureSet? = FeatureSet.all(),
   serializeFeatureSet: FeatureSet? = FeatureSet.all(),
-) {
-  if (encoded != null) {
-    if (deserializeFeatureSet != null) {
-      if (matcher != null) {
-        testDeserialize(type.serializer<T>(), matcher(value), encoded.rewind(), deserializeFeatureSet)
-      } else {
-        testDeserialize(type.serializer(), value, encoded.rewind(), deserializeFeatureSet)
-      }
-    }
-    if (serializeFeatureSet != null) {
-      testSerialize(type.serializer(), value, encoded.rewind(), serializeFeatureSet)
-    }
-  }
-  for (featureSet in featureSets) {
-    testPrimitiveSerializerDirect(type.serializer(), value, featureSet, matcher?.invoke(value))
-    testQuasselSerializerVariant(type, value, featureSet, matcher?.invoke(value))
-  }
-}
+) = primitiveSerializerTest(
+  type.serializer(),
+  value,
+  encoded,
+  matcher,
+  featureSets,
+  deserializeFeatureSet,
+  serializeFeatureSet
+)
 
-inline fun <reified T : Any?> quasselSerializerTest(
+inline fun <reified T : Any?> primitiveSerializerTest(
   serializer: PrimitiveSerializer<T>,
   value: T,
   encoded: ByteBuffer? = null,
@@ -62,14 +77,19 @@ inline fun <reified T : Any?> quasselSerializerTest(
 ) {
   if (encoded != null) {
     if (deserializeFeatureSet != null) {
+      val after = serializer.deserialize(encoded.rewind(), deserializeFeatureSet)
+      assertEquals(0, encoded.remaining())
       if (matcher != null) {
-        testDeserialize(serializer, matcher(value), encoded.rewind(), deserializeFeatureSet)
+        assertThat(after, matcher(value))
       } else {
-        testDeserialize(serializer, value, encoded.rewind(), deserializeFeatureSet)
+        assertEquals(value, after)
       }
     }
     if (serializeFeatureSet != null) {
-      testSerialize(serializer, value, encoded.rewind(), serializeFeatureSet)
+      val after = ChainedByteBuffer().use {
+        serializer.serialize(it, value, serializeFeatureSet)
+      }
+      assertThat(after, ByteBufferMatcher(encoded.rewind()))
     }
   }
   for (featureSet in featureSets) {
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/qtSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/qtSerializerTest.kt
deleted file mode 100644
index 73ea9f907c9592016563ce995f2b32b552cde7f4..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/qtSerializerTest.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.models.types.QtType
-import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
-import org.hamcrest.Matcher
-import java.nio.ByteBuffer
-
-inline fun <reified T : Any?> qtSerializerTest(
-  type: QtType,
-  value: T,
-  encoded: ByteBuffer? = null,
-  noinline matcher: ((T) -> Matcher<T>)? = null,
-  featureSets: List<FeatureSet> = listOf(FeatureSet.none(), FeatureSet.all()),
-  deserializeFeatureSet: FeatureSet? = FeatureSet.all(),
-  serializeFeatureSet: FeatureSet? = FeatureSet.all(),
-) {
-  if (encoded != null) {
-    if (deserializeFeatureSet != null) {
-      if (matcher != null) {
-        testDeserialize(type.serializer<T>(), matcher(value), encoded.rewind(), deserializeFeatureSet)
-      } else {
-        testDeserialize(type.serializer(), value, encoded.rewind(), deserializeFeatureSet)
-      }
-    }
-    if (serializeFeatureSet != null) {
-      testSerialize(type.serializer(), value, encoded.rewind(), serializeFeatureSet)
-    }
-  }
-  for (featureSet in featureSets) {
-    testPrimitiveSerializerDirect(type.serializer(), value, featureSet, matcher?.invoke(value))
-    testQtSerializerVariant(type, value, featureSet, matcher?.invoke(value))
-  }
-}
-
-inline fun <reified T : Any?> qtSerializerTest(
-  serializer: PrimitiveSerializer<T>,
-  value: T,
-  encoded: ByteBuffer? = null,
-  noinline matcher: ((T) -> Matcher<T>)? = null,
-  featureSets: List<FeatureSet> = listOf(FeatureSet.none(), FeatureSet.all()),
-  deserializeFeatureSet: FeatureSet? = FeatureSet.all(),
-  serializeFeatureSet: FeatureSet? = FeatureSet.all(),
-) {
-  if (encoded != null) {
-    if (deserializeFeatureSet != null) {
-      if (matcher != null) {
-        testDeserialize(serializer, matcher(value), encoded.rewind(), deserializeFeatureSet)
-      } else {
-        testDeserialize(serializer, value, encoded.rewind(), deserializeFeatureSet)
-      }
-    }
-    if (serializeFeatureSet != null) {
-      testSerialize(serializer, value, encoded.rewind(), serializeFeatureSet)
-    }
-  }
-  for (featureSet in featureSets) {
-    testPrimitiveSerializerDirect(serializer, value, featureSet, matcher?.invoke(value))
-  }
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt
deleted file mode 100644
index c19cafe5d70dee2227e4108100571eddd8c66215..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serialize.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.HandshakeMessage
-import de.justjanne.libquassel.protocol.models.SignalProxyMessage
-import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer
-import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
-import de.justjanne.libquassel.protocol.serializers.SignalProxySerializer
-import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer
-import de.justjanne.libquassel.protocol.serializers.qt.QVariantListSerializer
-import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
-import org.hamcrest.MatcherAssert.assertThat
-import java.nio.ByteBuffer
-
-fun <T> serialize(
-  serializer: PrimitiveSerializer<T>,
-  data: T,
-  featureSet: FeatureSet = FeatureSet.all()
-): ByteBuffer {
-  val buffer = ChainedByteBuffer()
-  serializer.serialize(buffer, data, featureSet)
-  return buffer.toBuffer()
-}
-
-fun <T> testSerialize(
-  serializer: PrimitiveSerializer<T>,
-  data: T,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val after = serialize(serializer, data, featureSet)
-  assertThat(after, ByteBufferMatcher(buffer))
-}
-
-fun <T : HandshakeMessage> testSerialize(
-  serializer: HandshakeSerializer<T>,
-  data: T,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val map = serializer.serialize(data)
-  val after = serialize(HandshakeMapSerializer, map, featureSet)
-  assertThat(after, ByteBufferMatcher(buffer))
-}
-
-fun <T : SignalProxyMessage> testSerialize(
-  serializer: SignalProxySerializer<T>,
-  data: T,
-  buffer: ByteBuffer,
-  featureSet: FeatureSet = FeatureSet.all()
-) {
-  val list = serializer.serialize(data)
-  val after = serialize(QVariantListSerializer, list, featureSet)
-  assertThat(after, ByteBufferMatcher(buffer))
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt
index c14bece12beb743020d450f16386198d4f0a98f3..ff9231eac00e27561f64205a06b41ac3ee45678d 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/serializerTest.kt
@@ -19,8 +19,13 @@
 package de.justjanne.libquassel.protocol.testutil
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
+import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
+import de.justjanne.libquassel.protocol.io.use
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
+import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import org.hamcrest.Matcher
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.jupiter.api.Assertions.assertEquals
 import java.nio.ByteBuffer
 
 fun <T : Any?> serializerTest(
@@ -33,14 +38,19 @@ fun <T : Any?> serializerTest(
 ) {
   if (encoded != null) {
     if (deserializeFeatureSet != null) {
+      val after = serializer.deserialize(encoded.rewind(), deserializeFeatureSet)
+      assertEquals(0, encoded.remaining())
       if (matcher != null) {
-        testDeserialize(serializer, matcher(value), encoded.rewind(), deserializeFeatureSet)
+        assertThat(after, matcher(value))
       } else {
-        testDeserialize(serializer, value, encoded.rewind(), deserializeFeatureSet)
+        assertEquals(value, after)
       }
     }
     if (serializeFeatureSet != null) {
-      testSerialize(serializer, value, encoded.rewind(), serializeFeatureSet)
+      val after = ChainedByteBuffer().use {
+        serializer.serialize(it, value, serializeFeatureSet)
+      }
+      assertThat(after, ByteBufferMatcher(encoded.rewind()))
     }
   }
 }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt
index 0fa7c85e39b2f694b88feaceac63d5555c7737f9..08e0b835e542773a6d0da98918512a5d29946cd3 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/signalProxySerializerTest.kt
@@ -19,34 +19,53 @@
 package de.justjanne.libquassel.protocol.testutil
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
+import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
+import de.justjanne.libquassel.protocol.io.use
 import de.justjanne.libquassel.protocol.models.SignalProxyMessage
-import de.justjanne.libquassel.protocol.serializers.SignalProxySerializer
+import de.justjanne.libquassel.protocol.serializers.SignalProxyMessageSerializer
+import de.justjanne.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import org.hamcrest.Matcher
+import org.hamcrest.MatcherAssert.assertThat
 import java.nio.ByteBuffer
+import kotlin.test.assertEquals
 
-fun <T : SignalProxyMessage> signalProxySerializerTest(
-  serializer: SignalProxySerializer<T>,
+inline fun <reified T : SignalProxyMessage> signalProxySerializerTest(
   value: T,
   encoded: ByteBuffer? = null,
-  matcher: ((T) -> Matcher<T>)? = null,
+  noinline matcher: ((T?) -> Matcher<T?>)? = null,
   featureSets: List<FeatureSet> = listOf(FeatureSet.none(), FeatureSet.all()),
   deserializeFeatureSet: FeatureSet? = FeatureSet.all(),
   serializeFeatureSet: FeatureSet? = FeatureSet.all(),
 ) {
   if (encoded != null) {
     if (deserializeFeatureSet != null) {
+      val after = SignalProxyMessageSerializer.deserialize(encoded, deserializeFeatureSet) as? T
       if (matcher != null) {
-        testDeserialize(serializer, matcher(value), encoded.rewind(), deserializeFeatureSet)
+        assertThat(after, matcher(value))
       } else {
-        testDeserialize(serializer, value, encoded.rewind(), deserializeFeatureSet)
+        assertEquals(after, value)
       }
     }
     if (serializeFeatureSet != null) {
-      testSerialize(serializer, value, encoded.rewind(), serializeFeatureSet)
+      assertThat(
+        ChainedByteBuffer().use {
+          SignalProxyMessageSerializer.serialize(it, value, serializeFeatureSet)
+        },
+        ByteBufferMatcher(encoded.rewind())
+      )
     }
   }
   for (featureSet in featureSets) {
-    testSignalProxySerializerDirect(serializer, value)
-    testSignalProxySerializerEncoded(serializer, value, featureSet)
+    val after = SignalProxyMessageSerializer.deserialize(
+      ChainedByteBuffer().use {
+        SignalProxyMessageSerializer.serialize(it, value, featureSet)
+      },
+      featureSet
+    ) as? T
+    if (matcher != null) {
+      assertThat(after, matcher(value))
+    } else {
+      assertEquals(value, after)
+    }
   }
 }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerDirect.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerDirect.kt
deleted file mode 100644
index 2fd34c3c27928635570f17ff21f230a4578b7ca5..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerDirect.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.models.HandshakeMessage
-import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer
-import org.hamcrest.Matcher
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.jupiter.api.Assertions.assertEquals
-
-fun <T : HandshakeMessage> testHandshakeSerializerDirect(
-  serializer: HandshakeSerializer<T>,
-  data: T,
-  matcher: Matcher<T>? = null
-) {
-  val after = serializer.deserialize(serializer.serialize(data))
-  if (matcher != null) {
-    assertThat(after, matcher)
-  } else {
-    assertEquals(data, after)
-  }
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerEncoded.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerEncoded.kt
deleted file mode 100644
index fcb03de52978174bbe9181a06227054a470853e5..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testHandshakeSerializerEncoded.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.HandshakeMessage
-import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer
-import de.justjanne.libquassel.protocol.serializers.qt.HandshakeMapSerializer
-import org.hamcrest.Matcher
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.jupiter.api.Assertions.assertEquals
-
-fun <T : HandshakeMessage> testHandshakeSerializerEncoded(
-  serializer: HandshakeSerializer<T>,
-  data: T,
-  featureSet: FeatureSet = FeatureSet.all(),
-  matcher: Matcher<T>? = null
-) {
-  val buffer = ChainedByteBuffer(limit = 16384)
-  HandshakeMapSerializer.serialize(buffer, serializer.serialize(data), featureSet)
-  val result = buffer.toBuffer()
-  val after = serializer.deserialize(HandshakeMapSerializer.deserialize(result, featureSet))
-  assertEquals(0, result.remaining())
-  if (matcher != null) {
-    assertThat(after, matcher)
-  } else {
-    assertEquals(data, after)
-  }
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testQuasselSerializerVariant.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testPrimitiveSerializerVariant.kt
similarity index 71%
rename from libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testQuasselSerializerVariant.kt
rename to libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testPrimitiveSerializerVariant.kt
index 4355cbe6c94a8c925e35d158d8272346263800d6..893bc594e514562b59db8e547fafa63e9c913d48 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testQuasselSerializerVariant.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testPrimitiveSerializerVariant.kt
@@ -20,6 +20,7 @@ package de.justjanne.libquassel.protocol.testutil
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
+import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.serializers.qt.QVariantSerializer
 import de.justjanne.libquassel.protocol.variant.qVariant
@@ -27,7 +28,7 @@ import org.hamcrest.Matcher
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.jupiter.api.Assertions.assertEquals
 
-inline fun <reified T> testQuasselSerializerVariant(
+inline fun <reified T> testPrimitiveSerializerVariant(
   type: QuasselType,
   data: T,
   featureSet: FeatureSet = FeatureSet.all(),
@@ -45,3 +46,22 @@ inline fun <reified T> testQuasselSerializerVariant(
     assertEquals(data, after.data)
   }
 }
+
+inline fun <reified T> testPrimitiveSerializerVariant(
+  type: QtType,
+  data: T,
+  featureSet: FeatureSet = FeatureSet.all(),
+  matcher: Matcher<in T>? = null
+) {
+  val buffer = ChainedByteBuffer(limit = 16384)
+  QVariantSerializer.serialize(buffer, qVariant(data, type), featureSet)
+  val result = buffer.toBuffer()
+  val after = QVariantSerializer.deserialize(result, featureSet)
+  assertEquals(0, result.remaining())
+  if (matcher != null) {
+    @Suppress("UNCHECKED_CAST")
+    assertThat(after.data as T, matcher)
+  } else {
+    assertEquals(data, after.data)
+  }
+}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testQtSerializerVariant.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testQtSerializerVariant.kt
deleted file mode 100644
index c7d6094af8ddea36a1c6389d419abe60c0ebcaa6..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testQtSerializerVariant.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.types.QtType
-import de.justjanne.libquassel.protocol.serializers.qt.QVariantSerializer
-import de.justjanne.libquassel.protocol.variant.qVariant
-import org.hamcrest.Matcher
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.jupiter.api.Assertions.assertEquals
-
-inline fun <reified T> testQtSerializerVariant(
-  type: QtType,
-  data: T,
-  featureSet: FeatureSet = FeatureSet.all(),
-  matcher: Matcher<in T>? = null
-) {
-  val buffer = ChainedByteBuffer(limit = 16384)
-  QVariantSerializer.serialize(buffer, qVariant(data, type), featureSet)
-  val result = buffer.toBuffer()
-  val after = QVariantSerializer.deserialize(result, featureSet)
-  assertEquals(0, result.remaining())
-  if (matcher != null) {
-    @Suppress("UNCHECKED_CAST")
-    assertThat(after.data as T, matcher)
-  } else {
-    assertEquals(data, after.data)
-  }
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testSignalProxySerializerDirect.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testSignalProxySerializerDirect.kt
deleted file mode 100644
index 10bc255b167e1a2d2bb6d9578290d2733679d61c..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testSignalProxySerializerDirect.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.models.SignalProxyMessage
-import de.justjanne.libquassel.protocol.serializers.SignalProxySerializer
-import org.hamcrest.Matcher
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.jupiter.api.Assertions.assertEquals
-
-fun <T : SignalProxyMessage> testSignalProxySerializerDirect(
-  serializer: SignalProxySerializer<T>,
-  data: T,
-  matcher: Matcher<T>? = null
-) {
-  val after = serializer.deserialize(serializer.serialize(data))
-  if (matcher != null) {
-    assertThat(after, matcher)
-  } else {
-    assertEquals(data, after)
-  }
-}
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testSignalProxySerializerEncoded.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testSignalProxySerializerEncoded.kt
deleted file mode 100644
index 8575be4683c71e2f50511f1bcd1aa2e0bd8914f4..0000000000000000000000000000000000000000
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/testSignalProxySerializerEncoded.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Quasseldroid - Quassel client for Android
- *
- * Copyright (c) 2021 Janne Mareike Koschinski
- * Copyright (c) 2021 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.justjanne.libquassel.protocol.testutil
-
-import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.SignalProxyMessage
-import de.justjanne.libquassel.protocol.serializers.SignalProxySerializer
-import de.justjanne.libquassel.protocol.serializers.qt.QVariantListSerializer
-import org.hamcrest.Matcher
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.jupiter.api.Assertions.assertEquals
-
-fun <T : SignalProxyMessage> testSignalProxySerializerEncoded(
-  serializer: SignalProxySerializer<T>,
-  data: T,
-  featureSet: FeatureSet = FeatureSet.all(),
-  matcher: Matcher<T>? = null
-) {
-  val buffer = ChainedByteBuffer(limit = 16384)
-  QVariantListSerializer.serialize(buffer, serializer.serialize(data), featureSet)
-  val result = buffer.toBuffer()
-  val after = serializer.deserialize(QVariantListSerializer.deserialize(result, featureSet))
-  assertEquals(0, result.remaining())
-  if (matcher != null) {
-    assertThat(after, matcher)
-  } else {
-    assertEquals(data, after)
-  }
-}