From 0ea27011d063d4fa0e34c6916e94d4606fe5aae0 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Mon, 8 Feb 2021 01:29:39 +0100
Subject: [PATCH] Additional testing

---
 .../kuschku/quasseldroid/ExampleUnitTest.kt   |  1 -
 .../main/kotlin/de/kuschku/bitflags/Flags.kt  |  1 -
 .../de/kuschku/codecoverage/Generated.kt      |  2 +-
 .../protocol/features/LegacyFeature.kt        |  1 -
 .../protocol/features/QuasselFeature.kt       |  3 +
 .../libquassel/protocol/io/ByteBufferUtil.kt  |  6 +-
 .../protocol/io/ChainedByteBuffer.kt          |  5 +-
 .../libquassel/protocol/io/StringEncoder.kt   | 18 +++--
 .../serializers/primitive/BoolSerializer.kt   |  2 +-
 .../serializers/primitive/ByteSerializer.kt   |  2 +-
 .../serializers/primitive/DoubleSerializer.kt |  2 +-
 .../serializers/primitive/FloatSerializer.kt  |  2 +-
 .../serializers/primitive/IntSerializer.kt    |  2 +-
 .../serializers/primitive/LongSerializer.kt   |  2 +-
 .../serializers/primitive/QCharSerializer.kt  |  2 +-
 .../serializers/primitive/ShortSerializer.kt  |  2 +-
 .../protocol/types/BufferActivity.kt          |  1 -
 .../libquassel/protocol/types/BufferType.kt   |  1 -
 .../libquassel/protocol/types/MessageFlag.kt  |  1 -
 .../libquassel/protocol/types/MessageType.kt  |  1 -
 .../libquassel/protocol/variant/QVariant.kt   | 56 ++++++---------
 .../protocol/io/StringEncoderTest.kt          | 24 ++++---
 .../handshake/ClientInitSerializerTest.kt     | 14 ++++
 .../primitive/BoolSerializerTest.kt           | 12 ++++
 .../primitive/BufferIdSerializerTest.kt       | 66 +++++++++++++++++
 .../primitive/BufferInfoSerializerTest.kt     | 14 ++++
 .../primitive/ByteBufferSerializerTest.kt     | 12 ++++
 .../primitive/ByteSerializerTest.kt           | 13 ++++
 .../primitive/DateTimeSerializerTest.kt       | 13 +++-
 .../primitive/DoubleSerializerTest.kt         | 13 ++++
 .../primitive/FloatSerializerTest.kt          | 12 ++++
 .../primitive/IdentityIdSerializerTest.kt     | 66 +++++++++++++++++
 .../primitive/IntSerializerTest.kt            | 12 ++++
 .../primitive/LongSerializerTest.kt           | 12 ++++
 .../primitive/MessageSerializerTest.kt        | 15 ++++
 .../primitive/MsgIdSerializerTest.kt          | 70 +++++++++++++++++++
 .../primitive/NetworkIdSerializerTest.kt      | 66 +++++++++++++++++
 .../primitive/PeerPtrSerializerTest.kt        | 70 +++++++++++++++++++
 .../primitive/QCharSerializerTest.kt          | 12 ++++
 .../primitive/QVariantListSerializerTest.kt   | 59 ++++++++++++++++
 .../primitive/QVariantMapSerializerTest.kt    | 28 +++++++-
 .../primitive/QVariantSerializerTest.kt       | 12 ++++
 .../primitive/ShortSerializerTest.kt          | 12 ++++
 .../primitive/StringSerializerTest.kt         | 10 +++
 .../primitive/UByteSerializerTest.kt          | 12 ++++
 .../primitive/UIntSerializerTest.kt           | 12 ++++
 .../primitive/ULongSerializerTest.kt          | 12 ++++
 .../primitive/UShortSerializerTest.kt         | 12 ++++
 .../primitive/VoidSerializerTest.kt           | 43 ++++++++++++
 .../protocol/testutil/byteBufferOf.kt         | 15 +++-
 .../protocol/variant/QVariantTest.kt          |  8 +++
 51 files changed, 792 insertions(+), 72 deletions(-)
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt
 create mode 100644 protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt

diff --git a/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt b/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt
index 6a9c5578c..990e55219 100644
--- a/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt
+++ b/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt
@@ -69,7 +69,6 @@ class ExampleUnitTest {
           channel.write(sizeBuffer)
           sizeBuffer.clear()
         }
-        println(sendBuffer.toBuffer().contentToString())
         channel.write(sendBuffer)
         channel.flush()
         sendBuffer.clear()
diff --git a/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt b/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt
index cc6a8daa3..716d905a5 100644
--- a/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt
+++ b/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt
@@ -20,6 +20,5 @@
 package de.kuschku.bitflags
 
 interface Flags<T, U> where U : Flag<T>, U : Enum<U> {
-  operator fun get(value: T): U?
   val all: Set<U>
 }
diff --git a/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt b/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt
index 7b3674fb8..a0492bb5b 100644
--- a/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt
+++ b/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt
@@ -22,5 +22,5 @@ package de.kuschku.codecoverage
 /**
  * Used to mark inline functions as generated for jacoco
  */
-@Retention(AnnotationRetention.SOURCE)
+@Retention(AnnotationRetention.RUNTIME)
 annotation class Generated
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt
index f069ccc47..fece09639 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt
@@ -78,7 +78,6 @@ enum class LegacyFeature(
     fun get(feature: QuasselFeature) = features[feature]
 
     private val values = values().associateBy(LegacyFeature::value)
-    override fun get(value: UInt) = values[value]
     override val all: LegacyFeatures = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt
index 3466e053d..09ee52b71 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt
@@ -19,6 +19,9 @@
 
 package de.kuschku.libquassel.protocol.features
 
+import de.kuschku.codecoverage.Generated
+
+@Generated
 inline class QuasselFeatureName(
   val name: String,
 )
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt
index d4f7e0797..15bf1c782 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt
@@ -21,12 +21,10 @@ package de.kuschku.libquassel.protocol.io
 
 import java.nio.ByteBuffer
 
-fun copyData(from: ByteBuffer, to: ByteBuffer, desiredAmount: Int = -1) {
+fun copyData(from: ByteBuffer, to: ByteBuffer, desiredAmount: Int) {
   val limit = from.limit()
   val availableAmount = minOf(from.remaining(), to.remaining())
-  val amount =
-    if (desiredAmount < 0) availableAmount
-    else minOf(availableAmount, desiredAmount)
+  val amount = minOf(availableAmount, desiredAmount)
   from.limit(from.position() + amount)
   to.put(from)
   from.limit(limit)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt
index ba8aeade6..20c977ead 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt
@@ -90,8 +90,11 @@ class ChainedByteBuffer(
       val requested = minOf(value.remaining(), chunkSize)
       if (bufferList.lastOrNull()?.hasRemaining() != true) {
         ensureSpace(requested)
+      } else {
+        ensureSpace(minOf(bufferList.last().remaining(), requested))
       }
-      copyData(value, bufferList.last())
+
+      copyData(value, bufferList.last(), requested)
     }
   }
 
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt
index 08ebb2a33..782c8946d 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt
@@ -52,13 +52,21 @@ class StringEncoder(charset: Charset) {
     return encodeInternal(charBuffer)
   }
 
-  fun encodeChar(data: Char?): ByteBuffer {
-    if (!encoder.canEncode(data ?: '\u0000')) {
-      return ByteBuffer.allocateDirect(2)
+  private fun replacementChar(data: Char?): Char {
+    return if (data == null || !encoder.canEncode(data)) {
+      if (encoder.canEncode('\uFFFD')) {
+        '\uFFFD'
+      } else {
+        '\u0000'
+      }
+    } else {
+      data
     }
+  }
 
-    val charBuffer = charBuffer(2)
-    charBuffer.put(data ?: '\u0000')
+  fun encodeChar(data: Char?): ByteBuffer {
+    val charBuffer = charBuffer(1)
+    charBuffer.put(replacementChar(data))
     charBuffer.flip()
     return encodeInternal(charBuffer)
   }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt
index 0e0b73a6a..1e51bd537 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object BoolSerializer : QtSerializer<Boolean> {
   override val qtType: QtType = QtType.Bool
-  override val javaType: Class<Boolean> = Boolean::class.java
+  override val javaType: Class<Boolean> = Boolean::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Boolean, featureSet: FeatureSet) {
     buffer.put(
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt
index e996faf6e..2d3d7083c 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object ByteSerializer : QtSerializer<Byte> {
   override val qtType: QtType = QtType.Char
-  override val javaType: Class<Byte> = Byte::class.java
+  override val javaType: Class<Byte> = Byte::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Byte, featureSet: FeatureSet) {
     buffer.put(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt
index 6217ea633..1e81a519d 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object DoubleSerializer : QtSerializer<Double> {
   override val qtType: QtType = QtType.Double
-  override val javaType: Class<Double> = Double::class.java
+  override val javaType: Class<Double> = Double::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Double, featureSet: FeatureSet) {
     buffer.putDouble(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt
index 9cfaf16be..636262b56 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object FloatSerializer : QtSerializer<Float> {
   override val qtType: QtType = QtType.Float
-  override val javaType: Class<Float> = Float::class.java
+  override val javaType: Class<Float> = Float::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Float, featureSet: FeatureSet) {
     buffer.putFloat(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt
index 98a38bea7..54db40355 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object IntSerializer : QtSerializer<Int> {
   override val qtType: QtType = QtType.Int
-  override val javaType: Class<Int> = Int::class.java
+  override val javaType: Class<Int> = Int::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Int, featureSet: FeatureSet) {
     buffer.putInt(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt
index 82bfdcff4..d592f55ef 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object LongSerializer : QtSerializer<Long> {
   override val qtType: QtType = QtType.Long
-  override val javaType: Class<Long> = Long::class.java
+  override val javaType: Class<Long> = Long::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Long, featureSet: FeatureSet) {
     buffer.putLong(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt
index bf78fc8c5..77045149b 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt
@@ -28,7 +28,7 @@ import kotlin.concurrent.getOrSet
 
 object QCharSerializer : QtSerializer<Char> {
   override val qtType: QtType = QtType.QChar
-  override val javaType: Class<out Char> = Char::class.java
+  override val javaType: Class<out Char> = Char::class.javaObjectType
 
   private val encoderLocal = ThreadLocal<StringEncoder>()
   private fun encoder() = encoderLocal.getOrSet { StringEncoder(Charsets.UTF_16BE) }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt
index 409beba5f..d3ea4dd89 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object ShortSerializer : QtSerializer<Short> {
   override val qtType: QtType = QtType.Short
-  override val javaType: Class<Short> = Short::class.java
+  override val javaType: Class<Short> = Short::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Short, featureSet: FeatureSet) {
     buffer.putShort(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt
index 557155d56..5aa12c8ae 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt
@@ -33,7 +33,6 @@ enum class BufferActivity(
 
   companion object : Flags<UInt, BufferActivity> {
     private val values = values().associateBy(BufferActivity::value)
-    override fun get(value: UInt) = values[value]
     override val all: BufferActivities = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt
index 356d0bbf1..cc71f3465 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt
@@ -34,7 +34,6 @@ enum class BufferType(
 
   companion object : Flags<UShort, BufferType> {
     private val values = values().associateBy(BufferType::value)
-    override fun get(value: UShort) = values[value]
     override val all: BufferTypes = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt
index 8d45bfed5..86008c5a4 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt
@@ -34,7 +34,6 @@ enum class MessageFlag(
 
   companion object : Flags<UInt, MessageFlag> {
     private val values = values().associateBy(MessageFlag::value)
-    override fun get(value: UInt) = values[value]
     override val all: MessageFlags = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt
index e0882d595..4badbe176 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt
@@ -48,7 +48,6 @@ enum class MessageType(
 
   companion object : Flags<UInt, MessageType> {
     private val values = values().associateBy(MessageType::value)
-    override fun get(value: UInt) = values[value]
     override val all: MessageTypes = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt
index a006ff4c7..ae6ac6ab1 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt
@@ -27,22 +27,29 @@ import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
 import de.kuschku.libquassel.protocol.serializers.primitive.QtSerializer
 import de.kuschku.libquassel.protocol.serializers.primitive.QuasselSerializer
 import java.nio.ByteBuffer
-import java.util.*
 
 typealias QVariant_ = QVariant<*>
 typealias QVariantList = List<QVariant_>
 typealias QVariantMap = Map<String, QVariant_>
 typealias QStringList = List<String?>
 
-sealed class QVariant<T> constructor(
-  private val data: T,
-  open val serializer: QtSerializer<T>,
-) {
-  class Typed<T> internal constructor(data: T, serializer: QtSerializer<T>) :
-    QVariant<T>(data, serializer)
+sealed class QVariant<T> {
+  abstract val data: T
+  abstract val serializer: QtSerializer<T>
 
-  class Custom<T> internal constructor(data: T, override val serializer: QuasselSerializer<T>) :
-    QVariant<T>(data, serializer)
+  data class Typed<T> internal constructor(
+    override val data: T,
+    override val serializer: QtSerializer<T>
+  ) : QVariant<T>() {
+    override fun toString() = super.toString()
+  }
+
+  data class Custom<T> internal constructor(
+    override val data: T,
+    override val serializer: QuasselSerializer<T>
+  ) : QVariant<T>() {
+    override fun toString() = super.toString()
+  }
 
   fun value(): T = data
 
@@ -51,11 +58,13 @@ sealed class QVariant<T> constructor(
     serializer.serialize(buffer, data, featureSet)
   }
 
-  override fun toString() = when (data) {
-    is ByteBuffer ->
-      "QVariant(${serializer::class.java.simpleName}, ${data.contentToString()})"
-    else ->
-      "QVariant(${serializer::class.java.simpleName}, $data)"
+  override fun toString() = data.let {
+    when (it) {
+      is ByteBuffer ->
+        "QVariant(${serializer::class.java.simpleName}, ${it.contentToString()})"
+      else ->
+        "QVariant(${serializer::class.java.simpleName}, $it)"
+    }
   }
 
   @Suppress("UNCHECKED_CAST")
@@ -63,25 +72,6 @@ sealed class QVariant<T> constructor(
     if (serializer.javaType == T::class.java && this.value() is T) this as QVariant<T>
     else null
 
-  override fun equals(other: Any?): Boolean {
-    if (this === other) return true
-    if (javaClass != other?.javaClass) return false
-
-    other as QVariant<*>
-
-    if (data != other.data) return false
-    if (serializer != other.serializer) return false
-
-    return true
-  }
-
-  override fun hashCode(): Int {
-    var result = data?.hashCode() ?: 0
-    result = 31 * result + serializer.hashCode()
-    return result
-  }
-
-
   companion object {
     fun <T> of(data: T, serializer: QtSerializer<T>) = Typed(data, serializer)
     fun <T> of(data: T, serializer: QuasselSerializer<T>) = Custom(data, serializer)
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt
index 2b356d8bd..cb1db12ab 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt
@@ -47,6 +47,18 @@ class StringEncoderTest {
     )
   }
 
+  @Test
+  fun testUnencodableString() {
+    assertEquals(
+      0,
+      ascii.encode("\uFFFF").remaining()
+    )
+    assertThat(
+      ascii.encode("\uFFFF"),
+      ByteBufferMatcher(byteBufferOf())
+    )
+  }
+
   @Test
   fun testNullChar() {
     assertEquals(
@@ -58,13 +70,9 @@ class StringEncoderTest {
       ByteBufferMatcher(byteBufferOf(0))
     )
 
-    assertEquals(
-      1,
-      utf8.encodeChar(null).remaining()
-    )
     assertThat(
       utf8.encodeChar(null),
-      ByteBufferMatcher(byteBufferOf(0))
+      ByteBufferMatcher(byteBufferOf(0xEFu, 0xBFu, 0xBDu))
     )
 
     assertEquals(
@@ -73,19 +81,19 @@ class StringEncoderTest {
     )
     assertThat(
       utf16.encodeChar(null),
-      ByteBufferMatcher(byteBufferOf(0, 0)),
+      ByteBufferMatcher(byteBufferOf(0xFFu, 0xFDu)),
     )
   }
 
   @Test
   fun testUnencodableChar() {
     assertEquals(
-      2,
+      1,
       ascii.encodeChar('\uFFFF').remaining()
     )
     assertThat(
       ascii.encodeChar('\uFFFF'),
-      ByteBufferMatcher(byteBufferOf(0, 0))
+      ByteBufferMatcher(byteBufferOf(0))
     )
   }
 }
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
index fca778612..a48194552 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
@@ -22,11 +22,25 @@ import de.kuschku.bitflags.none
 import de.kuschku.libquassel.protocol.features.FeatureSet
 import de.kuschku.libquassel.protocol.features.LegacyFeature
 import de.kuschku.libquassel.protocol.messages.handshake.ClientInit
+import de.kuschku.libquassel.protocol.serializers.HandshakeSerializers
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.serializers.primitive.BoolSerializer
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.handshakeSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
 import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.Assertions.assertEquals as assertEquals
 
 class ClientInitSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ClientInitSerializer,
+      HandshakeSerializers.find<ClientInit>("ClientInit"),
+    )
+  }
+
   @Test
   fun testSimple() = handshakeSerializerTest(
     ClientInitSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt
index c6dfa9a3c..4e38c0ba9 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class BoolSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      BoolSerializer,
+      QtSerializers.find<Boolean>(QtType.Bool),
+    )
+  }
+
   @Test
   fun testTrue() = qtSerializerTest(
     BoolSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt
new file mode 100644
index 000000000..21f9d2cbd
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.BufferId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class BufferIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      BufferIdSerializer,
+      QuasselSerializers.find<BufferId>(QuasselType.BufferId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId(0),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0)
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1)
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1)
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt
index f32ae8ae1..934aef98c 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt
@@ -20,15 +20,29 @@ package de.kuschku.libquassel.protocol.serializers.primitive
 
 import de.kuschku.bitflags.none
 import de.kuschku.bitflags.validValues
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
 import de.kuschku.libquassel.protocol.types.BufferId
 import de.kuschku.libquassel.protocol.types.BufferInfo
 import de.kuschku.libquassel.protocol.types.BufferType
 import de.kuschku.libquassel.protocol.types.NetworkId
+import de.kuschku.libquassel.protocol.variant.QtType
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class BufferInfoSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      BufferInfoSerializer,
+      QuasselSerializers.find<BufferInfo>(QuasselType.BufferInfo),
+    )
+  }
+
   @Test
   fun testBaseCase() = quasselSerializerTest(
     BufferInfoSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt
index dfaa87f44..b0671da59 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt
@@ -18,13 +18,25 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import java.nio.ByteBuffer
 
 class ByteBufferSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ByteBufferSerializer,
+      QtSerializers.find<ByteBuffer>(QtType.QByteArray),
+    )
+  }
+
   @Test
   fun testBaseCase() = qtSerializerTest(
     ByteBufferSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt
index acb9c9960..0a8557f30 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt
@@ -18,12 +18,25 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
+import java.nio.ByteBuffer
 import kotlin.experimental.inv
 
 class ByteSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ByteSerializer,
+      QtSerializers.find<Byte>(QtType.Char),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     ByteSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt
index f2291dbf5..a93efda96 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt
@@ -18,16 +18,27 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.TemporalMatcher
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.assertThrows
 import org.threeten.bp.*
 import org.threeten.bp.chrono.JapaneseDate
+import org.threeten.bp.temporal.Temporal
 
 class DateTimeSerializerTest {
-  private val serializer = DateTimeSerializer
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      DateTimeSerializer,
+      QtSerializers.find<Temporal>(QtType.QDateTime),
+    )
+  }
 
   @Test
   fun testEpoch() = qtSerializerTest(
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt
index 5b6c41938..0242bcb35 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt
@@ -18,11 +18,24 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
+import org.threeten.bp.temporal.Temporal
 
 class DoubleSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      DoubleSerializer,
+      QtSerializers.find<Double>(QtType.Double),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     DoubleSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt
index ea12027a0..b491e312c 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class FloatSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      FloatSerializer,
+      QtSerializers.find<Float>(QtType.Float),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     FloatSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt
new file mode 100644
index 000000000..34e0fc5b5
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.IdentityId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class IdentityIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      IdentityIdSerializer,
+      QuasselSerializers.find<IdentityId>(QuasselType.IdentityId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId(0),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0)
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1)
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1)
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt
index 019f3245e..21bd1bb8d 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class IntSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      IntSerializer,
+      QtSerializers.find<Int>(QtType.Int),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     IntSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt
index f6cc0729c..0c9fec88c 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class LongSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      LongSerializer,
+      QtSerializers.find<Long>(QtType.Long),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     LongSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt
index 0c5328670..e07503e16 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt
@@ -22,13 +22,28 @@ package de.kuschku.libquassel.protocol.serializers.primitive
 import de.kuschku.bitflags.none
 import de.kuschku.bitflags.validValues
 import de.kuschku.libquassel.protocol.features.FeatureSet
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
 import de.kuschku.libquassel.protocol.types.*
+import de.kuschku.libquassel.protocol.variant.QtType
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.threeten.bp.Instant
+import java.nio.ByteBuffer
 
 class MessageSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      MessageSerializer,
+      QuasselSerializers.find<Message>(QuasselType.Message),
+    )
+  }
+
   @Test
   fun testEmpty() = quasselSerializerTest(
     MessageSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt
new file mode 100644
index 000000000..ce2107d82
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.features.FeatureSet
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.MsgId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class MsgIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      MsgIdSerializer,
+      QuasselSerializers.find<MsgId>(QuasselType.MsgId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId(0),
+    byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt
new file mode 100644
index 000000000..996bc8975
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.NetworkId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class NetworkIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      NetworkIdSerializer,
+      QuasselSerializers.find<NetworkId>(QuasselType.NetworkId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId(0),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0)
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1)
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1)
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt
new file mode 100644
index 000000000..0018e5a64
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.features.FeatureSet
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.MsgId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class PeerPtrSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      PeerPtrSerializer,
+      QuasselSerializers.find<ULong>(QuasselType.PeerPtr),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    PeerPtrSerializer,
+    0uL,
+    byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    PeerPtrSerializer,
+    ULong.MIN_VALUE,
+    byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    PeerPtrSerializer,
+    ULong.MAX_VALUE,
+    byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    PeerPtrSerializer,
+    0uL.inv(),
+    byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt
index 411635ccf..b152f1f40 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt
@@ -18,12 +18,24 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.BomMatcherChar
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class QCharSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QCharSerializer,
+      QtSerializers.find<Char>(QtType.QChar),
+    )
+  }
+
   @Test
   fun testNull() = qtSerializerTest(
     QCharSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt
new file mode 100644
index 000000000..4bbff8522
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt
@@ -0,0 +1,59 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.matchers.MapMatcher
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QVariantList
+import de.kuschku.libquassel.protocol.variant.QVariantMap
+import de.kuschku.libquassel.protocol.variant.QtType
+import de.kuschku.libquassel.protocol.variant.qVariant
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class QVariantListSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QVariantListSerializer,
+      QtSerializers.find<QVariantList>(QtType.QVariantList),
+    )
+  }
+
+  @Test
+  fun testEmpty() = qtSerializerTest(
+    QVariantListSerializer,
+    listOf(),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testNormal() = qtSerializerTest(
+    QVariantListSerializer,
+    listOf(
+      qVariant("AzureDiamond", QtType.QString),
+      qVariant("hunter2", QtType.QString)
+    ),
+    byteBufferOf( 0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x18u, 0x00u, 0x41u, 0x00u, 0x7Au, 0x00u, 0x75u, 0x00u, 0x72u, 0x00u, 0x65u, 0x00u, 0x44u, 0x00u, 0x69u, 0x00u, 0x61u, 0x00u, 0x6Du, 0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x64u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Eu, 0x00u, 0x68u, 0x00u, 0x75u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x32u)
+  )
+}
+
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt
index bc38705c6..04d60612c 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt
@@ -18,14 +18,26 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.MapMatcher
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QVariantMap
 import de.kuschku.libquassel.protocol.variant.QtType
 import de.kuschku.libquassel.protocol.variant.qVariant
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class QVariantMapSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QVariantMapSerializer,
+      QtSerializers.find<QVariantMap>(QtType.QVariantMap),
+    )
+  }
+
   @Test
   fun testEmpty() = qtSerializerTest(
     QVariantMapSerializer,
@@ -50,8 +62,20 @@ class QVariantMapSerializerTest {
     mapOf(
       "" to qVariant<String?>(null, QtType.QString)
     ),
-    byteBufferOf(0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0xFFu),
-    ::MapMatcher
+    byteBufferOf(
+      // length
+      0x00u, 0x00u, 0x00u, 0x01u,
+      // length of key
+      0xFFu, 0xFFu, 0xFFu, 0xFFu,
+      // type of value
+      0x00u, 0x00u, 0x00u, 0x0Au,
+      // isNull of value
+      0x00u,
+      // length of value
+      0xFFu, 0xFFu, 0xFFu, 0xFFu
+    ),
+    ::MapMatcher,
+    serializeFeatureSet = null
   )
 }
 
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt
index 06e4907bb..483a8782e 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt
@@ -19,12 +19,24 @@
 package de.kuschku.libquassel.protocol.serializers.primitive
 
 import de.kuschku.libquassel.protocol.serializers.NoSerializerForTypeException
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.deserialize
+import de.kuschku.libquassel.protocol.variant.QVariant_
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.assertThrows
 
 class QVariantSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QVariantSerializer,
+      QtSerializers.find<QVariant_>(QtType.QVariant),
+    )
+  }
+
   @Test
   fun testUnregisteredQtType() {
     assertThrows<NoSerializerForTypeException> {
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt
index 644a03b47..cd0832003 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt
@@ -18,12 +18,24 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import kotlin.experimental.inv
 
 class ShortSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ShortSerializer,
+      QtSerializers.find<Short>(QtType.Short),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     ShortSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt
index 01c8ace78..98484c464 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt
@@ -18,17 +18,27 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.deserialize
 import de.kuschku.libquassel.protocol.testutil.matchers.BomMatcherString
 import de.kuschku.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import de.kuschku.libquassel.protocol.testutil.testQtSerializerDirect
 import de.kuschku.libquassel.protocol.testutil.testQtSerializerVariant
+import de.kuschku.libquassel.protocol.variant.QtType
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class StringSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      StringSerializerUtf16,
+      QtSerializers.find<String>(QtType.QString),
+    )
+  }
+
   @Test
   fun testBigListOfNaughtyStrings() {
     this::class.java.getResourceAsStream("/blns.txt")!!.bufferedReader(Charsets.UTF_8).forEachLine {
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt
index 79766902b..df63eeca9 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class UByteSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      UByteSerializer,
+      QtSerializers.find<UByte>(QtType.UChar),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     UByteSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt
index 8b4d49858..5cdd0b78e 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class UIntSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      UIntSerializer,
+      QtSerializers.find<UInt>(QtType.UInt),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     UIntSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt
index 3a68c7c63..53db1a21d 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class ULongSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ULongSerializer,
+      QtSerializers.find<ULong>(QtType.ULong),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     ULongSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt
index 57192fb64..9d7cfeb27 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class UShortSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      UShortSerializer,
+      QtSerializers.find<UShort>(QtType.UShort),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     UShortSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt
new file mode 100644
index 000000000..76db87989
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt
@@ -0,0 +1,43 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class VoidSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      VoidSerializer,
+      QtSerializers.find<Unit>(QtType.Void),
+    )
+  }
+
+  @Test
+  fun test() = qtSerializerTest(
+    VoidSerializer,
+    Unit,
+    byteBufferOf()
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt
index 65f2eb75c..61e196dd7 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt
@@ -20,5 +20,16 @@ package de.kuschku.libquassel.protocol.testutil
 
 import java.nio.ByteBuffer
 
-inline fun byteBufferOf(vararg elements: Byte) = ByteBuffer.wrap(byteArrayOf(*elements))
-inline fun byteBufferOf(vararg elements: UByte) = ByteBuffer.wrap(ubyteArrayOf(*elements).toByteArray())
+@Suppress("NOTHING_TO_INLINE")
+inline fun byteBufferOf(
+  vararg elements: Byte
+): ByteBuffer = ByteBuffer.wrap(byteArrayOf(*elements))
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun byteBufferOf(
+  vararg elements: UByte
+): ByteBuffer = ByteBuffer.wrap(ubyteArrayOf(*elements).toByteArray())
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun byteBufferOf(): ByteBuffer =
+  ByteBuffer.allocateDirect(0)
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt
index df0d34f82..b55e43f4b 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt
@@ -20,6 +20,7 @@
 package de.kuschku.libquassel.protocol.variant
 
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.types.BufferId
 import de.kuschku.libquassel.protocol.variant.QtType
 import de.kuschku.libquassel.protocol.variant.qVariant
 import org.junit.jupiter.api.Assertions.*
@@ -42,5 +43,12 @@ class QVariantTest {
         QtType.QString
       ).toString()
     )
+    assertEquals(
+      "QVariant(BufferIdSerializer, BufferId(-1))",
+      qVariant(
+        BufferId(-1),
+        QuasselType.BufferId
+      ).toString()
+    )
   }
 }
-- 
GitLab