Title: ClassCastException when processing UtEnumConstantModel · Issue #230 · UnitTestBot/UTBotJava · GitHub
Open Graph Title: ClassCastException when processing UtEnumConstantModel · Issue #230 · UnitTestBot/UTBotJava
X Title: ClassCastException when processing UtEnumConstantModel · Issue #230 · UnitTestBot/UTBotJava
Description: Description Processing of Enum types may result in ClassCastException, as UtEnumConstantModel is incorrectly cast to UtReferenceModel in several situations, in particular: ArrayObjectWrappers.kt: AssociativeArrayWrapper.value() (the loca...
Open Graph Description: Description Processing of Enum types may result in ClassCastException, as UtEnumConstantModel is incorrectly cast to UtReferenceModel in several situations, in particular: ArrayObjectWrappers.kt: A...
X Description: Description Processing of Enum types may result in ClassCastException, as UtEnumConstantModel is incorrectly cast to UtReferenceModel in several situations, in particular: ArrayObjectWrappers.kt: A...
Opengraph URL: https://github.com/UnitTestBot/UTBotJava/issues/230
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"ClassCastException when processing UtEnumConstantModel","articleBody":"**Description**\r\n\r\nProcessing of `Enum` types may result in `ClassCastException`, as `UtEnumConstantModel` is incorrectly cast to `UtReferenceModel` in several situations, in particular:\r\n\r\n * `ArrayObjectWrappers.kt`: `AssociativeArrayWrapper.value()` (the location related to the reproducible example below).\r\n * `CollectionWrappers.kt`: `constructKeysAndValues()` (a similar type cast).\r\n\r\n**To Reproduce**\r\n\r\nGenerate the test suite for the `MapExamples` class.\r\n\r\n`Color.java`:\r\n```\r\npublic enum Color {\r\n UNDEFINED,\r\n RED,\r\n YELLOW,\r\n GREEN\r\n}\r\n```\r\n\r\n`MapExamples.java`:\r\n```\r\npublic class MapExamples {\r\n public Color[] transduce(@NotNull Color[] inputs, @NotNull HashMap\u003cColor, Color\u003e fst) {\r\n if (inputs.length \u003e 0) {\r\n Color[] result = new Color[inputs.length];\r\n for (int i = 0; i \u003c inputs.length; i++) {\r\n result[i] = fst.getOrDefault(inputs[i], Color.UNDEFINED);\r\n }\r\n return result;\r\n } else {\r\n return new Color[0];\r\n }\r\n }\r\n\r\n public Color[] trafficLightTransduce(@NotNull Color[] inputs) {\r\n HashMap\u003cColor, Color\u003e trafficLight = new HashMap\u003c\u003e();\r\n trafficLight.put(Color.RED, Color.GREEN);\r\n trafficLight.put(Color.GREEN, Color.YELLOW);\r\n trafficLight.put(Color.YELLOW, Color.RED);\r\n\r\n return transduce(inputs, trafficLight);\r\n }\r\n}\r\n```\r\n\r\n**Expected behavior**\r\n\r\nTest suite is generated, no `ClassCastException` errors are reported.\r\n\r\n**Actual behavior**\r\n\r\nNo tests are generated, the plugin fails with the following exception:\r\n\r\n```\r\njava.lang.ClassCastException: class org.utbot.framework.plugin.api.UtEnumConstantModel cannot be cast to class org.utbot.framework.plugin.api.UtReferenceModel (org.utbot.framework.plugin.api.UtEnumConstantModel and org.utbot.framework.plugin.api.UtReferenceModel are in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @56d6d8d8)\r\n\tat org.utbot.engine.AssociativeArrayWrapper.value(ArrayObjectWrappers.kt:382)\r\n\tat org.utbot.engine.Resolver.resolveObject(Resolver.kt:454)\r\n\tat org.utbot.engine.Resolver.resolveReferenceValue(Resolver.kt:424)\r\n\tat org.utbot.engine.Resolver.resolveModel(Resolver.kt:395)\r\n\tat org.utbot.engine.Resolver.collectFieldModels(Resolver.kt:581)\r\n\tat org.utbot.engine.MapWrapper.resolveValueModels(CollectionWrappers.kt:309)\r\n\tat org.utbot.engine.BaseCollectionWrapper.value(CollectionWrappers.kt:108)\r\n\tat org.utbot.engine.BaseCollectionWrapper.value(CollectionWrappers.kt:99)\r\n\tat org.utbot.engine.Resolver.resolveObject(Resolver.kt:454)\r\n\tat org.utbot.engine.Resolver.resolveReferenceValue(Resolver.kt:424)\r\n\tat org.utbot.engine.Resolver.resolveModel(Resolver.kt:395)\r\n\tat org.utbot.engine.Resolver.internalResolveModel(Resolver.kt:233)\r\n\tat org.utbot.engine.Resolver.resolveModels$utbot_framework(Resolver.kt:204)\r\n\tat org.utbot.engine.UtBotSymbolicEngine$traverseImpl$1.invokeSuspend(UtBotSymbolicEngine.kt:466)\r\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\r\n\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)\r\n\tat kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)\r\n\tat kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:84)\r\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)\r\n\tat kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)\r\n\tat kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)\r\n\tat kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)\r\n\tat org.utbot.common.ConcurrencyKt.runBlockingWithCancellationPredicate(Concurrency.kt:38)\r\n\tat org.utbot.framework.plugin.api.UtBotTestCaseGenerator$generateForSeveralMethods$4.invoke(UtBotTestCaseGenerator.kt:263)\r\n\tat org.utbot.framework.plugin.api.UtBotTestCaseGenerator$generateForSeveralMethods$4.invoke(UtBotTestCaseGenerator.kt:56)\r\n\tat org.utbot.common.ConcurrencyKt.runIgnoringCancellationException(Concurrency.kt:47)\r\n\tat org.utbot.framework.plugin.api.UtBotTestCaseGenerator.generateForSeveralMethods(UtBotTestCaseGenerator.kt:262)\r\n\tat org.utbot.framework.plugin.api.UtBotTestCaseGenerator.generateForSeveralMethods$default(UtBotTestCaseGenerator.kt:249)\r\n\tat org.utbot.intellij.plugin.generator.CodeGenerator.generateForSeveralMethods(CodeGenerator.kt:53)\r\n\tat org.utbot.intellij.plugin.ui.UtTestsDialogProcessor$createTests$2$1.run(UtTestsDialogProcessor.kt:164)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.startTask(CoreProgressManager.java:442)\r\n\tat com.intellij.openapi.progress.impl.ProgressManagerImpl.startTask(ProgressManagerImpl.java:114)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressAsynchronously$5(CoreProgressManager.java:493)\r\n\tat com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$3(ProgressRunner.java:244)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:189)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:608)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:683)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:639)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:607)\r\n\tat com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)\r\n\tat com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:176)\r\n\tat com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$4(ProgressRunner.java:244)\r\n\tat java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\r\n\tat java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:668)\r\n\tat java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:665)\r\n\tat java.base/java.security.AccessController.doPrivileged(Native Method)\r\n\tat java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:665)\r\n\tat java.base/java.lang.Thread.run(Thread.java:829)\r\n```\r\n\r\nIt is possible that some tests are generated, but a non-empty error suite is generated as well (I encountered this case once but it seems hard to reproduce). See **Additional context** below for details.\r\n\r\n**Environment**\r\n\r\nMock strategy: *Other packages: Mockito*\r\nMock static: *No static mocking*\r\nTest framework: *JUnit5*\r\n\r\n**Additional context**\r\n\r\nI somehow managed to generate a non-empty test suite with several reported `ClassCastException` errors. It seems hard to reproduce (usually the generator just fails, so I am not sure that it is not a version mismatch from my side), but it might be useful to have this log.\r\n\r\n```\r\npublic class MapExamplesTest {\r\n ///region Test suites for executable collections.MapExamples.transduce\r\n\r\n ///region SUCCESSFUL EXECUTIONS for method transduce(collections.Color[], java.util.HashMap)\r\n\r\n /**\r\n * \u003cpre\u003e\r\n * Test does not iterate {@code for(int i = 0; i \u003c inputs.length; i++) }, executes conditions:\r\n * {@code (inputs.length \u003e 0): False }\r\n * returns from: {@code return new Color[0]; }\r\n * \u003c/pre\u003e\r\n */\r\n @Test\r\n @DisplayName(\"transduce: inputs.length \u003e 0 : False -\u003e return new Color[0]\")\r\n public void testTransduce_InputsLengthLessOrEqualZero() {\r\n MapExamples mapExamples = new MapExamples();\r\n Color[] colorArray = {};\r\n HashMap hashMap = new HashMap();\r\n\r\n Color[] actual = mapExamples.transduce(colorArray, hashMap);\r\n\r\n Color[] expected = {};\r\n\r\n int expectedSize = expected.length;\r\n assertEquals(expectedSize, actual.length);\r\n assertTrue(deepEquals(expected, actual));\r\n }\r\n\r\n /**\r\n * \u003cpre\u003e\r\n * Test executes conditions:\r\n * {@code (inputs.length \u003e 0): True }\r\n * iterates the loop {@code for(int i = 0; i \u003c inputs.length; i++) } once.\r\n * Test then returns from: {@code return result; }\r\n * \u003c/pre\u003e\r\n */\r\n @Test\r\n @DisplayName(\"transduce: inputs.length \u003e 0 : True -\u003e return result\")\r\n public void testTransduce_InputsLengthGreaterThanZero() throws ClassNotFoundException, Exception {\r\n Color prevUNDEFINED = Color.UNDEFINED;\r\n try {\r\n Color undefined = Color.UNDEFINED;\r\n Class colorClazz = Class.forName(\"collections.Color\");\r\n setStaticField(colorClazz, \"UNDEFINED\", undefined);\r\n MapExamples mapExamples = new MapExamples();\r\n Color[] colorArray = {null};\r\n HashMap hashMap = new HashMap();\r\n\r\n Color[] actual = mapExamples.transduce(colorArray, hashMap);\r\n\r\n Color[] expected = new Color[1];\r\n Color color = Color.UNDEFINED;\r\n expected[0] = color;\r\n\r\n int expectedSize = expected.length;\r\n assertEquals(expectedSize, actual.length);\r\n assertTrue(deepEquals(expected, actual));\r\n\r\n Color finalColorArray0 = colorArray[0];\r\n\r\n assertNull(finalColorArray0);\r\n } finally {\r\n setStaticField(Color.class, \"UNDEFINED\", prevUNDEFINED);\r\n }\r\n }\r\n ///endregion\r\n\r\n ///region Errors report for transduce\r\n\r\n public void testTransduce_errors() {\r\n // Couldn't generate some tests. List of errors:\r\n // \r\n // 18 occurrences of:\r\n /* class org.utbot.framework.plugin.api.UtEnumConstantModel cannot be cast to class org.utbot.framework.plugin.api.UtReferenceModel (org.utbot.framework.plugin.api.UtEnumConstantModel and\r\n org.utbot.framework.plugin.api.UtReferenceModel are in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @33114743) */\r\n\r\n }\r\n ///endregion\r\n\r\n ///endregion\r\n\r\n ///region Test suites for executable collections.MapExamples.trafficLightTransduce\r\n\r\n ///region SUCCESSFUL EXECUTIONS for method trafficLightTransduce(collections.Color[])\r\n\r\n /**\r\n * \u003cpre\u003e\r\n * Test calls MapExamples::transduce,\r\n * there it does not iterate {@code for(int i = 0; i \u003c inputs.length; i++) }, executes conditions:\r\n * {@code (inputs.length \u003e 0): False }\r\n * returns from: {@code return new Color[0]; }\r\n *\r\n * Test afterwards returns from: {@code return transduce(inputs, trafficLight); }\r\n * \u003c/pre\u003e\r\n */\r\n @Test\r\n @DisplayName(\"trafficLightTransduce: inputs.length \u003e 0 : False -\u003e return new Color[0]\")\r\n public void testTrafficLightTransduce_InputsLengthLessOrEqualZero() throws ClassNotFoundException, Exception {\r\n Color prevRED = Color.RED;\r\n Color prevGREEN = Color.GREEN;\r\n Color prevYELLOW = Color.YELLOW;\r\n try {\r\n Color red = Color.RED;\r\n Class colorClazz = Class.forName(\"collections.Color\");\r\n setStaticField(colorClazz, \"RED\", red);\r\n Color green = Color.GREEN;\r\n setStaticField(colorClazz, \"GREEN\", green);\r\n Color yellow = Color.YELLOW;\r\n setStaticField(colorClazz, \"YELLOW\", yellow);\r\n MapExamples mapExamples = new MapExamples();\r\n Color[] colorArray = {};\r\n\r\n Color[] actual = mapExamples.trafficLightTransducer(colorArray);\r\n\r\n Color[] expected = {};\r\n\r\n int expectedSize = expected.length;\r\n assertEquals(expectedSize, actual.length);\r\n assertTrue(deepEquals(expected, actual));\r\n } finally {\r\n setStaticField(Color.class, \"RED\", prevRED);\r\n setStaticField(Color.class, \"GREEN\", prevGREEN);\r\n setStaticField(Color.class, \"YELLOW\", prevYELLOW);\r\n }\r\n }\r\n\r\n /**\r\n * \u003cpre\u003e\r\n * Test calls MapExamples::transduce,\r\n * there it executes conditions:\r\n * {@code (inputs.length \u003e 0): True }\r\n * iterates the loop {@code for(int i = 0; i \u003c inputs.length; i++) } once.\r\n * Test then returns from: {@code return result; }\r\n *\r\n * Test next returns from: {@code return transduce(inputs, trafficLight); }\r\n * \u003c/pre\u003e\r\n */\r\n @Test\r\n @DisplayName(\"trafficLightTransduce: inputs.length \u003e 0 : True -\u003e return result\")\r\n public void testTrafficLightTransduce_InputsLengthGreaterThanZero() throws ClassNotFoundException, Exception {\r\n Color prevRED = Color.RED;\r\n Color prevGREEN = Color.GREEN;\r\n Color prevYELLOW = Color.YELLOW;\r\n Color prevUNDEFINED = Color.UNDEFINED;\r\n try {\r\n Color red = Color.RED;\r\n Class colorClazz = Class.forName(\"collections.Color\");\r\n setStaticField(colorClazz, \"RED\", red);\r\n Color green = Color.GREEN;\r\n setStaticField(colorClazz, \"GREEN\", green);\r\n Color yellow = Color.YELLOW;\r\n setStaticField(colorClazz, \"YELLOW\", yellow);\r\n Color undefined = Color.UNDEFINED;\r\n setStaticField(colorClazz, \"UNDEFINED\", undefined);\r\n MapExamples mapExamples = new MapExamples();\r\n Color[] colorArray = {null};\r\n\r\n Color[] actual = mapExamples.trafficLightTransducer(colorArray);\r\n\r\n Color[] expected = new Color[1];\r\n Color color = Color.UNDEFINED;\r\n expected[0] = color;\r\n\r\n int expectedSize = expected.length;\r\n assertEquals(expectedSize, actual.length);\r\n assertTrue(deepEquals(expected, actual));\r\n\r\n Color finalColorArray0 = colorArray[0];\r\n\r\n assertNull(finalColorArray0);\r\n } finally {\r\n setStaticField(Color.class, \"RED\", prevRED);\r\n setStaticField(Color.class, \"GREEN\", prevGREEN);\r\n setStaticField(Color.class, \"YELLOW\", prevYELLOW);\r\n setStaticField(Color.class, \"UNDEFINED\", prevUNDEFINED);\r\n }\r\n }\r\n ///endregion\r\n\r\n ///endregion\r\n}\r\n```\r\n","author":{"url":"https://github.com/dtim","@type":"Person","name":"dtim"},"datePublished":"2022-06-17T09:29:08.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/230/UTBotJava/issues/230"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:6a19a9d8-131a-0028-8011-1f2440e735d9 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | BDD2:49CAD:11B31CA:16E4861:6990744C |
| html-safe-nonce | d6acd011767358be40167a9f396eee3a4f825bf49f6177b2a45614a9f726a958 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCREQyOjQ5Q0FEOjExQjMxQ0E6MTZFNDg2MTo2OTkwNzQ0QyIsInZpc2l0b3JfaWQiOiI4MDgxMTM0MDYzMzA0MzQwNTU2IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 2773a6424d8f46b1cf4b3dcdc499a9d695b1e09c9611a1d8c6a062a421a00c6c |
| hovercard-subject-tag | issue:1274801551 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/UnitTestBot/UTBotJava/230/issue_layout |
| twitter:image | https://opengraph.githubassets.com/6bfe61d64c30f12cd4c3ac63a991d81749f6a2d88dc0099335ae82b924fce0c7/UnitTestBot/UTBotJava/issues/230 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/6bfe61d64c30f12cd4c3ac63a991d81749f6a2d88dc0099335ae82b924fce0c7/UnitTestBot/UTBotJava/issues/230 |
| og:image:alt | Description Processing of Enum types may result in ClassCastException, as UtEnumConstantModel is incorrectly cast to UtReferenceModel in several situations, in particular: ArrayObjectWrappers.kt: A... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | dtim |
| hostname | github.com |
| expected-hostname | github.com |
| None | 42c603b9d642c4a9065a51770f75e5e27132fef0e858607f5c9cb7e422831a7b |
| turbo-cache-control | no-preview |
| go-import | github.com/UnitTestBot/UTBotJava git https://github.com/UnitTestBot/UTBotJava.git |
| octolytics-dimension-user_id | 87413538 |
| octolytics-dimension-user_login | UnitTestBot |
| octolytics-dimension-repository_id | 480810501 |
| octolytics-dimension-repository_nwo | UnitTestBot/UTBotJava |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 480810501 |
| octolytics-dimension-repository_network_root_nwo | UnitTestBot/UTBotJava |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 3b33c5aedc9808f45bc5fcf0b1e4404cf749dac7 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width