diff --git a/context-tests/src/test/kotlin/io/spine/tools/validation/AssumedRequiredIdSpec.kt b/context-tests/src/test/kotlin/io/spine/tools/validation/AssumedRequiredIdSpec.kt
new file mode 100644
index 0000000000..478865aa3b
--- /dev/null
+++ b/context-tests/src/test/kotlin/io/spine/tools/validation/AssumedRequiredIdSpec.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.validation
+
+import com.google.protobuf.Descriptors.Descriptor
+import io.kotest.matchers.string.shouldNotContain
+import io.spine.logging.testing.ConsoleTap
+import io.spine.logging.testing.tapConsole
+import io.spine.testing.compiler.PipelineSetup
+import io.spine.testing.compiler.acceptingOnly
+import io.spine.testing.compiler.pipelineParams
+import io.spine.testing.compiler.withRequestFile
+import io.spine.testing.compiler.withSettingsDir
+import io.spine.tools.code.SourceSetName
+import io.spine.tools.compiler.params.WorkingDirectory
+import io.spine.tools.compiler.protobuf.field
+import io.spine.tools.validation.given.EntityWithInt32Id
+import java.nio.file.Path
+import kotlin.io.path.createDirectories
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.io.TempDir
+
+@DisplayName("Assumed `(required)` entity IDs should")
+internal class AssumedRequiredIdSpec {
+
+ @TempDir
+ lateinit var workingDir: Path
+
+ @Test
+ fun `not emit a warning for an int32 field`() {
+ val descriptor = EntityWithInt32Id.getDescriptor()
+ val output = compile(descriptor)
+ val field = descriptor.field("id")
+
+ output shouldNotContain field.fullName
+ output shouldNotContain "should not be declared as `(required)`"
+ output shouldNotContain "assumed to be required"
+ }
+
+ private fun compile(descriptor: Descriptor): String {
+ val wd = WorkingDirectory(workingDir)
+ val outputDir = workingDir.resolve("output")
+ outputDir.createDirectories()
+ val params = pipelineParams {
+ withRequestFile(wd.requestDirectory.file(SourceSetName("testFixtures")))
+ withSettingsDir(wd.settingsDirectory.path)
+ }
+ val setup = PipelineSetup.byResources(
+ params,
+ plugins = listOf(object : ValidationPlugin() {}),
+ outputRoot = outputDir,
+ descriptorFilter = acceptingOnly(descriptor)
+ ) {}
+ val pipeline = setup.createPipeline()
+ return tapConsole {
+ pipeline()
+ }
+ }
+
+ companion object {
+
+ @JvmStatic
+ @BeforeAll
+ fun installConsoleTap() {
+ ConsoleTap.install()
+ }
+ }
+}
diff --git a/context-tests/src/testFixtures/proto/spine/validation/assumed_required_id_spec.proto b/context-tests/src/testFixtures/proto/spine/validation/assumed_required_id_spec.proto
new file mode 100644
index 0000000000..c574431880
--- /dev/null
+++ b/context-tests/src/testFixtures/proto/spine/validation/assumed_required_id_spec.proto
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+syntax = "proto3";
+
+package spine.validation.stubs;
+
+import "spine/options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.tools.validation.given";
+option java_outer_classname = "AssumedRequiredIdSpecProto";
+option java_multiple_files = true;
+
+message EntityWithInt32Id {
+ option (entity).kind = ENTITY;
+
+ int32 id = 1;
+}
diff --git a/docs/content/docs/validation/developer/build-and-release.md b/docs/content/docs/validation/developer/build-and-release.md
index 6ef2ecc511..dc0ca90609 100644
--- a/docs/content/docs/validation/developer/build-and-release.md
+++ b/docs/content/docs/validation/developer/build-and-release.md
@@ -47,7 +47,7 @@ through Gradle's `extra` properties:
end="val validationVersion">
```kotlin
-val validationVersion by extra("2.0.0-SNAPSHOT.420")
+val validationVersion by extra("2.0.0-SNAPSHOT.421")
```
The root build script applies this file under `allprojects { … }` and assigns
diff --git a/docs/content/docs/validation/user/01-getting-started/adding-to-build.md b/docs/content/docs/validation/user/01-getting-started/adding-to-build.md
index d5bf9d49fc..ab88f3805d 100644
--- a/docs/content/docs/validation/user/01-getting-started/adding-to-build.md
+++ b/docs/content/docs/validation/user/01-getting-started/adding-to-build.md
@@ -90,7 +90,7 @@ Add the Validation plugin to the build.
```kotlin
plugins {
module
- id("io.spine.validation") version "2.0.0-SNAPSHOT.420"
+ id("io.spine.validation") version "2.0.0-SNAPSHOT.421"
}
```
diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md
index 041de692fe..ff071b1499 100644
--- a/docs/dependencies/dependencies.md
+++ b/docs/dependencies/dependencies.md
@@ -1,6 +1,6 @@
-# Dependencies of `io.spine.tools:validation-context:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-context:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -1097,7 +1097,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-context-tests:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-context-tests:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -1798,7 +1798,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-docs:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-docs:2.0.0-SNAPSHOT.421`
## Runtime
## Compile, tests, and tooling
@@ -1812,7 +1812,7 @@ This report was generated on **Wed May 13 20:09:04 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-gradle-plugin:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-gradle-plugin:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -2871,7 +2871,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-java:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-java:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -3968,7 +3968,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-java-bundle:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-java-bundle:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
@@ -4022,7 +4022,7 @@ This report was generated on **Wed May 13 20:44:35 WEST 2026** using
-# Dependencies of `io.spine:spine-validation-jvm-runtime:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine:spine-validation-jvm-runtime:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -4829,7 +4829,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-consumer:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-consumer:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -5518,7 +5518,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-consumer-dependency:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-consumer-dependency:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -5983,7 +5983,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-extensions:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-extensions:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -6609,7 +6609,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-runtime:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-runtime:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -7177,7 +7177,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-validating:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-validating:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -7788,7 +7788,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-validator:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-validator:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -8533,7 +8533,7 @@ This report was generated on **Wed May 13 20:44:36 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-validator-dependency:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-validator-dependency:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -8773,7 +8773,7 @@ This report was generated on **Wed May 13 20:44:35 WEST 2026** using
-# Dependencies of `io.spine.tools:validation-vanilla:2.0.0-SNAPSHOT.420`
+# Dependencies of `io.spine.tools:validation-vanilla:2.0.0-SNAPSHOT.421`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml
index c57129ad5c..133b9969ac 100644
--- a/docs/dependencies/pom.xml
+++ b/docs/dependencies/pom.xml
@@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject.
-->
io.spine.tools
validation
-2.0.0-SNAPSHOT.420
+2.0.0-SNAPSHOT.421
2015
diff --git a/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/RequiredGenerator.kt b/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/RequiredGenerator.kt
index 6e80f8a85f..91700e70c3 100644
--- a/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/RequiredGenerator.kt
+++ b/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/RequiredGenerator.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -48,8 +48,9 @@ import io.spine.tools.validation.java.generate.SingleOptionCode
import io.spine.tools.validation.java.generate.ValidateScope.parentName
import io.spine.tools.validation.java.generate.ValidateScope.parentPath
import io.spine.tools.validation.java.generate.ValidateScope.violations
-import io.spine.tools.validation.option.IF_MISSING
+import io.spine.tools.validation.option.required.RequiredFieldSupport.isSupported
import io.spine.validation.ConstraintViolation
+import io.spine.tools.validation.option.IF_MISSING
import io.spine.validation.ErrorPlaceholder
import io.spine.validation.ErrorPlaceholder.FIELD_PATH
import io.spine.validation.ErrorPlaceholder.FIELD_TYPE
@@ -71,6 +72,7 @@ internal class RequiredGenerator : OptionGeneratorWithConverter() {
override fun codeFor(type: TypeName): List =
allRequiredFields
.filter { it.id.type == type }
+ .filter { it.subject.type.isSupported() }
.map { GenerateRequired(it, converter).code() }
}
diff --git a/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/bound/BoundedFieldGenerator.kt b/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/bound/BoundedFieldGenerator.kt
index e630732e1c..d6f2caa6d7 100644
--- a/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/bound/BoundedFieldGenerator.kt
+++ b/java/src/main/kotlin/io/spine/tools/validation/java/generate/option/bound/BoundedFieldGenerator.kt
@@ -26,6 +26,7 @@
package io.spine.tools.validation.java.generate.option.bound
+import io.spine.annotation.VisibleForTesting
import io.spine.base.FieldPath
import io.spine.string.camelCase
import io.spine.tools.compiler.Compilation
@@ -69,6 +70,7 @@ import io.spine.tools.validation.java.generate.option.bound.Docs.UNSIGNED_API
import io.spine.type.TypeName
import io.spine.validation.ConstraintViolation
import io.spine.validation.ErrorPlaceholder
+import java.util.concurrent.ConcurrentHashMap
/**
* An abstract base for field generators that restrict the range of numeric fields.
@@ -120,11 +122,9 @@ internal abstract class BoundedFieldGenerator(
* of [ConstraintViolation] and adds it to the [violations] list.
*/
private fun checkWithinBounds(value: Expression): CodeBlock {
- // TODO:2025-05-12:yevhenii.nadtochii: Enable reporting back when we decide upon the format.
- // Issue: https://github.com/SpineEventEngine/validation/issues/227.
- // if (boundPrimitive in listOf(UINT32_VALUE, UINT64_VALUE)) {
- // unsignedIntegerWarning(view.file, field.span)
- // }
+ if (boundPrimitive in listOf(UINT32_VALUE, UINT64_VALUE)) {
+ unsignedIntegerWarning(view.file, field.span)
+ }
return CodeBlock(
"""
if (${isOutOfBounds(value)}) {
@@ -217,15 +217,16 @@ internal abstract class BoundedFieldGenerator(
}
}
-@Suppress("unused") // https://github.com/SpineEventEngine/validation/issues/227
private fun unsignedIntegerWarning(file: File, span: Span) =
- Compilation.warning(file, span) {
- "Unsigned integer types are not supported in Java. The Protobuf compiler uses" +
- " signed integers to represent unsigned types in Java ($SCALAR_TYPES)." +
- " Operations on unsigned values rely on static utility methods from" +
- " `$IntegerClass` and `$LongClass` classes ($UNSIGNED_API). Be cautious" +
- " when dealing with unsigned values outside of these methods, as Java" +
- " treats all primitive integers as signed."
+ UnsignedIntegerWarnings.report(file, span) {
+ Compilation.warning(file, span) {
+ "Unsigned integer types are not supported in Java. The Protobuf compiler uses" +
+ " signed integers to represent unsigned types in Java ($SCALAR_TYPES)." +
+ " Operations on unsigned values rely on static utility methods from" +
+ " `$IntegerClass` and `$LongClass` classes ($UNSIGNED_API). Be cautious" +
+ " when dealing with unsigned values outside of these methods, as Java" +
+ " treats all primitive integers as signed."
+ }
}
@Suppress("MaxLineLength") // Long links.
@@ -234,3 +235,29 @@ private object Docs {
const val UNSIGNED_API =
"https://www.baeldung.com/java-unsigned-arithmetic#the-unsigned-integer-api"
}
+
+/**
+ * Reports unsigned-integer warnings once per source location.
+ */
+internal object UnsignedIntegerWarnings {
+
+ private val reported = ConcurrentHashMap.newKeySet()
+
+ fun report(file: File, span: Span, warning: () -> Unit) {
+ report(key(file, span), warning)
+ }
+
+ @VisibleForTesting
+ fun report(key: String, warning: () -> Unit) {
+ if (reported.add(key)) {
+ warning()
+ }
+ }
+
+ @VisibleForTesting
+ fun clear() {
+ reported.clear()
+ }
+
+ private fun key(file: File, span: Span): String = "$file:$span"
+}
diff --git a/java/src/test/kotlin/io/spine/tools/validation/java/generate/option/bound/UnsignedIntegerWarningsSpec.kt b/java/src/test/kotlin/io/spine/tools/validation/java/generate/option/bound/UnsignedIntegerWarningsSpec.kt
new file mode 100644
index 0000000000..1c3251ddcb
--- /dev/null
+++ b/java/src/test/kotlin/io/spine/tools/validation/java/generate/option/bound/UnsignedIntegerWarningsSpec.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.validation.java.generate.option.bound
+
+import io.kotest.matchers.shouldBe
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+
+@DisplayName("`UnsignedIntegerWarnings` should")
+internal class UnsignedIntegerWarningsSpec {
+
+ @BeforeEach
+ fun setUp() {
+ UnsignedIntegerWarnings.clear()
+ }
+
+ @Test
+ fun `report warning only once for the same location`() {
+ var reports = 0
+
+ UnsignedIntegerWarnings.report("same-location") {
+ reports++
+ }
+ UnsignedIntegerWarnings.report("same-location") {
+ reports++
+ }
+
+ reports shouldBe 1
+ }
+
+ @Test
+ fun `report warning for each distinct location`() {
+ var reports = 0
+
+ UnsignedIntegerWarnings.report("location-1") {
+ reports++
+ }
+ UnsignedIntegerWarnings.report("location-2") {
+ reports++
+ }
+
+ reports shouldBe 2
+ }
+}
diff --git a/tests/validating/src/test/kotlin/io/spine/test/options/AssumedRequiredITest.kt b/tests/validating/src/test/kotlin/io/spine/test/options/AssumedRequiredITest.kt
index 418344e4fd..015ad04c63 100644
--- a/tests/validating/src/test/kotlin/io/spine/test/options/AssumedRequiredITest.kt
+++ b/tests/validating/src/test/kotlin/io/spine/test/options/AssumedRequiredITest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2024, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,6 +30,7 @@ import io.spine.base.Identifier
import io.spine.test.tools.validate.TaskId
import io.spine.test.tools.validate.command.AssignTask
import io.spine.test.tools.validate.command.CreateProject
+import io.spine.test.tools.validate.entity.NumberStats
import io.spine.test.tools.validate.entity.Project
import io.spine.test.tools.validate.entity.Task
import io.spine.tools.validation.assertions.assertInvalid
@@ -85,5 +86,11 @@ internal class AssumedRequiredITest {
val msg = Task.newBuilder()
assertValid(msg)
}
+
+ @Test
+ fun `not requiring a primitive ID`() {
+ val msg = NumberStats.newBuilder()
+ assertValid(msg)
+ }
}
}
diff --git a/tests/validating/src/testFixtures/proto/spine/test/tools/validate/entity.proto b/tests/validating/src/testFixtures/proto/spine/test/tools/validate/entity.proto
index db2d77a63a..b868dc2ee5 100644
--- a/tests/validating/src/testFixtures/proto/spine/test/tools/validate/entity.proto
+++ b/tests/validating/src/testFixtures/proto/spine/test/tools/validate/entity.proto
@@ -1,11 +1,11 @@
/*
- * Copyright 2024, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * https://www.apache.org/licenses/LICENSE-2.0
*
* Redistribution and use in source and/or binary forms, with or without
* modification, must retain the above copyright notice and the following
@@ -23,6 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
syntax = "proto3";
package spine.test.tools.validate;
@@ -52,3 +53,10 @@ message Task {
// Here the first field (which is assumed to be required) is explicitly set optional.
string id = 1 [(required) = false];
}
+
+// An entity type with a primitive ID.
+message NumberStats {
+ option (entity).kind = ENTITY;
+
+ int32 id = 1;
+}
diff --git a/version.gradle.kts b/version.gradle.kts
index ee62bd3168..82a46bd6ca 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -27,4 +27,4 @@
/**
* The version of the Validation library to publish.
*/
-val validationVersion by extra("2.0.0-SNAPSHOT.420")
+val validationVersion by extra("2.0.0-SNAPSHOT.421")