Merge pull request #32 from bchallenor/master
Support reading all segments from a single ByteBuffer (e.g. memory mapped file)
This commit is contained in:
commit
89e3dff2da
8 changed files with 1161 additions and 988 deletions
571
compiler/src/test/scala/org/capnproto/EncodingSuite.scala
Normal file
571
compiler/src/test/scala/org/capnproto/EncodingSuite.scala
Normal file
|
@ -0,0 +1,571 @@
|
||||||
|
// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
||||||
|
// Licensed under the MIT License:
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
package org.capnproto
|
||||||
|
|
||||||
|
import org.capnproto.test.Test._
|
||||||
|
import org.scalatest.FunSuite
|
||||||
|
import org.scalatest.Matchers._
|
||||||
|
|
||||||
|
class EncodingSuite extends FunSuite {
|
||||||
|
test("AllTypes") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
TestUtil.initTestMessage(allTypes)
|
||||||
|
TestUtil.checkTestMessage(allTypes)
|
||||||
|
TestUtil.checkTestMessage(allTypes.asReader())
|
||||||
|
}
|
||||||
|
|
||||||
|
test("AllTypesMultiSegment") {
|
||||||
|
val message = new MessageBuilder(5, BuilderArena.AllocationStrategy.FIXED_SIZE)
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
TestUtil.initTestMessage(allTypes)
|
||||||
|
|
||||||
|
TestUtil.checkTestMessage(allTypes)
|
||||||
|
TestUtil.checkTestMessage(allTypes.asReader())
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Setters") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
TestUtil.initTestMessage(allTypes)
|
||||||
|
|
||||||
|
val message2 = new MessageBuilder()
|
||||||
|
val allTypes2 = message2.initRoot(TestAllTypes.factory)
|
||||||
|
|
||||||
|
allTypes2.setStructField(allTypes.asReader())
|
||||||
|
TestUtil.checkTestMessage(allTypes2.getStructField())
|
||||||
|
val reader = allTypes2.asReader().getStructField()
|
||||||
|
TestUtil.checkTestMessage(reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Zeroing") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
|
||||||
|
val structList = allTypes.initStructList(3)
|
||||||
|
TestUtil.initTestMessage(structList.get(0))
|
||||||
|
|
||||||
|
val structField = allTypes.initStructField()
|
||||||
|
TestUtil.initTestMessage(structField)
|
||||||
|
|
||||||
|
TestUtil.initTestMessage(structList.get(1))
|
||||||
|
TestUtil.initTestMessage(structList.get(2))
|
||||||
|
TestUtil.checkTestMessage(structList.get(0))
|
||||||
|
allTypes.initStructList(0)
|
||||||
|
|
||||||
|
TestUtil.checkTestMessage(allTypes.getStructField())
|
||||||
|
val allTypesReader = allTypes.asReader()
|
||||||
|
TestUtil.checkTestMessage(allTypesReader.getStructField())
|
||||||
|
|
||||||
|
val any = message.initRoot(AnyPointer.factory)
|
||||||
|
val segments = message.getSegmentsForOutput()
|
||||||
|
for (segment <- segments) {
|
||||||
|
for (jj <- 0 to segment.limit - 1) {
|
||||||
|
segment.get(jj) should equal (0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("DoubleFarPointers") {
|
||||||
|
val bytes = Array[Byte](2,0,0,0, 1,0,0,0, 2,0,0,0, 1,0,0,0,
|
||||||
|
6,0,0,0, 1,0,0,0, 2,0,0,0, 2,0,0,0,
|
||||||
|
0,0,0,0, 1,0,0,0, 1,7, -1, 127, 0,0,0,0)
|
||||||
|
|
||||||
|
val input = new ArrayInputStream (java.nio.ByteBuffer.wrap(bytes))
|
||||||
|
val message = org.capnproto.Serialize.read(input)
|
||||||
|
val root = message.getRoot(TestAllTypes.factory)
|
||||||
|
root.getBoolField() should equal (true)
|
||||||
|
root.getInt8Field() should equal (7)
|
||||||
|
root.getInt16Field() should equal (32767)
|
||||||
|
}
|
||||||
|
|
||||||
|
test("UpgradeStructInBuilder") {
|
||||||
|
val builder = new MessageBuilder()
|
||||||
|
val root = builder.initRoot(TestAnyPointer.factory)
|
||||||
|
|
||||||
|
{
|
||||||
|
val oldVersion = root.getAnyPointerField().initAs(TestOldVersion.factory)
|
||||||
|
oldVersion.setOld1(123)
|
||||||
|
oldVersion.setOld2("foo")
|
||||||
|
val sub = oldVersion.initOld3()
|
||||||
|
sub.setOld1(456)
|
||||||
|
sub.setOld2("bar")
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val newVersion = root.getAnyPointerField().getAs(TestNewVersion.factory)
|
||||||
|
newVersion.getOld1() should equal (123)
|
||||||
|
newVersion.getOld2().toString() should equal ("foo")
|
||||||
|
newVersion.getNew1() should equal (987)
|
||||||
|
newVersion.getNew2().toString() should equal ("baz")
|
||||||
|
val sub = newVersion.getOld3()
|
||||||
|
sub.getOld1() should equal (456)
|
||||||
|
sub.getOld2().toString() should equal ("bar")
|
||||||
|
|
||||||
|
newVersion.setOld1(234)
|
||||||
|
newVersion.setOld2("qux")
|
||||||
|
newVersion.setNew1(654)
|
||||||
|
newVersion.setNew2("quux")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val oldVersion = root.getAnyPointerField().getAs(TestOldVersion.factory)
|
||||||
|
oldVersion.getOld1() should equal (234)
|
||||||
|
oldVersion.getOld2.toString() should equal ("qux")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("StructListUpgrade") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val root = message.initRoot(TestAnyPointer.factory)
|
||||||
|
val any = root.getAnyPointerField()
|
||||||
|
|
||||||
|
{
|
||||||
|
val longs = any.initAs(PrimitiveList.Long.factory, 3)
|
||||||
|
longs.set(0, 123)
|
||||||
|
longs.set(1, 456)
|
||||||
|
longs.set(2, 789)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val olds = any.asReader().getAs(TestOldVersion.listFactory)
|
||||||
|
olds.get(0).getOld1() should equal (123)
|
||||||
|
olds.get(1).getOld1() should equal (456)
|
||||||
|
olds.get(2).getOld1() should equal (789)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val olds = any.getAs(TestOldVersion.listFactory)
|
||||||
|
olds.size() should equal (3)
|
||||||
|
olds.get(0).getOld1() should equal (123)
|
||||||
|
olds.get(1).getOld1() should equal (456)
|
||||||
|
olds.get(2).getOld1() should equal (789)
|
||||||
|
|
||||||
|
olds.get(0).setOld2("zero")
|
||||||
|
olds.get(1).setOld2("one")
|
||||||
|
olds.get(2).setOld2("two")
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val news = any.getAs(TestNewVersion.listFactory)
|
||||||
|
news.size() should equal (3)
|
||||||
|
news.get(0).getOld1() should equal (123)
|
||||||
|
news.get(0).getOld2().toString() should equal ("zero")
|
||||||
|
|
||||||
|
news.get(1).getOld1() should equal (456)
|
||||||
|
news.get(1).getOld2().toString() should equal ("one")
|
||||||
|
|
||||||
|
news.get(2).getOld1() should equal (789)
|
||||||
|
news.get(2).getOld2().toString() should equal ("two")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Generics") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val factory = TestGenerics.newFactory(TestAllTypes.factory, Text.factory)
|
||||||
|
val root = message.initRoot(factory)
|
||||||
|
TestUtil.initTestMessage(root.getFoo())
|
||||||
|
root.getDub().setFoo(Text.factory, new Text.Reader("Hello"))
|
||||||
|
val bar = root.getDub().initBar(1)
|
||||||
|
bar.set(0, 11)
|
||||||
|
val revBar = root.getRev().getBar()
|
||||||
|
revBar.setInt8Field(111)
|
||||||
|
val boolList = revBar.initBoolList(2)
|
||||||
|
boolList.set(0, false)
|
||||||
|
boolList.set(1, true)
|
||||||
|
|
||||||
|
TestUtil.checkTestMessage(root.getFoo())
|
||||||
|
val rootReader = root.asReader(factory)
|
||||||
|
TestUtil.checkTestMessage(rootReader.getFoo())
|
||||||
|
val dubReader = root.getDub()
|
||||||
|
dubReader.getFoo().toString() should equal ("Hello")
|
||||||
|
val barReader = dubReader.getBar()
|
||||||
|
barReader.size() should equal (1)
|
||||||
|
barReader.get(0) should equal (11)
|
||||||
|
}
|
||||||
|
|
||||||
|
test("UseGenerics") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val root = message.initRoot(TestUseGenerics.factory)
|
||||||
|
|
||||||
|
{
|
||||||
|
val message2 = new MessageBuilder()
|
||||||
|
val factory2 = TestGenerics.newFactory(AnyPointer.factory, AnyPointer.factory)
|
||||||
|
val root2 = message2.initRoot(factory2)
|
||||||
|
val dub2 = root2.initDub().setFoo(Text.factory, new Text.Reader("foobar"))
|
||||||
|
|
||||||
|
root.setUnspecified(factory2, root2.asReader(factory2))
|
||||||
|
}
|
||||||
|
|
||||||
|
val rootReader = root.asReader()
|
||||||
|
root.getUnspecified().getDub().getFoo().toString() should equal ("foobar")
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Defaults") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val defaults = message.initRoot(TestDefaults.factory)
|
||||||
|
TestUtil.checkDefaultMessage(defaults)
|
||||||
|
TestUtil.checkDefaultMessage(defaults.asReader())
|
||||||
|
TestUtil.setDefaultMessage(defaults)
|
||||||
|
TestUtil.checkSettedDefaultMessage(defaults.asReader())
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Groups") {
|
||||||
|
val builder = new MessageBuilder()
|
||||||
|
val root = builder.initRoot(TestGroups.factory)
|
||||||
|
|
||||||
|
{
|
||||||
|
val foo = root.getGroups().initFoo()
|
||||||
|
foo.setCorge(12345678)
|
||||||
|
foo.setGrault(123456789012345L)
|
||||||
|
foo.setGarply(new Text.Reader("foobar"))
|
||||||
|
|
||||||
|
assert(12345678 == foo.getCorge())
|
||||||
|
assert(123456789012345L == foo.getGrault())
|
||||||
|
assert("foobar" == foo.getGarply().toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val bar = root.getGroups.initBar()
|
||||||
|
bar.setCorge(23456789)
|
||||||
|
bar.setGrault(new Text.Reader("barbaz"))
|
||||||
|
bar.setGarply(234567890123456L)
|
||||||
|
|
||||||
|
assert(23456789 == bar.getCorge())
|
||||||
|
assert("barbaz" == bar.getGrault().toString())
|
||||||
|
assert(234567890123456L == bar.getGarply())
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val baz = root.getGroups().initBaz()
|
||||||
|
baz.setCorge(34567890)
|
||||||
|
baz.setGrault(new Text.Reader("bazqux"))
|
||||||
|
baz.setGarply(new Text.Reader("quxquux"))
|
||||||
|
|
||||||
|
assert(34567890 == baz.getCorge())
|
||||||
|
assert("bazqux" == baz.getGrault().toString())
|
||||||
|
assert("quxquux" == baz.getGarply().toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
test("NestedLists") {
|
||||||
|
val builder = new MessageBuilder()
|
||||||
|
val root = builder.initRoot(TestLists.factory)
|
||||||
|
|
||||||
|
{
|
||||||
|
val intListList = root.initInt32ListList(2)
|
||||||
|
val intList0 = intListList.init(0, 4)
|
||||||
|
intList0.set(0, 1)
|
||||||
|
intList0.set(1, 2)
|
||||||
|
intList0.set(2, 3)
|
||||||
|
intList0.set(3, 4)
|
||||||
|
val intList1 = intListList.init(1, 1)
|
||||||
|
intList1.set(0, 100)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val reader = root.asReader()
|
||||||
|
val intListList = root.getInt32ListList()
|
||||||
|
intListList.size() should equal (2)
|
||||||
|
val intList0 = intListList.get(0)
|
||||||
|
intList0.size() should equal (4)
|
||||||
|
intList0.get(0) should equal (1)
|
||||||
|
intList0.get(1) should equal (2)
|
||||||
|
intList0.get(2) should equal (3)
|
||||||
|
intList0.get(3) should equal (4)
|
||||||
|
val intList1 = intListList.get(1)
|
||||||
|
intList1.size() should equal (1)
|
||||||
|
intList1.get(0) should equal(100)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Constants") {
|
||||||
|
assert(Void.VOID == TestConstants.VOID_CONST)
|
||||||
|
assert(true == TestConstants.BOOL_CONST)
|
||||||
|
assert(-123 == TestConstants.INT8_CONST)
|
||||||
|
assert(-12345 == TestConstants.INT16_CONST)
|
||||||
|
assert(-12345678 == TestConstants.INT32_CONST)
|
||||||
|
assert(-123456789012345L == TestConstants.INT64_CONST)
|
||||||
|
|
||||||
|
assert(-22 == TestConstants.UINT8_CONST)
|
||||||
|
assert(-19858 == TestConstants.UINT16_CONST)
|
||||||
|
assert(-838178284 == TestConstants.UINT32_CONST)
|
||||||
|
assert(-6101065172474983726L == TestConstants.UINT64_CONST)
|
||||||
|
|
||||||
|
assert(1234.5f == TestConstants.FLOAT32_CONST)
|
||||||
|
(-123e45) should equal (TestConstants.FLOAT64_CONST)
|
||||||
|
|
||||||
|
(TestConstants.TEXT_CONST.toString()) should equal ("foo")
|
||||||
|
(TestConstants.DATA_CONST.toArray()) should equal (TestUtil.data("bar"))
|
||||||
|
|
||||||
|
(TestConstants.ENUM_CONST) should equal (TestEnum.CORGE)
|
||||||
|
|
||||||
|
{
|
||||||
|
val subReader = TestConstants.STRUCT_CONST
|
||||||
|
subReader.getBoolField() should equal (true)
|
||||||
|
subReader.getInt8Field() should equal (-12)
|
||||||
|
subReader.getInt16Field() should equal(3456)
|
||||||
|
subReader.getInt32Field() should equal (-78901234)
|
||||||
|
subReader.getInt64Field() should equal (56789012345678L)
|
||||||
|
subReader.getUInt8Field() should equal (90)
|
||||||
|
subReader.getUInt16Field should equal (1234)
|
||||||
|
subReader.getUInt32Field() should equal (56789012)
|
||||||
|
subReader.getUInt64Field() should equal (345678901234567890L)
|
||||||
|
subReader.getFloat32Field() should equal (-1.25e-10f)
|
||||||
|
subReader.getFloat64Field() should equal (345)
|
||||||
|
subReader.getTextField().toString() should equal ("baz")
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
TestConstants.VOID_LIST_CONST.size() should equal (6)
|
||||||
|
|
||||||
|
{
|
||||||
|
val listReader = TestConstants.BOOL_LIST_CONST
|
||||||
|
listReader.size() should equal (4)
|
||||||
|
listReader.get(0) should equal (true)
|
||||||
|
listReader.get(1) should equal (false)
|
||||||
|
listReader.get(2) should equal (false)
|
||||||
|
listReader.get(3) should equal (true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...
|
||||||
|
{
|
||||||
|
val listReader = TestConstants.TEXT_LIST_CONST
|
||||||
|
listReader.size() should equal(3)
|
||||||
|
listReader.get(0).toString() should equal ("plugh")
|
||||||
|
listReader.get(1).toString() should equal ("xyzzy")
|
||||||
|
listReader.get(2).toString() should equal ("thud")
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val listReader = TestConstants.STRUCT_LIST_CONST
|
||||||
|
listReader.size() should equal(3)
|
||||||
|
listReader.get(0).getTextField().toString() should equal ("structlist 1")
|
||||||
|
listReader.get(1).getTextField().toString() should equal ("structlist 2")
|
||||||
|
listReader.get(2).getTextField().toString() should equal ("structlist 3")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
test("GlobalConstants") {
|
||||||
|
assert(12345 == GLOBAL_INT)
|
||||||
|
}
|
||||||
|
|
||||||
|
test("EmptyStruct") {
|
||||||
|
val builder = new MessageBuilder()
|
||||||
|
val root = builder.initRoot(TestAnyPointer.factory)
|
||||||
|
root.hasAnyPointerField() should equal (false)
|
||||||
|
val any = root.getAnyPointerField()
|
||||||
|
any.isNull() should equal (true)
|
||||||
|
any.initAs(TestEmptyStruct.factory)
|
||||||
|
any.isNull() should equal (false)
|
||||||
|
root.hasAnyPointerField() should equal (true)
|
||||||
|
|
||||||
|
{
|
||||||
|
val rootReader = root.asReader()
|
||||||
|
rootReader.hasAnyPointerField() should equal (true)
|
||||||
|
rootReader.getAnyPointerField().isNull() should equal (false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("TextBuilderIntUnderflow") {
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val root = message.initRoot(TestAnyPointer.factory)
|
||||||
|
root.getAnyPointerField.initAs(org.capnproto.Data.factory, 0)
|
||||||
|
a [DecodeException] should be thrownBy root.getAnyPointerField.getAs(org.capnproto.Text.factory)
|
||||||
|
}
|
||||||
|
|
||||||
|
test("InlineCompositeListIntOverflow") {
|
||||||
|
val bytes = Array[Byte](0,0,0,0, 0,0,1,0,
|
||||||
|
1,0,0,0, 0x17,0,0,0, 0,0,0,-128, 16,0,0,0,
|
||||||
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0)
|
||||||
|
|
||||||
|
val segment = java.nio.ByteBuffer.wrap(bytes)
|
||||||
|
segment.order(java.nio.ByteOrder.LITTLE_ENDIAN)
|
||||||
|
val message = new MessageReader(Array(segment), ReaderOptions.DEFAULT_READER_OPTIONS)
|
||||||
|
|
||||||
|
val root = message.getRoot(TestAnyPointer.factory)
|
||||||
|
// TODO add this after we impelement totalSize():
|
||||||
|
//root.totalSize()
|
||||||
|
|
||||||
|
a [DecodeException] should be thrownBy
|
||||||
|
root.getAnyPointerField.getAs(new StructList.Factory(TestAllTypes.factory))
|
||||||
|
|
||||||
|
val messageBuilder = new MessageBuilder()
|
||||||
|
val builderRoot = messageBuilder.initRoot(TestAnyPointer.factory)
|
||||||
|
a [DecodeException] should be thrownBy
|
||||||
|
builderRoot.getAnyPointerField.setAs(TestAnyPointer.factory, root)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
test("VoidListAmplification") {
|
||||||
|
val builder = new MessageBuilder()
|
||||||
|
builder.initRoot(TestAnyPointer.factory).getAnyPointerField().initAs(PrimitiveList.Void.factory, 1 << 28)
|
||||||
|
|
||||||
|
val segments = builder.getSegmentsForOutput()
|
||||||
|
segments.length should equal (1)
|
||||||
|
|
||||||
|
val reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS)
|
||||||
|
val root = reader.getRoot(TestAnyPointer.factory)
|
||||||
|
a [DecodeException] should be thrownBy
|
||||||
|
root.getAnyPointerField().getAs(new StructList.Factory(TestAllTypes.factory))
|
||||||
|
}
|
||||||
|
|
||||||
|
test("EmptyStructListAmplification") {
|
||||||
|
val builder = new MessageBuilder()
|
||||||
|
builder.initRoot(TestAnyPointer.factory).getAnyPointerField()
|
||||||
|
.initAs(new StructList.Factory(TestEmptyStruct.factory), (1 << 29) - 1)
|
||||||
|
|
||||||
|
val segments = builder.getSegmentsForOutput()
|
||||||
|
segments.length should equal (1)
|
||||||
|
|
||||||
|
val reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS)
|
||||||
|
val root = reader.getRoot(TestAnyPointer.factory)
|
||||||
|
a [DecodeException] should be thrownBy
|
||||||
|
root.getAnyPointerField().getAs(new StructList.Factory(TestAllTypes.factory))
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongUint8List") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 28) + 1
|
||||||
|
val list = allTypes.initUInt8List(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, 3)
|
||||||
|
list.get(length - 1) should equal (3)
|
||||||
|
allTypes.asReader().getUInt8List().get(length - 1) should equal (3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
test("LongUint16List") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 27) + 1
|
||||||
|
val list = allTypes.initUInt16List(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, 3)
|
||||||
|
list.get(length - 1) should equal (3)
|
||||||
|
allTypes.asReader().getUInt16List().get(length - 1) should equal (3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongUint32List") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 26) + 1
|
||||||
|
val list = allTypes.initUInt32List(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, 3)
|
||||||
|
list.get(length - 1) should equal (3)
|
||||||
|
allTypes.asReader().getUInt32List().get(length - 1) should equal (3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongUint64List") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 25) + 1
|
||||||
|
val list = allTypes.initUInt64List(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, 3)
|
||||||
|
list.get(length - 1) should equal (3)
|
||||||
|
allTypes.asReader().getUInt64List().get(length - 1) should equal (3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongFloat32List") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 26) + 1
|
||||||
|
val list = allTypes.initFloat32List(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, 3.14f)
|
||||||
|
list.get(length - 1) should equal (3.14f)
|
||||||
|
allTypes.asReader().getFloat32List().get(length - 1) should equal (3.14f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongFloat64List") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 25) + 1
|
||||||
|
val list = allTypes.initFloat64List(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, 3.14)
|
||||||
|
list.get(length - 1) should equal (3.14)
|
||||||
|
allTypes.asReader().getFloat64List().get(length - 1) should equal (3.14)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongStructList") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 21) + 1
|
||||||
|
val list = allTypes.initStructList(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.get(length - 1).setUInt8Field(3)
|
||||||
|
allTypes.asReader().getStructList().get(length - 1).getUInt8Field() should equal (3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("LongTextList") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val allTypes = message.initRoot(TestAllTypes.factory)
|
||||||
|
val length = (1 << 25) + 1
|
||||||
|
val list = allTypes.initTextList(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.set(length - 1, new Text.Reader("foo"))
|
||||||
|
allTypes.asReader().getTextList().get(length - 1).toString() should equal ("foo")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
test("LongListList") {
|
||||||
|
{
|
||||||
|
val message = new MessageBuilder()
|
||||||
|
val root = message.initRoot(TestLists.factory)
|
||||||
|
val length = (1 << 25) + 1
|
||||||
|
val list = root.initStructListList(length)
|
||||||
|
list.size() should equal (length)
|
||||||
|
list.init(length - 1, 3)
|
||||||
|
list.get(length - 1).size() should equal (3)
|
||||||
|
root.asReader().getStructListList().get(length - 1).size() should equal (3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// to debug, do this:
|
||||||
|
//Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
|
||||||
|
// message)
|
||||||
|
|
||||||
|
}
|
|
@ -1,563 +0,0 @@
|
||||||
// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
|
||||||
// Licensed under the MIT License:
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package org.capnproto;
|
|
||||||
|
|
||||||
import org.capnproto.test.Test._;
|
|
||||||
import org.scalatest.FunSuite
|
|
||||||
import org.scalatest.Matchers._;
|
|
||||||
|
|
||||||
class EncodingSuite extends FunSuite {
|
|
||||||
test("AllTypes") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
TestUtil.initTestMessage(allTypes);
|
|
||||||
TestUtil.checkTestMessage(allTypes);
|
|
||||||
TestUtil.checkTestMessage(allTypes.asReader());
|
|
||||||
}
|
|
||||||
|
|
||||||
test("AllTypesMultiSegment") {
|
|
||||||
val message = new MessageBuilder(5, BuilderArena.AllocationStrategy.FIXED_SIZE);
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
TestUtil.initTestMessage(allTypes);
|
|
||||||
|
|
||||||
TestUtil.checkTestMessage(allTypes);
|
|
||||||
TestUtil.checkTestMessage(allTypes.asReader());
|
|
||||||
}
|
|
||||||
|
|
||||||
test("Setters") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
TestUtil.initTestMessage(allTypes);
|
|
||||||
|
|
||||||
val message2 = new MessageBuilder();
|
|
||||||
val allTypes2 = message2.initRoot(TestAllTypes.factory);
|
|
||||||
|
|
||||||
allTypes2.setStructField(allTypes.asReader());
|
|
||||||
TestUtil.checkTestMessage(allTypes2.getStructField());
|
|
||||||
val reader = allTypes2.asReader().getStructField();
|
|
||||||
TestUtil.checkTestMessage(reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
test("Zeroing") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
|
|
||||||
val structList = allTypes.initStructList(3);
|
|
||||||
TestUtil.initTestMessage(structList.get(0));
|
|
||||||
|
|
||||||
val structField = allTypes.initStructField();
|
|
||||||
TestUtil.initTestMessage(structField);
|
|
||||||
|
|
||||||
TestUtil.initTestMessage(structList.get(1));
|
|
||||||
TestUtil.initTestMessage(structList.get(2));
|
|
||||||
TestUtil.checkTestMessage(structList.get(0));
|
|
||||||
allTypes.initStructList(0);
|
|
||||||
|
|
||||||
TestUtil.checkTestMessage(allTypes.getStructField());
|
|
||||||
val allTypesReader = allTypes.asReader();
|
|
||||||
TestUtil.checkTestMessage(allTypesReader.getStructField());
|
|
||||||
|
|
||||||
val any = message.initRoot(AnyPointer.factory);
|
|
||||||
val segments = message.getSegmentsForOutput();
|
|
||||||
for (segment <- segments) {
|
|
||||||
for (jj <- 0 to segment.limit - 1) {
|
|
||||||
segment.get(jj) should equal (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("DoubleFarPointers") {
|
|
||||||
val bytes = Array[Byte](2,0,0,0, 1,0,0,0, 2,0,0,0, 1,0,0,0,
|
|
||||||
6,0,0,0, 1,0,0,0, 2,0,0,0, 2,0,0,0,
|
|
||||||
0,0,0,0, 1,0,0,0, 1,7, -1, 127, 0,0,0,0);
|
|
||||||
|
|
||||||
val input = new ArrayInputStream (java.nio.ByteBuffer.wrap(bytes));
|
|
||||||
val message = org.capnproto.Serialize.read(input);
|
|
||||||
val root = message.getRoot(TestAllTypes.factory);
|
|
||||||
root.getBoolField() should equal (true);
|
|
||||||
root.getInt8Field() should equal (7);
|
|
||||||
root.getInt16Field() should equal (32767);
|
|
||||||
}
|
|
||||||
|
|
||||||
test("UpgradeStructInBuilder") {
|
|
||||||
val builder = new MessageBuilder();
|
|
||||||
val root = builder.initRoot(TestAnyPointer.factory);
|
|
||||||
|
|
||||||
{
|
|
||||||
val oldVersion = root.getAnyPointerField().initAs(TestOldVersion.factory);
|
|
||||||
oldVersion.setOld1(123);
|
|
||||||
oldVersion.setOld2("foo");
|
|
||||||
val sub = oldVersion.initOld3();
|
|
||||||
sub.setOld1(456);
|
|
||||||
sub.setOld2("bar");
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
val newVersion = root.getAnyPointerField().getAs(TestNewVersion.factory);
|
|
||||||
newVersion.getOld1() should equal (123);
|
|
||||||
newVersion.getOld2().toString() should equal ("foo");
|
|
||||||
newVersion.getNew1() should equal (987);
|
|
||||||
newVersion.getNew2().toString() should equal ("baz");
|
|
||||||
val sub = newVersion.getOld3();
|
|
||||||
sub.getOld1() should equal (456);
|
|
||||||
sub.getOld2().toString() should equal ("bar");
|
|
||||||
|
|
||||||
newVersion.setOld1(234);
|
|
||||||
newVersion.setOld2("qux");
|
|
||||||
newVersion.setNew1(654);
|
|
||||||
newVersion.setNew2("quux");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
val oldVersion = root.getAnyPointerField().getAs(TestOldVersion.factory);
|
|
||||||
oldVersion.getOld1() should equal (234);
|
|
||||||
oldVersion.getOld2.toString() should equal ("qux");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("StructListUpgrade") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val root = message.initRoot(TestAnyPointer.factory);
|
|
||||||
val any = root.getAnyPointerField();
|
|
||||||
{
|
|
||||||
val longs = any.initAs(PrimitiveList.Long.factory, 3);
|
|
||||||
longs.set(0, 123);
|
|
||||||
longs.set(1, 456);
|
|
||||||
longs.set(2, 789);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
val olds = any.asReader().getAs(TestOldVersion.listFactory);
|
|
||||||
olds.get(0).getOld1() should equal (123);
|
|
||||||
olds.get(1).getOld1() should equal (456);
|
|
||||||
olds.get(2).getOld1() should equal (789);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
val olds = any.getAs(TestOldVersion.listFactory);
|
|
||||||
olds.size() should equal (3);
|
|
||||||
olds.get(0).getOld1() should equal (123);
|
|
||||||
olds.get(1).getOld1() should equal (456);
|
|
||||||
olds.get(2).getOld1() should equal (789);
|
|
||||||
|
|
||||||
olds.get(0).setOld2("zero");
|
|
||||||
olds.get(1).setOld2("one");
|
|
||||||
olds.get(2).setOld2("two");
|
|
||||||
}
|
|
||||||
{
|
|
||||||
val news = any.getAs(TestNewVersion.listFactory);
|
|
||||||
news.size() should equal (3);
|
|
||||||
news.get(0).getOld1() should equal (123);
|
|
||||||
news.get(0).getOld2().toString() should equal ("zero");
|
|
||||||
|
|
||||||
news.get(1).getOld1() should equal (456);
|
|
||||||
news.get(1).getOld2().toString() should equal ("one");
|
|
||||||
|
|
||||||
news.get(2).getOld1() should equal (789);
|
|
||||||
news.get(2).getOld2().toString() should equal ("two");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("Generics") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val factory = TestGenerics.newFactory(TestAllTypes.factory, Text.factory);
|
|
||||||
val root = message.initRoot(factory);
|
|
||||||
TestUtil.initTestMessage(root.getFoo());
|
|
||||||
root.getDub().setFoo(Text.factory, new Text.Reader("Hello"));
|
|
||||||
val bar = root.getDub().initBar(1);
|
|
||||||
bar.set(0, 11);
|
|
||||||
val revBar = root.getRev().getBar()
|
|
||||||
revBar.setInt8Field(111);
|
|
||||||
var boolList = revBar.initBoolList(2);
|
|
||||||
boolList.set(0, false);
|
|
||||||
boolList.set(1, true);
|
|
||||||
|
|
||||||
TestUtil.checkTestMessage(root.getFoo());
|
|
||||||
val rootReader = root.asReader(factory);
|
|
||||||
TestUtil.checkTestMessage(rootReader.getFoo());
|
|
||||||
val dubReader = root.getDub();
|
|
||||||
dubReader.getFoo().toString() should equal ("Hello");
|
|
||||||
val barReader = dubReader.getBar();
|
|
||||||
barReader.size() should equal (1);
|
|
||||||
barReader.get(0) should equal (11);
|
|
||||||
}
|
|
||||||
|
|
||||||
test("UseGenerics") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val root = message.initRoot(TestUseGenerics.factory);
|
|
||||||
{
|
|
||||||
val message2 = new MessageBuilder();
|
|
||||||
val factory2 = TestGenerics.newFactory(AnyPointer.factory, AnyPointer.factory);
|
|
||||||
val root2 = message2.initRoot(factory2);
|
|
||||||
val dub2 = root2.initDub().setFoo(Text.factory, new Text.Reader("foobar"));
|
|
||||||
|
|
||||||
root.setUnspecified(factory2, root2.asReader(factory2));
|
|
||||||
}
|
|
||||||
|
|
||||||
val rootReader = root.asReader();
|
|
||||||
root.getUnspecified().getDub().getFoo().toString() should equal ("foobar");
|
|
||||||
}
|
|
||||||
|
|
||||||
test("Defaults") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val defaults = message.initRoot(TestDefaults.factory);
|
|
||||||
TestUtil.checkDefaultMessage(defaults);
|
|
||||||
TestUtil.checkDefaultMessage(defaults.asReader());
|
|
||||||
TestUtil.setDefaultMessage(defaults);
|
|
||||||
TestUtil.checkSettedDefaultMessage(defaults.asReader());
|
|
||||||
}
|
|
||||||
|
|
||||||
test("Groups") {
|
|
||||||
val builder = new MessageBuilder();
|
|
||||||
val root = builder.initRoot(TestGroups.factory);
|
|
||||||
|
|
||||||
{
|
|
||||||
val foo = root.getGroups().initFoo();
|
|
||||||
foo.setCorge(12345678);
|
|
||||||
foo.setGrault(123456789012345L);
|
|
||||||
foo.setGarply(new Text.Reader("foobar"));
|
|
||||||
|
|
||||||
assert(12345678 == foo.getCorge());
|
|
||||||
assert(123456789012345L == foo.getGrault());
|
|
||||||
assert("foobar" == foo.getGarply().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
val bar = root.getGroups.initBar();
|
|
||||||
bar.setCorge(23456789);
|
|
||||||
bar.setGrault(new Text.Reader("barbaz"));
|
|
||||||
bar.setGarply(234567890123456L);
|
|
||||||
|
|
||||||
assert(23456789 == bar.getCorge());
|
|
||||||
assert("barbaz" == bar.getGrault().toString());
|
|
||||||
assert(234567890123456L == bar.getGarply());
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
val baz = root.getGroups().initBaz();
|
|
||||||
baz.setCorge(34567890);
|
|
||||||
baz.setGrault(new Text.Reader("bazqux"));
|
|
||||||
baz.setGarply(new Text.Reader("quxquux"));
|
|
||||||
|
|
||||||
assert(34567890 == baz.getCorge());
|
|
||||||
assert("bazqux" == baz.getGrault().toString());
|
|
||||||
assert("quxquux" == baz.getGarply().toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
test("NestedLists") {
|
|
||||||
val builder = new MessageBuilder();
|
|
||||||
val root = builder.initRoot(TestLists.factory);
|
|
||||||
{
|
|
||||||
val intListList = root.initInt32ListList(2);
|
|
||||||
val intList0 = intListList.init(0, 4);
|
|
||||||
intList0.set(0, 1);
|
|
||||||
intList0.set(1, 2);
|
|
||||||
intList0.set(2, 3);
|
|
||||||
intList0.set(3, 4);
|
|
||||||
val intList1 = intListList.init(1, 1);
|
|
||||||
intList1.set(0, 100);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
val reader = root.asReader();
|
|
||||||
val intListList = root.getInt32ListList();
|
|
||||||
intListList.size() should equal (2);
|
|
||||||
val intList0 = intListList.get(0);
|
|
||||||
intList0.size() should equal (4);
|
|
||||||
intList0.get(0) should equal (1);
|
|
||||||
intList0.get(1) should equal (2);
|
|
||||||
intList0.get(2) should equal (3);
|
|
||||||
intList0.get(3) should equal (4);
|
|
||||||
val intList1 = intListList.get(1);
|
|
||||||
intList1.size() should equal (1);
|
|
||||||
intList1.get(0) should equal(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("Constants") {
|
|
||||||
assert(Void.VOID == TestConstants.VOID_CONST);
|
|
||||||
assert(true == TestConstants.BOOL_CONST);
|
|
||||||
assert(-123 == TestConstants.INT8_CONST);
|
|
||||||
assert(-12345 == TestConstants.INT16_CONST);
|
|
||||||
assert(-12345678 == TestConstants.INT32_CONST);
|
|
||||||
assert(-123456789012345L == TestConstants.INT64_CONST);
|
|
||||||
|
|
||||||
assert(-22 == TestConstants.UINT8_CONST);
|
|
||||||
assert(-19858 == TestConstants.UINT16_CONST);
|
|
||||||
assert(-838178284 == TestConstants.UINT32_CONST);
|
|
||||||
assert(-6101065172474983726L == TestConstants.UINT64_CONST);
|
|
||||||
|
|
||||||
assert(1234.5f == TestConstants.FLOAT32_CONST);
|
|
||||||
(-123e45) should equal (TestConstants.FLOAT64_CONST);
|
|
||||||
|
|
||||||
(TestConstants.TEXT_CONST.toString()) should equal ("foo");
|
|
||||||
(TestConstants.DATA_CONST.toArray()) should equal (TestUtil.data("bar"));
|
|
||||||
|
|
||||||
(TestConstants.ENUM_CONST) should equal (TestEnum.CORGE);
|
|
||||||
{
|
|
||||||
val subReader = TestConstants.STRUCT_CONST;
|
|
||||||
subReader.getBoolField() should equal (true);
|
|
||||||
subReader.getInt8Field() should equal (-12);
|
|
||||||
subReader.getInt16Field() should equal(3456);
|
|
||||||
subReader.getInt32Field() should equal (-78901234);
|
|
||||||
subReader.getInt64Field() should equal (56789012345678L);
|
|
||||||
subReader.getUInt8Field() should equal (90);
|
|
||||||
subReader.getUInt16Field should equal (1234);
|
|
||||||
subReader.getUInt32Field() should equal (56789012);
|
|
||||||
subReader.getUInt64Field() should equal (345678901234567890L);
|
|
||||||
subReader.getFloat32Field() should equal (-1.25e-10f);
|
|
||||||
subReader.getFloat64Field() should equal (345);
|
|
||||||
subReader.getTextField().toString() should equal ("baz");
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
TestConstants.VOID_LIST_CONST.size() should equal (6);
|
|
||||||
|
|
||||||
{
|
|
||||||
val listReader = TestConstants.BOOL_LIST_CONST;
|
|
||||||
listReader.size() should equal (4);
|
|
||||||
listReader.get(0) should equal (true);
|
|
||||||
listReader.get(1) should equal (false);
|
|
||||||
listReader.get(2) should equal (false);
|
|
||||||
listReader.get(3) should equal (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...
|
|
||||||
{
|
|
||||||
val listReader = TestConstants.TEXT_LIST_CONST;
|
|
||||||
listReader.size() should equal(3);
|
|
||||||
listReader.get(0).toString() should equal ("plugh");
|
|
||||||
listReader.get(1).toString() should equal ("xyzzy");
|
|
||||||
listReader.get(2).toString() should equal ("thud");
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
val listReader = TestConstants.STRUCT_LIST_CONST;
|
|
||||||
listReader.size() should equal(3);
|
|
||||||
listReader.get(0).getTextField().toString() should equal ("structlist 1");
|
|
||||||
listReader.get(1).getTextField().toString() should equal ("structlist 2");
|
|
||||||
listReader.get(2).getTextField().toString() should equal ("structlist 3");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
test("GlobalConstants") {
|
|
||||||
assert(12345 == GLOBAL_INT);
|
|
||||||
}
|
|
||||||
|
|
||||||
test("EmptyStruct") {
|
|
||||||
val builder = new MessageBuilder();
|
|
||||||
val root = builder.initRoot(TestAnyPointer.factory);
|
|
||||||
root.hasAnyPointerField() should equal (false);
|
|
||||||
val any = root.getAnyPointerField();
|
|
||||||
any.isNull() should equal (true);
|
|
||||||
any.initAs(TestEmptyStruct.factory);
|
|
||||||
any.isNull() should equal (false);
|
|
||||||
root.hasAnyPointerField() should equal (true);
|
|
||||||
|
|
||||||
{
|
|
||||||
val rootReader = root.asReader();
|
|
||||||
rootReader.hasAnyPointerField() should equal (true);
|
|
||||||
rootReader.getAnyPointerField().isNull() should equal (false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("TextBuilderIntUnderflow") {
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val root = message.initRoot(TestAnyPointer.factory);
|
|
||||||
root.getAnyPointerField.initAs(org.capnproto.Data.factory, 0);
|
|
||||||
a [DecodeException] should be thrownBy root.getAnyPointerField.getAs(org.capnproto.Text.factory);
|
|
||||||
}
|
|
||||||
|
|
||||||
test("InlineCompositeListIntOverflow") {
|
|
||||||
val bytes = Array[Byte](0,0,0,0, 0,0,1,0,
|
|
||||||
1,0,0,0, 0x17,0,0,0, 0,0,0,-128, 16,0,0,0,
|
|
||||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0);
|
|
||||||
|
|
||||||
val segment = java.nio.ByteBuffer.wrap(bytes);
|
|
||||||
segment.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
|
||||||
val message = new MessageReader(Array(segment), ReaderOptions.DEFAULT_READER_OPTIONS);
|
|
||||||
|
|
||||||
val root = message.getRoot(TestAnyPointer.factory);
|
|
||||||
// TODO add this after we impelement totalSize():
|
|
||||||
//root.totalSize();
|
|
||||||
|
|
||||||
a [DecodeException] should be thrownBy
|
|
||||||
root.getAnyPointerField.getAs(new StructList.Factory(TestAllTypes.factory));
|
|
||||||
|
|
||||||
val messageBuilder = new MessageBuilder();
|
|
||||||
val builderRoot = messageBuilder.initRoot(TestAnyPointer.factory);
|
|
||||||
a [DecodeException] should be thrownBy
|
|
||||||
builderRoot.getAnyPointerField.setAs(TestAnyPointer.factory, root);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
test("VoidListAmplification") {
|
|
||||||
val builder = new MessageBuilder();
|
|
||||||
builder.initRoot(TestAnyPointer.factory).getAnyPointerField().initAs(PrimitiveList.Void.factory, 1 << 28);
|
|
||||||
|
|
||||||
val segments = builder.getSegmentsForOutput();
|
|
||||||
segments.length should equal (1);
|
|
||||||
|
|
||||||
val reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS);
|
|
||||||
val root = reader.getRoot(TestAnyPointer.factory);
|
|
||||||
a [DecodeException] should be thrownBy
|
|
||||||
root.getAnyPointerField().getAs(new StructList.Factory(TestAllTypes.factory));
|
|
||||||
}
|
|
||||||
|
|
||||||
test("EmptyStructListAmplification") {
|
|
||||||
val builder = new MessageBuilder();
|
|
||||||
builder.initRoot(TestAnyPointer.factory).getAnyPointerField()
|
|
||||||
.initAs(new StructList.Factory(TestEmptyStruct.factory), (1 << 29) - 1);
|
|
||||||
|
|
||||||
val segments = builder.getSegmentsForOutput();
|
|
||||||
segments.length should equal (1);
|
|
||||||
|
|
||||||
val reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS);
|
|
||||||
val root = reader.getRoot(TestAnyPointer.factory);
|
|
||||||
a [DecodeException] should be thrownBy
|
|
||||||
root.getAnyPointerField().getAs(new StructList.Factory(TestAllTypes.factory));
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongUint8List") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 28) + 1;
|
|
||||||
val list = allTypes.initUInt8List(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, 3);
|
|
||||||
list.get(length - 1) should equal (3);
|
|
||||||
allTypes.asReader().getUInt8List().get(length - 1) should equal (3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
test("LongUint16List") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 27) + 1;
|
|
||||||
val list = allTypes.initUInt16List(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, 3);
|
|
||||||
list.get(length - 1) should equal (3);
|
|
||||||
allTypes.asReader().getUInt16List().get(length - 1) should equal (3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongUint32List") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 26) + 1;
|
|
||||||
val list = allTypes.initUInt32List(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, 3);
|
|
||||||
list.get(length - 1) should equal (3);
|
|
||||||
allTypes.asReader().getUInt32List().get(length - 1) should equal (3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongUint64List") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 25) + 1;
|
|
||||||
val list = allTypes.initUInt64List(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, 3);
|
|
||||||
list.get(length - 1) should equal (3);
|
|
||||||
allTypes.asReader().getUInt64List().get(length - 1) should equal (3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongFloat32List") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 26) + 1;
|
|
||||||
val list = allTypes.initFloat32List(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, 3.14f);
|
|
||||||
list.get(length - 1) should equal (3.14f);
|
|
||||||
allTypes.asReader().getFloat32List().get(length - 1) should equal (3.14f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongFloat64List") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 25) + 1;
|
|
||||||
val list = allTypes.initFloat64List(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, 3.14);
|
|
||||||
list.get(length - 1) should equal (3.14);
|
|
||||||
allTypes.asReader().getFloat64List().get(length - 1) should equal (3.14);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongStructList") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 21) + 1;
|
|
||||||
val list = allTypes.initStructList(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.get(length - 1).setUInt8Field(3);
|
|
||||||
allTypes.asReader().getStructList().get(length - 1).getUInt8Field() should equal (3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("LongTextList") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val allTypes = message.initRoot(TestAllTypes.factory);
|
|
||||||
val length = (1 << 25) + 1;
|
|
||||||
val list = allTypes.initTextList(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.set(length - 1, new Text.Reader("foo"));
|
|
||||||
allTypes.asReader().getTextList().get(length - 1).toString() should equal ("foo");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
test("LongListList") {
|
|
||||||
{
|
|
||||||
val message = new MessageBuilder();
|
|
||||||
val root = message.initRoot(TestLists.factory);
|
|
||||||
val length = (1 << 25) + 1;
|
|
||||||
val list = root.initStructListList(length);
|
|
||||||
list.size() should equal (length);
|
|
||||||
list.init(length - 1, 3);
|
|
||||||
list.get(length - 1).size() should equal (3);
|
|
||||||
root.asReader().getStructListList().get(length - 1).size() should equal (3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// to debug, do this:
|
|
||||||
//Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
|
|
||||||
// message);
|
|
||||||
|
|
||||||
}
|
|
|
@ -19,356 +19,361 @@
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
package org.capnproto;
|
package org.capnproto
|
||||||
|
|
||||||
import org.capnproto.Text.Reader
|
import org.capnproto.Text.Reader
|
||||||
import org.scalatest.Matchers._;
|
import org.scalatest.Matchers._
|
||||||
import org.capnproto.test.Test._;
|
import org.capnproto.test.Test._
|
||||||
|
|
||||||
|
|
||||||
object TestUtil {
|
object TestUtil {
|
||||||
|
|
||||||
def data(str : String) : Array[Byte] = {
|
def data(str : String) : Array[Byte] = {
|
||||||
try {
|
try {
|
||||||
return str.getBytes("ISO_8859-1");
|
str.getBytes("ISO_8859-1")
|
||||||
} catch {
|
} catch {
|
||||||
case e: Exception => throw new Error("could not decode");
|
case e: Exception => throw new Error("could not decode")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def initTestMessage(builder : TestAllTypes.Builder) {
|
def initTestMessage(builder : TestAllTypes.Builder) {
|
||||||
builder.setVoidField(org.capnproto.Void.VOID);
|
builder.setVoidField(org.capnproto.Void.VOID)
|
||||||
builder.setBoolField(true);
|
builder.setBoolField(true)
|
||||||
builder.setInt8Field(-123);
|
builder.setInt8Field(-123)
|
||||||
builder.setInt16Field(-12345);
|
builder.setInt16Field(-12345)
|
||||||
builder.setInt32Field(-12345678);
|
builder.setInt32Field(-12345678)
|
||||||
builder.setInt64Field(-123456789012345L);
|
builder.setInt64Field(-123456789012345L)
|
||||||
builder.setUInt8Field(0xea.toByte);
|
builder.setUInt8Field(0xea.toByte)
|
||||||
builder.setUInt16Field(0x4567);
|
builder.setUInt16Field(0x4567)
|
||||||
builder.setUInt32Field(0x34567890);
|
builder.setUInt32Field(0x34567890)
|
||||||
builder.setUInt64Field(0x1234567890123456L);
|
builder.setUInt64Field(0x1234567890123456L)
|
||||||
builder.setFloat32Field(1234.5f);
|
builder.setFloat32Field(1234.5f)
|
||||||
builder.setFloat64Field(-123e45);
|
builder.setFloat64Field(-123e45)
|
||||||
builder.setTextField("foo");
|
builder.setTextField("foo")
|
||||||
builder.setDataField(data("bar"));
|
builder.setDataField(data("bar"))
|
||||||
{
|
|
||||||
val subBuilder = builder.initStructField();
|
|
||||||
subBuilder.setVoidField(org.capnproto.Void.VOID);
|
|
||||||
subBuilder.setBoolField(true);
|
|
||||||
subBuilder.setInt8Field(-12);
|
|
||||||
subBuilder.setInt16Field(3456);
|
|
||||||
subBuilder.setInt32Field(-78901234);
|
|
||||||
subBuilder.setInt64Field(56789012345678L);
|
|
||||||
subBuilder.setUInt8Field(90);
|
|
||||||
subBuilder.setUInt16Field(1234);
|
|
||||||
subBuilder.setUInt32Field(56789012);
|
|
||||||
subBuilder.setUInt64Field(345678901234567890L);
|
|
||||||
subBuilder.setFloat32Field(-1.25e-10f);
|
|
||||||
subBuilder.setFloat64Field(345);
|
|
||||||
subBuilder.setTextField(new Text.Reader("baz"));
|
|
||||||
subBuilder.setDataField(data("qux"));
|
|
||||||
{
|
|
||||||
val subSubBuilder = subBuilder.initStructField();
|
|
||||||
subSubBuilder.setTextField(new Text.Reader("nested"));
|
|
||||||
subSubBuilder.initStructField().setTextField(new Text.Reader("really nested"));
|
|
||||||
}
|
|
||||||
subBuilder.setEnumField(TestEnum.BAZ);
|
|
||||||
|
|
||||||
val boolList = subBuilder.initBoolList(5);
|
{
|
||||||
boolList.set(0, false);
|
val subBuilder = builder.initStructField()
|
||||||
boolList.set(1, true);
|
subBuilder.setVoidField(org.capnproto.Void.VOID)
|
||||||
boolList.set(2, false);
|
subBuilder.setBoolField(true)
|
||||||
boolList.set(3, true);
|
subBuilder.setInt8Field(-12)
|
||||||
boolList.set(4, true);
|
subBuilder.setInt16Field(3456)
|
||||||
|
subBuilder.setInt32Field(-78901234)
|
||||||
|
subBuilder.setInt64Field(56789012345678L)
|
||||||
|
subBuilder.setUInt8Field(90)
|
||||||
|
subBuilder.setUInt16Field(1234)
|
||||||
|
subBuilder.setUInt32Field(56789012)
|
||||||
|
subBuilder.setUInt64Field(345678901234567890L)
|
||||||
|
subBuilder.setFloat32Field(-1.25e-10f)
|
||||||
|
subBuilder.setFloat64Field(345)
|
||||||
|
subBuilder.setTextField(new Text.Reader("baz"))
|
||||||
|
subBuilder.setDataField(data("qux"))
|
||||||
|
|
||||||
|
{
|
||||||
|
val subSubBuilder = subBuilder.initStructField()
|
||||||
|
subSubBuilder.setTextField(new Text.Reader("nested"))
|
||||||
|
subSubBuilder.initStructField().setTextField(new Text.Reader("really nested"))
|
||||||
|
}
|
||||||
|
|
||||||
|
subBuilder.setEnumField(TestEnum.BAZ)
|
||||||
|
|
||||||
|
val boolList = subBuilder.initBoolList(5)
|
||||||
|
boolList.set(0, false)
|
||||||
|
boolList.set(1, true)
|
||||||
|
boolList.set(2, false)
|
||||||
|
boolList.set(3, true)
|
||||||
|
boolList.set(4, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setEnumField(TestEnum.CORGE);
|
builder.setEnumField(TestEnum.CORGE)
|
||||||
builder.initVoidList(6);
|
builder.initVoidList(6)
|
||||||
|
|
||||||
val boolList = builder.initBoolList(4);
|
val boolList = builder.initBoolList(4)
|
||||||
boolList.set(0, true);
|
boolList.set(0, true)
|
||||||
boolList.set(1, false);
|
boolList.set(1, false)
|
||||||
boolList.set(2, false);
|
boolList.set(2, false)
|
||||||
boolList.set(3, true);
|
boolList.set(3, true)
|
||||||
|
|
||||||
val float64List = builder.initFloat64List(4);
|
val float64List = builder.initFloat64List(4)
|
||||||
float64List.set(0, 7777.75);
|
float64List.set(0, 7777.75)
|
||||||
float64List.set(1, Double.PositiveInfinity);
|
float64List.set(1, Double.PositiveInfinity)
|
||||||
float64List.set(2, Double.NegativeInfinity);
|
float64List.set(2, Double.NegativeInfinity)
|
||||||
float64List.set(3, Double.NaN);
|
float64List.set(3, Double.NaN)
|
||||||
|
|
||||||
val textList = builder.initTextList(3);
|
val textList = builder.initTextList(3)
|
||||||
textList.set(0, new Text.Reader("plugh"));
|
textList.set(0, new Text.Reader("plugh"))
|
||||||
textList.set(1, new Text.Reader("xyzzy"));
|
textList.set(1, new Text.Reader("xyzzy"))
|
||||||
textList.set(2, new Text.Reader("thud"));
|
textList.set(2, new Text.Reader("thud"))
|
||||||
|
|
||||||
val structList = builder.initStructList(3);
|
val structList = builder.initStructList(3)
|
||||||
structList.get(0).setTextField(new Text.Reader("structlist 1"));
|
structList.get(0).setTextField(new Text.Reader("structlist 1"))
|
||||||
structList.get(1).setTextField(new Text.Reader("structlist 2"));
|
structList.get(1).setTextField(new Text.Reader("structlist 2"))
|
||||||
structList.get(2).setTextField(new Text.Reader("structlist 3"));
|
structList.get(2).setTextField(new Text.Reader("structlist 3"))
|
||||||
|
|
||||||
|
|
||||||
val enumList = builder.initEnumList(2);
|
val enumList = builder.initEnumList(2)
|
||||||
enumList.set(0, TestEnum.FOO);
|
enumList.set(0, TestEnum.FOO)
|
||||||
enumList.set(1, TestEnum.GARPLY);
|
enumList.set(1, TestEnum.GARPLY)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def checkTestMessage(builder : TestAllTypes.Builder) {
|
def checkTestMessage(builder : TestAllTypes.Builder) {
|
||||||
builder.getVoidField();
|
builder.getVoidField()
|
||||||
assert(builder.getBoolField() == true);
|
assert(builder.getBoolField() == true)
|
||||||
assert(builder.getInt8Field() == -123);
|
assert(builder.getInt8Field() == -123)
|
||||||
assert(builder.getInt16Field() == -12345);
|
assert(builder.getInt16Field() == -12345)
|
||||||
assert(builder.getInt32Field() == -12345678);
|
assert(builder.getInt32Field() == -12345678)
|
||||||
assert(builder.getInt64Field() == -123456789012345L);
|
assert(builder.getInt64Field() == -123456789012345L)
|
||||||
assert(builder.getUInt8Field() == 0xea.toByte);
|
assert(builder.getUInt8Field() == 0xea.toByte)
|
||||||
assert(builder.getUInt16Field() == 0x4567);
|
assert(builder.getUInt16Field() == 0x4567)
|
||||||
assert(builder.getUInt32Field() == 0x34567890);
|
assert(builder.getUInt32Field() == 0x34567890)
|
||||||
assert(builder.getUInt64Field() == 0x1234567890123456L);
|
assert(builder.getUInt64Field() == 0x1234567890123456L)
|
||||||
assert(builder.getFloat32Field() == 1234.5f);
|
assert(builder.getFloat32Field() == 1234.5f)
|
||||||
assert(builder.getFloat64Field() == -123e45);
|
assert(builder.getFloat64Field() == -123e45)
|
||||||
assert(builder.getTextField().toString() == "foo");
|
assert(builder.getTextField().toString() == "foo")
|
||||||
|
|
||||||
{
|
{
|
||||||
val subBuilder = builder.getStructField();
|
val subBuilder = builder.getStructField()
|
||||||
subBuilder.getVoidField();
|
subBuilder.getVoidField()
|
||||||
assert(subBuilder.getBoolField() == true);
|
assert(subBuilder.getBoolField() == true)
|
||||||
assert(subBuilder.getInt8Field() == -12);
|
assert(subBuilder.getInt8Field() == -12)
|
||||||
assert(subBuilder.getInt16Field() == 3456);
|
assert(subBuilder.getInt16Field() == 3456)
|
||||||
assert(subBuilder.getInt32Field() == -78901234);
|
assert(subBuilder.getInt32Field() == -78901234)
|
||||||
assert(subBuilder.getInt64Field() == 56789012345678L);
|
assert(subBuilder.getInt64Field() == 56789012345678L)
|
||||||
assert(subBuilder.getUInt8Field() == 90);
|
assert(subBuilder.getUInt8Field() == 90)
|
||||||
assert(subBuilder.getUInt16Field() == 1234);
|
assert(subBuilder.getUInt16Field() == 1234)
|
||||||
assert(subBuilder.getUInt32Field() == 56789012);
|
assert(subBuilder.getUInt32Field() == 56789012)
|
||||||
assert(subBuilder.getUInt64Field() == 345678901234567890L);
|
assert(subBuilder.getUInt64Field() == 345678901234567890L)
|
||||||
assert(subBuilder.getFloat32Field() == -1.25e-10f);
|
assert(subBuilder.getFloat32Field() == -1.25e-10f)
|
||||||
assert(subBuilder.getFloat64Field() == 345);
|
assert(subBuilder.getFloat64Field() == 345)
|
||||||
|
|
||||||
{
|
{
|
||||||
val subSubBuilder = subBuilder.getStructField();
|
val subSubBuilder = subBuilder.getStructField()
|
||||||
assert(subSubBuilder.getTextField().toString() == "nested")
|
assert(subSubBuilder.getTextField().toString() == "nested")
|
||||||
}
|
}
|
||||||
|
|
||||||
subBuilder.getEnumField() should equal (TestEnum.BAZ);
|
subBuilder.getEnumField() should equal (TestEnum.BAZ)
|
||||||
|
|
||||||
val boolList = subBuilder.getBoolList();
|
val boolList = subBuilder.getBoolList()
|
||||||
assert(boolList.get(0) == false);
|
assert(boolList.get(0) == false)
|
||||||
assert(boolList.get(1) == true);
|
assert(boolList.get(1) == true)
|
||||||
assert(boolList.get(2) == false);
|
assert(boolList.get(2) == false)
|
||||||
assert(boolList.get(3) == true);
|
assert(boolList.get(3) == true)
|
||||||
assert(boolList.get(4) == true);
|
assert(boolList.get(4) == true)
|
||||||
|
|
||||||
}
|
}
|
||||||
builder.getEnumField() should equal (TestEnum.CORGE);
|
builder.getEnumField() should equal (TestEnum.CORGE)
|
||||||
|
|
||||||
assert(builder.getVoidList().size() == 6);
|
assert(builder.getVoidList().size() == 6)
|
||||||
|
|
||||||
val boolList = builder.getBoolList();
|
val boolList = builder.getBoolList()
|
||||||
assert(boolList.get(0) == true);
|
assert(boolList.get(0) == true)
|
||||||
assert(boolList.get(1) == false);
|
assert(boolList.get(1) == false)
|
||||||
assert(boolList.get(2) == false);
|
assert(boolList.get(2) == false)
|
||||||
assert(boolList.get(3) == true);
|
assert(boolList.get(3) == true)
|
||||||
|
|
||||||
val float64List = builder.getFloat64List();
|
val float64List = builder.getFloat64List()
|
||||||
assert(float64List.get(0) == 7777.75);
|
assert(float64List.get(0) == 7777.75)
|
||||||
assert(float64List.get(1) == Double.PositiveInfinity);
|
assert(float64List.get(1) == Double.PositiveInfinity)
|
||||||
assert(float64List.get(2) == Double.NegativeInfinity);
|
assert(float64List.get(2) == Double.NegativeInfinity)
|
||||||
assert(float64List.get(3) != float64List.get(3)); // NaN
|
assert(float64List.get(3) != float64List.get(3)); // NaN
|
||||||
|
|
||||||
val textList = builder.getTextList();
|
val textList = builder.getTextList()
|
||||||
assert(textList.size() == 3);
|
assert(textList.size() == 3)
|
||||||
assert(textList.get(0).toString() == "plugh");
|
assert(textList.get(0).toString() == "plugh")
|
||||||
assert(textList.get(1).toString() == "xyzzy");
|
assert(textList.get(1).toString() == "xyzzy")
|
||||||
assert(textList.get(2).toString() == "thud");
|
assert(textList.get(2).toString() == "thud")
|
||||||
|
|
||||||
val structList = builder.getStructList();
|
val structList = builder.getStructList()
|
||||||
assert(3 == structList.size());
|
assert(3 == structList.size())
|
||||||
assert(structList.get(0).getTextField().toString() == "structlist 1")
|
assert(structList.get(0).getTextField().toString() == "structlist 1")
|
||||||
assert(structList.get(1).getTextField().toString() == "structlist 2")
|
assert(structList.get(1).getTextField().toString() == "structlist 2")
|
||||||
assert(structList.get(2).getTextField().toString() == "structlist 3")
|
assert(structList.get(2).getTextField().toString() == "structlist 3")
|
||||||
|
|
||||||
val enumList = builder.getEnumList();
|
val enumList = builder.getEnumList()
|
||||||
(enumList.get(0)) should equal (TestEnum.FOO);
|
(enumList.get(0)) should equal (TestEnum.FOO)
|
||||||
(enumList.get(1)) should equal (TestEnum.GARPLY);
|
(enumList.get(1)) should equal (TestEnum.GARPLY)
|
||||||
}
|
}
|
||||||
|
|
||||||
def checkTestMessage(reader : TestAllTypes.Reader) {
|
def checkTestMessage(reader : TestAllTypes.Reader) {
|
||||||
reader.getVoidField();
|
reader.getVoidField()
|
||||||
assert(reader.getBoolField() == true);
|
assert(reader.getBoolField() == true)
|
||||||
assert(reader.getInt8Field() == -123);
|
assert(reader.getInt8Field() == -123)
|
||||||
assert(reader.getInt16Field() == -12345);
|
assert(reader.getInt16Field() == -12345)
|
||||||
assert(reader.getInt32Field() == -12345678);
|
assert(reader.getInt32Field() == -12345678)
|
||||||
assert(reader.getInt64Field() == -123456789012345L);
|
assert(reader.getInt64Field() == -123456789012345L)
|
||||||
assert(reader.getUInt8Field() == 0xea.toByte);
|
assert(reader.getUInt8Field() == 0xea.toByte)
|
||||||
assert(reader.getUInt16Field() == 0x4567);
|
assert(reader.getUInt16Field() == 0x4567)
|
||||||
assert(reader.getUInt32Field() == 0x34567890);
|
assert(reader.getUInt32Field() == 0x34567890)
|
||||||
assert(reader.getUInt64Field() == 0x1234567890123456L);
|
assert(reader.getUInt64Field() == 0x1234567890123456L)
|
||||||
assert(reader.getFloat32Field() == 1234.5f);
|
assert(reader.getFloat32Field() == 1234.5f)
|
||||||
assert(reader.getFloat64Field() == -123e45);
|
assert(reader.getFloat64Field() == -123e45)
|
||||||
assert(reader.getTextField().toString() == "foo");
|
assert(reader.getTextField().toString() == "foo")
|
||||||
|
|
||||||
{
|
{
|
||||||
val subReader = reader.getStructField();
|
val subReader = reader.getStructField()
|
||||||
subReader.getVoidField();
|
subReader.getVoidField()
|
||||||
assert(subReader.getBoolField() == true);
|
assert(subReader.getBoolField() == true)
|
||||||
assert(subReader.getInt8Field() == -12);
|
assert(subReader.getInt8Field() == -12)
|
||||||
assert(subReader.getInt16Field() == 3456);
|
assert(subReader.getInt16Field() == 3456)
|
||||||
assert(subReader.getInt32Field() == -78901234);
|
assert(subReader.getInt32Field() == -78901234)
|
||||||
assert(subReader.getInt64Field() == 56789012345678L);
|
assert(subReader.getInt64Field() == 56789012345678L)
|
||||||
assert(subReader.getUInt8Field() == 90);
|
assert(subReader.getUInt8Field() == 90)
|
||||||
assert(subReader.getUInt16Field() == 1234);
|
assert(subReader.getUInt16Field() == 1234)
|
||||||
assert(subReader.getUInt32Field() == 56789012);
|
assert(subReader.getUInt32Field() == 56789012)
|
||||||
assert(subReader.getUInt64Field() == 345678901234567890L);
|
assert(subReader.getUInt64Field() == 345678901234567890L)
|
||||||
assert(subReader.getFloat32Field() == -1.25e-10f);
|
assert(subReader.getFloat32Field() == -1.25e-10f)
|
||||||
assert(subReader.getFloat64Field() == 345);
|
assert(subReader.getFloat64Field() == 345)
|
||||||
|
|
||||||
{
|
{
|
||||||
val subSubReader = subReader.getStructField();
|
val subSubReader = subReader.getStructField()
|
||||||
assert(subSubReader.getTextField().toString() == "nested")
|
assert(subSubReader.getTextField().toString() == "nested")
|
||||||
}
|
}
|
||||||
val boolList = subReader.getBoolList();
|
val boolList = subReader.getBoolList()
|
||||||
assert(boolList.get(0) == false);
|
assert(boolList.get(0) == false)
|
||||||
assert(boolList.get(1) == true);
|
assert(boolList.get(1) == true)
|
||||||
assert(boolList.get(2) == false);
|
assert(boolList.get(2) == false)
|
||||||
assert(boolList.get(3) == true);
|
assert(boolList.get(3) == true)
|
||||||
assert(boolList.get(4) == true);
|
assert(boolList.get(4) == true)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(reader.getVoidList().size() == 6);
|
assert(reader.getVoidList().size() == 6)
|
||||||
|
|
||||||
val boolList = reader.getBoolList();
|
val boolList = reader.getBoolList()
|
||||||
assert(boolList.get(0) == true);
|
assert(boolList.get(0) == true)
|
||||||
assert(boolList.get(1) == false);
|
assert(boolList.get(1) == false)
|
||||||
assert(boolList.get(2) == false);
|
assert(boolList.get(2) == false)
|
||||||
assert(boolList.get(3) == true);
|
assert(boolList.get(3) == true)
|
||||||
|
|
||||||
val float64List = reader.getFloat64List();
|
val float64List = reader.getFloat64List()
|
||||||
assert(float64List.get(0) == 7777.75);
|
assert(float64List.get(0) == 7777.75)
|
||||||
assert(float64List.get(1) == Double.PositiveInfinity);
|
assert(float64List.get(1) == Double.PositiveInfinity)
|
||||||
assert(float64List.get(2) == Double.NegativeInfinity);
|
assert(float64List.get(2) == Double.NegativeInfinity)
|
||||||
assert(float64List.get(3) != float64List.get(3)); // NaN
|
assert(float64List.get(3) != float64List.get(3)); // NaN
|
||||||
|
|
||||||
val textList = reader.getTextList();
|
val textList = reader.getTextList()
|
||||||
assert(textList.size() == 3);
|
assert(textList.size() == 3)
|
||||||
assert(textList.get(0).toString() == "plugh");
|
assert(textList.get(0).toString() == "plugh")
|
||||||
assert(textList.get(1).toString() == "xyzzy");
|
assert(textList.get(1).toString() == "xyzzy")
|
||||||
assert(textList.get(2).toString() == "thud");
|
assert(textList.get(2).toString() == "thud")
|
||||||
|
|
||||||
|
|
||||||
val structList = reader.getStructList();
|
val structList = reader.getStructList()
|
||||||
assert(3 == structList.size());
|
assert(3 == structList.size())
|
||||||
assert(structList.get(0).getTextField().toString() == "structlist 1")
|
assert(structList.get(0).getTextField().toString() == "structlist 1")
|
||||||
assert(structList.get(1).getTextField().toString() == "structlist 2")
|
assert(structList.get(1).getTextField().toString() == "structlist 2")
|
||||||
assert(structList.get(2).getTextField().toString() == "structlist 3")
|
assert(structList.get(2).getTextField().toString() == "structlist 3")
|
||||||
|
|
||||||
val enumList = reader.getEnumList();
|
val enumList = reader.getEnumList()
|
||||||
(enumList.get(0)) should equal (TestEnum.FOO);
|
(enumList.get(0)) should equal (TestEnum.FOO)
|
||||||
(enumList.get(1)) should equal (TestEnum.GARPLY);
|
(enumList.get(1)) should equal (TestEnum.GARPLY)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def checkDefaultMessage(builder : TestDefaults.Builder) {
|
def checkDefaultMessage(builder : TestDefaults.Builder) {
|
||||||
builder.getVoidField();
|
builder.getVoidField()
|
||||||
assert(builder.getBoolField() == true);
|
assert(builder.getBoolField() == true)
|
||||||
assert(builder.getInt8Field() == -123);
|
assert(builder.getInt8Field() == -123)
|
||||||
assert(builder.getInt16Field() == -12345);
|
assert(builder.getInt16Field() == -12345)
|
||||||
assert(builder.getInt32Field() == -12345678);
|
assert(builder.getInt32Field() == -12345678)
|
||||||
assert(builder.getInt64Field() == -123456789012345L);
|
assert(builder.getInt64Field() == -123456789012345L)
|
||||||
assert(builder.getUInt8Field() == 0xea.toByte);
|
assert(builder.getUInt8Field() == 0xea.toByte)
|
||||||
assert(builder.getUInt16Field() == 45678.toShort);
|
assert(builder.getUInt16Field() == 45678.toShort)
|
||||||
assert(builder.getUInt32Field() == 0xce0a6a14);
|
assert(builder.getUInt32Field() == 0xce0a6a14)
|
||||||
assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L);
|
assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L)
|
||||||
assert(builder.getFloat32Field() == 1234.5f);
|
assert(builder.getFloat32Field() == 1234.5f)
|
||||||
assert(builder.getFloat64Field() == -123e45);
|
assert(builder.getFloat64Field() == -123e45)
|
||||||
assert(builder.getEnumField() == TestEnum.CORGE);
|
assert(builder.getEnumField() == TestEnum.CORGE)
|
||||||
|
|
||||||
(builder.getTextField().toString()) should equal ("foo");
|
(builder.getTextField().toString()) should equal ("foo")
|
||||||
(builder.getDataField().toArray()) should equal (Array(0x62,0x61,0x72));
|
(builder.getDataField().toArray()) should equal (Array(0x62,0x61,0x72))
|
||||||
}
|
}
|
||||||
|
|
||||||
def checkDefaultMessage(reader : TestDefaults.Reader) {
|
def checkDefaultMessage(reader : TestDefaults.Reader) {
|
||||||
reader.getVoidField();
|
reader.getVoidField()
|
||||||
assert(reader.getBoolField() == true);
|
assert(reader.getBoolField() == true)
|
||||||
assert(reader.getInt8Field() == -123);
|
assert(reader.getInt8Field() == -123)
|
||||||
assert(reader.getInt16Field() == -12345);
|
assert(reader.getInt16Field() == -12345)
|
||||||
assert(reader.getInt32Field() == -12345678);
|
assert(reader.getInt32Field() == -12345678)
|
||||||
assert(reader.getInt64Field() == -123456789012345L);
|
assert(reader.getInt64Field() == -123456789012345L)
|
||||||
assert(reader.getUInt8Field() == 0xea.toByte);
|
assert(reader.getUInt8Field() == 0xea.toByte)
|
||||||
assert(reader.getUInt16Field() == 45678.toShort);
|
assert(reader.getUInt16Field() == 45678.toShort)
|
||||||
assert(reader.getUInt32Field() == 0xce0a6a14);
|
assert(reader.getUInt32Field() == 0xce0a6a14)
|
||||||
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L);
|
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L)
|
||||||
assert(reader.getFloat32Field() == 1234.5f);
|
assert(reader.getFloat32Field() == 1234.5f)
|
||||||
assert(reader.getFloat64Field() == -123e45);
|
assert(reader.getFloat64Field() == -123e45)
|
||||||
(reader.getTextField().toString()) should equal ("foo");
|
(reader.getTextField().toString()) should equal ("foo")
|
||||||
(reader.getDataField().toArray()) should equal (Array(0x62,0x61,0x72));
|
(reader.getDataField().toArray()) should equal (Array(0x62,0x61,0x72))
|
||||||
|
|
||||||
{
|
{
|
||||||
val subReader = reader.getStructField();
|
val subReader = reader.getStructField()
|
||||||
subReader.getVoidField();
|
subReader.getVoidField()
|
||||||
subReader.getBoolField() should equal (true);
|
subReader.getBoolField() should equal (true)
|
||||||
subReader.getInt8Field() should equal (-12);
|
subReader.getInt8Field() should equal (-12)
|
||||||
subReader.getInt16Field() should equal (3456);
|
subReader.getInt16Field() should equal (3456)
|
||||||
subReader.getInt32Field() should equal (-78901234);
|
subReader.getInt32Field() should equal (-78901234)
|
||||||
// ...
|
// ...
|
||||||
subReader.getTextField().toString() should equal ("baz");
|
subReader.getTextField().toString() should equal ("baz")
|
||||||
|
|
||||||
{
|
{
|
||||||
val subSubReader = subReader.getStructField();
|
val subSubReader = subReader.getStructField()
|
||||||
subSubReader.getTextField().toString() should equal ("nested");
|
subSubReader.getTextField().toString() should equal ("nested")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.getEnumField() should equal (TestEnum.CORGE);
|
reader.getEnumField() should equal (TestEnum.CORGE)
|
||||||
|
|
||||||
|
reader.getVoidList().size() should equal (6)
|
||||||
|
|
||||||
reader.getVoidList().size() should equal (6);
|
|
||||||
{
|
{
|
||||||
val listReader = reader.getBoolList();
|
val listReader = reader.getBoolList()
|
||||||
listReader.size() should equal (4);
|
listReader.size() should equal (4)
|
||||||
listReader.get(0) should equal (true);
|
listReader.get(0) should equal (true)
|
||||||
listReader.get(1) should equal (false);
|
listReader.get(1) should equal (false)
|
||||||
listReader.get(2) should equal (false);
|
listReader.get(2) should equal (false)
|
||||||
listReader.get(3) should equal (true);
|
listReader.get(3) should equal (true)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
val listReader = reader.getInt8List();
|
val listReader = reader.getInt8List()
|
||||||
listReader.size() should equal (2);
|
listReader.size() should equal (2)
|
||||||
listReader.get(0) should equal (111);
|
listReader.get(0) should equal (111)
|
||||||
listReader.get(1) should equal (-111);
|
listReader.get(1) should equal (-111)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def setDefaultMessage(builder : TestDefaults.Builder) {
|
def setDefaultMessage(builder : TestDefaults.Builder) {
|
||||||
builder.setBoolField(false);
|
builder.setBoolField(false)
|
||||||
builder.setInt8Field(-122);
|
builder.setInt8Field(-122)
|
||||||
builder.setInt16Field(-12344);
|
builder.setInt16Field(-12344)
|
||||||
builder.setInt32Field(-12345677);
|
builder.setInt32Field(-12345677)
|
||||||
builder.setInt64Field(-123456789012344L);
|
builder.setInt64Field(-123456789012344L)
|
||||||
builder.setUInt8Field(0xe9.toByte);
|
builder.setUInt8Field(0xe9.toByte)
|
||||||
builder.setUInt16Field(45677.toShort);
|
builder.setUInt16Field(45677.toShort)
|
||||||
builder.setUInt32Field(0xce0a6a13);
|
builder.setUInt32Field(0xce0a6a13)
|
||||||
builder.setUInt64Field(0xab54a98ceb1f0ad1L);
|
builder.setUInt64Field(0xab54a98ceb1f0ad1L)
|
||||||
builder.setFloat32Field(1234.4f);
|
builder.setFloat32Field(1234.4f)
|
||||||
builder.setFloat64Field(-123e44);
|
builder.setFloat64Field(-123e44)
|
||||||
builder.setTextField(new Reader("bar"));
|
builder.setTextField(new Reader("bar"))
|
||||||
builder.setEnumField(TestEnum.QUX);
|
builder.setEnumField(TestEnum.QUX)
|
||||||
}
|
}
|
||||||
|
|
||||||
def checkSettedDefaultMessage(reader : TestDefaults.Reader) {
|
def checkSettedDefaultMessage(reader : TestDefaults.Reader) {
|
||||||
assert(reader.getBoolField() == false);
|
assert(reader.getBoolField() == false)
|
||||||
assert(reader.getInt8Field() == -122);
|
assert(reader.getInt8Field() == -122)
|
||||||
assert(reader.getInt16Field() == -12344);
|
assert(reader.getInt16Field() == -12344)
|
||||||
assert(reader.getInt32Field() == -12345677);
|
assert(reader.getInt32Field() == -12345677)
|
||||||
assert(reader.getInt64Field() == -123456789012344L);
|
assert(reader.getInt64Field() == -123456789012344L)
|
||||||
assert(reader.getUInt8Field() == 0xe9.toByte);
|
assert(reader.getUInt8Field() == 0xe9.toByte)
|
||||||
assert(reader.getUInt16Field() == 45677.toShort);
|
assert(reader.getUInt16Field() == 45677.toShort)
|
||||||
assert(reader.getUInt32Field() == 0xce0a6a13);
|
assert(reader.getUInt32Field() == 0xce0a6a13)
|
||||||
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad1L);
|
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad1L)
|
||||||
assert(reader.getFloat32Field() == 1234.4f);
|
assert(reader.getFloat32Field() == 1234.4f)
|
||||||
assert(reader.getFloat64Field() == -123e44);
|
assert(reader.getFloat64Field() == -123e44)
|
||||||
assert(reader.getEnumField() == TestEnum.QUX)
|
assert(reader.getEnumField() == TestEnum.QUX)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,46 @@ public final class Serialize {
|
||||||
return new MessageReader(segmentSlices, options);
|
return new MessageReader(segmentSlices, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MessageReader read(ByteBuffer bb) throws IOException {
|
||||||
|
return read(bb, ReaderOptions.DEFAULT_READER_OPTIONS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MessageReader read(ByteBuffer bb, ReaderOptions options) throws IOException {
|
||||||
|
bb.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
int segmentCount = 1 + bb.getInt();
|
||||||
|
if (segmentCount > 512) {
|
||||||
|
throw new IOException("too many segments");
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteBuffer[] segmentSlices = new ByteBuffer[segmentCount];
|
||||||
|
|
||||||
|
int segmentSizesBase = bb.position();
|
||||||
|
int segmentSizesSize = segmentCount * 4;
|
||||||
|
|
||||||
|
int align = Constants.BYTES_PER_WORD - 1;
|
||||||
|
int segmentBase = (segmentSizesBase + segmentSizesSize + align) & ~align;
|
||||||
|
|
||||||
|
int totalWords = 0;
|
||||||
|
|
||||||
|
for (int ii = 0; ii < segmentCount; ++ii) {
|
||||||
|
int segmentSize = bb.getInt(segmentSizesBase + ii * 4);
|
||||||
|
|
||||||
|
bb.position(segmentBase + totalWords * Constants.BYTES_PER_WORD);
|
||||||
|
segmentSlices[ii] = bb.slice();
|
||||||
|
segmentSlices[ii].limit(segmentSize * Constants.BYTES_PER_WORD);
|
||||||
|
segmentSlices[ii].order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
totalWords += segmentSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalWords > options.traversalLimitInWords) {
|
||||||
|
throw new DecodeException("Message size exceeds traversal limit.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MessageReader(segmentSlices, options);
|
||||||
|
}
|
||||||
|
|
||||||
public static void write(WritableByteChannel outputChannel,
|
public static void write(WritableByteChannel outputChannel,
|
||||||
MessageBuilder message) throws IOException {
|
MessageBuilder message) throws IOException {
|
||||||
ByteBuffer[] segments = message.getSegmentsForOutput();
|
ByteBuffer[] segments = message.getSegmentsForOutput();
|
||||||
|
|
144
runtime/src/test/scala/org/capnproto/LayoutSuite.scala
Normal file
144
runtime/src/test/scala/org/capnproto/LayoutSuite.scala
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
||||||
|
// Licensed under the MIT License:
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
package org.capnproto
|
||||||
|
|
||||||
|
import org.scalatest.FunSuite
|
||||||
|
|
||||||
|
|
||||||
|
class LayoutSuite extends FunSuite {
|
||||||
|
|
||||||
|
class BareStructReader extends StructReader.Factory[StructReader] {
|
||||||
|
def constructReader(segment: org.capnproto.SegmentReader, data: Int, pointers: Int,
|
||||||
|
dataSize: Int, pointerCount: Short, nestingLimit:Int) : StructReader = {
|
||||||
|
new StructReader(segment,data,pointers,dataSize,pointerCount,nestingLimit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("SimpleRawDataStruct") {
|
||||||
|
val data : Array[Byte] =
|
||||||
|
Array(0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x23, 0x45, 0x67, 0x89.toByte, 0xab.toByte,
|
||||||
|
0xcd.toByte, 0xef.toByte)
|
||||||
|
|
||||||
|
val buffer = java.nio.ByteBuffer.wrap(data)
|
||||||
|
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN)
|
||||||
|
|
||||||
|
val arena = new ReaderArena(Array(buffer), 0x7fffffffffffffffL)
|
||||||
|
|
||||||
|
val reader = WireHelpers.readStructPointer(new BareStructReader(),
|
||||||
|
arena.tryGetSegment(0),
|
||||||
|
0, null, 0, 0x7fffffff)
|
||||||
|
|
||||||
|
assert(reader._getLongField(0) === 0xefcdab8967452301L)
|
||||||
|
assert(reader._getLongField(1) === 0L)
|
||||||
|
|
||||||
|
assert(reader._getIntField(0) === 0x67452301)
|
||||||
|
assert(reader._getIntField(1) === 0xefcdab89)
|
||||||
|
assert(reader._getIntField(2) === 0)
|
||||||
|
assert(reader._getShortField(0) === 0x2301.toShort)
|
||||||
|
assert(reader._getShortField(1) === 0x6745.toShort)
|
||||||
|
assert(reader._getShortField(2) === 0xab89.toShort)
|
||||||
|
assert(reader._getShortField(3) === 0xefcd.toShort)
|
||||||
|
assert(reader._getShortField(4) === 0.toShort)
|
||||||
|
|
||||||
|
// TODO masking
|
||||||
|
|
||||||
|
assert(reader._getBooleanField(0) === true)
|
||||||
|
assert(reader._getBooleanField(1) === false)
|
||||||
|
assert(reader._getBooleanField(2) === false)
|
||||||
|
|
||||||
|
assert(reader._getBooleanField(3) === false)
|
||||||
|
assert(reader._getBooleanField(4) === false)
|
||||||
|
assert(reader._getBooleanField(5) === false)
|
||||||
|
assert(reader._getBooleanField(6) === false)
|
||||||
|
assert(reader._getBooleanField(7) == false)
|
||||||
|
|
||||||
|
assert(reader._getBooleanField(8) === true)
|
||||||
|
assert(reader._getBooleanField(9) === true)
|
||||||
|
assert(reader._getBooleanField(10) === false)
|
||||||
|
assert(reader._getBooleanField(11) === false)
|
||||||
|
assert(reader._getBooleanField(12) === false)
|
||||||
|
assert(reader._getBooleanField(13) === true)
|
||||||
|
assert(reader._getBooleanField(14) === false)
|
||||||
|
assert(reader._getBooleanField(15) === false)
|
||||||
|
|
||||||
|
assert(reader._getBooleanField(63) === true)
|
||||||
|
assert(reader._getBooleanField(64) === false)
|
||||||
|
|
||||||
|
// TODO masking
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
def setupStruct(builder : StructBuilder) = {
|
||||||
|
builder._setLongField(0, 0x1011121314151617L)
|
||||||
|
builder._setIntField(2, 0x20212223)
|
||||||
|
builder._setShortField(6, 0x3031.toShort)
|
||||||
|
builder._setByteField(14, 0x40)
|
||||||
|
builder._setBooleanField(120, false)
|
||||||
|
builder._setBooleanField(121, false)
|
||||||
|
builder._setBooleanField(122, true)
|
||||||
|
builder._setBooleanField(123, false)
|
||||||
|
builder._setBooleanField(124, true)
|
||||||
|
builder._setBooleanField(125, true)
|
||||||
|
builder._setBooleanField(126, true)
|
||||||
|
builder._setBooleanField(127, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
def checkStruct(builder : StructBuilder) {
|
||||||
|
assert(0x1011121314151617L === builder._getLongField(0))
|
||||||
|
assert(0x20212223 == builder._getIntField(2))
|
||||||
|
assert(0x3031 === builder._getShortField(6))
|
||||||
|
assert(0x40 === builder._getByteField(14))
|
||||||
|
assert(false === builder._getBooleanField(120))
|
||||||
|
assert(false === builder._getBooleanField(121))
|
||||||
|
assert(true === builder._getBooleanField(122))
|
||||||
|
assert(false === builder._getBooleanField(123))
|
||||||
|
assert(true === builder._getBooleanField(124))
|
||||||
|
assert(true === builder._getBooleanField(125))
|
||||||
|
assert(true === builder._getBooleanField(126))
|
||||||
|
assert(false === builder._getBooleanField(127))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class BareStructBuilder(val structSize : StructSize) extends StructBuilder.Factory[StructBuilder] {
|
||||||
|
|
||||||
|
def constructBuilder(segment: org.capnproto.SegmentBuilder, data: Int, pointers: Int,
|
||||||
|
dataSize: Int, pointerCount: Short) : StructBuilder = {
|
||||||
|
new StructBuilder(segment,data,pointers,dataSize,pointerCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
test("StructRoundTrip_OneSegment") {
|
||||||
|
val buffer = java.nio.ByteBuffer.allocate(1024 * 8)
|
||||||
|
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN)
|
||||||
|
|
||||||
|
val segment = new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS,
|
||||||
|
BuilderArena.SUGGESTED_ALLOCATION_STRATEGY))
|
||||||
|
val factory = new BareStructBuilder(new StructSize(2, 4))
|
||||||
|
val builder = WireHelpers.initStructPointer(factory, 0, segment, factory.structSize)
|
||||||
|
setupStruct(builder)
|
||||||
|
checkStruct(builder)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,147 +0,0 @@
|
||||||
// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
|
||||||
// Licensed under the MIT License:
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package org.capnproto;
|
|
||||||
|
|
||||||
import org.scalatest.FunSuite
|
|
||||||
|
|
||||||
|
|
||||||
class LayoutSuite extends FunSuite {
|
|
||||||
|
|
||||||
class BareStructReader extends StructReader.Factory[StructReader] {
|
|
||||||
def constructReader(segment: org.capnproto.SegmentReader, data: Int, pointers: Int,
|
|
||||||
dataSize: Int, pointerCount: Short, nestingLimit:Int) : StructReader = {
|
|
||||||
return new StructReader(segment,data,pointers,dataSize,pointerCount,nestingLimit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test("SimpleRawDataStruct") {
|
|
||||||
val data : Array[Byte] =
|
|
||||||
Array(0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x23, 0x45, 0x67, 0x89.toByte, 0xab.toByte,
|
|
||||||
0xcd.toByte, 0xef.toByte);
|
|
||||||
|
|
||||||
val buffer = java.nio.ByteBuffer.wrap(data);
|
|
||||||
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
|
||||||
|
|
||||||
val arena = new ReaderArena(Array(buffer), 0x7fffffffffffffffL);
|
|
||||||
|
|
||||||
val reader = WireHelpers.readStructPointer(new BareStructReader(),
|
|
||||||
arena.tryGetSegment(0),
|
|
||||||
0, null, 0, 0x7fffffff);
|
|
||||||
|
|
||||||
assert(reader._getLongField(0) === 0xefcdab8967452301L);
|
|
||||||
assert(reader._getLongField(1) === 0L);
|
|
||||||
|
|
||||||
assert(reader._getIntField(0) === 0x67452301);
|
|
||||||
assert(reader._getIntField(1) === 0xefcdab89);
|
|
||||||
assert(reader._getIntField(2) === 0);
|
|
||||||
assert(reader._getShortField(0) === 0x2301.toShort);
|
|
||||||
assert(reader._getShortField(1) === 0x6745.toShort);
|
|
||||||
assert(reader._getShortField(2) === 0xab89.toShort);
|
|
||||||
assert(reader._getShortField(3) === 0xefcd.toShort);
|
|
||||||
assert(reader._getShortField(4) === 0.toShort);
|
|
||||||
|
|
||||||
// TODO masking
|
|
||||||
|
|
||||||
assert(reader._getBooleanField(0) === true);
|
|
||||||
assert(reader._getBooleanField(1) === false);
|
|
||||||
assert(reader._getBooleanField(2) === false);
|
|
||||||
|
|
||||||
assert(reader._getBooleanField(3) === false);
|
|
||||||
assert(reader._getBooleanField(4) === false);
|
|
||||||
assert(reader._getBooleanField(5) === false);
|
|
||||||
assert(reader._getBooleanField(6) === false);
|
|
||||||
assert(reader._getBooleanField(7) == false);
|
|
||||||
|
|
||||||
assert(reader._getBooleanField(8) === true);
|
|
||||||
assert(reader._getBooleanField(9) === true);
|
|
||||||
assert(reader._getBooleanField(10) === false);
|
|
||||||
assert(reader._getBooleanField(11) === false);
|
|
||||||
assert(reader._getBooleanField(12) === false);
|
|
||||||
assert(reader._getBooleanField(13) === true);
|
|
||||||
assert(reader._getBooleanField(14) === false);
|
|
||||||
assert(reader._getBooleanField(15) === false);
|
|
||||||
|
|
||||||
assert(reader._getBooleanField(63) === true);
|
|
||||||
assert(reader._getBooleanField(64) === false);
|
|
||||||
|
|
||||||
// TODO masking
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
def setupStruct(builder : StructBuilder) = {
|
|
||||||
builder._setLongField(0, 0x1011121314151617L);
|
|
||||||
builder._setIntField(2, 0x20212223);
|
|
||||||
builder._setShortField(6, 0x3031.toShort);
|
|
||||||
builder._setByteField(14, 0x40);
|
|
||||||
builder._setBooleanField(120, false);
|
|
||||||
builder._setBooleanField(121, false);
|
|
||||||
builder._setBooleanField(122, true);
|
|
||||||
builder._setBooleanField(123, false);
|
|
||||||
builder._setBooleanField(124, true);
|
|
||||||
builder._setBooleanField(125, true);
|
|
||||||
builder._setBooleanField(126, true);
|
|
||||||
builder._setBooleanField(127, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
def checkStruct(builder : StructBuilder) {
|
|
||||||
assert(0x1011121314151617L === builder._getLongField(0));
|
|
||||||
assert(0x20212223 == builder._getIntField(2));
|
|
||||||
assert(0x3031 === builder._getShortField(6));
|
|
||||||
assert(0x40 === builder._getByteField(14));
|
|
||||||
assert(false === builder._getBooleanField(120));
|
|
||||||
assert(false === builder._getBooleanField(121));
|
|
||||||
assert(true === builder._getBooleanField(122));
|
|
||||||
assert(false === builder._getBooleanField(123));
|
|
||||||
assert(true === builder._getBooleanField(124));
|
|
||||||
assert(true === builder._getBooleanField(125));
|
|
||||||
assert(true === builder._getBooleanField(126));
|
|
||||||
assert(false === builder._getBooleanField(127));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class BareStructBuilder(structSize : StructSize) extends StructBuilder.Factory[StructBuilder] {
|
|
||||||
|
|
||||||
def constructBuilder(segment: org.capnproto.SegmentBuilder, data: Int, pointers: Int,
|
|
||||||
dataSize: Int, pointerCount: Short) : StructBuilder = {
|
|
||||||
return new StructBuilder(segment,data,pointers,dataSize,pointerCount);
|
|
||||||
}
|
|
||||||
def structSize() : StructSize = {
|
|
||||||
return structSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
test("StructRoundTrip_OneSegment") {
|
|
||||||
val buffer = java.nio.ByteBuffer.allocate(1024 * 8);
|
|
||||||
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
|
||||||
|
|
||||||
val segment = new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS,
|
|
||||||
BuilderArena.SUGGESTED_ALLOCATION_STRATEGY))
|
|
||||||
val factory = new BareStructBuilder(new StructSize(2, 4));
|
|
||||||
val builder = WireHelpers.initStructPointer(factory, 0, segment, factory.structSize());
|
|
||||||
setupStruct(builder);
|
|
||||||
checkStruct(builder);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
package org.capnproto;
|
package org.capnproto
|
||||||
|
|
||||||
import org.scalatest.FunSuite;
|
import org.scalatest.FunSuite
|
||||||
import org.scalatest.Matchers._;
|
import org.scalatest.Matchers._
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
class SerializePackedSuite extends FunSuite {
|
class SerializePackedSuite extends FunSuite {
|
||||||
|
|
||||||
|
@ -31,54 +31,54 @@ class SerializePackedSuite extends FunSuite {
|
||||||
// ----
|
// ----
|
||||||
// write
|
// write
|
||||||
{
|
{
|
||||||
val bytes = new Array[Byte](packed.length);
|
val bytes = new Array[Byte](packed.length)
|
||||||
val writer = new ArrayOutputStream(ByteBuffer.wrap(bytes));
|
val writer = new ArrayOutputStream(ByteBuffer.wrap(bytes))
|
||||||
val packedOutputStream = new PackedOutputStream(writer);
|
val packedOutputStream = new PackedOutputStream(writer)
|
||||||
packedOutputStream.write(ByteBuffer.wrap(unpacked));
|
packedOutputStream.write(ByteBuffer.wrap(unpacked))
|
||||||
|
|
||||||
(bytes) should equal (packed);
|
(bytes) should equal (packed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------
|
// ------
|
||||||
// read
|
// read
|
||||||
{
|
{
|
||||||
val reader = new ArrayInputStream(ByteBuffer.wrap(packed));
|
val reader = new ArrayInputStream(ByteBuffer.wrap(packed))
|
||||||
val packedInputStream = new PackedInputStream(reader);
|
val packedInputStream = new PackedInputStream(reader)
|
||||||
val bytes = new Array[Byte](unpacked.length);
|
val bytes = new Array[Byte](unpacked.length)
|
||||||
val n = packedInputStream.read(ByteBuffer.wrap(bytes));
|
val n = packedInputStream.read(ByteBuffer.wrap(bytes))
|
||||||
|
|
||||||
(n) should equal (unpacked.length);
|
(n) should equal (unpacked.length)
|
||||||
|
|
||||||
(bytes) should equal (unpacked);
|
(bytes) should equal (unpacked)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test("SimplePacking") {
|
test("SimplePacking") {
|
||||||
expectPacksTo(Array(), Array());
|
expectPacksTo(Array(), Array())
|
||||||
expectPacksTo(Array(0,0,0,0,0,0,0,0), Array(0,0));
|
expectPacksTo(Array(0,0,0,0,0,0,0,0), Array(0,0))
|
||||||
expectPacksTo(Array(0,0,12,0,0,34,0,0), Array(0x24,12,34));
|
expectPacksTo(Array(0,0,12,0,0,34,0,0), Array(0x24,12,34))
|
||||||
expectPacksTo(Array(1,3,2,4,5,7,6,8), Array(0xff.toByte,1,3,2,4,5,7,6,8,0));
|
expectPacksTo(Array(1,3,2,4,5,7,6,8), Array(0xff.toByte,1,3,2,4,5,7,6,8,0))
|
||||||
expectPacksTo(Array(0,0,0,0,0,0,0,0, 1,3,2,4,5,7,6,8),
|
expectPacksTo(Array(0,0,0,0,0,0,0,0, 1,3,2,4,5,7,6,8),
|
||||||
Array(0,0,0xff.toByte,1,3,2,4,5,7,6,8,0));
|
Array(0,0,0xff.toByte,1,3,2,4,5,7,6,8,0))
|
||||||
expectPacksTo(Array(0,0,12,0,0,34,0,0, 1,3,2,4,5,7,6,8),
|
expectPacksTo(Array(0,0,12,0,0,34,0,0, 1,3,2,4,5,7,6,8),
|
||||||
Array(0x24, 12, 34, 0xff.toByte,1,3,2,4,5,7,6,8,0));
|
Array(0x24, 12, 34, 0xff.toByte,1,3,2,4,5,7,6,8,0))
|
||||||
expectPacksTo(Array(1,3,2,4,5,7,6,8, 8,6,7,4,5,2,3,1),
|
expectPacksTo(Array(1,3,2,4,5,7,6,8, 8,6,7,4,5,2,3,1),
|
||||||
Array(0xff.toByte,1,3,2,4,5,7,6,8,1,8,6,7,4,5,2,3,1));
|
Array(0xff.toByte,1,3,2,4,5,7,6,8,1,8,6,7,4,5,2,3,1))
|
||||||
|
|
||||||
expectPacksTo(Array(1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1),
|
expectPacksTo(Array(1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1),
|
||||||
Array(0xff.toByte,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8,
|
Array(0xff.toByte,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8,
|
||||||
0xd6.toByte,2,4,9,5,1));
|
0xd6.toByte,2,4,9,5,1))
|
||||||
|
|
||||||
expectPacksTo(Array(1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1),
|
expectPacksTo(Array(1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1),
|
||||||
Array(0xff.toByte,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8,
|
Array(0xff.toByte,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8,
|
||||||
0xd6.toByte,2,4,9,5,1));
|
0xd6.toByte,2,4,9,5,1))
|
||||||
|
|
||||||
expectPacksTo(Array(8,0,100,6,0,1,1,2, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,1,0,2,0,3,1),
|
expectPacksTo(Array(8,0,100,6,0,1,1,2, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,1,0,2,0,3,1),
|
||||||
Array(0xed.toByte,8,100,6,1,1,2, 0,2, 0xd4.toByte,1,2,3,1));
|
Array(0xed.toByte,8,100,6,1,1,2, 0,2, 0xd4.toByte,1,2,3,1))
|
||||||
|
|
||||||
expectPacksTo(Array(0,0,0,0,2,0,0,0, 0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0),
|
expectPacksTo(Array(0,0,0,0,2,0,0,0, 0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0),
|
||||||
Array(0x10,2, 0x40,1, 0,0));
|
Array(0x10,2, 0x40,1, 0,0))
|
||||||
}
|
}
|
||||||
}
|
}
|
123
runtime/src/test/scala/org/capnproto/SerializeSuite.scala
Normal file
123
runtime/src/test/scala/org/capnproto/SerializeSuite.scala
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
||||||
|
// Licensed under the MIT License:
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
package org.capnproto
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
|
import org.scalatest.FunSuite
|
||||||
|
import org.scalatest.Matchers._
|
||||||
|
|
||||||
|
class SerializeSuite extends FunSuite {
|
||||||
|
/**
|
||||||
|
* @param exampleSegmentCount number of segments
|
||||||
|
* @param exampleBytes byte array containing `segmentCount` segments; segment `i` contains `i` words each set to `i`
|
||||||
|
*/
|
||||||
|
def expectSerializesTo(exampleSegmentCount: Int, exampleBytes: Array[Byte]): Unit = {
|
||||||
|
def checkSegmentContents(arena: ReaderArena): Unit = {
|
||||||
|
arena.segments should have length exampleSegmentCount
|
||||||
|
for (i <- 0 until exampleSegmentCount) {
|
||||||
|
val segment = arena.segments.get(i)
|
||||||
|
val segmentWords = segment.buffer.asLongBuffer()
|
||||||
|
|
||||||
|
segmentWords.capacity should equal (i)
|
||||||
|
segmentWords.rewind()
|
||||||
|
while (segmentWords.hasRemaining) {
|
||||||
|
segmentWords.get should equal (i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----
|
||||||
|
// read via ReadableByteChannel
|
||||||
|
{
|
||||||
|
val messageReader = Serialize.read(new ArrayInputStream(ByteBuffer.wrap(exampleBytes)))
|
||||||
|
checkSegmentContents(messageReader.arena)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------
|
||||||
|
// read via ByteBuffer
|
||||||
|
{
|
||||||
|
val messageReader = Serialize.read(ByteBuffer.wrap(exampleBytes))
|
||||||
|
checkSegmentContents(messageReader.arena)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("SegmentReading") {
|
||||||
|
// When transmitting over a stream, the following should be sent. All integers are unsigned and little-endian.
|
||||||
|
// - (4 bytes) The number of segments, minus one (since there is always at least one segment).
|
||||||
|
// - (N * 4 bytes) The size of each segment, in words.
|
||||||
|
// - (0 or 4 bytes) Padding up to the next word boundary.
|
||||||
|
// - The content of each segment, in order.
|
||||||
|
|
||||||
|
expectSerializesTo(1, Array[Byte](
|
||||||
|
0, 0, 0, 0, // 1 segment
|
||||||
|
0, 0, 0, 0 // Segment 0 contains 0 bytes
|
||||||
|
// No padding
|
||||||
|
// Segment 0 (empty)
|
||||||
|
))
|
||||||
|
|
||||||
|
expectSerializesTo(2, Array[Byte](
|
||||||
|
1, 0, 0, 0, // 2 segments
|
||||||
|
0, 0, 0, 0, // Segment 0 contains 0 words
|
||||||
|
1, 0, 0, 0, // Segment 1 contains 1 words
|
||||||
|
// Padding
|
||||||
|
0, 0, 0, 0,
|
||||||
|
// Segment 0 (empty)
|
||||||
|
// Segment 1
|
||||||
|
1, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
))
|
||||||
|
|
||||||
|
expectSerializesTo(3, Array[Byte](
|
||||||
|
2, 0, 0, 0, // 3 segments
|
||||||
|
0, 0, 0, 0, // Segment 0 contains 0 words
|
||||||
|
1, 0, 0, 0, // Segment 1 contains 1 words
|
||||||
|
2, 0, 0, 0, // Segment 2 contains 2 words
|
||||||
|
// No padding
|
||||||
|
// Segment 0 (empty)
|
||||||
|
// Segment 1
|
||||||
|
1, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
// Segment 2
|
||||||
|
2, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
2, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
))
|
||||||
|
|
||||||
|
expectSerializesTo(4, Array[Byte](
|
||||||
|
3, 0, 0, 0, // 4 segments
|
||||||
|
0, 0, 0, 0, // Segment 0 contains 0 words
|
||||||
|
1, 0, 0, 0, // Segment 1 contains 1 words
|
||||||
|
2, 0, 0, 0, // Segment 2 contains 2 words
|
||||||
|
3, 0, 0, 0, // Segment 3 contains 3 words
|
||||||
|
// Padding
|
||||||
|
0, 0, 0, 0,
|
||||||
|
// Segment 0 (empty)
|
||||||
|
// Segment 1
|
||||||
|
1, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
// Segment 2
|
||||||
|
2, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
2, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
// Segment 3
|
||||||
|
3, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
3, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
3, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue