Fixed RMI short/int packing for negative numbers

This commit is contained in:
nathan 2020-08-18 01:49:19 +02:00
parent d2caea6645
commit da5264c542
2 changed files with 44 additions and 5 deletions

View File

@ -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()
}
}

View File

@ -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)
}
}
}
}