From 05efcafb5670568ebe7205cb6c18b449cd161f03 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 24 May 2022 15:29:49 +0300 Subject: [PATCH] Do not set final fields with direct accessors in UtAssembleModel --- .../assemble/AssembleModelGenerator.kt | 3 ++ .../examples/assemble/DirectAccessFinal.java | 8 +++++ .../assemble/AssembleModelGeneratorTests.kt | 30 +++++++++++++------ 3 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 utbot-framework/src/test/java/org/utbot/examples/assemble/DirectAccessFinal.java diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt index 77fe678518..fad4158d4d 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt @@ -246,6 +246,9 @@ class AssembleModelGenerator(private val methodUnderTest: UtMethod<*>) { if (fieldId.isStatic) { throw AssembleException("Static field $fieldId can't be set in an object of the class $classId") } + if (fieldId.isFinal) { + throw AssembleException("Final field $fieldId can't be set in an object of the class $classId") + } //fill field value if it hasn't been filled by constructor, and it is not default if (fieldId in constructorInfo.affectedFields || (fieldId !in constructorInfo.setFields && !fieldModel.hasDefaultValue()) diff --git a/utbot-framework/src/test/java/org/utbot/examples/assemble/DirectAccessFinal.java b/utbot-framework/src/test/java/org/utbot/examples/assemble/DirectAccessFinal.java new file mode 100644 index 0000000000..64d86e77f0 --- /dev/null +++ b/utbot-framework/src/test/java/org/utbot/examples/assemble/DirectAccessFinal.java @@ -0,0 +1,8 @@ +package org.utbot.examples.assemble; + +/** + * A class with a FINAL field allowing direct access. + */ +public class DirectAccessFinal { + public final int[] array = {1, 2}; +} \ No newline at end of file diff --git a/utbot-framework/src/test/kotlin/org/utbot/framework/assemble/AssembleModelGeneratorTests.kt b/utbot-framework/src/test/kotlin/org/utbot/framework/assemble/AssembleModelGeneratorTests.kt index 09b3b85e72..ffa6b63c69 100644 --- a/utbot-framework/src/test/kotlin/org/utbot/framework/assemble/AssembleModelGeneratorTests.kt +++ b/utbot-framework/src/test/kotlin/org/utbot/framework/assemble/AssembleModelGeneratorTests.kt @@ -1,14 +1,5 @@ package org.utbot.framework.assemble -import org.utbot.examples.assemble.AssembleTestUtils -import org.utbot.examples.assemble.ComplexField -import org.utbot.examples.assemble.DirectAccess -import org.utbot.examples.assemble.DirectAccessAndSetter -import org.utbot.examples.assemble.InheritedField -import org.utbot.examples.assemble.ListItem -import org.utbot.examples.assemble.NoModifier -import org.utbot.examples.assemble.PackagePrivateFields -import org.utbot.examples.assemble.PrimitiveFields import org.utbot.examples.assemble.arrays.ArrayOfComplexArrays import org.utbot.examples.assemble.arrays.ArrayOfPrimitiveArrays import org.utbot.examples.assemble.arrays.AssignedArray @@ -54,6 +45,7 @@ import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test +import org.utbot.examples.assemble.* /** * Test classes must be located in the same folder as [AssembleTestUtils] class. @@ -337,6 +329,26 @@ class AssembleModelGeneratorTests { createModelAndAssert(compositeModel, expectedRepresentation) } + @Test + fun testOnObjectWithFinalFields() { + val testClassId = DirectAccessFinal::class.id + + val arrayObjectFields = fields( + testClassId, + "array" to UtArrayModel( + modelIdCounter.incrementAndGet(), + intArrayClassId, + length = 2, + UtPrimitiveModel(0), + mutableMapOf(0 to UtPrimitiveModel(1), 1 to UtPrimitiveModel(2)), + ), + ) + val compositeModel = + UtCompositeModel(modelIdCounter.incrementAndGet(), testClassId, isMock = false, arrayObjectFields) + + createModelAndAssert(compositeModel, null) + } + //region inheritance_tests @Test