diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 104fc0d..f50237e 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -884,7 +884,38 @@ private: }; } else if (kind == FieldKind::STRUCT) { - KJ_FAIL_REQUIRE("unimplemented"); + + return FieldText { + kj::strTree( + kj::mv(unionDiscrim.readerIsDecl), + spaces(indent), " public boolean has", titleCase, "() {\n", + spaces(indent), " return !_reader.getPointerField(", offset, ").isNull();\n", + spaces(indent), " }\n", + + spaces(indent), " public ", type, ".Reader", + " get", titleCase, "() {\n", + spaces(indent), " throw new Error();\n", + spaces(indent), " }\n", "\n"), + + kj::strTree( + kj::mv(unionDiscrim.builderIsDecl), + spaces(indent), " public final boolean has", titleCase, "() {\n", + spaces(indent), " return !_builder.getPointerField(", offset, ").isNull();\n", + spaces(indent), " }\n", + spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n", + spaces(indent), " throw new Error();\n", + spaces(indent), " }\n", + spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n", + unionDiscrim.set, + spaces(indent), " throw new Error();\n", + spaces(indent), " }\n", + spaces(indent), " public final ", type, ".Builder init", titleCase, "(int size) {\n", + spaces(indent), " throw new Error();\n", + spaces(indent), " }\n"), + + kj::strTree(), + kj::strTree() + }; } else if (kind == FieldKind::BLOB) { @@ -920,7 +951,6 @@ private: spaces(indent), " }\n"), kj::strTree(), - kj::strTree() }; } else if (kind == FieldKind::LIST) { diff --git a/compiler/src/test/scala/org/capnproto/EncodingTest.scala b/compiler/src/test/scala/org/capnproto/EncodingTest.scala index 9fadfe6..3c46499 100644 --- a/compiler/src/test/scala/org/capnproto/EncodingTest.scala +++ b/compiler/src/test/scala/org/capnproto/EncodingTest.scala @@ -6,12 +6,12 @@ import org.scalatest.FunSuite class EncodingSuite extends FunSuite { + test("AllTypes") { val message = new MessageBuilder(); val allTypes = message.initRoot(TestAllTypes.Builder.factory); - allTypes.setVoidField(); - allTypes.setBoolField(true); - // ... + TestUtil.initTestMessage(allTypes); + TestUtil.checkTestMessage(allTypes); } } diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala new file mode 100644 index 0000000..1bf9fc1 --- /dev/null +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -0,0 +1,43 @@ +package org.capnproto; + +import org.capnproto.test.Test._; + + + +object TestUtil { + def initTestMessage(builder : TestAllTypes.Builder) { + builder.setVoidField(); + builder.setBoolField(true); + builder.setInt8Field(-123); + builder.setInt16Field(-12345); + builder.setInt32Field(-12345678); + builder.setInt64Field(-123456789012345L); + builder.setUInt8Field(0xef.toByte); + builder.setUInt16Field(0x4567); + builder.setUInt32Field(0x34567890); + builder.setUInt64Field(0x1234567890123456L); + builder.setFloat32Field(1234.5f); + builder.setFloat64Field(-123e45); + builder.setTextField(new Text.Reader("foo")); +// builder.setDataField(data("bar")); + + } + + + def checkTestMessage(builder : TestAllTypes.Builder) { + builder.getVoidField(); + assert(builder.getBoolField() == true); + assert(builder.getInt8Field() == -123); + assert(builder.getInt16Field() == -12345); + assert(builder.getInt32Field() == -12345678); + assert(builder.getInt64Field() == -123456789012345L); + assert(builder.getUInt8Field() == 0xef.toByte); + assert(builder.getUInt16Field() == 0x4567); + assert(builder.getUInt32Field() == 0x34567890); + assert(builder.getUInt64Field() == 0x1234567890123456L); + assert(builder.getFloat32Field() == 1234.5f); + assert(builder.getFloat64Field() == -123e45); + //assert(builder.getTextField().toString() == "foo"); + } + +} diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index 32557e0..524b298 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -30,6 +30,8 @@ struct TestAllTypes { float64Field @11 : Float64; textField @12 : Text; dataField @13 : Data; + structField @14 : TestAllTypes; + enumField @15 : TestEnum; # ... }