From da5264c5422422d021a7e8ff5c6096dc930b117b Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 18 Aug 2020 01:49:19 +0200 Subject: [PATCH] Fixed RMI short/int packing for negative numbers --- src/dorkbox/network/rmi/RmiUtils.kt | 9 ++--- test/dorkboxTest/network/rmi/RmiPackIdTest.kt | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 test/dorkboxTest/network/rmi/RmiPackIdTest.kt diff --git a/src/dorkbox/network/rmi/RmiUtils.kt b/src/dorkbox/network/rmi/RmiUtils.kt index c46b8f9a..2bae4849 100644 --- a/src/dorkbox/network/rmi/RmiUtils.kt +++ b/src/dorkbox/network/rmi/RmiUtils.kt @@ -427,16 +427,15 @@ object RmiUtils { return allClasses } - private const val RIGHT = 0xFFFF fun packShorts(left: Int, right: Int): Int { - return left shl 16 or (right and RIGHT) + return left shl 16 or (right and 0xFFFF) } fun unpackLeft(packedInt: Int): Int { - return packedInt ushr 16 // >>> operator 0-fills from left - + return packedInt shr 16 } + fun unpackRight(packedInt: Int): Int { - return packedInt and RIGHT + return packedInt.toShort().toInt() } } diff --git a/test/dorkboxTest/network/rmi/RmiPackIdTest.kt b/test/dorkboxTest/network/rmi/RmiPackIdTest.kt new file mode 100644 index 00000000..29bd87c0 --- /dev/null +++ b/test/dorkboxTest/network/rmi/RmiPackIdTest.kt @@ -0,0 +1,40 @@ +package dorkboxTest.network.rmi + +import dorkbox.network.rmi.RmiUtils +import org.junit.Assert +import org.junit.Test + +/** + * + */ +class RmiPackIdTest { + @Test + fun rmiObjectIdNegative() { + // these are SHORTS, so SHORT.MIN -> SHORT.MAX, excluding 0 + for (rmiObjectId in Short.MIN_VALUE..-1) { + for (rmiId in 1..Short.MAX_VALUE) { + val packed = RmiUtils.packShorts(rmiObjectId, rmiId) + val rmiObjectId2 = RmiUtils.unpackLeft(packed) + val rmiId2 = RmiUtils.unpackRight(packed) + + Assert.assertEquals(rmiObjectId, rmiObjectId2) + Assert.assertEquals(rmiId, rmiId2) + } + } + } + + @Test + fun rmiIdNegative() { + // these are SHORTS, so SHORT.MIN -> SHORT.MAX, excluding 0 + for (rmiId in Short.MIN_VALUE..-1) { + for (rmiObjectId in 1..Short.MAX_VALUE) { + val packed = RmiUtils.packShorts(rmiObjectId, rmiId) + val rmiObjectId2 = RmiUtils.unpackLeft(packed) + val rmiId2 = RmiUtils.unpackRight(packed) + + Assert.assertEquals(rmiObjectId, rmiObjectId2) + Assert.assertEquals(rmiId, rmiId2) + } + } + } +}