commit
76188afb94
71 changed files with 5882 additions and 3 deletions
@ -0,0 +1,19 @@ |
||||
<project name="generate-sources"> |
||||
<echo message="Running protoc ..."/> |
||||
<mkdir dir="${generated.sources.dir}"/> |
||||
<exec executable="${protoc}"> |
||||
<arg value="--kotlin_out=lite:${generated.sources.dir}"/> |
||||
<arg value="--proto_path=${protobuf.source.dir}"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/any.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/api.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/duration.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/empty.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/field_mask.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/source_context.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/struct.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/timestamp.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/type.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/wrappers.proto"/> |
||||
</exec> |
||||
</project> |
||||
|
@ -0,0 +1,34 @@ |
||||
<project name="generate-test-sources"> |
||||
<mkdir dir="${generated.testsources.dir}"/> |
||||
<exec executable="${protoc}"> |
||||
<arg value="--java_out=lite:${generated.testsources.dir}"/> |
||||
<arg value="--proto_path=${protobuf.source.dir}"/> |
||||
<arg value="--proto_path=${protobuf.basedir}/java/kotlin/${test.proto.dir}"/> |
||||
<arg value="--experimental_allow_proto3_optional"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/map_lite_unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import_public.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import_public_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_proto3.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/evil_names_proto2.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/evil_names_proto3.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/example_extensible_message.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/multiple_files_proto3.proto"/> |
||||
</exec> |
||||
<exec executable="${protoc}"> |
||||
<arg value="--kotlin_out=lite:${generated.testsources.dir}"/> |
||||
<arg value="--proto_path=${protobuf.source.dir}"/> |
||||
<arg value="--proto_path=${protobuf.basedir}/java/kotlin/${test.proto.dir}"/> |
||||
<arg value="--experimental_allow_proto3_optional"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/map_lite_unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_proto3.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/evil_names_proto2.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/evil_names_proto3.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/example_extensible_message.proto"/> |
||||
<arg value="${protobuf.basedir}/java/kotlin/${test.proto.dir}/com/google/protobuf/multiple_files_proto3.proto"/> |
||||
</exec> |
||||
</project> |
@ -0,0 +1,25 @@ |
||||
# Remove code enclosed by "BEGIN FULL-RUNTIME" and "END FULL-RUNTIME" to |
||||
# create the lite-only version of a test file. |
||||
|
||||
BEGIN { |
||||
in_full_runtime = 0; |
||||
} |
||||
|
||||
/BEGIN FULL-RUNTIME/ { |
||||
in_full_runtime = 1; |
||||
next; |
||||
} |
||||
|
||||
/END FULL-RUNTIME/ { |
||||
in_full_runtime = 0; |
||||
next; |
||||
} |
||||
|
||||
in_full_runtime { |
||||
# Skip full runtime code path. |
||||
next; |
||||
} |
||||
|
||||
{ |
||||
print; |
||||
} |
@ -0,0 +1,284 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
<parent> |
||||
<groupId>com.google.protobuf</groupId> |
||||
<artifactId>protobuf-parent</artifactId> |
||||
<version>3.15.6</version> |
||||
</parent> |
||||
|
||||
<artifactId>protobuf-kotlin-lite</artifactId> |
||||
<packaging>bundle</packaging> |
||||
|
||||
<name>Protocol Buffers [Lite]</name> |
||||
<description> |
||||
Lite version of Protocol Buffers library. This version is optimized for code size, but does |
||||
not guarantee API/ABI stability. |
||||
</description> |
||||
|
||||
<properties> |
||||
<kotlin.version>1.4.31</kotlin.version> |
||||
</properties> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>${project.groupId}</groupId> |
||||
<artifactId>protobuf-javalite</artifactId> |
||||
<version>${project.version}</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>junit</groupId> |
||||
<artifactId>junit</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.easymock</groupId> |
||||
<artifactId>easymock</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.easymock</groupId> |
||||
<artifactId>easymockclassextension</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.guava</groupId> |
||||
<artifactId>guava</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.guava</groupId> |
||||
<artifactId>guava-testlib</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.truth</groupId> |
||||
<artifactId>truth</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.jetbrains.kotlin</groupId> |
||||
<artifactId>kotlin-stdlib</artifactId> |
||||
<version>${kotlin.version}</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.jetbrains.kotlin</groupId> |
||||
<artifactId>kotlin-test</artifactId> |
||||
<version>${kotlin.version}</version> |
||||
</dependency> |
||||
</dependencies> |
||||
|
||||
<build> |
||||
<!-- Include core protos in the bundle as resources --> |
||||
<resources> |
||||
<resource> |
||||
<directory>${protobuf.source.dir}</directory> |
||||
<includes> |
||||
<include>google/protobuf/any.proto</include> |
||||
<include>google/protobuf/api.proto</include> |
||||
<include>google/protobuf/duration.proto</include> |
||||
<include>google/protobuf/empty.proto</include> |
||||
<include>google/protobuf/field_mask.proto</include> |
||||
<include>google/protobuf/source_context.proto</include> |
||||
<include>google/protobuf/struct.proto</include> |
||||
<include>google/protobuf/timestamp.proto</include> |
||||
<include>google/protobuf/type.proto</include> |
||||
<include>google/protobuf/wrappers.proto</include> |
||||
</includes> |
||||
</resource> |
||||
</resources> |
||||
<testResources> |
||||
<testResource> |
||||
<directory>${protobuf.source.dir}</directory> |
||||
<includes> |
||||
<include>google/protobuf/testdata/golden_message_oneof_implemented</include> |
||||
<include>google/protobuf/testdata/golden_packed_fields_message</include> |
||||
</includes> |
||||
</testResource> |
||||
</testResources> |
||||
|
||||
<plugins> |
||||
<plugin> |
||||
<artifactId>maven-resources-plugin</artifactId> |
||||
<version>3.1.0</version> |
||||
<executions> |
||||
<execution> |
||||
<id>copy-kotlin-source-files</id> |
||||
<phase>generate-sources</phase> |
||||
<goals> |
||||
<goal>copy-resources</goal> |
||||
</goals> |
||||
<configuration> |
||||
<outputDirectory>${generated.sources.dir}/com/google/protobuf</outputDirectory> |
||||
<resources> |
||||
<resource> |
||||
<directory>${basedir}/../kotlin/src/main/kotlin/com/google/protobuf</directory> |
||||
<includes> |
||||
<include>DslList.kt</include> |
||||
<include>DslMap.kt</include> |
||||
<include>DslProxy.kt</include> |
||||
<include>ExtendableMessageLiteExtensions.kt</include> |
||||
<include>ExtensionList.kt</include> |
||||
<include>OnlyForUseByGeneratedProtoCode.kt</include> |
||||
<include>ProtoDslMarker.kt</include> |
||||
<include>UnmodifiableCollections.kt</include> |
||||
</includes> |
||||
</resource> |
||||
</resources> |
||||
</configuration> |
||||
</execution> |
||||
<execution> |
||||
<id>copy-test-source-files</id> |
||||
<phase>generate-test-sources</phase> |
||||
<goals> |
||||
<goal>copy-resources</goal> |
||||
</goals> |
||||
<configuration> |
||||
<outputDirectory>${generated.testsources.dir}/com/google/protobuf</outputDirectory> |
||||
<resources> |
||||
<resource> |
||||
<directory>${basedir}/../core/src/test/java/com/google/protobuf</directory> |
||||
<includes> |
||||
<include>TestUtilLite.java</include> |
||||
</includes> |
||||
</resource> |
||||
<resource> |
||||
<directory>${basedir}/../kotlin/src/test/kotlin/com/google/protobuf</directory> |
||||
<excludes> |
||||
<exclude>ExtendableMessageExtensionsTest.kt</exclude> |
||||
<exclude>Proto2Test.kt</exclude> |
||||
<exclude>ProtoUtil.java</exclude> |
||||
</excludes> |
||||
</resource> |
||||
</resources> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
|
||||
<!-- Use Antrun plugin to generate sources with protoc --> |
||||
<plugin> |
||||
<artifactId>maven-antrun-plugin</artifactId> |
||||
<executions> |
||||
<!-- Generate core protos --> |
||||
<execution> |
||||
<id>generate-sources</id> |
||||
<phase>generate-sources</phase> |
||||
<configuration> |
||||
<target> |
||||
<ant antfile="generate-sources-build.xml"/> |
||||
</target> |
||||
</configuration> |
||||
<goals> |
||||
<goal>run</goal> |
||||
</goals> |
||||
</execution> |
||||
|
||||
<!-- Generate the test protos --> |
||||
<execution> |
||||
<id>generate-test-sources</id> |
||||
<phase>generate-test-sources</phase> |
||||
<configuration> |
||||
<target> |
||||
<ant antfile="generate-test-sources-build.xml"/> |
||||
</target> |
||||
</configuration> |
||||
<goals> |
||||
<goal>run</goal> |
||||
</goals> |
||||
</execution> |
||||
|
||||
<execution> |
||||
<id>process-lite-sources</id> |
||||
<phase>generate-test-sources</phase> |
||||
<configuration> |
||||
<target> |
||||
<ant antfile="process-lite-sources-build.xml"/> |
||||
</target> |
||||
</configuration> |
||||
<goals> |
||||
<goal>run</goal> |
||||
</goals> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
|
||||
<plugin> |
||||
<groupId>org.codehaus.mojo</groupId> |
||||
<artifactId>build-helper-maven-plugin</artifactId> |
||||
<executions> |
||||
<execution> |
||||
<id>add-generated-sources</id> |
||||
<phase>generate-sources</phase> |
||||
<goals> |
||||
<goal>add-source</goal> |
||||
</goals> |
||||
<configuration> |
||||
<sources> |
||||
<source>${generated.sources.dir}</source> |
||||
</sources> |
||||
</configuration> |
||||
</execution> |
||||
|
||||
<execution> |
||||
<id>add-generated-test-sources</id> |
||||
<phase>generate-test-sources</phase> |
||||
<goals> |
||||
<goal>add-test-source</goal> |
||||
</goals> |
||||
<configuration> |
||||
<sources> |
||||
<source>${generated.testsources.dir}</source> |
||||
</sources> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
|
||||
<plugin> |
||||
<groupId>org.jetbrains.kotlin</groupId> |
||||
<artifactId>kotlin-maven-plugin</artifactId> |
||||
<version>${kotlin.version}</version> |
||||
<extensions>true</extensions> |
||||
<executions> |
||||
<execution> |
||||
<id>compile</id> |
||||
<goals> <goal>compile</goal> </goals> |
||||
<configuration> |
||||
<sourceDirs> |
||||
<sourceDir>${generated.sources.dir}</sourceDir> |
||||
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir> |
||||
</sourceDirs> |
||||
</configuration> |
||||
</execution> |
||||
<execution> |
||||
<id>test-compile</id> |
||||
<goals> <goal>test-compile</goal> </goals> |
||||
<configuration> |
||||
<sourceDirs> |
||||
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir> |
||||
<sourceDir>${generated.testsources.dir}</sourceDir> |
||||
</sourceDirs> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
|
||||
<!-- OSGI bundle configuration --> |
||||
<plugin> |
||||
<groupId>org.apache.felix</groupId> |
||||
<artifactId>maven-bundle-plugin</artifactId> |
||||
<extensions>true</extensions> |
||||
<configuration> |
||||
<instructions> |
||||
<Automatic-Module-Name>com.google.protobuf</Automatic-Module-Name> <!-- Java9+ Jigsaw module name --> |
||||
<Bundle-DocURL>https://developers.google.com/protocol-buffers/</Bundle-DocURL> |
||||
<Bundle-SymbolicName>com.google.protobuf</Bundle-SymbolicName> |
||||
<Export-Package>com.google.protobuf;version=${project.version}</Export-Package> |
||||
<Import-Package>sun.misc;resolution:=optional,*</Import-Package> |
||||
</instructions> |
||||
</configuration> |
||||
</plugin> |
||||
</plugins> |
||||
</build> |
||||
</project> |
@ -0,0 +1,7 @@ |
||||
<project name="process-lite-sources"> |
||||
<exec executable="awk" output="${generated.testsources.dir}/com/google/protobuf/TestUtil.java"> |
||||
<arg value="-f" /> |
||||
<arg value="${basedir}/lite.awk" /> |
||||
<arg value="${basedir}/../core/src/test/java/com/google/protobuf/TestUtil.java" /> |
||||
</exec> |
||||
</project> |
@ -0,0 +1,60 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.truth.Truth.assertThat |
||||
import example_extensible_message.ExampleExtensibleMessage |
||||
import example_extensible_message.ExampleExtensibleMessageOuterClass as TestProto |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
@RunWith(JUnit4::class) |
||||
class ExtendableMessageLiteExtensionsTest { |
||||
@Test |
||||
fun setOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
builder[TestProto.int32Extension] = 5 |
||||
assertThat(builder.build().getExtension(TestProto.int32Extension)).isEqualTo(5) |
||||
} |
||||
|
||||
@Test |
||||
fun getOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
assertThat(builder[TestProto.int32Extension]).isEqualTo(6) |
||||
} |
||||
|
||||
@Test |
||||
fun getOnMessage() { |
||||
val message = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
.build() |
||||
assertThat(message[TestProto.int32Extension]).isEqualTo(6) |
||||
} |
||||
|
||||
@Test |
||||
fun containsPositiveOnMessage() { |
||||
val message = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
.build() |
||||
assertThat(TestProto.int32Extension in message).isTrue() |
||||
} |
||||
|
||||
@Test |
||||
fun containsPositiveOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
assertThat(TestProto.int32Extension in builder).isTrue() |
||||
} |
||||
|
||||
@Test |
||||
fun containsNegativeOnMessage() { |
||||
val message = ExampleExtensibleMessage.newBuilder().build() |
||||
assertThat(TestProto.int32Extension in message).isFalse() |
||||
} |
||||
|
||||
@Test |
||||
fun containsNegativeOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
assertThat(TestProto.int32Extension in builder).isFalse() |
||||
} |
||||
} |
@ -0,0 +1,993 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.truth.Truth.assertThat |
||||
import com.google.protobuf.TestAllTypesLiteKt |
||||
import com.google.protobuf.TestAllTypesLiteKt.nestedMessage |
||||
import com.google.protobuf.TestUtilLite |
||||
import com.google.protobuf.TestUtilLite.toBytes |
||||
import com.google.protobuf.UnittestImportLite.ImportEnumLite |
||||
import com.google.protobuf.UnittestImportLite.ImportMessageLite |
||||
import com.google.protobuf.UnittestImportPublicLite.PublicImportMessageLite |
||||
import com.google.protobuf.UnittestLite |
||||
import com.google.protobuf.UnittestLite.ForeignEnumLite |
||||
import com.google.protobuf.UnittestLite.TestAllTypesLite |
||||
import com.google.protobuf.UnittestLite.TestAllTypesLite.NestedEnum |
||||
import com.google.protobuf.UnittestLite.TestEmptyMessageLite |
||||
import com.google.protobuf.UnittestLite.TestEmptyMessageWithExtensionsLite |
||||
import com.google.protobuf.copy |
||||
import com.google.protobuf.foreignMessageLite |
||||
import evil_names_proto2.EvilNamesProto2OuterClass.EvilNamesProto2 |
||||
import evil_names_proto2.EvilNamesProto2OuterClass.HardKeywordsAllTypes |
||||
import evil_names_proto2.EvilNamesProto2OuterClass.Interface |
||||
import evil_names_proto2.HardKeywordsAllTypesKt |
||||
import evil_names_proto2.evilNamesProto2 |
||||
import evil_names_proto2.hardKeywordsAllTypes |
||||
import evil_names_proto2.interface_ |
||||
import com.google.protobuf.optionalGroupExtensionLite |
||||
import com.google.protobuf.repeatedGroupExtensionLite |
||||
import com.google.protobuf.testAllExtensionsLite |
||||
import com.google.protobuf.testAllTypesLite |
||||
import com.google.protobuf.testEmptyMessageLite |
||||
import com.google.protobuf.testEmptyMessageWithExtensionsLite |
||||
import protobuf_unittest.MapLiteUnittest.MapEnumLite |
||||
import protobuf_unittest.MapLiteUnittest.TestMapLite |
||||
import protobuf_unittest.testMapLite |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
@RunWith(JUnit4::class) |
||||
class Proto2LiteTest { |
||||
@Test |
||||
fun testSetters() { |
||||
assertThat( |
||||
testAllTypesLite { |
||||
optionalInt32 = 101 |
||||
optionalInt64 = 102 |
||||
optionalUint32 = 103 |
||||
optionalUint64 = 104 |
||||
optionalSint32 = 105 |
||||
optionalSint64 = 106 |
||||
optionalFixed32 = 107 |
||||
optionalFixed64 = 108 |
||||
optionalSfixed32 = 109 |
||||
optionalSfixed64 = 110 |
||||
optionalFloat = 111.0f |
||||
optionalDouble = 112.0 |
||||
optionalBool = true |
||||
optionalString = "115" |
||||
optionalBytes = toBytes("116") |
||||
optionalGroup = |
||||
TestAllTypesLiteKt.optionalGroup { a = 117 } |
||||
optionalNestedMessage = nestedMessage { bb = 118 } |
||||
optionalForeignMessage = |
||||
foreignMessageLite { c = 119 } |
||||
optionalImportMessage = |
||||
ImportMessageLite.newBuilder().setD(120).build() |
||||
optionalPublicImportMessage = |
||||
PublicImportMessageLite.newBuilder().setE(126).build() |
||||
optionalLazyMessage = nestedMessage { bb = 127 } |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
optionalForeignEnum = ForeignEnumLite.FOREIGN_LITE_BAZ |
||||
optionalImportEnum = ImportEnumLite.IMPORT_LITE_BAZ |
||||
optionalStringPiece = "124" |
||||
optionalCord = "125" |
||||
repeatedInt32.add(201) |
||||
repeatedInt64.add(202) |
||||
repeatedUint32.add(203) |
||||
repeatedUint64.add(204) |
||||
repeatedSint32.add(205) |
||||
repeatedSint64.add(206) |
||||
repeatedFixed32.add(207) |
||||
repeatedFixed64.add(208) |
||||
repeatedSfixed32.add(209) |
||||
repeatedSfixed64.add(210) |
||||
repeatedFloat.add(211f) |
||||
repeatedDouble.add(212.0) |
||||
repeatedBool.add(true) |
||||
repeatedString.add("215") |
||||
repeatedBytes.add(toBytes("216")) |
||||
repeatedGroup.add(TestAllTypesLiteKt.repeatedGroup { a = 217 }) |
||||
repeatedNestedMessage.add(nestedMessage { bb = 218 }) |
||||
repeatedForeignMessage.add( |
||||
foreignMessageLite { c = 219 } |
||||
) |
||||
repeatedImportMessage.add( |
||||
ImportMessageLite.newBuilder().setD(220).build() |
||||
) |
||||
repeatedLazyMessage.add(nestedMessage { bb = 227 }) |
||||
repeatedNestedEnum.add(NestedEnum.BAR) |
||||
repeatedForeignEnum.add(ForeignEnumLite.FOREIGN_LITE_BAR) |
||||
repeatedImportEnum.add(ImportEnumLite.IMPORT_LITE_BAR) |
||||
repeatedStringPiece.add("224") |
||||
repeatedCord.add("225") |
||||
repeatedInt32 += 301 |
||||
repeatedInt64 += 302 |
||||
repeatedUint32 += 303 |
||||
repeatedUint64 += 304 |
||||
repeatedSint32 += 305 |
||||
repeatedSint64 += 306 |
||||
repeatedFixed32 += 307 |
||||
repeatedFixed64 += 308 |
||||
repeatedSfixed32 += 309 |
||||
repeatedSfixed64 += 310 |
||||
repeatedFloat += 311f |
||||
repeatedDouble += 312.0 |
||||
repeatedBool += false |
||||
repeatedString += "315" |
||||
repeatedBytes += toBytes("316") |
||||
repeatedGroup += TestAllTypesLiteKt.repeatedGroup { a = 317 } |
||||
repeatedNestedMessage += nestedMessage { bb = 318 } |
||||
repeatedForeignMessage += |
||||
foreignMessageLite { c = 319 } |
||||
repeatedImportMessage += |
||||
ImportMessageLite.newBuilder().setD(320).build() |
||||
repeatedLazyMessage += |
||||
TestAllTypesLiteKt.nestedMessage { bb = 327 } |
||||
repeatedNestedEnum += NestedEnum.BAZ |
||||
repeatedForeignEnum += ForeignEnumLite.FOREIGN_LITE_BAZ |
||||
repeatedImportEnum += ImportEnumLite.IMPORT_LITE_BAZ |
||||
repeatedStringPiece += "324" |
||||
repeatedCord += "325" |
||||
defaultInt32 = 401 |
||||
defaultInt64 = 402 |
||||
defaultUint32 = 403 |
||||
defaultUint64 = 404 |
||||
defaultSint32 = 405 |
||||
defaultSint64 = 406 |
||||
defaultFixed32 = 407 |
||||
defaultFixed64 = 408 |
||||
defaultSfixed32 = 409 |
||||
defaultSfixed64 = 410 |
||||
defaultFloat = 411f |
||||
defaultDouble = 412.0 |
||||
defaultBool = false |
||||
defaultString = "415" |
||||
defaultBytes = toBytes("416") |
||||
defaultNestedEnum = NestedEnum.FOO |
||||
defaultForeignEnum = ForeignEnumLite.FOREIGN_LITE_FOO |
||||
defaultImportEnum = ImportEnumLite.IMPORT_LITE_FOO |
||||
defaultStringPiece = "424" |
||||
defaultCord = "425" |
||||
oneofUint32 = 601 |
||||
oneofNestedMessage = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 602 } |
||||
oneofString = "603" |
||||
oneofBytes = toBytes("604") |
||||
} |
||||
).isEqualTo( |
||||
TestUtilLite.getAllLiteSetBuilder().build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testGetters() { |
||||
testAllTypesLite { |
||||
optionalInt32 = 101 |
||||
assertThat(optionalInt32).isEqualTo(101) |
||||
optionalString = "115" |
||||
assertThat(optionalString).isEqualTo("115") |
||||
optionalGroup = TestAllTypesLiteKt.optionalGroup { a = 117 } |
||||
assertThat(optionalGroup).isEqualTo(TestAllTypesLiteKt.optionalGroup { a = 117 }) |
||||
optionalNestedMessage = TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
assertThat(optionalNestedMessage).isEqualTo(TestAllTypesLiteKt.nestedMessage { bb = 118 }) |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
assertThat(optionalNestedEnum).isEqualTo(NestedEnum.BAZ) |
||||
defaultInt32 = 401 |
||||
assertThat(defaultInt32).isEqualTo(401) |
||||
oneofUint32 = 601 |
||||
assertThat(oneofUint32).isEqualTo(601) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testDefaultGetters() { |
||||
testAllTypesLite { |
||||
assertThat(defaultInt32).isEqualTo(41) |
||||
assertThat(defaultString).isEqualTo("hello") |
||||
assertThat(defaultNestedEnum).isEqualTo(NestedEnum.BAR) |
||||
assertThat(defaultStringPiece).isEqualTo("abc") |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testRepeatedGettersAndSetters() { |
||||
testAllTypesLite { |
||||
repeatedInt32.addAll(listOf(1, 2)) |
||||
assertThat(repeatedInt32).isEqualTo(listOf(1, 2)) |
||||
repeatedInt32 += listOf(3, 4) |
||||
assertThat(repeatedInt32).isEqualTo(listOf(1, 2, 3, 4)) |
||||
repeatedInt32[0] = 5 |
||||
assertThat(repeatedInt32).isEqualTo(listOf(5, 2, 3, 4)) |
||||
|
||||
repeatedString.addAll(listOf("1", "2")) |
||||
assertThat(repeatedString).isEqualTo(listOf("1", "2")) |
||||
repeatedString += listOf("3", "4") |
||||
assertThat(repeatedString).isEqualTo(listOf("1", "2", "3", "4")) |
||||
repeatedString[0] = "5" |
||||
assertThat(repeatedString).isEqualTo(listOf("5", "2", "3", "4")) |
||||
|
||||
repeatedGroup.addAll( |
||||
listOf( |
||||
TestAllTypesLiteKt.repeatedGroup { a = 1 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 2 } |
||||
) |
||||
) |
||||
assertThat(repeatedGroup).isEqualTo( |
||||
listOf( |
||||
TestAllTypesLiteKt.repeatedGroup { a = 1 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 2 } |
||||
) |
||||
) |
||||
repeatedGroup += |
||||
listOf( |
||||
TestAllTypesLiteKt.repeatedGroup { a = 3 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 4 } |
||||
) |
||||
assertThat(repeatedGroup).isEqualTo( |
||||
listOf( |
||||
TestAllTypesLiteKt.repeatedGroup { a = 1 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 2 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 3 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 4 } |
||||
) |
||||
) |
||||
repeatedGroup[0] = TestAllTypesLiteKt.repeatedGroup { a = 5 } |
||||
assertThat(repeatedGroup).isEqualTo( |
||||
listOf( |
||||
TestAllTypesLiteKt.repeatedGroup { a = 5 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 2 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 3 }, |
||||
TestAllTypesLiteKt.repeatedGroup { a = 4 } |
||||
) |
||||
) |
||||
|
||||
repeatedNestedMessage.addAll(listOf(nestedMessage { bb = 1 }, nestedMessage { bb = 2 })) |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 } |
||||
) |
||||
) |
||||
repeatedNestedMessage += listOf(nestedMessage { bb = 3 }, nestedMessage { bb = 4 }) |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
repeatedNestedMessage[0] = nestedMessage { bb = 5 } |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 5 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
|
||||
repeatedNestedEnum.addAll(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
assertThat(repeatedNestedEnum).isEqualTo(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
repeatedNestedEnum += listOf(NestedEnum.BAZ, NestedEnum.FOO) |
||||
assertThat(repeatedNestedEnum).isEqualTo( |
||||
listOf(NestedEnum.FOO, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
repeatedNestedEnum[0] = NestedEnum.BAR |
||||
assertThat(repeatedNestedEnum).isEqualTo( |
||||
listOf(NestedEnum.BAR, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHazzers() { |
||||
testAllTypesLite { |
||||
optionalInt32 = 101 |
||||
assertThat(hasOptionalInt32()).isTrue() |
||||
assertThat(hasOptionalString()).isFalse() |
||||
optionalGroup = TestAllTypesLiteKt.optionalGroup { a = 117 } |
||||
assertThat(hasOptionalGroup()).isTrue() |
||||
assertThat(hasOptionalNestedMessage()).isFalse() |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
assertThat(hasOptionalNestedEnum()).isTrue() |
||||
assertThat(hasDefaultInt32()).isFalse() |
||||
oneofUint32 = 601 |
||||
assertThat(hasOneofUint32()).isTrue() |
||||
} |
||||
|
||||
testAllTypesLite { |
||||
assertThat(hasOptionalInt32()).isFalse() |
||||
optionalString = "115" |
||||
assertThat(hasOptionalString()).isTrue() |
||||
assertThat(hasOptionalGroup()).isFalse() |
||||
optionalNestedMessage = TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
assertThat(hasOptionalNestedMessage()).isTrue() |
||||
assertThat(hasOptionalNestedEnum()).isFalse() |
||||
defaultInt32 = 401 |
||||
assertThat(hasDefaultInt32()).isTrue() |
||||
assertThat(hasOneofUint32()).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testClears() { |
||||
testAllTypesLite { |
||||
optionalInt32 = 101 |
||||
clearOptionalInt32() |
||||
assertThat(hasOptionalInt32()).isFalse() |
||||
|
||||
optionalString = "115" |
||||
clearOptionalString() |
||||
assertThat(hasOptionalString()).isFalse() |
||||
|
||||
optionalGroup = TestAllTypesLiteKt.optionalGroup { a = 117 } |
||||
clearOptionalGroup() |
||||
assertThat(hasOptionalGroup()).isFalse() |
||||
|
||||
optionalNestedMessage = TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
clearOptionalNestedMessage() |
||||
assertThat(hasOptionalNestedMessage()).isFalse() |
||||
|
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
clearOptionalNestedEnum() |
||||
assertThat(hasOptionalNestedEnum()).isFalse() |
||||
|
||||
defaultInt32 = 401 |
||||
clearDefaultInt32() |
||||
assertThat(hasDefaultInt32()).isFalse() |
||||
|
||||
oneofUint32 = 601 |
||||
clearOneofUint32() |
||||
assertThat(hasOneofUint32()).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testCopy() { |
||||
val message = testAllTypesLite { |
||||
optionalInt32 = 101 |
||||
optionalString = "115" |
||||
} |
||||
val modifiedMessage = message.copy { |
||||
optionalInt32 = 201 |
||||
} |
||||
|
||||
assertThat(message).isEqualTo( |
||||
TestAllTypesLite.newBuilder() |
||||
.setOptionalInt32(101) |
||||
.setOptionalString("115") |
||||
.build() |
||||
) |
||||
assertThat(modifiedMessage).isEqualTo( |
||||
TestAllTypesLite.newBuilder() |
||||
.setOptionalInt32(201) |
||||
.setOptionalString("115") |
||||
.build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testOneof() { |
||||
val message = testAllTypesLite { |
||||
oneofString = "foo" |
||||
assertThat(oneofFieldCase) |
||||
.isEqualTo(TestAllTypesLite.OneofFieldCase.ONEOF_STRING) |
||||
assertThat(oneofString).isEqualTo("foo") |
||||
clearOneofField() |
||||
assertThat(hasOneofUint32()).isFalse() |
||||
assertThat(oneofFieldCase) |
||||
.isEqualTo(TestAllTypesLite.OneofFieldCase.ONEOFFIELD_NOT_SET) |
||||
oneofUint32 = 5 |
||||
} |
||||
|
||||
assertThat(message.getOneofFieldCase()) |
||||
.isEqualTo(TestAllTypesLite.OneofFieldCase.ONEOF_UINT32) |
||||
assertThat(message.getOneofUint32()).isEqualTo(5) |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionsSet() { |
||||
assertThat( |
||||
testAllExtensionsLite { |
||||
this[UnittestLite.optionalInt32ExtensionLite] = 101 |
||||
this[UnittestLite.optionalInt64ExtensionLite] = 102L |
||||
this[UnittestLite.optionalUint32ExtensionLite] = 103 |
||||
this[UnittestLite.optionalUint64ExtensionLite] = 104L |
||||
this[UnittestLite.optionalSint32ExtensionLite] = 105 |
||||
this[UnittestLite.optionalSint64ExtensionLite] = 106L |
||||
this[UnittestLite.optionalFixed32ExtensionLite] = 107 |
||||
this[UnittestLite.optionalFixed64ExtensionLite] = 108L |
||||
this[UnittestLite.optionalSfixed32ExtensionLite] = 109 |
||||
this[UnittestLite.optionalSfixed64ExtensionLite] = 110L |
||||
this[UnittestLite.optionalFloatExtensionLite] = 111F |
||||
this[UnittestLite.optionalDoubleExtensionLite] = 112.0 |
||||
this[UnittestLite.optionalBoolExtensionLite] = true |
||||
this[UnittestLite.optionalStringExtensionLite] = "115" |
||||
this[UnittestLite.optionalBytesExtensionLite] = toBytes("116") |
||||
this[UnittestLite.optionalGroupExtensionLite] = optionalGroupExtensionLite { a = 117 } |
||||
this[UnittestLite.optionalNestedMessageExtensionLite] = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
this[UnittestLite.optionalForeignMessageExtensionLite] = foreignMessageLite { c = 119 } |
||||
this[UnittestLite.optionalImportMessageExtensionLite] = |
||||
ImportMessageLite.newBuilder().setD(120).build() |
||||
this[UnittestLite.optionalPublicImportMessageExtensionLite] = |
||||
PublicImportMessageLite.newBuilder().setE(126).build() |
||||
this[UnittestLite.optionalLazyMessageExtensionLite] = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 127 } |
||||
this[UnittestLite.optionalNestedEnumExtensionLite] = NestedEnum.BAZ |
||||
this[UnittestLite.optionalForeignEnumExtensionLite] = ForeignEnumLite.FOREIGN_LITE_BAZ |
||||
this[UnittestLite.optionalImportEnumExtensionLite] = ImportEnumLite.IMPORT_LITE_BAZ |
||||
this[UnittestLite.optionalStringPieceExtensionLite] = "124" |
||||
this[UnittestLite.optionalCordExtensionLite] = "125" |
||||
this[UnittestLite.repeatedInt32ExtensionLite].add(201) |
||||
this[UnittestLite.repeatedInt64ExtensionLite].add(202L) |
||||
this[UnittestLite.repeatedUint32ExtensionLite].add(203) |
||||
this[UnittestLite.repeatedUint64ExtensionLite].add(204L) |
||||
this[UnittestLite.repeatedSint32ExtensionLite].add(205) |
||||
this[UnittestLite.repeatedSint64ExtensionLite].add(206L) |
||||
this[UnittestLite.repeatedFixed32ExtensionLite].add(207) |
||||
this[UnittestLite.repeatedFixed64ExtensionLite].add(208L) |
||||
this[UnittestLite.repeatedSfixed32ExtensionLite].add(209) |
||||
this[UnittestLite.repeatedSfixed64ExtensionLite].add(210L) |
||||
this[UnittestLite.repeatedFloatExtensionLite].add(211F) |
||||
this[UnittestLite.repeatedDoubleExtensionLite].add(212.0) |
||||
this[UnittestLite.repeatedBoolExtensionLite].add(true) |
||||
this[UnittestLite.repeatedStringExtensionLite].add("215") |
||||
this[UnittestLite.repeatedBytesExtensionLite].add(toBytes("216")) |
||||
this[UnittestLite.repeatedGroupExtensionLite].add(repeatedGroupExtensionLite { a = 217 }) |
||||
this[UnittestLite.repeatedNestedMessageExtensionLite].add( |
||||
TestAllTypesLiteKt.nestedMessage { bb = 218 } |
||||
) |
||||
this[UnittestLite.repeatedForeignMessageExtensionLite].add(foreignMessageLite { c = 219 }) |
||||
this[UnittestLite.repeatedImportMessageExtensionLite].add( |
||||
ImportMessageLite.newBuilder().setD(220).build() |
||||
) |
||||
this[UnittestLite.repeatedLazyMessageExtensionLite].add( |
||||
TestAllTypesLiteKt.nestedMessage { bb = 227 } |
||||
) |
||||
this[UnittestLite.repeatedNestedEnumExtensionLite].add(NestedEnum.BAR) |
||||
this[UnittestLite.repeatedForeignEnumExtensionLite].add(ForeignEnumLite.FOREIGN_LITE_BAR) |
||||
this[UnittestLite.repeatedImportEnumExtensionLite].add(ImportEnumLite.IMPORT_LITE_BAR) |
||||
this[UnittestLite.repeatedStringPieceExtensionLite].add("224") |
||||
this[UnittestLite.repeatedCordExtensionLite].add("225") |
||||
this[UnittestLite.repeatedInt32ExtensionLite].add(301) |
||||
this[UnittestLite.repeatedInt64ExtensionLite].add(302L) |
||||
this[UnittestLite.repeatedUint32ExtensionLite].add(303) |
||||
this[UnittestLite.repeatedUint64ExtensionLite].add(304L) |
||||
this[UnittestLite.repeatedSint32ExtensionLite].add(305) |
||||
this[UnittestLite.repeatedSint64ExtensionLite].add(306L) |
||||
this[UnittestLite.repeatedFixed32ExtensionLite].add(307) |
||||
this[UnittestLite.repeatedFixed64ExtensionLite].add(308L) |
||||
this[UnittestLite.repeatedSfixed32ExtensionLite].add(309) |
||||
this[UnittestLite.repeatedSfixed64ExtensionLite].add(310L) |
||||
this[UnittestLite.repeatedFloatExtensionLite].add(311F) |
||||
this[UnittestLite.repeatedDoubleExtensionLite].add(312.0) |
||||
this[UnittestLite.repeatedBoolExtensionLite].add(false) |
||||
this[UnittestLite.repeatedStringExtensionLite].add("315") |
||||
this[UnittestLite.repeatedBytesExtensionLite].add(toBytes("316")) |
||||
this[UnittestLite.repeatedGroupExtensionLite].add(repeatedGroupExtensionLite { a = 317 }) |
||||
this[UnittestLite.repeatedNestedMessageExtensionLite].add( |
||||
TestAllTypesLiteKt.nestedMessage { bb = 318 } |
||||
) |
||||
this[UnittestLite.repeatedForeignMessageExtensionLite].add(foreignMessageLite { c = 319 }) |
||||
this[UnittestLite.repeatedImportMessageExtensionLite].add( |
||||
ImportMessageLite.newBuilder().setD(320).build() |
||||
) |
||||
this[UnittestLite.repeatedLazyMessageExtensionLite].add( |
||||
TestAllTypesLiteKt.nestedMessage { bb = 327 } |
||||
) |
||||
this[UnittestLite.repeatedNestedEnumExtensionLite].add(NestedEnum.BAZ) |
||||
this[UnittestLite.repeatedForeignEnumExtensionLite].add(ForeignEnumLite.FOREIGN_LITE_BAZ) |
||||
this[UnittestLite.repeatedImportEnumExtensionLite].add(ImportEnumLite.IMPORT_LITE_BAZ) |
||||
this[UnittestLite.repeatedStringPieceExtensionLite].add("324") |
||||
this[UnittestLite.repeatedCordExtensionLite].add("325") |
||||
this[UnittestLite.defaultInt32ExtensionLite] = 401 |
||||
this[UnittestLite.defaultInt64ExtensionLite] = 402L |
||||
this[UnittestLite.defaultUint32ExtensionLite] = 403 |
||||
this[UnittestLite.defaultUint64ExtensionLite] = 404L |
||||
this[UnittestLite.defaultSint32ExtensionLite] = 405 |
||||
this[UnittestLite.defaultSint64ExtensionLite] = 406L |
||||
this[UnittestLite.defaultFixed32ExtensionLite] = 407 |
||||
this[UnittestLite.defaultFixed64ExtensionLite] = 408L |
||||
this[UnittestLite.defaultSfixed32ExtensionLite] = 409 |
||||
this[UnittestLite.defaultSfixed64ExtensionLite] = 410L |
||||
this[UnittestLite.defaultFloatExtensionLite] = 411F |
||||
this[UnittestLite.defaultDoubleExtensionLite] = 412.0 |
||||
this[UnittestLite.defaultBoolExtensionLite] = false |
||||
this[UnittestLite.defaultStringExtensionLite] = "415" |
||||
this[UnittestLite.defaultBytesExtensionLite] = toBytes("416") |
||||
this[UnittestLite.defaultNestedEnumExtensionLite] = NestedEnum.FOO |
||||
this[UnittestLite.defaultForeignEnumExtensionLite] = ForeignEnumLite.FOREIGN_LITE_FOO |
||||
this[UnittestLite.defaultImportEnumExtensionLite] = ImportEnumLite.IMPORT_LITE_FOO |
||||
this[UnittestLite.defaultStringPieceExtensionLite] = "424" |
||||
this[UnittestLite.defaultCordExtensionLite] = "425" |
||||
this[UnittestLite.oneofUint32ExtensionLite] = 601 |
||||
this[UnittestLite.oneofNestedMessageExtensionLite] = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 602 } |
||||
this[UnittestLite.oneofStringExtensionLite] = "603" |
||||
this[UnittestLite.oneofBytesExtensionLite] = toBytes("604") |
||||
} |
||||
).isEqualTo( |
||||
TestUtilLite.getAllLiteExtensionsSet() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionGetters() { |
||||
testAllExtensionsLite { |
||||
this[UnittestLite.optionalInt32ExtensionLite] = 101 |
||||
assertThat(this[UnittestLite.optionalInt32ExtensionLite]).isEqualTo(101) |
||||
this[UnittestLite.optionalStringExtensionLite] = "115" |
||||
assertThat(this[UnittestLite.optionalStringExtensionLite]).isEqualTo("115") |
||||
this[UnittestLite.optionalGroupExtensionLite] = optionalGroupExtensionLite { a = 117 } |
||||
assertThat(this[UnittestLite.optionalGroupExtensionLite]) |
||||
.isEqualTo(optionalGroupExtensionLite { a = 117 }) |
||||
this[UnittestLite.optionalNestedMessageExtensionLite] = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
assertThat(this[UnittestLite.optionalNestedMessageExtensionLite]) |
||||
.isEqualTo(TestAllTypesLiteKt.nestedMessage { bb = 118 }) |
||||
this[UnittestLite.optionalNestedEnumExtensionLite] = NestedEnum.BAZ |
||||
assertThat(this[UnittestLite.optionalNestedEnumExtensionLite]).isEqualTo(NestedEnum.BAZ) |
||||
this[UnittestLite.defaultInt32ExtensionLite] = 401 |
||||
assertThat(this[UnittestLite.defaultInt32ExtensionLite]).isEqualTo(401) |
||||
this[UnittestLite.oneofUint32ExtensionLite] = 601 |
||||
assertThat(this[UnittestLite.oneofUint32ExtensionLite]).isEqualTo(601) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testRepeatedExtensionGettersAndSetters() { |
||||
testAllExtensionsLite { |
||||
this[UnittestLite.repeatedInt32ExtensionLite].addAll(listOf(1, 2)) |
||||
assertThat(this[UnittestLite.repeatedInt32ExtensionLite]).isEqualTo(listOf(1, 2)) |
||||
this[UnittestLite.repeatedInt32ExtensionLite].addAll(listOf(3, 4)) |
||||
assertThat(this[UnittestLite.repeatedInt32ExtensionLite]).isEqualTo(listOf(1, 2, 3, 4)) |
||||
this[UnittestLite.repeatedInt32ExtensionLite][0] = 5 |
||||
assertThat(this[UnittestLite.repeatedInt32ExtensionLite]).isEqualTo(listOf(5, 2, 3, 4)) |
||||
|
||||
this[UnittestLite.repeatedStringExtensionLite].addAll(listOf("1", "2")) |
||||
assertThat(this[UnittestLite.repeatedStringExtensionLite]).isEqualTo(listOf("1", "2")) |
||||
this[UnittestLite.repeatedStringExtensionLite].addAll(listOf("3", "4")) |
||||
assertThat(this[UnittestLite.repeatedStringExtensionLite]) |
||||
.isEqualTo(listOf("1", "2", "3", "4")) |
||||
this[UnittestLite.repeatedStringExtensionLite][0] = "5" |
||||
assertThat(this[UnittestLite.repeatedStringExtensionLite]) |
||||
.isEqualTo(listOf("5", "2", "3", "4")) |
||||
|
||||
this[UnittestLite.repeatedGroupExtensionLite].addAll( |
||||
listOf( |
||||
repeatedGroupExtensionLite { a = 1 }, |
||||
repeatedGroupExtensionLite { a = 2 } |
||||
) |
||||
) |
||||
assertThat(this[UnittestLite.repeatedGroupExtensionLite]).isEqualTo( |
||||
listOf( |
||||
repeatedGroupExtensionLite { a = 1 }, |
||||
repeatedGroupExtensionLite { a = 2 } |
||||
) |
||||
) |
||||
this[UnittestLite.repeatedGroupExtensionLite].addAll( |
||||
listOf( |
||||
repeatedGroupExtensionLite { a = 3 }, |
||||
repeatedGroupExtensionLite { a = 4 } |
||||
) |
||||
) |
||||
assertThat(this[UnittestLite.repeatedGroupExtensionLite]).isEqualTo( |
||||
listOf( |
||||
repeatedGroupExtensionLite { a = 1 }, |
||||
repeatedGroupExtensionLite { a = 2 }, |
||||
repeatedGroupExtensionLite { a = 3 }, |
||||
repeatedGroupExtensionLite { a = 4 } |
||||
) |
||||
) |
||||
this[UnittestLite.repeatedGroupExtensionLite][0] = repeatedGroupExtensionLite { a = 5 } |
||||
assertThat(this[UnittestLite.repeatedGroupExtensionLite]).isEqualTo( |
||||
listOf( |
||||
repeatedGroupExtensionLite { a = 5 }, |
||||
repeatedGroupExtensionLite { a = 2 }, |
||||
repeatedGroupExtensionLite { a = 3 }, |
||||
repeatedGroupExtensionLite { a = 4 } |
||||
) |
||||
) |
||||
|
||||
this[UnittestLite.repeatedNestedMessageExtensionLite].addAll( |
||||
listOf(nestedMessage { bb = 1 }, nestedMessage { bb = 2 }) |
||||
) |
||||
assertThat(this[UnittestLite.repeatedNestedMessageExtensionLite]).isEqualTo( |
||||
listOf(nestedMessage { bb = 1 }, nestedMessage { bb = 2 }) |
||||
) |
||||
this[UnittestLite.repeatedNestedMessageExtensionLite].addAll( |
||||
listOf(nestedMessage { bb = 3 }, nestedMessage { bb = 4 }) |
||||
) |
||||
assertThat(this[UnittestLite.repeatedNestedMessageExtensionLite]).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
this[UnittestLite.repeatedNestedMessageExtensionLite][0] = nestedMessage { bb = 5 } |
||||
assertThat(this[UnittestLite.repeatedNestedMessageExtensionLite]).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 5 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
|
||||
this[UnittestLite.repeatedNestedEnumExtensionLite] |
||||
.addAll(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
assertThat(this[UnittestLite.repeatedNestedEnumExtensionLite]) |
||||
.isEqualTo(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
this[UnittestLite.repeatedNestedEnumExtensionLite].addAll(listOf(NestedEnum.BAZ, NestedEnum.FOO)) |
||||
assertThat(this[UnittestLite.repeatedNestedEnumExtensionLite]).isEqualTo( |
||||
listOf(NestedEnum.FOO, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
this[UnittestLite.repeatedNestedEnumExtensionLite][0] = NestedEnum.BAR |
||||
assertThat(this[UnittestLite.repeatedNestedEnumExtensionLite]).isEqualTo( |
||||
listOf(NestedEnum.BAR, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionContains() { |
||||
testAllExtensionsLite { |
||||
this[UnittestLite.optionalInt32ExtensionLite] = 101 |
||||
assertThat(contains(UnittestLite.optionalInt32ExtensionLite)).isTrue() |
||||
assertThat(contains(UnittestLite.optionalStringExtensionLite)).isFalse() |
||||
this[UnittestLite.optionalGroupExtensionLite] = optionalGroupExtensionLite { a = 117 } |
||||
assertThat(contains(UnittestLite.optionalGroupExtensionLite)).isTrue() |
||||
assertThat(contains(UnittestLite.optionalNestedMessageExtensionLite)).isFalse() |
||||
this[UnittestLite.optionalNestedEnumExtensionLite] = NestedEnum.BAZ |
||||
assertThat(contains(UnittestLite.optionalNestedEnumExtensionLite)).isTrue() |
||||
assertThat(contains(UnittestLite.defaultInt32ExtensionLite)).isFalse() |
||||
this[UnittestLite.oneofUint32ExtensionLite] = 601 |
||||
assertThat(contains(UnittestLite.oneofUint32ExtensionLite)).isTrue() |
||||
} |
||||
|
||||
testAllExtensionsLite { |
||||
assertThat(contains(UnittestLite.optionalInt32ExtensionLite)).isFalse() |
||||
this[UnittestLite.optionalStringExtensionLite] = "115" |
||||
assertThat(contains(UnittestLite.optionalStringExtensionLite)).isTrue() |
||||
assertThat(contains(UnittestLite.optionalGroupExtensionLite)).isFalse() |
||||
this[UnittestLite.optionalNestedMessageExtensionLite] = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
assertThat(contains(UnittestLite.optionalNestedMessageExtensionLite)).isTrue() |
||||
assertThat(contains(UnittestLite.optionalNestedEnumExtensionLite)).isFalse() |
||||
this[UnittestLite.defaultInt32ExtensionLite] = 401 |
||||
assertThat(contains(UnittestLite.defaultInt32ExtensionLite)).isTrue() |
||||
assertThat(contains(UnittestLite.oneofUint32ExtensionLite)).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionClears() { |
||||
testAllExtensionsLite { |
||||
this[UnittestLite.optionalInt32ExtensionLite] = 101 |
||||
clear(UnittestLite.optionalInt32ExtensionLite) |
||||
assertThat(contains(UnittestLite.optionalInt32ExtensionLite)).isFalse() |
||||
|
||||
this[UnittestLite.optionalStringExtensionLite] = "115" |
||||
clear(UnittestLite.optionalStringExtensionLite) |
||||
assertThat(contains(UnittestLite.optionalStringExtensionLite)).isFalse() |
||||
|
||||
this[UnittestLite.optionalGroupExtensionLite] = optionalGroupExtensionLite { a = 117 } |
||||
clear(UnittestLite.optionalGroupExtensionLite) |
||||
assertThat(contains(UnittestLite.optionalGroupExtensionLite)).isFalse() |
||||
|
||||
this[UnittestLite.optionalNestedMessageExtensionLite] = |
||||
TestAllTypesLiteKt.nestedMessage { bb = 118 } |
||||
clear(UnittestLite.optionalNestedMessageExtensionLite) |
||||
assertThat(contains(UnittestLite.optionalNestedMessageExtensionLite)).isFalse() |
||||
|
||||
this[UnittestLite.optionalNestedEnumExtensionLite] = NestedEnum.BAZ |
||||
clear(UnittestLite.optionalNestedEnumExtensionLite) |
||||
assertThat(contains(UnittestLite.optionalNestedEnumExtensionLite)).isFalse() |
||||
|
||||
this[UnittestLite.defaultInt32ExtensionLite] = 401 |
||||
clear(UnittestLite.defaultInt32ExtensionLite) |
||||
assertThat(contains(UnittestLite.defaultInt32ExtensionLite)).isFalse() |
||||
|
||||
this[UnittestLite.oneofUint32ExtensionLite] = 601 |
||||
clear(UnittestLite.oneofUint32ExtensionLite) |
||||
assertThat(contains(UnittestLite.oneofUint32ExtensionLite)).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testEmptyMessages() { |
||||
assertThat( |
||||
testEmptyMessageLite {} |
||||
).isEqualTo( |
||||
TestEmptyMessageLite.newBuilder().build() |
||||
) |
||||
|
||||
assertThat( |
||||
testEmptyMessageWithExtensionsLite {} |
||||
).isEqualTo( |
||||
TestEmptyMessageWithExtensionsLite.newBuilder().build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testMapSetters() { |
||||
assertThat( |
||||
testMapLite { |
||||
mapInt32Int32[1] = 2 |
||||
mapInt64Int64[1L] = 2L |
||||
mapUint32Uint32[1] = 2 |
||||
mapUint64Uint64[1L] = 2L |
||||
mapSint32Sint32[1] = 2 |
||||
mapSint64Sint64[1L] = 2L |
||||
mapFixed32Fixed32[1] = 2 |
||||
mapFixed64Fixed64[1L] = 2L |
||||
mapSfixed32Sfixed32[1] = 2 |
||||
mapSfixed64Sfixed64[1L] = 2L |
||||
mapInt32Float[1] = 2F |
||||
mapInt32Double[1] = 2.0 |
||||
mapBoolBool[true] = true |
||||
mapStringString["1"] = "2" |
||||
mapInt32Bytes[1] = toBytes("2") |
||||
mapInt32Enum[1] = MapEnumLite.MAP_ENUM_FOO_LITE |
||||
mapInt32ForeignMessage[1] = foreignMessageLite { c = 1 } |
||||
} |
||||
).isEqualTo( |
||||
TestMapLite.newBuilder() |
||||
.putMapInt32Int32(1, 2) |
||||
.putMapInt64Int64(1L, 2L) |
||||
.putMapUint32Uint32(1, 2) |
||||
.putMapUint64Uint64(1L, 2L) |
||||
.putMapSint32Sint32(1, 2) |
||||
.putMapSint64Sint64(1L, 2L) |
||||
.putMapFixed32Fixed32(1, 2) |
||||
.putMapFixed64Fixed64(1L, 2L) |
||||
.putMapSfixed32Sfixed32(1, 2) |
||||
.putMapSfixed64Sfixed64(1L, 2L) |
||||
.putMapInt32Float(1, 2F) |
||||
.putMapInt32Double(1, 2.0) |
||||
.putMapBoolBool(true, true) |
||||
.putMapStringString("1", "2") |
||||
.putMapInt32Bytes(1, toBytes("2")) |
||||
.putMapInt32Enum(1, MapEnumLite.MAP_ENUM_FOO_LITE) |
||||
.putMapInt32ForeignMessage(1, foreignMessageLite { c = 1 }) |
||||
.build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testMapGettersAndSetters() { |
||||
testMapLite { |
||||
mapInt32Int32.put(1, 2) |
||||
assertThat(mapInt32Int32).isEqualTo(mapOf(1 to 2)) |
||||
mapInt32Int32[3] = 4 |
||||
assertThat(mapInt32Int32).isEqualTo(mapOf(1 to 2, 3 to 4)) |
||||
mapInt32Int32.putAll(mapOf(5 to 6, 7 to 8)) |
||||
assertThat(mapInt32Int32).isEqualTo(mapOf(1 to 2, 3 to 4, 5 to 6, 7 to 8)) |
||||
|
||||
mapStringString.put("1", "2") |
||||
assertThat(mapStringString).isEqualTo(mapOf("1" to "2")) |
||||
mapStringString["3"] = "4" |
||||
assertThat(mapStringString).isEqualTo(mapOf("1" to "2", "3" to "4")) |
||||
mapStringString.putAll(mapOf("5" to "6", "7" to "8")) |
||||
assertThat(mapStringString).isEqualTo(mapOf("1" to "2", "3" to "4", "5" to "6", "7" to "8")) |
||||
|
||||
mapInt32Enum.put(1, MapEnumLite.MAP_ENUM_FOO_LITE) |
||||
assertThat(mapInt32Enum).isEqualTo(mapOf(1 to MapEnumLite.MAP_ENUM_FOO_LITE)) |
||||
mapInt32Enum[2] = MapEnumLite.MAP_ENUM_BAR_LITE |
||||
assertThat(mapInt32Enum).isEqualTo( |
||||
mapOf(1 to MapEnumLite.MAP_ENUM_FOO_LITE, 2 to MapEnumLite.MAP_ENUM_BAR_LITE) |
||||
) |
||||
mapInt32Enum.putAll( |
||||
mapOf(3 to MapEnumLite.MAP_ENUM_BAZ_LITE, 4 to MapEnumLite.MAP_ENUM_FOO_LITE) |
||||
) |
||||
assertThat(mapInt32Enum).isEqualTo( |
||||
mapOf( |
||||
1 to MapEnumLite.MAP_ENUM_FOO_LITE, |
||||
2 to MapEnumLite.MAP_ENUM_BAR_LITE, |
||||
3 to MapEnumLite.MAP_ENUM_BAZ_LITE, |
||||
4 to MapEnumLite.MAP_ENUM_FOO_LITE |
||||
) |
||||
) |
||||
|
||||
mapInt32ForeignMessage.put(1, foreignMessageLite { c = 1 }) |
||||
assertThat(mapInt32ForeignMessage).isEqualTo(mapOf(1 to foreignMessageLite { c = 1 })) |
||||
mapInt32ForeignMessage[2] = foreignMessageLite { c = 2 } |
||||
assertThat(mapInt32ForeignMessage).isEqualTo( |
||||
mapOf(1 to foreignMessageLite { c = 1 }, 2 to foreignMessageLite { c = 2 }) |
||||
) |
||||
mapInt32ForeignMessage.putAll( |
||||
mapOf(3 to foreignMessageLite { c = 3 }, 4 to foreignMessageLite { c = 4 }) |
||||
) |
||||
assertThat(mapInt32ForeignMessage).isEqualTo( |
||||
mapOf( |
||||
1 to foreignMessageLite { c = 1 }, |
||||
2 to foreignMessageLite { c = 2 }, |
||||
3 to foreignMessageLite { c = 3 }, |
||||
4 to foreignMessageLite { c = 4 } |
||||
) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testMapRemove() { |
||||
testMapLite { |
||||
mapInt32Int32.putAll(mapOf(1 to 2, 3 to 4)) |
||||
mapInt32Int32.remove(1) |
||||
assertThat(mapInt32Int32).isEqualTo(mapOf(3 to 4)) |
||||
|
||||
mapStringString.putAll(mapOf("1" to "2", "3" to "4")) |
||||
mapStringString.remove("1") |
||||
assertThat(mapStringString).isEqualTo(mapOf("3" to "4")) |
||||
|
||||
mapInt32Enum.putAll( |
||||
mapOf(1 to MapEnumLite.MAP_ENUM_FOO_LITE, 2 to MapEnumLite.MAP_ENUM_BAR_LITE) |
||||
) |
||||
mapInt32Enum.remove(1) |
||||
assertThat(mapInt32Enum).isEqualTo(mapOf(2 to MapEnumLite.MAP_ENUM_BAR_LITE)) |
||||
|
||||
mapInt32ForeignMessage.putAll( |
||||
mapOf(1 to foreignMessageLite { c = 1 }, 2 to foreignMessageLite { c = 2 }) |
||||
) |
||||
mapInt32ForeignMessage.remove(1) |
||||
assertThat(mapInt32ForeignMessage).isEqualTo(mapOf(2 to foreignMessageLite { c = 2 })) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testMapClear() { |
||||
testMapLite { |
||||
mapInt32Int32.putAll(mapOf(1 to 2, 3 to 4)) |
||||
mapInt32Int32.clear() |
||||
assertThat(mapInt32Int32.isEmpty()).isTrue() |
||||
|
||||
mapStringString.putAll(mapOf("1" to "2", "3" to "4")) |
||||
mapStringString.clear() |
||||
assertThat(mapStringString.isEmpty()).isTrue() |
||||
|
||||
mapInt32Enum.putAll( |
||||
mapOf(1 to MapEnumLite.MAP_ENUM_FOO_LITE, 2 to MapEnumLite.MAP_ENUM_BAR_LITE) |
||||
) |
||||
mapInt32Enum.clear() |
||||
assertThat(mapInt32Enum.isEmpty()).isTrue() |
||||
|
||||
mapInt32ForeignMessage.putAll( |
||||
mapOf(1 to foreignMessageLite { c = 1 }, 2 to foreignMessageLite { c = 2 }) |
||||
) |
||||
mapInt32ForeignMessage.clear() |
||||
assertThat(mapInt32ForeignMessage.isEmpty()).isTrue() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testEvilNames() { |
||||
assertThat( |
||||
evilNamesProto2 { |
||||
initialized = true |
||||
hasFoo = true |
||||
bar = "foo" |
||||
isInitialized = true |
||||
fooBar = "foo" |
||||
aLLCAPS += "foo" |
||||
aLLCAPSMAP[1] = true |
||||
hasUnderbarPrecedingNumeric1Foo = true |
||||
hasUnderbarPrecedingNumeric42Bar = true |
||||
hasUnderbarPrecedingNumeric123Foo42BarBaz = true |
||||
extension += "foo" |
||||
class_ += 1 |
||||
int = 1.0 |
||||
long = true |
||||
boolean = 1L |
||||
sealed = "foo" |
||||
interface_ = 1F |
||||
in_ = 1 |
||||
object_ = "foo" |
||||
cachedSize_ = "foo" |
||||
serializedSize_ = true |
||||
by = "foo" |
||||
} |
||||
).isEqualTo( |
||||
EvilNamesProto2.newBuilder() |
||||
.setInitialized(true) |
||||
.setHasFoo(true) |
||||
.setBar("foo") |
||||
.setIsInitialized(true) |
||||
.setFooBar("foo") |
||||
.addALLCAPS("foo") |
||||
.putALLCAPSMAP(1, true) |
||||
.setHasUnderbarPrecedingNumeric1Foo(true) |
||||
.setHasUnderbarPrecedingNumeric42Bar(true) |
||||
.setHasUnderbarPrecedingNumeric123Foo42BarBaz(true) |
||||
.addExtension("foo") |
||||
.addClass_(1) |
||||
.setInt(1.0) |
||||
.setLong(true) |
||||
.setBoolean(1L) |
||||
.setSealed("foo") |
||||
.setInterface(1F) |
||||
.setIn(1) |
||||
.setObject("foo") |
||||
.setCachedSize_("foo") |
||||
.setSerializedSize_(true) |
||||
.setBy("foo") |
||||
.build() |
||||
) |
||||
|
||||
assertThat(interface_ {}).isEqualTo(Interface.newBuilder().build()) |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordGettersAndSetters() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
assertThat(as_).isEqualTo(1) |
||||
|
||||
in_ = "foo" |
||||
assertThat(in_).isEqualTo("foo") |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(break_).isEqualTo(HardKeywordsAllTypes.NestedEnum.FOO) |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(do_).isEqualTo(HardKeywordsAllTypesKt.nestedMessage { while_ = 1 }) |
||||
|
||||
continue_[1] = 1 |
||||
assertThat(continue_[1]).isEqualTo(1) |
||||
|
||||
else_ += 1 |
||||
assertThat(else_).isEqualTo(listOf(1)) |
||||
|
||||
for_ += "foo" |
||||
assertThat(for_).isEqualTo(listOf("foo")) |
||||
|
||||
fun_ += HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(fun_).isEqualTo(listOf(HardKeywordsAllTypes.NestedEnum.FOO)) |
||||
|
||||
if_ += HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(if_).isEqualTo(listOf(HardKeywordsAllTypesKt.nestedMessage { while_ = 1 })) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordHazzers() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
assertThat(hasAs_()).isTrue() |
||||
|
||||
in_ = "foo" |
||||
assertThat(hasIn_()).isTrue() |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(hasBreak_()).isTrue() |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(hasDo_()).isTrue() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordClears() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
clearAs_() |
||||
assertThat(hasAs_()).isFalse() |
||||
|
||||
in_ = "foo" |
||||
clearIn_() |
||||
assertThat(hasIn_()).isFalse() |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
clearBreak_() |
||||
assertThat(hasBreak_()).isFalse() |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
clearDo_() |
||||
assertThat(hasDo_()).isFalse() |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
<project name="generate-sources"> |
||||
<echo message="Running protoc ..."/> |
||||
<mkdir dir="${generated.sources.dir}"/> |
||||
<exec executable="${protoc}"> |
||||
<arg value="--kotlin_out=${generated.sources.dir}"/> |
||||
<arg value="--proto_path=${protobuf.source.dir}"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/any.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/api.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/descriptor.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/duration.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/empty.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/field_mask.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/source_context.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/struct.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/timestamp.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/type.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/wrappers.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/compiler/plugin.proto"/> |
||||
</exec> |
||||
</project> |
@ -0,0 +1,34 @@ |
||||
<project name="generate-test-sources"> |
||||
<mkdir dir="${generated.testsources.dir}"/> |
||||
<exec executable="${protoc}"> |
||||
<arg value="--java_out=${generated.testsources.dir}"/> |
||||
<arg value="--proto_path=${protobuf.source.dir}"/> |
||||
<arg value="--proto_path=${test.proto.dir}"/> |
||||
<arg value="--experimental_allow_proto3_optional"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/map_proto2_unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import_public.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_import_public_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_lite.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_proto3.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/evil_names_proto2.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/evil_names_proto3.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/example_extensible_message.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/multiple_files_proto3.proto"/> |
||||
</exec> |
||||
<exec executable="${protoc}"> |
||||
<arg value="--kotlin_out=${generated.testsources.dir}"/> |
||||
<arg value="--proto_path=${protobuf.source.dir}"/> |
||||
<arg value="--proto_path=${test.proto.dir}"/> |
||||
<arg value="--experimental_allow_proto3_optional"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/map_proto2_unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest.proto"/> |
||||
<arg value="${protobuf.source.dir}/google/protobuf/unittest_proto3.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/evil_names_proto2.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/evil_names_proto3.proto"/> |
||||
<arg value="${test.proto.dir}/com/google/protobuf/multiple_files_proto3.proto"/> |
||||
</exec> |
||||
|
||||
</project> |
@ -0,0 +1,240 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
<parent> |
||||
<groupId>com.google.protobuf</groupId> |
||||
<artifactId>protobuf-parent</artifactId> |
||||
<version>3.15.6</version> |
||||
</parent> |
||||
|
||||
<artifactId>protobuf-kotlin</artifactId> |
||||
<packaging>bundle</packaging> |
||||
|
||||
<name>Protocol Buffers [Core]</name> |
||||
<description> |
||||
Core Protocol Buffers library. Protocol Buffers are a way of encoding structured data in an |
||||
efficient yet extensible format. |
||||
</description> |
||||
|
||||
<properties> |
||||
<kotlin.version>1.4.31</kotlin.version> |
||||
</properties> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>${project.groupId}</groupId> |
||||
<artifactId>protobuf-java</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>junit</groupId> |
||||
<artifactId>junit</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.easymock</groupId> |
||||
<artifactId>easymock</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.easymock</groupId> |
||||
<artifactId>easymockclassextension</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.guava</groupId> |
||||
<artifactId>guava</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.guava</groupId> |
||||
<artifactId>guava-testlib</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>com.google.truth</groupId> |
||||
<artifactId>truth</artifactId> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.jetbrains.kotlin</groupId> |
||||
<artifactId>kotlin-stdlib</artifactId> |
||||
<version>${kotlin.version}</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.jetbrains.kotlin</groupId> |
||||
<artifactId>kotlin-test</artifactId> |
||||
<version>${kotlin.version}</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
</dependencies> |
||||
|
||||
<build> |
||||
<!-- Include core protos in the bundle as resources --> |
||||
<resources> |
||||
<resource> |
||||
<directory>${protobuf.source.dir}</directory> |
||||
<includes> |
||||
<include>google/protobuf/any.proto</include> |
||||
<include>google/protobuf/api.proto</include> |
||||
<include>google/protobuf/descriptor.proto</include> |
||||
<include>google/protobuf/duration.proto</include> |
||||
<include>google/protobuf/empty.proto</include> |
||||
<include>google/protobuf/field_mask.proto</include> |
||||
<include>google/protobuf/source_context.proto</include> |
||||
<include>google/protobuf/struct.proto</include> |
||||
<include>google/protobuf/timestamp.proto</include> |
||||
<include>google/protobuf/type.proto</include> |
||||
<include>google/protobuf/wrappers.proto</include> |
||||
<include>google/protobuf/compiler/plugin.proto</include> |
||||
</includes> |
||||
</resource> |
||||
</resources> |
||||
<testResources> |
||||
<testResource> |
||||
<directory>${protobuf.source.dir}</directory> |
||||
<includes> |
||||
<include>google/protobuf/testdata/golden_message_oneof_implemented</include> |
||||
<include>google/protobuf/testdata/golden_packed_fields_message</include> |
||||
</includes> |
||||
</testResource> |
||||
</testResources> |
||||
|
||||
<plugins> |
||||
<plugin> |
||||
<artifactId>maven-resources-plugin</artifactId> |
||||
<version>3.1.0</version> |
||||
<executions> |
||||
<execution> |
||||
<id>copy-test-source-files</id> |
||||
<phase>generate-test-sources</phase> |
||||
<goals> |
||||
<goal>copy-resources</goal> |
||||
</goals> |
||||
<configuration> |
||||
<outputDirectory>${generated.testsources.dir}/com/google/protobuf</outputDirectory> |
||||
<resources> |
||||
<resource> |
||||
<directory>${basedir}/../core/src/test/java/com/google/protobuf</directory> |
||||
<includes> |
||||
<include>TestUtil.java</include> |
||||
<include>TestUtilLite.java</include> |
||||
</includes> |
||||
</resource> |
||||
</resources> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
|
||||
<!-- Use Antrun plugin to generate sources with protoc --> |
||||
<plugin> |
||||
<artifactId>maven-antrun-plugin</artifactId> |
||||
<executions> |
||||
<!-- Generate core protos --> |
||||
<execution> |
||||
<id>generate-sources</id> |
||||
<phase>generate-sources</phase> |
||||
<configuration> |
||||
<target> |
||||
<ant antfile="generate-sources-build.xml"/> |
||||
</target> |
||||
</configuration> |
||||
<goals> |
||||
<goal>run</goal> |
||||
</goals> |
||||
</execution> |
||||
|
||||
<!-- Generate the test protos --> |
||||
<execution> |
||||
<id>generate-test-sources</id> |
||||
<phase>generate-test-sources</phase> |
||||
<configuration> |
||||
<target> |
||||
<ant antfile="generate-test-sources-build.xml"/> |
||||
</target> |
||||
</configuration> |
||||
<goals> |
||||
<goal>run</goal> |
||||
</goals> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
|
||||
<!-- Add the generated sources to the build --> |
||||
<plugin> |
||||
<groupId>org.codehaus.mojo</groupId> |
||||
<artifactId>build-helper-maven-plugin</artifactId> |
||||
<executions> |
||||
<execution> |
||||
<id>add-generated-sources</id> |
||||
<phase>generate-sources</phase> |
||||
<goals> |
||||
<goal>add-source</goal> |
||||
</goals> |
||||
<configuration> |
||||
<sources> |
||||
<source>${generated.sources.dir}</source> |
||||
</sources> |
||||
</configuration> |
||||
</execution> |
||||
<execution> |
||||
<id>add-generated-test-sources</id> |
||||
<phase>generate-test-sources</phase> |
||||
<goals> |
||||
<goal>add-test-source</goal> |
||||
</goals> |
||||
<configuration> |
||||
<sources> |
||||
<source>${generated.testsources.dir}</source> |
||||
</sources> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
<plugin> |
||||
<groupId>org.jetbrains.kotlin</groupId> |
||||
<artifactId>kotlin-maven-plugin</artifactId> |
||||
<version>${kotlin.version}</version> |
||||
<extensions>true</extensions> |
||||
<executions> |
||||
<execution> |
||||
<id>compile</id> |
||||
<goals> <goal>compile</goal> </goals> |
||||
<configuration> |
||||
<sourceDirs> |
||||
<sourceDir>${generated.sources.dir}</sourceDir> |
||||
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir> |
||||
</sourceDirs> |
||||
</configuration> |
||||
</execution> |
||||
<execution> |
||||
<id>test-compile</id> |
||||
<goals> <goal>test-compile</goal> </goals> |
||||
<configuration> |
||||
<sourceDirs> |
||||
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir> |
||||
<sourceDir>${generated.testsources.dir}</sourceDir> |
||||
</sourceDirs> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
<!-- OSGI bundle configuration --> |
||||
<plugin> |
||||
<groupId>org.apache.felix</groupId> |
||||
<artifactId>maven-bundle-plugin</artifactId> |
||||
<extensions>true</extensions> |
||||
<configuration> |
||||
<instructions> |
||||
<Automatic-Module-Name>com.google.protobuf</Automatic-Module-Name> <!-- Java9+ Jigsaw module name --> |
||||
<Bundle-DocURL>https://developers.google.com/protocol-buffers/</Bundle-DocURL> |
||||
<Bundle-SymbolicName>com.google.protobuf</Bundle-SymbolicName> |
||||
<Export-Package>com.google.protobuf;version=${project.version}</Export-Package> |
||||
<Import-Package>sun.misc;resolution:=optional,*</Import-Package> |
||||
</instructions> |
||||
</configuration> |
||||
</plugin> |
||||
</plugins> |
||||
</build> |
||||
|
||||
</project> |
@ -0,0 +1,27 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
/** |
||||
* A simple wrapper around a [List] with an extra generic parameter that can be used to disambiguate |
||||
* extension methods. |
||||
* |
||||
* <p>This class is used by Kotlin protocol buffer extensions, and its constructor is public only |
||||
* because generated message code is in a different compilation unit. Others should not use this |
||||
* class directly in any way. |
||||
*/ |
||||
@Suppress("unused") // the unused type parameter |
||||
class DslList<E, P : DslProxy> @OnlyForUseByGeneratedProtoCode constructor( |
||||
private val delegate: List<E> |
||||
) : List<E> by delegate { |
||||
override fun iterator(): Iterator<E> = UnmodifiableIterator(delegate.iterator()) |
||||
|
||||
override fun listIterator(): ListIterator<E> = UnmodifiableListIterator(delegate.listIterator()) |
||||
|
||||
override fun listIterator(index: Int): ListIterator<E> = |
||||
UnmodifiableListIterator(delegate.listIterator(index)) |
||||
|
||||
override fun equals(other: Any?): Boolean = delegate == other |
||||
|
||||
override fun hashCode(): Int = delegate.hashCode() |
||||
|
||||
override fun toString(): String = delegate.toString() |
||||
} |
@ -0,0 +1,30 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
/** |
||||
* A simple wrapper around a [Map] with an extra generic parameter that can be used to disambiguate |
||||
* extension methods. |
||||
* |
||||
* <p>This class is used by Kotlin protocol buffer extensions, and its constructor is public only |
||||
* because generated message code is in a different compilation unit. Others should not use this |
||||
* class directly in any way. |
||||
*/ |
||||
@Suppress("unused") // the unused type parameter |
||||
class DslMap<K, V, P : DslProxy> @OnlyForUseByGeneratedProtoCode constructor( |
||||
private val delegate: Map<K, V> |
||||
) : Map<K, V> by delegate { |
||||
// We allocate the wrappers on calls to get, not with lazy {...}, because lazy allocates |
||||
// a few objects up front, and any kind of query operation on this object should be rare. |
||||
|
||||
override val entries: Set<Map.Entry<K, V>> |
||||
get() = UnmodifiableMapEntries(delegate.entries) |
||||
override val keys: Set<K> |
||||
get() = UnmodifiableSet(delegate.keys) |
||||
override val values: Collection<V> |
||||
get() = UnmodifiableCollection(delegate.values) |
||||
|
||||
override fun equals(other: Any?): Boolean = delegate == other |
||||
|
||||
override fun hashCode(): Int = delegate.hashCode() |
||||
|
||||
override fun toString(): String = delegate.toString() |
||||
} |
@ -0,0 +1,12 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
/** |
||||
* A type meaningful only for its existence, never intended to be instantiated. For example, |
||||
* a `DslList<Int, FooProxy>` can be given different extension methods than a |
||||
* `DslList<Int, BarProxy>`. |
||||
*/ |
||||
abstract class DslProxy @OnlyForUseByGeneratedProtoCode protected constructor() { |
||||
init { |
||||
throw UnsupportedOperationException("A DslProxy should never be instantiated") |
||||
} |
||||
} |
@ -0,0 +1,26 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.protobuf.ExtensionLite |
||||
import com.google.protobuf.GeneratedMessageV3 |
||||
|
||||
/** Sets the current value of the proto extension in this builder.*/ |
||||
operator fun < |
||||
M : GeneratedMessageV3.ExtendableMessage<M>, |
||||
B : GeneratedMessageV3.ExtendableBuilder<M, B>, |
||||
T : Any |
||||
> B.set(extension: ExtensionLite<M, T>, value: T) { |
||||
setExtension(extension, value) |
||||
} |
||||
|
||||
/** Gets the current value of the proto extension. */ |
||||
operator fun < |
||||
M : GeneratedMessageV3.ExtendableMessage<M>, |
||||
MorBT : GeneratedMessageV3.ExtendableMessageOrBuilder<M>, |
||||
T : Any |
||||
> MorBT.get(extension: ExtensionLite<M, T>): T = getExtension(extension) |
||||
|
||||
/** Returns true if the specified extension is set on this builder. */ |
||||
operator fun < |
||||
M : GeneratedMessageV3.ExtendableMessage<M>, |
||||
MorBT : GeneratedMessageV3.ExtendableMessageOrBuilder<M> |
||||
> MorBT.contains(extension: ExtensionLite<M, *>): Boolean = hasExtension(extension) |
@ -0,0 +1,28 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.protobuf.ExtensionLite |
||||
import com.google.protobuf.GeneratedMessageLite |
||||
|
||||
/** Gets the value of the proto extension. */ |
||||
operator fun < |
||||
M : GeneratedMessageLite.ExtendableMessage<M, *>, |
||||
MOrBT : GeneratedMessageLite.ExtendableMessageOrBuilder<M, *>, |
||||
T : Any |
||||
> MOrBT.get(extension: ExtensionLite<M, T>): T = getExtension(extension) |
||||
|
||||
/** Sets the current value of the proto extension in this builder. */ |
||||
operator fun < |
||||
M : GeneratedMessageLite.ExtendableMessage<M, B>, |
||||
B : GeneratedMessageLite.ExtendableBuilder<M, B>, |
||||
T : Any |
||||
> B.set(extension: ExtensionLite<M, T>, value: T) { |
||||
setExtension(extension, value) |
||||
} |
||||
|
||||
/** Returns true if the specified extension is set. */ |
||||
operator fun < |
||||
M : GeneratedMessageLite.ExtendableMessage<M, *>, |
||||
MorBT : GeneratedMessageLite.ExtendableMessageOrBuilder<M, *> |
||||
> MorBT.contains( |
||||
extension: ExtensionLite<M, *> |
||||
): Boolean = hasExtension(extension) |
@ -0,0 +1,27 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.protobuf.ExtensionLite |
||||
import com.google.protobuf.MessageLite |
||||
|
||||
/** |
||||
* Implementation for ExtensionList and ExtensionListLite. Like [DslList], represents an |
||||
* unmodifiable view of a repeated proto field -- in this case, an extension field -- but |
||||
* supports querying the extension. |
||||
*/ |
||||
class ExtensionList<E, M : MessageLite> @OnlyForUseByGeneratedProtoCode constructor( |
||||
val extension: ExtensionLite<M, List<E>>, |
||||
@JvmField private val delegate: List<E> |
||||
) : List<E> by delegate { |
||||
override fun iterator(): Iterator<E> = UnmodifiableIterator(delegate.iterator()) |
||||
|
||||
override fun listIterator(): ListIterator<E> = UnmodifiableListIterator(delegate.listIterator()) |
||||
|
||||
override fun listIterator(index: Int): ListIterator<E> = |
||||
UnmodifiableListIterator(delegate.listIterator(index)) |
||||
|
||||
override fun equals(other: Any?): Boolean = delegate == other |
||||
|
||||
override fun hashCode(): Int = delegate.hashCode() |
||||
|
||||
override fun toString(): String = delegate.toString() |
||||
} |
@ -0,0 +1,18 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
/** |
||||
* Opt-in annotation to make it difficult to accidentally use APIs only intended for use by proto |
||||
* generated code. See https://kotlinlang.org/docs/reference/opt-in-requirements.html for details |
||||
* on how this API works. |
||||
*/ |
||||
@RequiresOptIn( |
||||
message = |
||||
""" |
||||
This API is only intended for use by generated protobuf code, the code generator, and their own |
||||
tests. If this does not describe your code, you should not be using this API. |
||||
""", |
||||
level = RequiresOptIn.Level.ERROR |
||||
) |
||||
@Retention(AnnotationRetention.BINARY) |
||||
@Target(AnnotationTarget.CONSTRUCTOR, AnnotationTarget.ANNOTATION_CLASS) |
||||
annotation class OnlyForUseByGeneratedProtoCode |
@ -0,0 +1,10 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
/** |
||||
* Indicates an API that is part of a DSL to generate protocol buffer messages. |
||||
*/ |
||||
@DslMarker |
||||
@Target(AnnotationTarget.CLASS) |
||||
@Retention(AnnotationRetention.BINARY) |
||||
@OnlyForUseByGeneratedProtoCode |
||||
annotation class ProtoDslMarker |
@ -0,0 +1,39 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
/** Wraps an [Iterator] and makes it unmodifiable even from Java. */ |
||||
internal class UnmodifiableIterator<E>(delegate: Iterator<E>) : Iterator<E> by delegate |
||||
|
||||
/** Wraps a [ListIterator] and makes it unmodifiable even from Java. */ |
||||
internal class UnmodifiableListIterator<E>( |
||||
delegate: ListIterator<E> |
||||
) : ListIterator<E> by delegate |
||||
|
||||
/** Wraps a [Collection] and makes it unmodifiable even from Java. */ |
||||
internal open class UnmodifiableCollection<E>( |
||||
private val delegate: Collection<E> |
||||
) : Collection<E> by delegate { |
||||
override fun iterator(): Iterator<E> = UnmodifiableIterator(delegate.iterator()) |
||||
} |
||||
|
||||
/** Wraps a [Set] and makes it unmodifiable even from Java. */ |
||||
internal class UnmodifiableSet<E>( |
||||
delegate: Collection<E> |
||||
) : UnmodifiableCollection<E>(delegate), Set<E> |
||||
|
||||
/** Wraps a [Map.Entry] and makes it unmodifiable even from Java. */ |
||||
internal class UnmodifiableMapEntry<K, V>(delegate: Map.Entry<K, V>) : Map.Entry<K, V> by delegate |
||||
|
||||
/** Wraps a [Set] of map entries and makes it unmodifiable even from Java. */ |
||||
internal class UnmodifiableMapEntries<K, V>( |
||||
private val delegate: Set<Map.Entry<K, V>> |
||||
) : UnmodifiableCollection<Map.Entry<K, V>>(delegate), Set<Map.Entry<K, V>> { |
||||
|
||||
// Is this overkill? Probably. |
||||
|
||||
override fun iterator(): Iterator<Map.Entry<K, V>> { |
||||
val itr = delegate.iterator() |
||||
return object : Iterator<Map.Entry<K, V>> by itr { |
||||
override fun next(): Map.Entry<K, V> = UnmodifiableMapEntry(itr.next()) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,98 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.testing.EqualsTester |
||||
import com.google.common.truth.Truth.assertThat |
||||
import kotlin.test.assertFailsWith |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
/** Tests for [DslList]. */ |
||||
@RunWith(JUnit4::class) |
||||
@OptIn(OnlyForUseByGeneratedProtoCode::class) |
||||
class DslListTest { |
||||
class DummyProxy private constructor() : DslProxy() |
||||
|
||||
@Test |
||||
fun matchesList() { |
||||
assertThat(DslList<Int, DummyProxy>(listOf(1, 2, 3))).containsExactly(1, 2, 3).inOrder() |
||||
} |
||||
|
||||
@Test |
||||
fun reflectsChangesInList() { |
||||
val mutableList = mutableListOf(1, 2, 3) |
||||
val dslList = DslList<Int, DummyProxy>(mutableList) |
||||
mutableList.add(4) |
||||
assertThat(dslList).containsExactly(1, 2, 3, 4).inOrder() |
||||
} |
||||
|
||||
@Test |
||||
fun dslListIsNotMutable() { |
||||
val dslList = DslList<Int, DummyProxy>(mutableListOf(1, 2, 3)) |
||||
assertThat(dslList is MutableList<*>).isFalse() |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslListIsNotEvenSecretlyMutable() { |
||||
val dslList = DslList<Int, DummyProxy>(mutableListOf(1, 2, 3)) |
||||
val dslListAsJavaUtil = dslList as java.util.List<Int> |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
dslListAsJavaUtil.add(4) |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslList_IteratorIsNotEvenSecretlyMutable() { |
||||
val dslList = DslList<Int, DummyProxy>(mutableListOf(1, 2, 3)) |
||||
val iterator = dslList.iterator() as java.util.Iterator<Int> |
||||
iterator.next() |
||||
|
||||
assertFailsWith<UnsupportedOperationException> { |
||||
iterator.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslList_ListIteratorIsNotEvenSecretlyMutable() { |
||||
val dslList = DslList<Int, DummyProxy>(mutableListOf(1, 2, 3)) |
||||
val iterator = dslList.listIterator() as java.util.ListIterator<Int> |
||||
iterator.next() |
||||
|
||||
assertFailsWith<UnsupportedOperationException> { |
||||
iterator.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslList_ListIteratorIndexIsNotEvenSecretlyMutable() { |
||||
val dslList = DslList<Int, DummyProxy>(mutableListOf(1, 2, 3)) |
||||
val iterator = dslList.listIterator(1) as java.util.ListIterator<Int> |
||||
iterator.next() |
||||
|
||||
assertFailsWith<UnsupportedOperationException> { |
||||
iterator.remove() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun expectedToString() { |
||||
assertThat(DslList<Int, DummyProxy>(listOf(1, 2)).toString()).isEqualTo("[1, 2]") |
||||
} |
||||
|
||||
@Test |
||||
fun equality() { |
||||
EqualsTester() |
||||
.addEqualityGroup(DslList<Int, DummyProxy>(listOf(1, 2)), listOf(1, 2)) |
||||
.addEqualityGroup(DslList<Int, DummyProxy>(listOf(2, 2)), listOf(2, 2)) |
||||
.addEqualityGroup( |
||||
DslList<Int, DummyProxy>(emptyList()), |
||||
DslList<String, DummyProxy>(emptyList()), |
||||
emptyList<Int>() |
||||
) |
||||
.testEquals() |
||||
} |
||||
} |
@ -0,0 +1,164 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.testing.EqualsTester |
||||
import com.google.common.truth.Truth.assertThat |
||||
import kotlin.test.assertFailsWith |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
@RunWith(JUnit4::class) |
||||
@OptIn(OnlyForUseByGeneratedProtoCode::class) |
||||
class DslMapTest { |
||||
class DummyProxy private constructor() : DslProxy() |
||||
|
||||
@Test |
||||
fun matchesMap() { |
||||
assertThat(DslMap<Int, Int, DummyProxy>(mapOf(1 to -1, 2 to -2))) |
||||
.containsExactly(1, -1, 2, -2) |
||||
} |
||||
|
||||
@Test |
||||
fun reflectsChangesInMap() { |
||||
val mutableMap = mutableMapOf(1 to -1, 2 to -2) |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMap) |
||||
mutableMap[3] = -3 |
||||
assertThat(dslMap).containsExactly(1, -1, 2, -2, 3, -3).inOrder() |
||||
} |
||||
|
||||
@Test |
||||
fun dslMapIsNotMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
assertThat(dslMap is MutableMap<*, *>).isFalse() |
||||
} |
||||
|
||||
@Test |
||||
fun dslMapKeysAreNotMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
assertThat(dslMap.keys is MutableSet<*>).isFalse() |
||||
} |
||||
|
||||
@Test |
||||
fun dslMapValuesAreNotMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
assertThat(dslMap.values is MutableSet<*>).isFalse() |
||||
} |
||||
|
||||
@Test |
||||
fun dslMapEntriesAreNotMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
assertThat(dslMap.entries is MutableSet<*>).isFalse() |
||||
} |
||||
|
||||
@Test |
||||
fun dslMapEntryObjectsAreNotMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
assertThat(dslMap.entries.single() is MutableMap.MutableEntry<*, *>).isFalse() |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapIsNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapAsJavaUtilMap = dslMap as java.util.Map<Int, Int> |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
dslMapAsJavaUtilMap.put(2, -2) |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapKeysAreNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapKeysAsJavaUtilSet = dslMap.keys as java.util.Set<Int> |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
dslMapKeysAsJavaUtilSet.remove(1) |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapKeysIteratorIsNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapKeysAsJavaUtilSet = dslMap.keys as java.util.Set<Int> |
||||
val itr = dslMapKeysAsJavaUtilSet.iterator() |
||||
itr.next() |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
itr.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapValuesAreNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapValuesAsJavaUtilCollection = dslMap.values as java.util.Collection<Int> |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
dslMapValuesAsJavaUtilCollection.remove(1) |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapValuesIteratorIsNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapValuesAsJavaUtilCollection = dslMap.values as java.util.Collection<Int> |
||||
val itr = dslMapValuesAsJavaUtilCollection.iterator() |
||||
itr.next() |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
itr.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapEntriesAreNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapEntriesAsJavaUtilSet = dslMap.entries as java.util.Set<Map.Entry<Int, Int>> |
||||
val entry = dslMap.entries.single() |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
dslMapEntriesAsJavaUtilSet.remove(entry) |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapEntriesIteratorIsNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapEntriesAsJavaUtilSet = dslMap.entries as java.util.Set<Map.Entry<Int, Int>> |
||||
val itr = dslMapEntriesAsJavaUtilSet.iterator() |
||||
itr.next() |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
itr.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun dslMapEntryObjectsAreNotEvenSecretlyMutable() { |
||||
val dslMap = DslMap<Int, Int, DummyProxy>(mutableMapOf(1 to -1)) |
||||
val dslMapEntryAsJavaUtilMapEntry = dslMap.entries.single() as java.util.Map.Entry<Int, Int> |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
dslMapEntryAsJavaUtilMapEntry.value = 2 |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun expectedToString() { |
||||
assertThat(DslMap<Int, Int, DummyProxy>(mapOf(1 to 2, 2 to 3)).toString()) |
||||
.isEqualTo("{1=2, 2=3}") |
||||
} |
||||
|
||||
@Test |
||||
fun equality() { |
||||
EqualsTester() |
||||
.addEqualityGroup(DslMap<Int, Int, DummyProxy>(mapOf(1 to 2, 2 to 3)), mapOf(1 to 2, 2 to 3)) |
||||
.addEqualityGroup(DslMap<Int, Int, DummyProxy>(mapOf(1 to 3, 2 to 3)), mapOf(1 to 3, 2 to 3)) |
||||
.addEqualityGroup( |
||||
DslMap<Int, Int, DummyProxy>(emptyMap()), |
||||
DslMap<String, String, DummyProxy>(emptyMap()), |
||||
emptyMap<Int, Int>() |
||||
) |
||||
.testEquals() |
||||
} |
||||
} |
@ -0,0 +1,60 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.truth.Truth.assertThat |
||||
import example_extensible_message.ExampleExtensibleMessage |
||||
import example_extensible_message.ExampleExtensibleMessageOuterClass as TestProto |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
@RunWith(JUnit4::class) |
||||
class ExtendableMessageExtensionsTest { |
||||
@Test |
||||
fun setOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
builder[TestProto.int32Extension] = 5 |
||||
assertThat(builder.build().getExtension(TestProto.int32Extension)).isEqualTo(5) |
||||
} |
||||
|
||||
@Test |
||||
fun getOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
assertThat(builder[TestProto.int32Extension]).isEqualTo(6) |
||||
} |
||||
|
||||
@Test |
||||
fun getOnMessage() { |
||||
val message = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
.build() |
||||
assertThat(message[TestProto.int32Extension]).isEqualTo(6) |
||||
} |
||||
|
||||
@Test |
||||
fun containsPositiveOnMessage() { |
||||
val message = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
.build() |
||||
assertThat(TestProto.int32Extension in message).isTrue() |
||||
} |
||||
|
||||
@Test |
||||
fun containsPositiveOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
.setExtension(TestProto.int32Extension, 6) |
||||
assertThat(TestProto.int32Extension in builder).isTrue() |
||||
} |
||||
|
||||
@Test |
||||
fun containsNegativeOnMessage() { |
||||
val message = ExampleExtensibleMessage.newBuilder().build() |
||||
assertThat(TestProto.int32Extension in message).isFalse() |
||||
} |
||||
|
||||
@Test |
||||
fun containsNegativeOnBuilder() { |
||||
val builder = ExampleExtensibleMessage.newBuilder() |
||||
assertThat(TestProto.int32Extension in builder).isFalse() |
||||
} |
||||
} |
@ -0,0 +1,125 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.testing.EqualsTester |
||||
import com.google.common.truth.Truth.assertThat |
||||
import example_extensible_message.ExampleExtensibleMessage |
||||
import example_extensible_message.ExampleExtensibleMessageOuterClass as TestProto |
||||
import kotlin.test.assertFailsWith |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
/** Tests for [DslList]. */ |
||||
@RunWith(JUnit4::class) |
||||
@OptIn(OnlyForUseByGeneratedProtoCode::class) |
||||
class ExtensionListTest { |
||||
class DummyProxy private constructor() : DslProxy() |
||||
|
||||
@Test |
||||
fun matchesList() { |
||||
assertThat( |
||||
ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, listOf(1, 2, 3) |
||||
) |
||||
).containsExactly(1, 2, 3).inOrder() |
||||
} |
||||
|
||||
@Test |
||||
fun reflectsChangesInList() { |
||||
val mutableList = mutableListOf(1, 2, 3) |
||||
val extensionList = ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, mutableList |
||||
) |
||||
mutableList.add(4) |
||||
assertThat(extensionList).containsExactly(1, 2, 3, 4).inOrder() |
||||
} |
||||
|
||||
@Test |
||||
fun extensionListIsNotMutable() { |
||||
val extensionList = ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, mutableListOf(1, 2, 3) |
||||
) |
||||
assertThat(extensionList is MutableList<*>).isFalse() |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun extensionListIsNotEvenSecretlyMutable() { |
||||
val extensionList = ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, mutableListOf(1, 2, 3) |
||||
) |
||||
val extensionListAsJavaUtil = extensionList as java.util.List<Int> |
||||
assertFailsWith<UnsupportedOperationException> { |
||||
extensionListAsJavaUtil.add(4) |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun extensionList_IteratorIsNotEvenSecretlyMutable() { |
||||
val extensionList = ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, mutableListOf(1, 2, 3) |
||||
) |
||||
val iterator = extensionList.iterator() as java.util.Iterator<Int> |
||||
iterator.next() |
||||
|
||||
assertFailsWith<UnsupportedOperationException> { |
||||
iterator.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun extensionList_ListIteratorIsNotEvenSecretlyMutable() { |
||||
val extensionList = ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, mutableListOf(1, 2, 3) |
||||
) |
||||
val iterator = extensionList.listIterator() as java.util.ListIterator<Int> |
||||
iterator.next() |
||||
|
||||
assertFailsWith<UnsupportedOperationException> { |
||||
iterator.remove() |
||||
} |
||||
} |
||||
|
||||
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") |
||||
@Test |
||||
fun extensionList_ListIteratorIndexIsNotEvenSecretlyMutable() { |
||||
val extensionList = ExtensionList<Int, ExampleExtensibleMessage>( |
||||
TestProto.repeatedExtension, mutableListOf(1, 2, 3) |
||||
) |
||||
val iterator = extensionList.listIterator(1) as java.util.ListIterator<Int> |
||||
iterator.next() |
||||
|
||||
assertFailsWith<UnsupportedOperationException> { |
||||
iterator.remove() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun expectedToString() { |
||||
assertThat( |
||||
ExtensionList<Int, ExampleExtensibleMessage>(TestProto.repeatedExtension, listOf(1, 2)) |
||||
.toString() |
||||
).isEqualTo("[1, 2]") |
||||
} |
||||
|
||||
@Test |
||||
fun equality() { |
||||
EqualsTester() |
||||
.addEqualityGroup( |
||||
ExtensionList<Int, ExampleExtensibleMessage>(TestProto.repeatedExtension, listOf(1, 2)), |
||||
ExtensionList<Int, ExampleExtensibleMessage>(TestProto.differentExtension, listOf(1, 2)), |
||||
listOf(1, 2) |
||||
) |
||||
.addEqualityGroup( |
||||
ExtensionList<Int, ExampleExtensibleMessage>(TestProto.repeatedExtension, listOf(2, 2)), |
||||
listOf(2, 2) |
||||
) |
||||
.addEqualityGroup( |
||||
ExtensionList<Int, ExampleExtensibleMessage>(TestProto.repeatedExtension, emptyList()), |
||||
emptyList<Int>() |
||||
) |
||||
.testEquals() |
||||
} |
||||
} |
@ -0,0 +1,891 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.truth.Truth.assertThat |
||||
import com.google.protobuf.TestUtil |
||||
import com.google.protobuf.TestUtil.toBytes |
||||
import evil_names_proto2.EvilNamesProto2OuterClass.EvilNamesProto2 |
||||
import evil_names_proto2.EvilNamesProto2OuterClass.HardKeywordsAllTypes |
||||
import evil_names_proto2.EvilNamesProto2OuterClass.Interface |
||||
import evil_names_proto2.HardKeywordsAllTypesKt |
||||
import evil_names_proto2.evilNamesProto2 |
||||
import evil_names_proto2.hardKeywordsAllTypes |
||||
import evil_names_proto2.interface_ |
||||
import com.google.protobuf.test.UnittestImport.ImportEnum |
||||
import com.google.protobuf.test.UnittestImport.ImportMessage |
||||
import com.google.protobuf.test.UnittestImportPublic.PublicImportMessage |
||||
import protobuf_unittest.MapProto2Unittest.Proto2MapEnum |
||||
import protobuf_unittest.MapProto2Unittest.TestEnumMap |
||||
import protobuf_unittest.MapProto2Unittest.TestIntIntMap |
||||
import protobuf_unittest.MapProto2Unittest.TestMaps |
||||
import protobuf_unittest.TestAllTypesKt |
||||
import protobuf_unittest.TestAllTypesKt.nestedMessage |
||||
import protobuf_unittest.UnittestProto |
||||
import protobuf_unittest.UnittestProto.ForeignEnum |
||||
import protobuf_unittest.UnittestProto.TestAllTypes |
||||
import protobuf_unittest.UnittestProto.TestAllTypes.NestedEnum |
||||
import protobuf_unittest.UnittestProto.TestEmptyMessage |
||||
import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions |
||||
import protobuf_unittest.copy |
||||
import protobuf_unittest.foreignMessage |
||||
import protobuf_unittest.optionalGroupExtension |
||||
import protobuf_unittest.repeatedGroupExtension |
||||
import protobuf_unittest.testAllExtensions |
||||
import protobuf_unittest.testAllTypes |
||||
import protobuf_unittest.testEmptyMessage |
||||
import protobuf_unittest.testEmptyMessageWithExtensions |
||||
import protobuf_unittest.testEnumMap |
||||
import protobuf_unittest.testIntIntMap |
||||
import protobuf_unittest.testMaps |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
@RunWith(JUnit4::class) |
||||
class Proto2Test { |
||||
@Test |
||||
fun testSetters() { |
||||
assertThat( |
||||
testAllTypes { |
||||
optionalInt32 = 101 |
||||
optionalInt64 = 102 |
||||
optionalUint32 = 103 |
||||
optionalUint64 = 104 |
||||
optionalSint32 = 105 |
||||
optionalSint64 = 106 |
||||
optionalFixed32 = 107 |
||||
optionalFixed64 = 108 |
||||
optionalSfixed32 = 109 |
||||
optionalSfixed64 = 110 |
||||
optionalFloat = 111.0f |
||||
optionalDouble = 112.0 |
||||
optionalBool = true |
||||
optionalString = "115" |
||||
optionalBytes = toBytes("116") |
||||
optionalGroup = |
||||
TestAllTypesKt.optionalGroup { a = 117 } |
||||
optionalNestedMessage = nestedMessage { bb = 118 } |
||||
optionalForeignMessage = foreignMessage { c = 119 } |
||||
optionalImportMessage = |
||||
ImportMessage.newBuilder().setD(120).build() |
||||
optionalPublicImportMessage = |
||||
PublicImportMessage.newBuilder().setE(126).build() |
||||
optionalLazyMessage = nestedMessage { bb = 127 } |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
optionalForeignEnum = ForeignEnum.FOREIGN_BAZ |
||||
optionalImportEnum = ImportEnum.IMPORT_BAZ |
||||
optionalStringPiece = "124" |
||||
optionalCord = "125" |
||||
repeatedInt32.add(201) |
||||
repeatedInt64.add(202) |
||||
repeatedUint32.add(203) |
||||
repeatedUint64.add(204) |
||||
repeatedSint32.add(205) |
||||
repeatedSint64.add(206) |
||||
repeatedFixed32.add(207) |
||||
repeatedFixed64.add(208) |
||||
repeatedSfixed32.add(209) |
||||
repeatedSfixed64.add(210) |
||||
repeatedFloat.add(211f) |
||||
repeatedDouble.add(212.0) |
||||
repeatedBool.add(true) |
||||
repeatedString.add("215") |
||||
repeatedBytes.add(toBytes("216")) |
||||
repeatedGroup.add(TestAllTypesKt.repeatedGroup { a = 217 }) |
||||
repeatedNestedMessage.add(nestedMessage { bb = 218 }) |
||||
repeatedForeignMessage.add(foreignMessage { c = 219 }) |
||||
repeatedImportMessage.add( |
||||
ImportMessage.newBuilder().setD(220).build() |
||||
) |
||||
repeatedLazyMessage.add(nestedMessage { bb = 227 }) |
||||
repeatedNestedEnum.add(NestedEnum.BAR) |
||||
repeatedForeignEnum.add(ForeignEnum.FOREIGN_BAR) |
||||
repeatedImportEnum.add(ImportEnum.IMPORT_BAR) |
||||
repeatedStringPiece.add("224") |
||||
repeatedCord.add("225") |
||||
repeatedInt32 += 301 |
||||
repeatedInt64 += 302 |
||||
repeatedUint32 += 303 |
||||
repeatedUint64 += 304 |
||||
repeatedSint32 += 305 |
||||
repeatedSint64 += 306 |
||||
repeatedFixed32 += 307 |
||||
repeatedFixed64 += 308 |
||||
repeatedSfixed32 += 309 |
||||
repeatedSfixed64 += 310 |
||||
repeatedFloat += 311f |
||||
repeatedDouble += 312.0 |
||||
repeatedBool += false |
||||
repeatedString += "315" |
||||
repeatedBytes += toBytes("316") |
||||
repeatedGroup += TestAllTypesKt.repeatedGroup { a = 317 } |
||||
repeatedNestedMessage += nestedMessage { bb = 318 } |
||||
repeatedForeignMessage += foreignMessage { c = 319 } |
||||
repeatedImportMessage += |
||||
ImportMessage.newBuilder().setD(320).build() |
||||
repeatedLazyMessage += |
||||
TestAllTypesKt.nestedMessage { bb = 327 } |
||||
repeatedNestedEnum += NestedEnum.BAZ |
||||
repeatedForeignEnum += ForeignEnum.FOREIGN_BAZ |
||||
repeatedImportEnum += ImportEnum.IMPORT_BAZ |
||||
repeatedStringPiece += "324" |
||||
repeatedCord += "325" |
||||
defaultInt32 = 401 |
||||
defaultInt64 = 402 |
||||
defaultUint32 = 403 |
||||
defaultUint64 = 404 |
||||
defaultSint32 = 405 |
||||
defaultSint64 = 406 |
||||
defaultFixed32 = 407 |
||||
defaultFixed64 = 408 |
||||
defaultSfixed32 = 409 |
||||
defaultSfixed64 = 410 |
||||
defaultFloat = 411f |
||||
defaultDouble = 412.0 |
||||
defaultBool = false |
||||
defaultString = "415" |
||||
defaultBytes = toBytes("416") |
||||
defaultNestedEnum = NestedEnum.FOO |
||||
defaultForeignEnum = ForeignEnum.FOREIGN_FOO |
||||
defaultImportEnum = ImportEnum.IMPORT_FOO |
||||
defaultStringPiece = "424" |
||||
defaultCord = "425" |
||||
oneofUint32 = 601 |
||||
oneofNestedMessage = |
||||
TestAllTypesKt.nestedMessage { bb = 602 } |
||||
oneofString = "603" |
||||
oneofBytes = toBytes("604") |
||||
} |
||||
).isEqualTo( |
||||
TestUtil.getAllSetBuilder().build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testGetters() { |
||||
testAllTypes { |
||||
optionalInt32 = 101 |
||||
assertThat(optionalInt32).isEqualTo(101) |
||||
optionalString = "115" |
||||
assertThat(optionalString).isEqualTo("115") |
||||
optionalGroup = TestAllTypesKt.optionalGroup { a = 117 } |
||||
assertThat(optionalGroup).isEqualTo(TestAllTypesKt.optionalGroup { a = 117 }) |
||||
optionalNestedMessage = TestAllTypesKt.nestedMessage { bb = 118 } |
||||
assertThat(optionalNestedMessage).isEqualTo(TestAllTypesKt.nestedMessage { bb = 118 }) |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
assertThat(optionalNestedEnum).isEqualTo(NestedEnum.BAZ) |
||||
defaultInt32 = 401 |
||||
assertThat(defaultInt32).isEqualTo(401) |
||||
oneofUint32 = 601 |
||||
assertThat(oneofUint32).isEqualTo(601) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testDefaultGetters() { |
||||
testAllTypes { |
||||
assertThat(defaultInt32).isEqualTo(41) |
||||
assertThat(defaultString).isEqualTo("hello") |
||||
assertThat(defaultNestedEnum).isEqualTo(NestedEnum.BAR) |
||||
assertThat(defaultStringPiece).isEqualTo("abc") |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testRepeatedGettersAndSetters() { |
||||
testAllTypes { |
||||
repeatedInt32.addAll(listOf(1, 2)) |
||||
assertThat(repeatedInt32).isEqualTo(listOf(1, 2)) |
||||
repeatedInt32 += listOf(3, 4) |
||||
assertThat(repeatedInt32).isEqualTo(listOf(1, 2, 3, 4)) |
||||
repeatedInt32[0] = 5 |
||||
assertThat(repeatedInt32).isEqualTo(listOf(5, 2, 3, 4)) |
||||
|
||||
repeatedString.addAll(listOf("1", "2")) |
||||
assertThat(repeatedString).isEqualTo(listOf("1", "2")) |
||||
repeatedString += listOf("3", "4") |
||||
assertThat(repeatedString).isEqualTo(listOf("1", "2", "3", "4")) |
||||
repeatedString[0] = "5" |
||||
assertThat(repeatedString).isEqualTo(listOf("5", "2", "3", "4")) |
||||
|
||||
repeatedGroup.addAll( |
||||
listOf( |
||||
TestAllTypesKt.repeatedGroup { a = 1 }, |
||||
TestAllTypesKt.repeatedGroup { a = 2 } |
||||
) |
||||
) |
||||
assertThat(repeatedGroup).isEqualTo( |
||||
listOf( |
||||
TestAllTypesKt.repeatedGroup { a = 1 }, |
||||
TestAllTypesKt.repeatedGroup { a = 2 } |
||||
) |
||||
) |
||||
repeatedGroup += |
||||
listOf( |
||||
TestAllTypesKt.repeatedGroup { a = 3 }, |
||||
TestAllTypesKt.repeatedGroup { a = 4 } |
||||
) |
||||
assertThat(repeatedGroup).isEqualTo( |
||||
listOf( |
||||
TestAllTypesKt.repeatedGroup { a = 1 }, |
||||
TestAllTypesKt.repeatedGroup { a = 2 }, |
||||
TestAllTypesKt.repeatedGroup { a = 3 }, |
||||
TestAllTypesKt.repeatedGroup { a = 4 } |
||||
) |
||||
) |
||||
repeatedGroup[0] = TestAllTypesKt.repeatedGroup { a = 5 } |
||||
assertThat(repeatedGroup).isEqualTo( |
||||
listOf( |
||||
TestAllTypesKt.repeatedGroup { a = 5 }, |
||||
TestAllTypesKt.repeatedGroup { a = 2 }, |
||||
TestAllTypesKt.repeatedGroup { a = 3 }, |
||||
TestAllTypesKt.repeatedGroup { a = 4 } |
||||
) |
||||
) |
||||
|
||||
repeatedNestedMessage.addAll(listOf(nestedMessage { bb = 1 }, nestedMessage { bb = 2 })) |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 } |
||||
) |
||||
) |
||||
repeatedNestedMessage += listOf(nestedMessage { bb = 3 }, nestedMessage { bb = 4 }) |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
repeatedNestedMessage[0] = nestedMessage { bb = 5 } |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 5 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
|
||||
repeatedNestedEnum.addAll(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
assertThat(repeatedNestedEnum).isEqualTo(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
repeatedNestedEnum += listOf(NestedEnum.BAZ, NestedEnum.FOO) |
||||
assertThat(repeatedNestedEnum).isEqualTo( |
||||
listOf(NestedEnum.FOO, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
repeatedNestedEnum[0] = NestedEnum.BAR |
||||
assertThat(repeatedNestedEnum).isEqualTo( |
||||
listOf(NestedEnum.BAR, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHazzers() { |
||||
testAllTypes { |
||||
optionalInt32 = 101 |
||||
assertThat(hasOptionalInt32()).isTrue() |
||||
assertThat(hasOptionalString()).isFalse() |
||||
optionalGroup = TestAllTypesKt.optionalGroup { a = 117 } |
||||
assertThat(hasOptionalGroup()).isTrue() |
||||
assertThat(hasOptionalNestedMessage()).isFalse() |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
assertThat(hasOptionalNestedEnum()).isTrue() |
||||
assertThat(hasDefaultInt32()).isFalse() |
||||
oneofUint32 = 601 |
||||
assertThat(hasOneofUint32()).isTrue() |
||||
} |
||||
|
||||
testAllTypes { |
||||
assertThat(hasOptionalInt32()).isFalse() |
||||
optionalString = "115" |
||||
assertThat(hasOptionalString()).isTrue() |
||||
assertThat(hasOptionalGroup()).isFalse() |
||||
optionalNestedMessage = TestAllTypesKt.nestedMessage { bb = 118 } |
||||
assertThat(hasOptionalNestedMessage()).isTrue() |
||||
assertThat(hasOptionalNestedEnum()).isFalse() |
||||
defaultInt32 = 401 |
||||
assertThat(hasDefaultInt32()).isTrue() |
||||
assertThat(hasOneofUint32()).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testClears() { |
||||
testAllTypes { |
||||
optionalInt32 = 101 |
||||
clearOptionalInt32() |
||||
assertThat(hasOptionalInt32()).isFalse() |
||||
|
||||
optionalString = "115" |
||||
clearOptionalString() |
||||
assertThat(hasOptionalString()).isFalse() |
||||
|
||||
optionalGroup = TestAllTypesKt.optionalGroup { a = 117 } |
||||
clearOptionalGroup() |
||||
assertThat(hasOptionalGroup()).isFalse() |
||||
|
||||
optionalNestedMessage = TestAllTypesKt.nestedMessage { bb = 118 } |
||||
clearOptionalNestedMessage() |
||||
assertThat(hasOptionalNestedMessage()).isFalse() |
||||
|
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
clearOptionalNestedEnum() |
||||
assertThat(hasOptionalNestedEnum()).isFalse() |
||||
|
||||
defaultInt32 = 401 |
||||
clearDefaultInt32() |
||||
assertThat(hasDefaultInt32()).isFalse() |
||||
|
||||
oneofUint32 = 601 |
||||
clearOneofUint32() |
||||
assertThat(hasOneofUint32()).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testCopy() { |
||||
val message = testAllTypes { |
||||
optionalInt32 = 101 |
||||
optionalString = "115" |
||||
} |
||||
val modifiedMessage = message.copy { |
||||
optionalInt32 = 201 |
||||
} |
||||
|
||||
assertThat(message).isEqualTo( |
||||
TestAllTypes.newBuilder() |
||||
.setOptionalInt32(101) |
||||
.setOptionalString("115") |
||||
.build() |
||||
) |
||||
assertThat(modifiedMessage).isEqualTo( |
||||
TestAllTypes.newBuilder() |
||||
.setOptionalInt32(201) |
||||
.setOptionalString("115") |
||||
.build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testOneof() { |
||||
val message = testAllTypes { |
||||
oneofString = "foo" |
||||
assertThat(oneofFieldCase) |
||||
.isEqualTo(TestAllTypes.OneofFieldCase.ONEOF_STRING) |
||||
assertThat(oneofString).isEqualTo("foo") |
||||
clearOneofField() |
||||
assertThat(hasOneofUint32()).isFalse() |
||||
assertThat(oneofFieldCase) |
||||
.isEqualTo(TestAllTypes.OneofFieldCase.ONEOFFIELD_NOT_SET) |
||||
oneofUint32 = 5 |
||||
} |
||||
|
||||
assertThat(message.getOneofFieldCase()) |
||||
.isEqualTo(TestAllTypes.OneofFieldCase.ONEOF_UINT32) |
||||
assertThat(message.getOneofUint32()).isEqualTo(5) |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionsSet() { |
||||
assertThat( |
||||
testAllExtensions { |
||||
this[UnittestProto.optionalInt32Extension] = 101 |
||||
this[UnittestProto.optionalInt64Extension] = 102L |
||||
this[UnittestProto.optionalUint32Extension] = 103 |
||||
this[UnittestProto.optionalUint64Extension] = 104L |
||||
this[UnittestProto.optionalSint32Extension] = 105 |
||||
this[UnittestProto.optionalSint64Extension] = 106L |
||||
this[UnittestProto.optionalFixed32Extension] = 107 |
||||
this[UnittestProto.optionalFixed64Extension] = 108L |
||||
this[UnittestProto.optionalSfixed32Extension] = 109 |
||||
this[UnittestProto.optionalSfixed64Extension] = 110L |
||||
this[UnittestProto.optionalFloatExtension] = 111F |
||||
this[UnittestProto.optionalDoubleExtension] = 112.0 |
||||
this[UnittestProto.optionalBoolExtension] = true |
||||
this[UnittestProto.optionalStringExtension] = "115" |
||||
this[UnittestProto.optionalBytesExtension] = toBytes("116") |
||||
this[UnittestProto.optionalGroupExtension] = optionalGroupExtension { a = 117 } |
||||
this[UnittestProto.optionalNestedMessageExtension] = |
||||
TestAllTypesKt.nestedMessage { bb = 118 } |
||||
this[UnittestProto.optionalForeignMessageExtension] = foreignMessage { c = 119 } |
||||
this[UnittestProto.optionalImportMessageExtension] = |
||||
ImportMessage.newBuilder().setD(120).build() |
||||
this[UnittestProto.optionalPublicImportMessageExtension] = |
||||
PublicImportMessage.newBuilder().setE(126).build() |
||||
this[UnittestProto.optionalLazyMessageExtension] = TestAllTypesKt.nestedMessage { bb = 127 } |
||||
this[UnittestProto.optionalNestedEnumExtension] = NestedEnum.BAZ |
||||
this[UnittestProto.optionalForeignEnumExtension] = ForeignEnum.FOREIGN_BAZ |
||||
this[UnittestProto.optionalImportEnumExtension] = ImportEnum.IMPORT_BAZ |
||||
this[UnittestProto.optionalStringPieceExtension] = "124" |
||||
this[UnittestProto.optionalCordExtension] = "125" |
||||
this[UnittestProto.repeatedInt32Extension].add(201) |
||||
this[UnittestProto.repeatedInt64Extension].add(202L) |
||||
this[UnittestProto.repeatedUint32Extension].add(203) |
||||
this[UnittestProto.repeatedUint64Extension].add(204L) |
||||
this[UnittestProto.repeatedSint32Extension].add(205) |
||||
this[UnittestProto.repeatedSint64Extension].add(206L) |
||||
this[UnittestProto.repeatedFixed32Extension].add(207) |
||||
this[UnittestProto.repeatedFixed64Extension].add(208L) |
||||
this[UnittestProto.repeatedSfixed32Extension].add(209) |
||||
this[UnittestProto.repeatedSfixed64Extension].add(210L) |
||||
this[UnittestProto.repeatedFloatExtension].add(211F) |
||||
this[UnittestProto.repeatedDoubleExtension].add(212.0) |
||||
this[UnittestProto.repeatedBoolExtension].add(true) |
||||
this[UnittestProto.repeatedStringExtension].add("215") |
||||
this[UnittestProto.repeatedBytesExtension].add(toBytes("216")) |
||||
this[UnittestProto.repeatedGroupExtension].add(repeatedGroupExtension { a = 217 }) |
||||
this[UnittestProto.repeatedNestedMessageExtension] |
||||
.add(TestAllTypesKt.nestedMessage { bb = 218 }) |
||||
this[UnittestProto.repeatedForeignMessageExtension].add(foreignMessage { c = 219 }) |
||||
this[UnittestProto.repeatedImportMessageExtension] |
||||
.add(ImportMessage.newBuilder().setD(220).build()) |
||||
this[UnittestProto.repeatedLazyMessageExtension] |
||||
.add(TestAllTypesKt.nestedMessage { bb = 227 }) |
||||
this[UnittestProto.repeatedNestedEnumExtension].add(NestedEnum.BAR) |
||||
this[UnittestProto.repeatedForeignEnumExtension].add(ForeignEnum.FOREIGN_BAR) |
||||
this[UnittestProto.repeatedImportEnumExtension].add(ImportEnum.IMPORT_BAR) |
||||
this[UnittestProto.repeatedStringPieceExtension].add("224") |
||||
this[UnittestProto.repeatedCordExtension].add("225") |
||||
this[UnittestProto.repeatedInt32Extension].add(301) |
||||
this[UnittestProto.repeatedInt64Extension].add(302L) |
||||
this[UnittestProto.repeatedUint32Extension].add(303) |
||||
this[UnittestProto.repeatedUint64Extension].add(304L) |
||||
this[UnittestProto.repeatedSint32Extension].add(305) |
||||
this[UnittestProto.repeatedSint64Extension].add(306L) |
||||
this[UnittestProto.repeatedFixed32Extension].add(307) |
||||
this[UnittestProto.repeatedFixed64Extension].add(308L) |
||||
this[UnittestProto.repeatedSfixed32Extension].add(309) |
||||
this[UnittestProto.repeatedSfixed64Extension].add(310L) |
||||
this[UnittestProto.repeatedFloatExtension].add(311F) |
||||
this[UnittestProto.repeatedDoubleExtension].add(312.0) |
||||
this[UnittestProto.repeatedBoolExtension].add(false) |
||||
this[UnittestProto.repeatedStringExtension].add("315") |
||||
this[UnittestProto.repeatedBytesExtension].add(toBytes("316")) |
||||
this[UnittestProto.repeatedGroupExtension].add(repeatedGroupExtension { a = 317 }) |
||||
this[UnittestProto.repeatedNestedMessageExtension] |
||||
.add(TestAllTypesKt.nestedMessage { bb = 318 }) |
||||
this[UnittestProto.repeatedForeignMessageExtension].add(foreignMessage { c = 319 }) |
||||
this[UnittestProto.repeatedImportMessageExtension] |
||||
.add(ImportMessage.newBuilder().setD(320).build()) |
||||
this[UnittestProto.repeatedLazyMessageExtension] |
||||
.add(TestAllTypesKt.nestedMessage { bb = 327 }) |
||||
this[UnittestProto.repeatedNestedEnumExtension].add(NestedEnum.BAZ) |
||||
this[UnittestProto.repeatedForeignEnumExtension].add(ForeignEnum.FOREIGN_BAZ) |
||||
this[UnittestProto.repeatedImportEnumExtension].add(ImportEnum.IMPORT_BAZ) |
||||
this[UnittestProto.repeatedStringPieceExtension].add("324") |
||||
this[UnittestProto.repeatedCordExtension].add("325") |
||||
this[UnittestProto.defaultInt32Extension] = 401 |
||||
this[UnittestProto.defaultInt64Extension] = 402L |
||||
this[UnittestProto.defaultUint32Extension] = 403 |
||||
this[UnittestProto.defaultUint64Extension] = 404L |
||||
this[UnittestProto.defaultSint32Extension] = 405 |
||||
this[UnittestProto.defaultSint64Extension] = 406L |
||||
this[UnittestProto.defaultFixed32Extension] = 407 |
||||
this[UnittestProto.defaultFixed64Extension] = 408L |
||||
this[UnittestProto.defaultSfixed32Extension] = 409 |
||||
this[UnittestProto.defaultSfixed64Extension] = 410L |
||||
this[UnittestProto.defaultFloatExtension] = 411F |
||||
this[UnittestProto.defaultDoubleExtension] = 412.0 |
||||
this[UnittestProto.defaultBoolExtension] = false |
||||
this[UnittestProto.defaultStringExtension] = "415" |
||||
this[UnittestProto.defaultBytesExtension] = toBytes("416") |
||||
this[UnittestProto.defaultNestedEnumExtension] = NestedEnum.FOO |
||||
this[UnittestProto.defaultForeignEnumExtension] = ForeignEnum.FOREIGN_FOO |
||||
this[UnittestProto.defaultImportEnumExtension] = ImportEnum.IMPORT_FOO |
||||
this[UnittestProto.defaultStringPieceExtension] = "424" |
||||
this[UnittestProto.defaultCordExtension] = "425" |
||||
this[UnittestProto.oneofUint32Extension] = 601 |
||||
this[UnittestProto.oneofNestedMessageExtension] = TestAllTypesKt.nestedMessage { bb = 602 } |
||||
this[UnittestProto.oneofStringExtension] = "603" |
||||
this[UnittestProto.oneofBytesExtension] = toBytes("604") |
||||
} |
||||
).isEqualTo( |
||||
TestUtil.getAllExtensionsSet() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionGetters() { |
||||
testAllExtensions { |
||||
this[UnittestProto.optionalInt32Extension] = 101 |
||||
assertThat(this[UnittestProto.optionalInt32Extension]).isEqualTo(101) |
||||
this[UnittestProto.optionalStringExtension] = "115" |
||||
assertThat(this[UnittestProto.optionalStringExtension]).isEqualTo("115") |
||||
this[UnittestProto.optionalGroupExtension] = optionalGroupExtension { a = 117 } |
||||
assertThat(this[UnittestProto.optionalGroupExtension]) |
||||
.isEqualTo(optionalGroupExtension { a = 117 }) |
||||
this[UnittestProto.optionalNestedMessageExtension] = |
||||
TestAllTypesKt.nestedMessage { bb = 118 } |
||||
assertThat(this[UnittestProto.optionalNestedMessageExtension]) |
||||
.isEqualTo(TestAllTypesKt.nestedMessage { bb = 118 }) |
||||
this[UnittestProto.optionalNestedEnumExtension] = NestedEnum.BAZ |
||||
assertThat(this[UnittestProto.optionalNestedEnumExtension]).isEqualTo(NestedEnum.BAZ) |
||||
this[UnittestProto.defaultInt32Extension] = 401 |
||||
assertThat(this[UnittestProto.defaultInt32Extension]).isEqualTo(401) |
||||
this[UnittestProto.oneofUint32Extension] = 601 |
||||
assertThat(this[UnittestProto.oneofUint32Extension]).isEqualTo(601) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionContains() { |
||||
testAllExtensions { |
||||
this[UnittestProto.optionalInt32Extension] = 101 |
||||
assertThat(contains(UnittestProto.optionalInt32Extension)).isTrue() |
||||
assertThat(contains(UnittestProto.optionalStringExtension)).isFalse() |
||||
this[UnittestProto.optionalGroupExtension] = optionalGroupExtension { a = 117 } |
||||
assertThat(contains(UnittestProto.optionalGroupExtension)).isTrue() |
||||
assertThat(contains(UnittestProto.optionalNestedMessageExtension)).isFalse() |
||||
this[UnittestProto.optionalNestedEnumExtension] = NestedEnum.BAZ |
||||
assertThat(contains(UnittestProto.optionalNestedEnumExtension)).isTrue() |
||||
assertThat(contains(UnittestProto.defaultInt32Extension)).isFalse() |
||||
this[UnittestProto.oneofUint32Extension] = 601 |
||||
assertThat(contains(UnittestProto.optionalInt32Extension)).isTrue() |
||||
} |
||||
|
||||
testAllExtensions { |
||||
assertThat(contains(UnittestProto.optionalInt32Extension)).isFalse() |
||||
this[UnittestProto.optionalStringExtension] = "115" |
||||
assertThat(contains(UnittestProto.optionalStringExtension)).isTrue() |
||||
assertThat(contains(UnittestProto.optionalGroupExtension)).isFalse() |
||||
this[UnittestProto.optionalNestedMessageExtension] = |
||||
TestAllTypesKt.nestedMessage { bb = 118 } |
||||
assertThat(contains(UnittestProto.optionalNestedMessageExtension)).isTrue() |
||||
assertThat(contains(UnittestProto.optionalNestedEnumExtension)).isFalse() |
||||
this[UnittestProto.defaultInt32Extension] = 401 |
||||
assertThat(contains(UnittestProto.defaultInt32Extension)).isTrue() |
||||
assertThat(contains(UnittestProto.oneofUint32Extension)).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testExtensionClears() { |
||||
testAllExtensions { |
||||
this[UnittestProto.optionalInt32Extension] = 101 |
||||
clear(UnittestProto.optionalInt32Extension) |
||||
assertThat(contains(UnittestProto.optionalInt32Extension)).isFalse() |
||||
|
||||
this[UnittestProto.optionalStringExtension] = "115" |
||||
clear(UnittestProto.optionalStringExtension) |
||||
assertThat(contains(UnittestProto.optionalStringExtension)).isFalse() |
||||
|
||||
this[UnittestProto.optionalGroupExtension] = optionalGroupExtension { a = 117 } |
||||
clear(UnittestProto.optionalGroupExtension) |
||||
assertThat(contains(UnittestProto.optionalGroupExtension)).isFalse() |
||||
|
||||
this[UnittestProto.optionalNestedMessageExtension] = |
||||
TestAllTypesKt.nestedMessage { bb = 118 } |
||||
clear(UnittestProto.optionalNestedMessageExtension) |
||||
assertThat(contains(UnittestProto.optionalNestedMessageExtension)).isFalse() |
||||
|
||||
this[UnittestProto.optionalNestedEnumExtension] = NestedEnum.BAZ |
||||
clear(UnittestProto.optionalNestedEnumExtension) |
||||
assertThat(contains(UnittestProto.optionalNestedEnumExtension)).isFalse() |
||||
|
||||
this[UnittestProto.defaultInt32Extension] = 401 |
||||
clear(UnittestProto.defaultInt32Extension) |
||||
assertThat(contains(UnittestProto.oneofUint32Extension)).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testEmptyMessages() { |
||||
assertThat( |
||||
testEmptyMessage {} |
||||
).isEqualTo( |
||||
TestEmptyMessage.newBuilder().build() |
||||
) |
||||
|
||||
assertThat( |
||||
testEmptyMessageWithExtensions {} |
||||
).isEqualTo( |
||||
TestEmptyMessageWithExtensions.newBuilder().build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testMapSetters() { |
||||
val intMap = testIntIntMap { m[1] = 2 } |
||||
assertThat(intMap).isEqualTo( |
||||
TestIntIntMap.newBuilder().putM(1, 2).build() |
||||
) |
||||
|
||||
assertThat( |
||||
testMaps { |
||||
mInt32[1] = intMap |
||||
mInt64[1L] = intMap |
||||
mUint32[1] = intMap |
||||
mUint64[1L] = intMap |
||||
mSint32[1] = intMap |
||||
mSint64[1L] = intMap |
||||
mFixed32[1] = intMap |
||||
mFixed64[1L] = intMap |
||||
mSfixed32[1] = intMap |
||||
mSfixed64[1] = intMap |
||||
mBool[true] = intMap |
||||
mString["1"] = intMap |
||||
} |
||||
).isEqualTo( |
||||
TestMaps.newBuilder() |
||||
.putMInt32(1, intMap) |
||||
.putMInt64(1L, intMap) |
||||
.putMUint32(1, intMap) |
||||
.putMUint64(1L, intMap) |
||||
.putMSint32(1, intMap) |
||||
.putMSint64(1L, intMap) |
||||
.putMFixed32(1, intMap) |
||||
.putMFixed64(1L, intMap) |
||||
.putMSfixed32(1, intMap) |
||||
.putMSfixed64(1L, intMap) |
||||
.putMBool(true, intMap) |
||||
.putMString("1", intMap) |
||||
.build() |
||||
) |
||||
|
||||
assertThat( |
||||
testEnumMap { |
||||
knownMapField[1] = Proto2MapEnum.PROTO2_MAP_ENUM_FOO |
||||
} |
||||
).isEqualTo( |
||||
TestEnumMap.newBuilder() |
||||
.putKnownMapField(1, Proto2MapEnum.PROTO2_MAP_ENUM_FOO) |
||||
.build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testMapGettersAndSetters() { |
||||
val intMap = |
||||
testIntIntMap { |
||||
m.put(1, 2) |
||||
assertThat(m).isEqualTo(mapOf(1 to 2)) |
||||
m[3] = 4 |
||||
assertThat(m).isEqualTo(mapOf(1 to 2, 3 to 4)) |
||||
m.putAll(mapOf(5 to 6, 7 to 8)) |
||||
assertThat(m).isEqualTo(mapOf(1 to 2, 3 to 4, 5 to 6, 7 to 8)) |
||||
} |
||||
|
||||
testMaps { |
||||
mInt32.put(1, intMap) |
||||
assertThat(mInt32).isEqualTo(mapOf(1 to intMap)) |
||||
mInt32[2] = intMap |
||||
assertThat(mInt32).isEqualTo(mapOf(1 to intMap, 2 to intMap)) |
||||
mInt32.putAll(mapOf(3 to intMap, 4 to intMap)) |
||||
assertThat(mInt32).isEqualTo(mapOf(1 to intMap, 2 to intMap, 3 to intMap, 4 to intMap)) |
||||
|
||||
mString.put("1", intMap) |
||||
assertThat(mString).isEqualTo(mapOf("1" to intMap)) |
||||
mString["2"] = intMap |
||||
assertThat(mString).isEqualTo(mapOf("1" to intMap, "2" to intMap)) |
||||
mString.putAll(mapOf("3" to intMap, "4" to intMap)) |
||||
assertThat(mString).isEqualTo( |
||||
mapOf("1" to intMap, "2" to intMap, "3" to intMap, "4" to intMap) |
||||
) |
||||
} |
||||
|
||||
testEnumMap { |
||||
knownMapField.put(1, Proto2MapEnum.PROTO2_MAP_ENUM_FOO) |
||||
assertThat(knownMapField).isEqualTo(mapOf(1 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO)) |
||||
knownMapField[2] = Proto2MapEnum.PROTO2_MAP_ENUM_BAR |
||||
assertThat(knownMapField).isEqualTo( |
||||
mapOf(1 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO, 2 to Proto2MapEnum.PROTO2_MAP_ENUM_BAR) |
||||
) |
||||
knownMapField.putAll( |
||||
mapOf(3 to Proto2MapEnum.PROTO2_MAP_ENUM_BAZ, 4 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO) |
||||
) |
||||
assertThat(knownMapField).isEqualTo( |
||||
mapOf( |
||||
1 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO, |
||||
2 to Proto2MapEnum.PROTO2_MAP_ENUM_BAR, |
||||
3 to Proto2MapEnum.PROTO2_MAP_ENUM_BAZ, |
||||
4 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO |
||||
) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testMapRemove() { |
||||
val intMap = |
||||
testIntIntMap { |
||||
m.putAll(mapOf(1 to 2, 3 to 4)) |
||||
m.remove(1) |
||||
assertThat(m).isEqualTo(mapOf(3 to 4)) |
||||
} |
||||
|
||||
testMaps { |
||||
mInt32.putAll(mapOf(1 to intMap, 2 to intMap)) |
||||
mInt32.remove(1) |
||||
assertThat(mInt32).isEqualTo(mapOf(2 to intMap)) |
||||
|
||||
mString.putAll(mapOf("1" to intMap, "2" to intMap)) |
||||
mString.remove("1") |
||||
assertThat(mString).isEqualTo(mapOf("2" to intMap)) |
||||
} |
||||
|
||||
testEnumMap { |
||||
knownMapField.putAll( |
||||
mapOf(1 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO, 2 to Proto2MapEnum.PROTO2_MAP_ENUM_BAR) |
||||
) |
||||
knownMapField.remove(1) |
||||
assertThat(knownMapField).isEqualTo(mapOf(2 to Proto2MapEnum.PROTO2_MAP_ENUM_BAR)) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testMapClear() { |
||||
val intMap = |
||||
testIntIntMap { |
||||
m.putAll(mapOf(1 to 2, 3 to 4)) |
||||
m.clear() |
||||
assertThat(m.isEmpty()).isTrue() |
||||
} |
||||
|
||||
testMaps { |
||||
mInt32.putAll(mapOf(1 to intMap, 2 to intMap)) |
||||
mInt32.clear() |
||||
assertThat(mInt32.isEmpty()).isTrue() |
||||
|
||||
mString.putAll(mapOf("1" to intMap, "2" to intMap)) |
||||
mString.clear() |
||||
assertThat(mString.isEmpty()).isTrue() |
||||
} |
||||
|
||||
testEnumMap { |
||||
knownMapField.putAll( |
||||
mapOf(1 to Proto2MapEnum.PROTO2_MAP_ENUM_FOO, 2 to Proto2MapEnum.PROTO2_MAP_ENUM_BAR) |
||||
) |
||||
knownMapField.clear() |
||||
assertThat(knownMapField.isEmpty()).isTrue() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testEvilNames() { |
||||
assertThat( |
||||
evilNamesProto2 { |
||||
initialized = true |
||||
hasFoo = true |
||||
bar = "foo" |
||||
isInitialized = true |
||||
fooBar = "foo" |
||||
aLLCAPS += "foo" |
||||
aLLCAPSMAP[1] = true |
||||
hasUnderbarPrecedingNumeric1Foo = true |
||||
hasUnderbarPrecedingNumeric42Bar = true |
||||
hasUnderbarPrecedingNumeric123Foo42BarBaz = true |
||||
extension += "foo" |
||||
class_ += 1 |
||||
int = 1.0 |
||||
long = true |
||||
boolean = 1L |
||||
sealed = "foo" |
||||
interface_ = 1F |
||||
in_ = 1 |
||||
object_ = "foo" |
||||
cachedSize_ = "foo" |
||||
serializedSize_ = true |
||||
by = "foo" |
||||
} |
||||
).isEqualTo( |
||||
EvilNamesProto2.newBuilder() |
||||
.setInitialized(true) |
||||
.setHasFoo(true) |
||||
.setBar("foo") |
||||
.setIsInitialized(true) |
||||
.setFooBar("foo") |
||||
.addALLCAPS("foo") |
||||
.putALLCAPSMAP(1, true) |
||||
.setHasUnderbarPrecedingNumeric1Foo(true) |
||||
.setHasUnderbarPrecedingNumeric42Bar(true) |
||||
.setHasUnderbarPrecedingNumeric123Foo42BarBaz(true) |
||||
.addExtension("foo") |
||||
.addClass_(1) |
||||
.setInt(1.0) |
||||
.setLong(true) |
||||
.setBoolean(1L) |
||||
.setSealed("foo") |
||||
.setInterface(1F) |
||||
.setIn(1) |
||||
.setObject("foo") |
||||
.setCachedSize_("foo") |
||||
.setSerializedSize_(true) |
||||
.setBy("foo") |
||||
.build() |
||||
) |
||||
|
||||
assertThat(interface_ {}).isEqualTo(Interface.newBuilder().build()) |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordGettersAndSetters() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
assertThat(as_).isEqualTo(1) |
||||
|
||||
in_ = "foo" |
||||
assertThat(in_).isEqualTo("foo") |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(break_).isEqualTo(HardKeywordsAllTypes.NestedEnum.FOO) |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(do_).isEqualTo(HardKeywordsAllTypesKt.nestedMessage { while_ = 1 }) |
||||
|
||||
continue_[1] = 1 |
||||
assertThat(continue_[1]).isEqualTo(1) |
||||
|
||||
else_ += 1 |
||||
assertThat(else_).isEqualTo(listOf(1)) |
||||
|
||||
for_ += "foo" |
||||
assertThat(for_).isEqualTo(listOf("foo")) |
||||
|
||||
fun_ += HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(fun_).isEqualTo(listOf(HardKeywordsAllTypes.NestedEnum.FOO)) |
||||
|
||||
if_ += HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(if_).isEqualTo(listOf(HardKeywordsAllTypesKt.nestedMessage { while_ = 1 })) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordHazzers() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
assertThat(hasAs_()).isTrue() |
||||
|
||||
in_ = "foo" |
||||
assertThat(hasIn_()).isTrue() |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(hasBreak_()).isTrue() |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(hasDo_()).isTrue() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordClears() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
clearAs_() |
||||
assertThat(hasAs_()).isFalse() |
||||
|
||||
in_ = "foo" |
||||
clearIn_() |
||||
assertThat(hasIn_()).isFalse() |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
clearBreak_() |
||||
assertThat(hasBreak_()).isFalse() |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
clearDo_() |
||||
assertThat(hasDo_()).isFalse() |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,340 @@ |
||||
package com.google.protobuf.kotlin |
||||
|
||||
import com.google.common.truth.Truth.assertThat |
||||
import evil_names_proto3.EvilNamesProto3OuterClass.EvilNamesProto3 |
||||
import evil_names_proto3.EvilNamesProto3OuterClass.HardKeywordsAllTypes |
||||
import evil_names_proto3.EvilNamesProto3OuterClass.Class |
||||
import evil_names_proto3.HardKeywordsAllTypesKt |
||||
import evil_names_proto3.class_ |
||||
import evil_names_proto3.evilNamesProto3 |
||||
import evil_names_proto3.hardKeywordsAllTypes |
||||
import multiple_files_proto3.MultipleFilesMessageA |
||||
import multiple_files_proto3.MultipleFilesMessageB |
||||
import multiple_files_proto3.multipleFilesMessageA |
||||
import multiple_files_proto3.multipleFilesMessageB |
||||
import proto3_unittest.UnittestProto3 |
||||
import proto3_unittest.TestAllTypesKt |
||||
import proto3_unittest.TestAllTypesKt.nestedMessage |
||||
import proto3_unittest.UnittestProto3.TestAllTypes |
||||
import proto3_unittest.UnittestProto3.TestAllTypes.NestedEnum |
||||
import proto3_unittest.UnittestProto3.TestEmptyMessage |
||||
import proto3_unittest.copy |
||||
import proto3_unittest.testAllTypes |
||||
import proto3_unittest.testEmptyMessage |
||||
import org.junit.Test |
||||
import org.junit.runner.RunWith |
||||
import org.junit.runners.JUnit4 |
||||
|
||||
@RunWith(JUnit4::class) |
||||
class Proto3Test { |
||||
@Test |
||||
fun testGettersAndSetters() { |
||||
testAllTypes { |
||||
optionalInt32 = 101 |
||||
assertThat(optionalInt32).isEqualTo(101) |
||||
optionalString = "115" |
||||
assertThat(optionalString).isEqualTo("115") |
||||
optionalNestedMessage = TestAllTypesKt.nestedMessage { bb = 118 } |
||||
assertThat(optionalNestedMessage).isEqualTo(TestAllTypesKt.nestedMessage { bb = 118 }) |
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
assertThat(optionalNestedEnum).isEqualTo(NestedEnum.BAZ) |
||||
oneofUint32 = 601 |
||||
assertThat(oneofUint32).isEqualTo(601) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testRepeatedGettersAndSetters() { |
||||
testAllTypes { |
||||
repeatedInt32.addAll(listOf(1, 2)) |
||||
assertThat(repeatedInt32).isEqualTo(listOf(1, 2)) |
||||
repeatedInt32 += listOf(3, 4) |
||||
assertThat(repeatedInt32).isEqualTo(listOf(1, 2, 3, 4)) |
||||
repeatedInt32[0] = 5 |
||||
assertThat(repeatedInt32).isEqualTo(listOf(5, 2, 3, 4)) |
||||
|
||||
repeatedString.addAll(listOf("1", "2")) |
||||
assertThat(repeatedString).isEqualTo(listOf("1", "2")) |
||||
repeatedString += listOf("3", "4") |
||||
assertThat(repeatedString).isEqualTo(listOf("1", "2", "3", "4")) |
||||
repeatedString[0] = "5" |
||||
assertThat(repeatedString).isEqualTo(listOf("5", "2", "3", "4")) |
||||
|
||||
repeatedNestedMessage.addAll(listOf(nestedMessage { bb = 1 }, nestedMessage { bb = 2 })) |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 } |
||||
) |
||||
) |
||||
repeatedNestedMessage += listOf(nestedMessage { bb = 3 }, nestedMessage { bb = 4 }) |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 1 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
repeatedNestedMessage[0] = nestedMessage { bb = 5 } |
||||
assertThat(repeatedNestedMessage).isEqualTo( |
||||
listOf( |
||||
nestedMessage { bb = 5 }, |
||||
nestedMessage { bb = 2 }, |
||||
nestedMessage { bb = 3 }, |
||||
nestedMessage { bb = 4 } |
||||
) |
||||
) |
||||
|
||||
repeatedNestedEnum.addAll(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
assertThat(repeatedNestedEnum).isEqualTo(listOf(NestedEnum.FOO, NestedEnum.BAR)) |
||||
repeatedNestedEnum += listOf(NestedEnum.BAZ, NestedEnum.FOO) |
||||
assertThat(repeatedNestedEnum).isEqualTo( |
||||
listOf(NestedEnum.FOO, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
repeatedNestedEnum[0] = NestedEnum.BAR |
||||
assertThat(repeatedNestedEnum).isEqualTo( |
||||
listOf(NestedEnum.BAR, NestedEnum.BAR, NestedEnum.BAZ, NestedEnum.FOO) |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testClears() { |
||||
assertThat( |
||||
testAllTypes { |
||||
optionalInt32 = 101 |
||||
clearOptionalInt32() |
||||
|
||||
optionalString = "115" |
||||
clearOptionalString() |
||||
|
||||
optionalNestedMessage = TestAllTypesKt.nestedMessage { bb = 118 } |
||||
clearOptionalNestedMessage() |
||||
|
||||
optionalNestedEnum = NestedEnum.BAZ |
||||
clearOptionalNestedEnum() |
||||
|
||||
oneofUint32 = 601 |
||||
clearOneofUint32() |
||||
} |
||||
).isEqualTo( |
||||
TestAllTypes.newBuilder().build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testCopy() { |
||||
val message = testAllTypes { |
||||
optionalInt32 = 101 |
||||
optionalString = "115" |
||||
} |
||||
val modifiedMessage = message.copy { |
||||
optionalInt32 = 201 |
||||
} |
||||
|
||||
assertThat(message).isEqualTo( |
||||
TestAllTypes.newBuilder() |
||||
.setOptionalInt32(101) |
||||
.setOptionalString("115") |
||||
.build() |
||||
) |
||||
assertThat(modifiedMessage).isEqualTo( |
||||
TestAllTypes.newBuilder() |
||||
.setOptionalInt32(201) |
||||
.setOptionalString("115") |
||||
.build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testOneof() { |
||||
val message = testAllTypes { |
||||
oneofString = "foo" |
||||
assertThat(oneofFieldCase) |
||||
.isEqualTo(TestAllTypes.OneofFieldCase.ONEOF_STRING) |
||||
assertThat(oneofString).isEqualTo("foo") |
||||
clearOneofField() |
||||
assertThat(oneofFieldCase) |
||||
.isEqualTo(TestAllTypes.OneofFieldCase.ONEOFFIELD_NOT_SET) |
||||
oneofUint32 = 5 |
||||
} |
||||
|
||||
assertThat(message.getOneofFieldCase()) |
||||
.isEqualTo(TestAllTypes.OneofFieldCase.ONEOF_UINT32) |
||||
assertThat(message.getOneofUint32()).isEqualTo(5) |
||||
} |
||||
|
||||
@Test |
||||
fun testEmptyMessages() { |
||||
assertThat( |
||||
testEmptyMessage {} |
||||
).isEqualTo( |
||||
TestEmptyMessage.newBuilder().build() |
||||
) |
||||
} |
||||
|
||||
@Test |
||||
fun testEvilNames() { |
||||
assertThat( |
||||
evilNamesProto3 { |
||||
initialized = true |
||||
hasFoo = true |
||||
bar = "foo" |
||||
isInitialized = true |
||||
fooBar = "foo" |
||||
aLLCAPS += "foo" |
||||
aLLCAPSMAP[1] = true |
||||
hasUnderbarPrecedingNumeric1Foo = true |
||||
hasUnderbarPrecedingNumeric42Bar = true |
||||
hasUnderbarPrecedingNumeric123Foo42BarBaz = true |
||||
extension += "foo" |
||||
class_ = "foo" |
||||
int = 1.0 |
||||
long = true |
||||
boolean = 1L |
||||
sealed = "foo" |
||||
interface_ = 1F |
||||
in_ = 1 |
||||
object_ = "foo" |
||||
cachedSize_ = "foo" |
||||
serializedSize_ = true |
||||
value = "foo" |
||||
index = 1L |
||||
values += "foo" |
||||
newValues += "foo" |
||||
builder = true |
||||
k[1] = 1 |
||||
v["foo"] = "foo" |
||||
key["foo"] = 1 |
||||
map[1] = "foo" |
||||
pairs["foo"] = 1 |
||||
LeadingUnderscore = "foo" |
||||
option = 1 |
||||
} |
||||
).isEqualTo( |
||||
EvilNamesProto3.newBuilder() |
||||
.setInitialized(true) |
||||
.setHasFoo(true) |
||||
.setBar("foo") |
||||
.setIsInitialized(true) |
||||
.setFooBar("foo") |
||||
.addALLCAPS("foo") |
||||
.putALLCAPSMAP(1, true) |
||||
.setHasUnderbarPrecedingNumeric1Foo(true) |
||||
.setHasUnderbarPrecedingNumeric42Bar(true) |
||||
.setHasUnderbarPrecedingNumeric123Foo42BarBaz(true) |
||||
.addExtension("foo") |
||||
.setClass_("foo") |
||||
.setInt(1.0) |
||||
.setLong(true) |
||||
.setBoolean(1L) |
||||
.setSealed("foo") |
||||
.setInterface(1F) |
||||
.setIn(1) |
||||
.setObject("foo") |
||||
.setCachedSize_("foo") |
||||
.setSerializedSize_(true) |
||||
.setValue("foo") |
||||
.setIndex(1L) |
||||
.addValues("foo") |
||||
.addNewValues("foo") |
||||
.setBuilder(true) |
||||
.putK(1, 1) |
||||
.putV("foo", "foo") |
||||
.putKey("foo", 1) |
||||
.putMap(1, "foo") |
||||
.putPairs("foo", 1) |
||||
.setLeadingUnderscore("foo") |
||||
.setOption(1) |
||||
.build() |
||||
) |
||||
|
||||
assertThat(class_ {}).isEqualTo(Class.newBuilder().build()) |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordGettersAndSetters() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
assertThat(as_).isEqualTo(1) |
||||
|
||||
in_ = "foo" |
||||
assertThat(in_).isEqualTo("foo") |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(break_).isEqualTo(HardKeywordsAllTypes.NestedEnum.FOO) |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(do_).isEqualTo(HardKeywordsAllTypesKt.nestedMessage { while_ = 1 }) |
||||
|
||||
continue_[1] = 1 |
||||
assertThat(continue_[1]).isEqualTo(1) |
||||
|
||||
else_ += 1 |
||||
assertThat(else_).isEqualTo(listOf(1)) |
||||
|
||||
for_ += "foo" |
||||
assertThat(for_).isEqualTo(listOf("foo")) |
||||
|
||||
fun_ += HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(fun_).isEqualTo(listOf(HardKeywordsAllTypes.NestedEnum.FOO)) |
||||
|
||||
if_ += HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(if_).isEqualTo(listOf(HardKeywordsAllTypesKt.nestedMessage { while_ = 1 })) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordHazzers() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
assertThat(hasAs_()).isTrue() |
||||
|
||||
in_ = "foo" |
||||
assertThat(hasIn_()).isTrue() |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
assertThat(hasBreak_()).isTrue() |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
assertThat(hasDo_()).isTrue() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testHardKeywordClears() { |
||||
hardKeywordsAllTypes { |
||||
as_ = 1 |
||||
clearAs_() |
||||
assertThat(hasAs_()).isFalse() |
||||
|
||||
in_ = "foo" |
||||
clearIn_() |
||||
assertThat(hasIn_()).isFalse() |
||||
|
||||
break_ = HardKeywordsAllTypes.NestedEnum.FOO |
||||
clearBreak_() |
||||
assertThat(hasBreak_()).isFalse() |
||||
|
||||
do_ = HardKeywordsAllTypesKt.nestedMessage { while_ = 1 } |
||||
clearDo_() |
||||
assertThat(hasDo_()).isFalse() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun testMultipleFiles() { |
||||
assertThat( |
||||
multipleFilesMessageA {} |
||||
).isEqualTo( |
||||
MultipleFilesMessageA.newBuilder().build() |
||||
) |
||||
|
||||
assertThat( |
||||
multipleFilesMessageB {} |
||||
).isEqualTo( |
||||
MultipleFilesMessageB.newBuilder().build() |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,62 @@ |
||||
syntax = "proto2"; |
||||
|
||||
package evil_names_proto2; |
||||
|
||||
option java_package = "evil_names_proto2"; |
||||
|
||||
message EvilNamesProto2 { |
||||
optional bool initialized = 1; |
||||
optional bool has_foo = 2; |
||||
optional string Bar = 3; |
||||
optional bool is_initialized = 4; |
||||
|
||||
oneof camelCase { |
||||
string fooBar = 5; |
||||
} |
||||
|
||||
repeated string ALL_CAPS = 7; |
||||
map<int32, bool> ALL_CAPS_MAP = 8; |
||||
|
||||
optional bool has_underbar_preceding_numeric_1foo = 9; |
||||
optional bool has_underbar_preceding_numeric_42bar = 13; |
||||
optional bool has_underbar_preceding_numeric_123foo42bar_baz = 14; |
||||
|
||||
extensions 100 to max; |
||||
|
||||
repeated string extension = 12; |
||||
repeated int32 class = 15; |
||||
optional double int = 16; |
||||
optional bool long = 17; |
||||
optional int64 boolean = 18; |
||||
optional string sealed = 19; |
||||
optional float interface = 20; |
||||
optional int32 in = 21; |
||||
optional string object = 22; |
||||
optional string cached_size = 23; |
||||
optional bool serialized_size = 24; |
||||
optional string by = 25; |
||||
} |
||||
|
||||
message HardKeywordsAllTypes { |
||||
message NestedMessage { |
||||
optional int32 while = 1; |
||||
} |
||||
|
||||
enum NestedEnum { |
||||
FOO = 1; |
||||
BAR = 2; |
||||
} |
||||
|
||||
optional int32 as = 1; |
||||
optional string in = 2; |
||||
optional NestedEnum break = 3; |
||||
map<int32, int32> continue = 4; |
||||
optional NestedMessage do = 5; |
||||
|
||||
repeated int32 else = 6; |
||||
repeated string for = 7; |
||||
repeated NestedEnum fun = 8; |
||||
repeated NestedMessage if = 9; |
||||
} |
||||
|
||||
message Interface {} |
@ -0,0 +1,76 @@ |
||||
syntax = "proto3"; |
||||
|
||||
package evil_names_proto3; |
||||
|
||||
option java_package = "evil_names_proto3"; |
||||
|
||||
message EvilNamesProto3 { |
||||
bool initialized = 1; |
||||
bool has_foo = 2; |
||||
string Bar = 3; |
||||
bool is_initialized = 4; |
||||
|
||||
oneof camelCase { |
||||
string fooBar = 5; |
||||
} |
||||
|
||||
repeated string ALL_CAPS = 7; |
||||
map<int32, bool> ALL_CAPS_MAP = 8; |
||||
|
||||
bool has_underbar_preceding_numeric_1foo = 9; |
||||
bool has_underbar_preceding_numeric_42bar = 10; |
||||
bool has_underbar_preceding_numeric_123foo42bar_baz = 11; |
||||
|
||||
repeated string extension = 12; |
||||
|
||||
string class = 13; |
||||
double int = 14; |
||||
bool long = 15; |
||||
int64 boolean = 16; |
||||
string sealed = 17; |
||||
float interface = 18; |
||||
int32 in = 19; |
||||
string object = 20; |
||||
string cached_size = 21; |
||||
bool serialized_size = 22; |
||||
string value = 23; |
||||
int64 index = 24; |
||||
repeated string values = 25; |
||||
repeated string new_values = 26; |
||||
bool builder = 27; |
||||
map<int32, int32> k = 28; |
||||
map<string, string> v = 29; |
||||
map<string, int32> key = 30; |
||||
map<int32, string> map = 31; |
||||
map<string, int32> pairs = 32; |
||||
|
||||
string _leading_underscore = 33; |
||||
oneof _leading_underscore_oneof { |
||||
int32 option = 34; |
||||
} |
||||
} |
||||
|
||||
message HardKeywordsAllTypes { |
||||
message NestedMessage { |
||||
optional int32 while = 1; |
||||
} |
||||
|
||||
enum NestedEnum { |
||||
ZERO = 0; |
||||
FOO = 1; |
||||
BAR = 2; |
||||
} |
||||
|
||||
optional int32 as = 1; |
||||
optional string in = 2; |
||||
optional NestedEnum break = 3; |
||||
map<int32, int32> continue = 4; |
||||
optional NestedMessage do = 5; |
||||
|
||||
repeated int32 else = 6; |
||||
repeated string for = 7; |
||||
repeated NestedEnum fun = 8; |
||||
repeated NestedMessage if = 9; |
||||
} |
||||
|
||||
message Class {} |
@ -0,0 +1,16 @@ |
||||
syntax = "proto2"; |
||||
|
||||
package example_extensible_message; |
||||
|
||||
option java_package = "example_extensible_message"; |
||||
option java_multiple_files = true; |
||||
|
||||
message ExampleExtensibleMessage { |
||||
extensions 10 to 20; |
||||
} |
||||
|
||||
extend ExampleExtensibleMessage { |
||||
repeated int32 repeated_extension = 10; |
||||
repeated int32 different_extension = 11; |
||||
optional int32 int32_extension = 12; |
||||
} |
@ -0,0 +1,12 @@ |
||||
syntax = "proto3"; |
||||
|
||||
package multiple_files_proto3; |
||||
|
||||
option java_package = "multiple_files_proto3"; |
||||
option java_multiple_files = true; |
||||
|
||||
enum NestedEnum { FOO = 0; } |
||||
|
||||
message MultipleFilesMessageA {} |
||||
|
||||
message MultipleFilesMessageB {} |
@ -0,0 +1,130 @@ |
||||
#include <google/protobuf/compiler/java/java_kotlin_generator.h> |
||||
|
||||
#include <memory> |
||||
|
||||
#include <google/protobuf/compiler/java/java_file.h> |
||||
#include <google/protobuf/compiler/java/java_helpers.h> |
||||
#include <google/protobuf/compiler/java/java_options.h> |
||||
|
||||
#include <google/protobuf/stubs/strutil.h> |
||||
|
||||
namespace google { |
||||
namespace protobuf { |
||||
namespace compiler { |
||||
namespace java { |
||||
|
||||
KotlinGenerator::KotlinGenerator() {} |
||||
KotlinGenerator::~KotlinGenerator() {} |
||||
|
||||
uint64_t KotlinGenerator::GetSupportedFeatures() const { |
||||
return CodeGenerator::Feature::FEATURE_PROTO3_OPTIONAL; |
||||
} |
||||
|
||||
bool KotlinGenerator::Generate(const FileDescriptor* file, |
||||
const std::string& parameter, |
||||
GeneratorContext* context, |
||||
std::string* error) const { |
||||
// -----------------------------------------------------------------
|
||||
// parse generator options
|
||||
|
||||
std::vector<std::pair<std::string, std::string> > options; |
||||
ParseGeneratorParameter(parameter, &options); |
||||
Options file_options; |
||||
|
||||
for (auto& option : options) { |
||||
if (option.first == "output_list_file") { |
||||
file_options.output_list_file = option.second; |
||||
} else if (option.first == "immutable") { |
||||
file_options.generate_immutable_code = true; |
||||
} else if (option.first == "mutable") { |
||||
*error = "Mutable not supported by Kotlin generator"; |
||||
return false; |
||||
} else if (option.first == "shared") { |
||||
file_options.generate_shared_code = true; |
||||
} else if (option.first == "lite") { |
||||
file_options.enforce_lite = true; |
||||
} else if (option.first == "annotate_code") { |
||||
file_options.annotate_code = true; |
||||
} else if (option.first == "annotation_list_file") { |
||||
file_options.annotation_list_file = option.second; |
||||
} else { |
||||
*error = "Unknown generator option: " + option.first; |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
// By default we generate immutable code and shared code for immutable API.
|
||||
if (!file_options.generate_immutable_code && |
||||
!file_options.generate_shared_code) { |
||||
file_options.generate_immutable_code = true; |
||||
file_options.generate_shared_code = true; |
||||
} |
||||
|
||||
std::vector<std::string> all_files; |
||||
std::vector<std::string> all_annotations; |
||||
|
||||
std::unique_ptr<FileGenerator> file_generator(new FileGenerator(file, file_options, /* immutable_api = */ true)); |
||||
|
||||
if (!file_generator->Validate(error)) { |
||||
return false; |
||||
} |
||||
|
||||
auto open_file = [context](const string& filename) { |
||||
return std::unique_ptr<io::ZeroCopyOutputStream>(context->Open(filename)); |
||||
}; |
||||
std::string package_dir = JavaPackageToDir(file_generator->java_package()); |
||||
std::string kotlin_filename = package_dir; |
||||
kotlin_filename += file_generator->GetKotlinClassname(); |
||||
kotlin_filename += ".kt"; |
||||
all_files.push_back(kotlin_filename); |
||||
std::string info_full_path = kotlin_filename + ".pb.meta"; |
||||
if (file_options.annotate_code) { |
||||
all_annotations.push_back(info_full_path); |
||||
} |
||||
|
||||
// Generate main kotlin file.
|
||||
auto output = open_file(kotlin_filename); |
||||
GeneratedCodeInfo annotations; |
||||
io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector( |
||||
&annotations); |
||||
io::Printer printer( |
||||
output.get(), '$', |
||||
file_options.annotate_code ? &annotation_collector : nullptr); |
||||
|
||||
file_generator->GenerateKotlinSiblings(package_dir, context, &all_files, |
||||
&all_annotations); |
||||
|
||||
if (file_options.annotate_code) { |
||||
auto info_output = open_file(info_full_path); |
||||
annotations.SerializeToZeroCopyStream(info_output.get()); |
||||
} |
||||
|
||||
// Generate output list if requested.
|
||||
if (!file_options.output_list_file.empty()) { |
||||
// Generate output list. This is just a simple text file placed in a
|
||||
// deterministic location which lists the .kt files being generated.
|
||||
auto srclist_raw_output = open_file(file_options.output_list_file); |
||||
io::Printer srclist_printer(srclist_raw_output.get(), '$'); |
||||
for (auto& all_file : all_files) { |
||||
srclist_printer.Print("$filename$\n", "filename", all_file); |
||||
} |
||||
} |
||||
|
||||
if (!file_options.annotation_list_file.empty()) { |
||||
// Generate output list. This is just a simple text file placed in a
|
||||
// deterministic location which lists the .kt files being generated.
|
||||
auto annotation_list_raw_output = |
||||
open_file(file_options.annotation_list_file); |
||||
io::Printer annotation_list_printer(annotation_list_raw_output.get(), '$'); |
||||
for (auto& all_annotation : all_annotations) { |
||||
annotation_list_printer.Print("$filename$\n", "filename", all_annotation); |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
} // namespace java
|
||||
} // namespace compiler
|
||||
} //namespace protobuf
|
||||
} // namespace google
|
@ -0,0 +1,40 @@ |
||||
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_KOTLIN_GENERATOR_H_ |
||||
#define GOOGLE_PROTOBUF_COMPILER_JAVA_KOTLIN_GENERATOR_H_ |
||||
|
||||
#include <string> |
||||
#include <google/protobuf/compiler/code_generator.h> |
||||
|
||||
#include <google/protobuf/port_def.inc> |
||||
|
||||
namespace google { |
||||
namespace protobuf { |
||||
namespace compiler { |
||||
namespace java { |
||||
|
||||
// CodeGenerator implementation which generates Kotlin code. If you create your
|
||||
// own protocol compiler binary and you want it to support Kotlin output, you
|
||||
// can do so by registering an instance of this CodeGenerator with the
|
||||
// CommandLineInterface in your main() function.
|
||||
class PROTOC_EXPORT KotlinGenerator : public CodeGenerator { |
||||
public: |
||||
KotlinGenerator(); |
||||
~KotlinGenerator() override; |
||||
|
||||
// implements CodeGenerator ----------------------------------------
|
||||
bool Generate(const FileDescriptor* file, const std::string& parameter, |
||||
GeneratorContext* context, std::string* error) const override; |
||||
|
||||
uint64_t GetSupportedFeatures() const override; |
||||
|
||||
private: |
||||
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(KotlinGenerator); |
||||
}; |
||||
|
||||
} // namespace java
|
||||
} // namespace compiler
|
||||
} // namespace protobuf
|
||||
} // namespace google
|
||||
|
||||
#include <google/protobuf/port_undef.inc> |
||||
|
||||
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_KOTLIN_GENERATOR_H_
|
Loading…
Reference in new issue