From 68fa2446d1ecdd7ee4d9cbf5f52bf5a1ac8cf0c9 Mon Sep 17 00:00:00 2001 From: Vladislav Kasimov <70969943+rudolf101@users.noreply.github.com> Date: Fri, 3 Mar 2023 19:49:38 +0300 Subject: [PATCH 1/7] Still removing old fuzzer deps --- .../plugin/language/js/CoverageModeButtons.kt | 2 +- .../src/main/kotlin/api/JsTestGenerator.kt | 6 ++- .../src/main/kotlin/framework/api/js/JsApi.kt | 6 +-- .../src/main/kotlin/fuzzer/JsFuzzerApi.kt | 46 +++++++++++++++++-- utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt | 13 ++++-- .../fuzzer/providers/BoolValueProvider.kt | 10 ++-- .../fuzzer/providers/NumberValueProvider.kt | 18 ++++---- .../fuzzer/providers/ObjectValueProvider.kt | 9 ++-- .../fuzzer/providers/StringValueProvider.kt | 8 +++- .../main/kotlin/parser/JsFuzzerAstVisitor.kt | 19 ++++---- .../src/main/kotlin/parser/JsParserUtils.kt | 20 ++++---- .../kotlin/service/CoverageServiceProvider.kt | 16 ++++--- 12 files changed, 117 insertions(+), 56 deletions(-) diff --git a/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt b/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt index f44ca170d7..874a3f1fe9 100644 --- a/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt +++ b/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt @@ -1,8 +1,8 @@ package org.utbot.intellij.plugin.language.js -import service.CoverageMode import javax.swing.ButtonGroup import javax.swing.JRadioButton +import service.coverage.CoverageMode object CoverageModeButtons { diff --git a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt index a35344f7b9..efaba218d6 100644 --- a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt +++ b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt @@ -8,6 +8,7 @@ import framework.api.js.util.isJsBasic import framework.api.js.util.jsErrorClassId import framework.api.js.util.jsUndefinedClassId import fuzzer.JsFeedback +import fuzzer.JsFuzzedValue import fuzzer.JsFuzzingExecutionFeedback import fuzzer.JsMethodDescription import fuzzer.JsStatement @@ -27,6 +28,7 @@ import org.utbot.framework.plugin.api.UtExecutionResult import org.utbot.framework.plugin.api.UtExecutionSuccess import org.utbot.framework.plugin.api.UtExplicitlyThrownException import org.utbot.framework.plugin.api.UtTimeoutException +import org.utbot.fuzzer.UtFuzzedExecution import org.utbot.fuzzer.FuzzedValue import org.utbot.fuzzer.UtFuzzedExecution import org.utbot.fuzzing.Control @@ -182,7 +184,7 @@ class JsTestGenerator( private fun getUtModelResult( execId: JsMethodId, resultData: ResultData, - fuzzedValues: List + fuzzedValues: List ): UtExecutionResult { if (resultData.isError && resultData.rawString == "Timeout") return UtTimeoutException( TimeoutException(" Timeout in generating test for ${ @@ -220,7 +222,7 @@ class JsTestGenerator( concreteValues = fuzzerVisitor.fuzzedConcreteValues, tracer = Trie(JsStatement::number) ) - val collectedValues = mutableListOf>() + val collectedValues = mutableListOf>() // .location field gets us "jsFile:A:B", then we get A and B as ints val funcLocation = funcNode.firstChild!!.location.substringAfter("jsFile:") .split(":").map { it.toInt() } diff --git a/utbot-js/src/main/kotlin/framework/api/js/JsApi.kt b/utbot-js/src/main/kotlin/framework/api/js/JsApi.kt index 1e7f19b528..ee5eb7858b 100644 --- a/utbot-js/src/main/kotlin/framework/api/js/JsApi.kt +++ b/utbot-js/src/main/kotlin/framework/api/js/JsApi.kt @@ -93,11 +93,7 @@ class JsConstructorId( get() = 0 } -class JsMultipleClassId(private val jsJoinedName: String) : JsClassId(jsJoinedName) { - - val types: Sequence - get() = jsJoinedName.split('|').map { JsClassId(it) }.asSequence() -} +class JsMultipleClassId(jsJoinedName: String) : JsClassId(jsJoinedName) open class JsUtModel( override val classId: JsClassId diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt index 150a9343a6..3d22bc4484 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt @@ -6,6 +6,7 @@ import org.utbot.framework.plugin.api.UtTimeoutException import org.utbot.fuzzer.FuzzedConcreteValue import org.utbot.fuzzer.FuzzedValue import org.utbot.fuzzer.UtFuzzedExecution +import org.utbot.fuzzer.UtFuzzedExecution import org.utbot.fuzzing.Control import org.utbot.fuzzing.Description import org.utbot.fuzzing.Feedback @@ -19,7 +20,7 @@ class JsTimeoutExecution(val utTimeout: UtTimeoutException) : JsFuzzingExecution class JsMethodDescription( val name: String, parameters: List, - val concreteValues: Collection, + val concreteValues: Collection, val thisInstance: JsClassId? = null, val tracer: Trie ) : Description(parameters) { @@ -28,7 +29,7 @@ class JsMethodDescription( name: String, parameters: List, classId: JsClassId, - concreteValues: Collection, + concreteValues: Collection, tracer: Trie ) : this( name, @@ -42,7 +43,7 @@ class JsMethodDescription( class JsFeedback( override val control: Control = Control.CONTINUE, val result: Trie.Node = Trie.emptyNode() -) : Feedback { +) : Feedback { override fun equals(other: Any?): Boolean { val castOther = other as? JsFeedback @@ -57,3 +58,42 @@ class JsFeedback( data class JsStatement( val number: Int ) + +data class JsFuzzedValue( + val model: UtModel, + var summary: String? = null, +) + +data class JsFuzzedConcreteValue( + val classId: ClassId, + val value: Any, + val fuzzedContext: JsFuzzedContext = JsFuzzedContext.Unknown, +) + +enum class JsFuzzedContext { + EQ, + NE, + GT, + GE, + LT, + LE, + Unknown; + + fun reverse(): JsFuzzedContext = when (this) { + EQ -> NE + NE -> EQ + GT -> LE + LT -> GE + LE -> GT + GE -> LT + Unknown -> Unknown + } +} + +fun UtModel.fuzzed(block: JsFuzzedValue.() -> Unit = {}): JsFuzzedValue = JsFuzzedValue(this).apply(block) + +object JsIdProvider { + private var _id = AtomicInteger(0) + + fun get() = _id.incrementAndGet() +} diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt index cc3420a45c..4db18543e4 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt @@ -3,12 +3,15 @@ package fuzzer import framework.api.js.JsClassId import fuzzer.providers.BoolValueProvider import fuzzer.providers.NumberValueProvider +import fuzzer.providers.SetValueProvider import fuzzer.providers.ObjectValueProvider import fuzzer.providers.StringValueProvider import org.utbot.fuzzer.FuzzedValue import org.utbot.fuzzing.Fuzzing import org.utbot.fuzzing.Seed import org.utbot.fuzzing.fuzz +import fuzzer.providers.ArrayValueProvider +import fuzzer.providers.ObjectValueProvider fun defaultValueProviders() = listOf( BoolValueProvider, @@ -18,10 +21,10 @@ fun defaultValueProviders() = listOf( ) class JsFuzzing( - val exec: suspend (JsMethodDescription, List) -> JsFeedback -) : Fuzzing { + val exec: suspend (JsMethodDescription, List) -> JsFeedback +) : Fuzzing { - override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> { + override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> { return defaultValueProviders().asSequence().flatMap { provider -> if (provider.accept(type)) { provider.generate(description, type) @@ -31,12 +34,12 @@ class JsFuzzing( } } - override suspend fun handle(description: JsMethodDescription, values: List): JsFeedback { + override suspend fun handle(description: JsMethodDescription, values: List): JsFeedback { return exec(description, values) } } suspend fun runFuzzing( description: JsMethodDescription, - exec: suspend (JsMethodDescription, List) -> JsFeedback + exec: suspend (JsMethodDescription, List) -> JsFeedback ) = JsFuzzing(exec).fuzz(description) diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt index 3c889bdb41..90fd2f7b24 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt @@ -3,20 +3,22 @@ package fuzzer.providers import framework.api.js.JsClassId import framework.api.js.JsPrimitiveModel import framework.api.js.util.isJsBasic +import fuzzer.JsFuzzedValue import fuzzer.JsMethodDescription -import org.utbot.fuzzer.FuzzedValue -import org.utbot.fuzzer.providers.PrimitivesModelProvider.fuzzed +import fuzzer.fuzzed + + import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider import org.utbot.fuzzing.seeds.Bool -object BoolValueProvider : ValueProvider { +object BoolValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isJsBasic } - override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = + override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = sequence { yield(Seed.Known(Bool.TRUE()) { JsPrimitiveModel(true).fuzzed { diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt index 33862d3019..0913dca3cc 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt @@ -3,26 +3,26 @@ package fuzzer.providers import framework.api.js.JsClassId import framework.api.js.JsPrimitiveModel import framework.api.js.util.isJsBasic +import fuzzer.JsFuzzedContext.EQ +import fuzzer.JsFuzzedContext.GE +import fuzzer.JsFuzzedContext.GT +import fuzzer.JsFuzzedContext.LE +import fuzzer.JsFuzzedContext.LT +import fuzzer.JsFuzzedValue import fuzzer.JsMethodDescription -import org.utbot.fuzzer.FuzzedContext.Comparison.EQ -import org.utbot.fuzzer.FuzzedContext.Comparison.GE -import org.utbot.fuzzer.FuzzedContext.Comparison.GT -import org.utbot.fuzzer.FuzzedContext.Comparison.LE -import org.utbot.fuzzer.FuzzedContext.Comparison.LT -import org.utbot.fuzzer.FuzzedValue -import org.utbot.fuzzer.providers.PrimitivesModelProvider.fuzzed +import fuzzer.fuzzed import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider import org.utbot.fuzzing.seeds.DefaultFloatBound import org.utbot.fuzzing.seeds.IEEE754Value -object NumberValueProvider : ValueProvider { +object NumberValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isJsBasic } - override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = + override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = sequence { description.concreteValues.forEach { (_, v, c) -> if (v is Double) { diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt index a9d02cf7df..05491b7342 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt @@ -3,7 +3,10 @@ package fuzzer.providers import framework.api.js.JsClassId import framework.api.js.JsConstructorId import framework.api.js.util.isClass +import fuzzer.JsFuzzedValue +import fuzzer.JsIdProvider import fuzzer.JsMethodDescription +import fuzzer.fuzzed import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtExecutableCallModel import org.utbot.framework.plugin.api.UtNullModel @@ -15,7 +18,7 @@ import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider import org.utbot.fuzzing.utils.hex -class ObjectValueProvider : ValueProvider { +class ObjectValueProvider : ValueProvider { private val idGenerator = ReferencePreservingIntIdGenerator() @@ -31,7 +34,7 @@ class ObjectValueProvider : ValueProvider { + private fun createValue(classId: JsClassId, constructorId: JsConstructorId): Seed.Recursive { return Seed.Recursive( construct = Routine.Create(constructorId.parameters) { values -> val id = idGenerator.createId() @@ -56,4 +59,4 @@ class ObjectValueProvider : ValueProvider { +object StringValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isJsBasic @@ -20,7 +24,7 @@ object StringValueProvider : ValueProvider> = sequence { + ): Sequence> = sequence { val constants = description.concreteValues.asSequence() .filter { it.classId == jsStringClassId } val values = constants diff --git a/utbot-js/src/main/kotlin/parser/JsFuzzerAstVisitor.kt b/utbot-js/src/main/kotlin/parser/JsFuzzerAstVisitor.kt index 08a6c41d49..1e0929534a 100644 --- a/utbot-js/src/main/kotlin/parser/JsFuzzerAstVisitor.kt +++ b/utbot-js/src/main/kotlin/parser/JsFuzzerAstVisitor.kt @@ -5,6 +5,10 @@ import com.google.javascript.rhino.Node import framework.api.js.util.jsBooleanClassId import framework.api.js.util.jsDoubleClassId import framework.api.js.util.jsStringClassId +import fuzzer.JsFuzzedConcreteValue +import fuzzer.JsFuzzedContext + + import org.utbot.fuzzer.FuzzedConcreteValue import org.utbot.fuzzer.FuzzedContext import parser.JsParserUtils.getAnyValue @@ -14,8 +18,8 @@ import parser.JsParserUtils.toFuzzedContextComparisonOrNull class JsFuzzerAstVisitor : IAstVisitor { - private var lastFuzzedOpGlobal: FuzzedContext = FuzzedContext.Unknown - val fuzzedConcreteValues = mutableSetOf() + private var lastFuzzedOpGlobal: JsFuzzedContext = JsFuzzedContext.Unknown + val fuzzedConcreteValues = mutableSetOf() override fun accept(rootNode: Node) { NodeUtil.visitPreOrder(rootNode) { node -> @@ -25,8 +29,7 @@ class JsFuzzerAstVisitor : IAstVisitor { currentFuzzedOp != null -> { lastFuzzedOpGlobal = currentFuzzedOp validateNode(node.getBinaryExprLeftOperand().getAnyValue()) - lastFuzzedOpGlobal = if (lastFuzzedOpGlobal is FuzzedContext.Comparison) - (lastFuzzedOpGlobal as FuzzedContext.Comparison).reverse() else FuzzedContext.Unknown + lastFuzzedOpGlobal = lastFuzzedOpGlobal.reverse() validateNode(node.getBinaryExprRightOperand().getAnyValue()) } } @@ -38,7 +41,7 @@ class JsFuzzerAstVisitor : IAstVisitor { when (value) { is String -> { fuzzedConcreteValues.add( - FuzzedConcreteValue( + JsFuzzedConcreteValue( jsStringClassId, value.toString(), lastFuzzedOpGlobal @@ -48,7 +51,7 @@ class JsFuzzerAstVisitor : IAstVisitor { is Boolean -> { fuzzedConcreteValues.add( - FuzzedConcreteValue( + JsFuzzedConcreteValue( jsBooleanClassId, value, lastFuzzedOpGlobal @@ -57,8 +60,8 @@ class JsFuzzerAstVisitor : IAstVisitor { } is Double -> { - fuzzedConcreteValues.add(FuzzedConcreteValue(jsDoubleClassId, value, lastFuzzedOpGlobal)) + fuzzedConcreteValues.add(JsFuzzedConcreteValue(jsDoubleClassId, value, lastFuzzedOpGlobal)) } } } -} \ No newline at end of file +} diff --git a/utbot-js/src/main/kotlin/parser/JsParserUtils.kt b/utbot-js/src/main/kotlin/parser/JsParserUtils.kt index 05a3676a83..9430aec740 100644 --- a/utbot-js/src/main/kotlin/parser/JsParserUtils.kt +++ b/utbot-js/src/main/kotlin/parser/JsParserUtils.kt @@ -3,8 +3,12 @@ package parser import com.google.javascript.jscomp.Compiler import com.google.javascript.jscomp.SourceFile import com.google.javascript.rhino.Node +import fuzzer.JsFuzzedContext +import java.lang.IllegalStateException +import parser.JsParserUtils.getMethodName import org.utbot.fuzzer.FuzzedContext +// TODO: make methods more safe by checking the Node method is called on. // Used for .children() calls. @Suppress("DEPRECATION") object JsParserUtils { @@ -73,14 +77,14 @@ object JsParserUtils { /** * Called upon node with any kind of binary comparison token. */ - fun Node.toFuzzedContextComparisonOrNull(): FuzzedContext.Comparison? = when { - this.isEQ -> FuzzedContext.Comparison.EQ - this.isNE -> FuzzedContext.Comparison.NE - this.token.name == "LT" -> FuzzedContext.Comparison.LT - this.token.name == "GT" -> FuzzedContext.Comparison.GT - this.token.name == "LE" -> FuzzedContext.Comparison.LE - this.token.name == "GE" -> FuzzedContext.Comparison.GE - this.token.name == "SHEQ" -> FuzzedContext.Comparison.EQ + fun Node.toFuzzedContextComparisonOrNull(): JsFuzzedContext? = when { + this.isEQ -> JsFuzzedContext.EQ + this.isNE -> JsFuzzedContext.NE + this.token.name == "LT" -> JsFuzzedContext.LT + this.token.name == "GT" -> JsFuzzedContext.GT + this.token.name == "LE" -> JsFuzzedContext.LE + this.token.name == "GE" -> JsFuzzedContext.GE + this.token.name == "SHEQ" -> JsFuzzedContext.EQ else -> null } diff --git a/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt b/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt index aaa401025c..137fece280 100644 --- a/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt +++ b/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt @@ -3,6 +3,7 @@ package service import framework.api.js.JsMethodId import framework.api.js.JsPrimitiveModel import framework.api.js.util.isUndefined +import fuzzer.JsFuzzedValue import fuzzer.JsMethodDescription import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtModel @@ -13,8 +14,11 @@ import settings.JsTestGenerationSettings.tempFileName import utils.CoverageData import utils.ResultData import java.util.regex.Pattern +import org.utbot.framework.plugin.api.UtArrayModel +import org.utbot.framework.plugin.api.UtExecutableCallModel +import org.utbot.framework.plugin.api.UtNullModel +import providers.imports.IImportsProvider -// TODO: Add "error" field in result json to not collide with "result" field upon error. class CoverageServiceProvider( private val context: ServiceContext, private val instrumentationService: InstrumentationService, @@ -58,7 +62,7 @@ function check_value(value, json) { } fun get( - fuzzedValues: List>, + fuzzedValues: List>, execId: JsMethodId, ): Pair, List> { return when (mode) { @@ -75,7 +79,7 @@ function check_value(value, json) { } private fun runBasicCoverageAnalysis( - fuzzedValues: List>, + fuzzedValues: List>, execId: JsMethodId, ): Pair, List> { val covFunName = instrumentationService.covFunName @@ -99,7 +103,7 @@ function check_value(value, json) { } private fun runFastCoverageAnalysis( - fuzzedValues: List>, + fuzzedValues: List>, execId: JsMethodId, ): Pair, List> { val covFunName = instrumentationService.covFunName @@ -134,7 +138,7 @@ fs.writeFileSync("$resFilePath", JSON.stringify(json)) } private fun makeStringForRunJs( - fuzzedValue: List, + fuzzedValue: List, method: JsMethodId, containingClass: String?, covFunName: String, @@ -166,7 +170,7 @@ fs.writeFileSync("$resFilePath$index.json", JSON.stringify(json$index)) } private fun makeCallFunctionString( - fuzzedValue: List, + fuzzedValue: List, method: JsMethodId, containingClass: String? ): String { From 44817231fa757f34ca4ea3e3076d17cf7f6238fe Mon Sep 17 00:00:00 2001 From: Vladislav Kasimov <70969943+rudolf101@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:30:06 +0300 Subject: [PATCH 2/7] Remove all `org.utbot.fuzzer` deps --- utbot-js/src/main/kotlin/api/JsTestGenerator.kt | 6 ++++-- .../kotlin/framework/api/js/JsUtFuzzedExecution.kt | 11 +++++++++++ utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt | 3 ++- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 utbot-js/src/main/kotlin/framework/api/js/JsUtFuzzedExecution.kt diff --git a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt index efaba218d6..d6b5e807ac 100644 --- a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt +++ b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt @@ -4,6 +4,8 @@ import codegen.JsCodeGenerator import com.google.javascript.rhino.Node import framework.api.js.JsClassId import framework.api.js.JsMethodId +import framework.api.js.JsUtFuzzedExecution +import framework.api.js.util.isExportable import framework.api.js.util.isJsBasic import framework.api.js.util.jsErrorClassId import framework.api.js.util.jsUndefinedClassId @@ -218,7 +220,7 @@ class JsTestGenerator( val jsDescription = JsMethodDescription( name = funcNode.getAbstractFunctionName(), parameters = execId.parameters, - execId.classId, + classId = execId.classId, concreteValues = fuzzerVisitor.fuzzedConcreteValues, tracer = Trie(JsStatement::number) ) @@ -268,7 +270,7 @@ class JsTestGenerator( EnvironmentModels(thisObject, modelList, mapOf()) emit( JsValidExecution( - UtFuzzedExecution( + JsUtFuzzedExecution( stateBefore = initEnv, stateAfter = initEnv, result = result, diff --git a/utbot-js/src/main/kotlin/framework/api/js/JsUtFuzzedExecution.kt b/utbot-js/src/main/kotlin/framework/api/js/JsUtFuzzedExecution.kt new file mode 100644 index 0000000000..e1540955dc --- /dev/null +++ b/utbot-js/src/main/kotlin/framework/api/js/JsUtFuzzedExecution.kt @@ -0,0 +1,11 @@ +package framework.api.js + +import org.utbot.framework.plugin.api.EnvironmentModels +import org.utbot.framework.plugin.api.UtExecution +import org.utbot.framework.plugin.api.UtExecutionResult + +class JsUtFuzzedExecution( + stateBefore: EnvironmentModels, + stateAfter: EnvironmentModels, + result: UtExecutionResult +) : UtExecution(stateBefore, stateAfter, result, null, null, null, null) diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt index 3d22bc4484..cbc61a9cb4 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt @@ -1,6 +1,7 @@ package fuzzer import framework.api.js.JsClassId +import framework.api.js.JsUtFuzzedExecution import framework.api.js.util.isClass import org.utbot.framework.plugin.api.UtTimeoutException import org.utbot.fuzzer.FuzzedConcreteValue @@ -13,7 +14,7 @@ import org.utbot.fuzzing.Feedback import org.utbot.fuzzing.utils.Trie sealed interface JsFuzzingExecutionFeedback -class JsValidExecution(val utFuzzedExecution: UtFuzzedExecution) : JsFuzzingExecutionFeedback +class JsValidExecution(val utFuzzedExecution: JsUtFuzzedExecution) : JsFuzzingExecutionFeedback class JsTimeoutExecution(val utTimeout: UtTimeoutException) : JsFuzzingExecutionFeedback From ca8a57b91e620d98ff1b42704c44d68bd01a47f6 Mon Sep 17 00:00:00 2001 From: Vladislav Kasimov Date: Mon, 6 Mar 2023 13:43:34 +0300 Subject: [PATCH 3/7] Fix imports --- .../plugin/language/js/CoverageModeButtons.kt | 2 +- utbot-js/src/main/kotlin/api/JsTestGenerator.kt | 6 +----- .../src/main/kotlin/api/JsUtModelConstructor.kt | 6 ++---- utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt | 7 +++---- utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt | 4 ---- .../fuzzer/providers/ObjectValueProvider.kt | 15 +++++++-------- .../fuzzer/providers/StringValueProvider.kt | 4 ---- .../src/main/kotlin/parser/JsFuzzerAstVisitor.kt | 5 +---- utbot-js/src/main/kotlin/parser/JsParserUtils.kt | 2 -- .../kotlin/service/CoverageServiceProvider.kt | 11 +++-------- 10 files changed, 18 insertions(+), 44 deletions(-) diff --git a/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt b/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt index 874a3f1fe9..f44ca170d7 100644 --- a/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt +++ b/utbot-intellij-js/src/main/kotlin/org/utbot/intellij/plugin/language/js/CoverageModeButtons.kt @@ -1,8 +1,8 @@ package org.utbot.intellij.plugin.language.js +import service.CoverageMode import javax.swing.ButtonGroup import javax.swing.JRadioButton -import service.coverage.CoverageMode object CoverageModeButtons { diff --git a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt index d6b5e807ac..57deaf4ad6 100644 --- a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt +++ b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt @@ -5,7 +5,6 @@ import com.google.javascript.rhino.Node import framework.api.js.JsClassId import framework.api.js.JsMethodId import framework.api.js.JsUtFuzzedExecution -import framework.api.js.util.isExportable import framework.api.js.util.isJsBasic import framework.api.js.util.jsErrorClassId import framework.api.js.util.jsUndefinedClassId @@ -30,10 +29,8 @@ import org.utbot.framework.plugin.api.UtExecutionResult import org.utbot.framework.plugin.api.UtExecutionSuccess import org.utbot.framework.plugin.api.UtExplicitlyThrownException import org.utbot.framework.plugin.api.UtTimeoutException -import org.utbot.fuzzer.UtFuzzedExecution -import org.utbot.fuzzer.FuzzedValue -import org.utbot.fuzzer.UtFuzzedExecution import org.utbot.fuzzing.Control +import org.utbot.fuzzing.utils.Trie import parser.JsClassAstVisitor import parser.JsFunctionAstVisitor import parser.JsFuzzerAstVisitor @@ -60,7 +57,6 @@ import utils.constructClass import utils.toJsAny import java.io.File import java.util.concurrent.CancellationException -import org.utbot.fuzzing.utils.Trie private val logger = KotlinLogging.logger {} diff --git a/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt b/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt index 5de6a87971..98705c1d26 100644 --- a/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt +++ b/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt @@ -7,17 +7,15 @@ import framework.api.js.JsPrimitiveModel import framework.api.js.JsUndefinedModel import framework.api.js.util.jsErrorClassId import framework.api.js.util.jsUndefinedClassId +import fuzzer.JsIdProvider import org.utbot.framework.plugin.api.ClassId import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtExecutableCallModel import org.utbot.framework.plugin.api.UtModel -import org.utbot.fuzzer.ReferencePreservingIntIdGenerator import org.utbot.instrumentation.instrumentation.execution.constructors.UtModelConstructorInterface class JsUtModelConstructor : UtModelConstructorInterface { - private val idGenerator = ReferencePreservingIntIdGenerator() - // TODO SEVERE: Requires substantial expansion to other types @Suppress("NAME_SHADOWING") override fun construct(value: Any?, classId: ClassId): UtModel { @@ -52,7 +50,7 @@ class JsUtModelConstructor : UtModelConstructorInterface { val values = (value as Map).values.map { construct(it, JsEmptyClassId()) } - val id = idGenerator.createId() + val id = JsIdProvider.get() val instantiationCall = UtExecutableCallModel(null, constructor, values) return UtAssembleModel( id = id, diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt index cbc61a9cb4..039b014a63 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt @@ -3,15 +3,14 @@ package fuzzer import framework.api.js.JsClassId import framework.api.js.JsUtFuzzedExecution import framework.api.js.util.isClass +import org.utbot.framework.plugin.api.ClassId +import org.utbot.framework.plugin.api.UtModel import org.utbot.framework.plugin.api.UtTimeoutException -import org.utbot.fuzzer.FuzzedConcreteValue -import org.utbot.fuzzer.FuzzedValue -import org.utbot.fuzzer.UtFuzzedExecution -import org.utbot.fuzzer.UtFuzzedExecution import org.utbot.fuzzing.Control import org.utbot.fuzzing.Description import org.utbot.fuzzing.Feedback import org.utbot.fuzzing.utils.Trie +import java.util.concurrent.atomic.AtomicInteger sealed interface JsFuzzingExecutionFeedback class JsValidExecution(val utFuzzedExecution: JsUtFuzzedExecution) : JsFuzzingExecutionFeedback diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt index 4db18543e4..0e9b9ae72a 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt @@ -3,15 +3,11 @@ package fuzzer import framework.api.js.JsClassId import fuzzer.providers.BoolValueProvider import fuzzer.providers.NumberValueProvider -import fuzzer.providers.SetValueProvider import fuzzer.providers.ObjectValueProvider import fuzzer.providers.StringValueProvider -import org.utbot.fuzzer.FuzzedValue import org.utbot.fuzzing.Fuzzing import org.utbot.fuzzing.Seed import org.utbot.fuzzing.fuzz -import fuzzer.providers.ArrayValueProvider -import fuzzer.providers.ObjectValueProvider fun defaultValueProviders() = listOf( BoolValueProvider, diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt index 05491b7342..02f4403dbc 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt @@ -10,9 +10,6 @@ import fuzzer.fuzzed import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtExecutableCallModel import org.utbot.framework.plugin.api.UtNullModel -import org.utbot.fuzzer.FuzzedValue -import org.utbot.fuzzer.ReferencePreservingIntIdGenerator -import org.utbot.fuzzer.providers.ConstantsModelProvider.fuzzed import org.utbot.fuzzing.Routine import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider @@ -20,8 +17,6 @@ import org.utbot.fuzzing.utils.hex class ObjectValueProvider : ValueProvider { - private val idGenerator = ReferencePreservingIntIdGenerator() - override fun accept(type: JsClassId): Boolean { return type.isClass } @@ -34,10 +29,13 @@ class ObjectValueProvider : ValueProvider { + private fun createValue( + classId: JsClassId, + constructorId: JsConstructorId + ): Seed.Recursive { return Seed.Recursive( construct = Routine.Create(constructorId.parameters) { values -> - val id = idGenerator.createId() + val id = JsIdProvider.get() UtAssembleModel( id = id, classId = classId, @@ -48,7 +46,8 @@ class ObjectValueProvider : ValueProvider Date: Mon, 6 Mar 2023 14:54:59 +0300 Subject: [PATCH 4/7] Fix naming --- utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt index 039b014a63..b956ffe28d 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt @@ -93,7 +93,7 @@ enum class JsFuzzedContext { fun UtModel.fuzzed(block: JsFuzzedValue.() -> Unit = {}): JsFuzzedValue = JsFuzzedValue(this).apply(block) object JsIdProvider { - private var _id = AtomicInteger(0) + private var id = AtomicInteger(0) - fun get() = _id.incrementAndGet() + fun get() = id.incrementAndGet() } From 30f185f442893a25825962bc5ed982e3aa996b3d Mon Sep 17 00:00:00 2001 From: Vladislav Kasimov Date: Tue, 7 Mar 2023 17:19:50 +0300 Subject: [PATCH 5/7] Change getter naming for id generator --- utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt | 2 +- utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt | 2 +- .../src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt b/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt index 98705c1d26..8df0625040 100644 --- a/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt +++ b/utbot-js/src/main/kotlin/api/JsUtModelConstructor.kt @@ -50,7 +50,7 @@ class JsUtModelConstructor : UtModelConstructorInterface { val values = (value as Map).values.map { construct(it, JsEmptyClassId()) } - val id = JsIdProvider.get() + val id = JsIdProvider.createId() val instantiationCall = UtExecutableCallModel(null, constructor, values) return UtAssembleModel( id = id, diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt index b956ffe28d..8191ae0d93 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt @@ -95,5 +95,5 @@ fun UtModel.fuzzed(block: JsFuzzedValue.() -> Unit = {}): JsFuzzedValue = JsFuzz object JsIdProvider { private var id = AtomicInteger(0) - fun get() = id.incrementAndGet() + fun createId() = id.incrementAndGet() } diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt index 02f4403dbc..e3dbbd1359 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt @@ -35,7 +35,7 @@ class ObjectValueProvider : ValueProvider { return Seed.Recursive( construct = Routine.Create(constructorId.parameters) { values -> - val id = JsIdProvider.get() + val id = JsIdProvider.createId() UtAssembleModel( id = id, classId = classId, From 51891a6adedeabdb0e218346f0382eb223a719cd Mon Sep 17 00:00:00 2001 From: Vladislav Kasimov Date: Tue, 7 Mar 2023 17:47:00 +0300 Subject: [PATCH 6/7] Remove JsFuzzedValue --- .../src/main/kotlin/api/JsTestGenerator.kt | 12 +++++------ .../src/main/kotlin/fuzzer/JsFuzzerApi.kt | 21 ++----------------- utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt | 11 +++++----- .../fuzzer/providers/BoolValueProvider.kt | 18 ++++++---------- .../fuzzer/providers/NumberValueProvider.kt | 15 +++++-------- .../fuzzer/providers/ObjectValueProvider.kt | 18 ++++++---------- .../fuzzer/providers/StringValueProvider.kt | 11 ++++------ .../kotlin/service/CoverageServiceProvider.kt | 15 +++++++------ 8 files changed, 42 insertions(+), 79 deletions(-) diff --git a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt index 36e5ca5572..46e8781c56 100644 --- a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt +++ b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt @@ -9,7 +9,6 @@ import framework.api.js.util.isJsBasic import framework.api.js.util.jsErrorClassId import framework.api.js.util.jsUndefinedClassId import fuzzer.JsFeedback -import fuzzer.JsFuzzedValue import fuzzer.JsFuzzingExecutionFeedback import fuzzer.JsMethodDescription import fuzzer.JsStatement @@ -28,6 +27,7 @@ import org.utbot.framework.plugin.api.UtExecution import org.utbot.framework.plugin.api.UtExecutionResult import org.utbot.framework.plugin.api.UtExecutionSuccess import org.utbot.framework.plugin.api.UtExplicitlyThrownException +import org.utbot.framework.plugin.api.UtModel import org.utbot.framework.plugin.api.UtTimeoutException import org.utbot.fuzzing.Control import org.utbot.fuzzing.utils.Trie @@ -187,7 +187,7 @@ class JsTestGenerator( private fun getUtModelResult( execId: JsMethodId, resultData: ResultData, - fuzzedValues: List + fuzzedValues: List ): UtExecutionResult { if (resultData.isError && resultData.rawString == "Timeout") return UtTimeoutException( TimeoutException(" Timeout in generating test for ${ @@ -197,7 +197,7 @@ class JsTestGenerator( prefix = "${execId.name}(", separator = ", ", postfix = ")" - ) { (_, value) -> value.model.toString() } + ) { (_, value) -> value.toString() } }") ) val (returnValue, valueClassId) = resultData.toJsAny( @@ -225,7 +225,7 @@ class JsTestGenerator( concreteValues = fuzzerVisitor.fuzzedConcreteValues, tracer = Trie(JsStatement::number) ) - val collectedValues = mutableListOf>() + val collectedValues = mutableListOf>() // .location field gets us "jsFile:A:B", then we get A and B as ints val funcLocation = funcNode.firstChild!!.location.substringAfter("jsFile:") .split(":").map { it.toInt() } @@ -265,8 +265,8 @@ class JsTestGenerator( return@runFuzzing JsFeedback(Control.PASS) } else if (!currentlyCoveredStmts.containsAll(covData.additionalCoverage)) { val (thisObject, modelList) = if (!funcNode.parent!!.isClassMembers) { - null to params.map { it.model } - } else params[0].model to params.drop(1).map { it.model } + null to params.map { it } + } else params[0] to params.drop(1).map { it } val initEnv = EnvironmentModels(thisObject, modelList, mapOf()) emit( diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt index 8191ae0d93..cbef94b64c 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzerApi.kt @@ -40,30 +40,15 @@ class JsMethodDescription( ) } -class JsFeedback( +data class JsFeedback( override val control: Control = Control.CONTINUE, val result: Trie.Node = Trie.emptyNode() -) : Feedback { - - override fun equals(other: Any?): Boolean { - val castOther = other as? JsFeedback - return control == castOther?.control - } - - override fun hashCode(): Int { - return control.hashCode() - } -} +) : Feedback data class JsStatement( val number: Int ) -data class JsFuzzedValue( - val model: UtModel, - var summary: String? = null, -) - data class JsFuzzedConcreteValue( val classId: ClassId, val value: Any, @@ -90,8 +75,6 @@ enum class JsFuzzedContext { } } -fun UtModel.fuzzed(block: JsFuzzedValue.() -> Unit = {}): JsFuzzedValue = JsFuzzedValue(this).apply(block) - object JsIdProvider { private var id = AtomicInteger(0) diff --git a/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt b/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt index 0e9b9ae72a..024aa860b8 100644 --- a/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt +++ b/utbot-js/src/main/kotlin/fuzzer/JsFuzzing.kt @@ -5,6 +5,7 @@ import fuzzer.providers.BoolValueProvider import fuzzer.providers.NumberValueProvider import fuzzer.providers.ObjectValueProvider import fuzzer.providers.StringValueProvider +import org.utbot.framework.plugin.api.UtModel import org.utbot.fuzzing.Fuzzing import org.utbot.fuzzing.Seed import org.utbot.fuzzing.fuzz @@ -17,10 +18,10 @@ fun defaultValueProviders() = listOf( ) class JsFuzzing( - val exec: suspend (JsMethodDescription, List) -> JsFeedback -) : Fuzzing { + val exec: suspend (JsMethodDescription, List) -> JsFeedback +) : Fuzzing { - override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> { + override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> { return defaultValueProviders().asSequence().flatMap { provider -> if (provider.accept(type)) { provider.generate(description, type) @@ -30,12 +31,12 @@ class JsFuzzing( } } - override suspend fun handle(description: JsMethodDescription, values: List): JsFeedback { + override suspend fun handle(description: JsMethodDescription, values: List): JsFeedback { return exec(description, values) } } suspend fun runFuzzing( description: JsMethodDescription, - exec: suspend (JsMethodDescription, List) -> JsFeedback + exec: suspend (JsMethodDescription, List) -> JsFeedback ) = JsFuzzing(exec).fuzz(description) diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt index 90fd2f7b24..e4d8f9246e 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/BoolValueProvider.kt @@ -1,34 +1,28 @@ package fuzzer.providers + import framework.api.js.JsClassId import framework.api.js.JsPrimitiveModel import framework.api.js.util.isJsBasic -import fuzzer.JsFuzzedValue import fuzzer.JsMethodDescription -import fuzzer.fuzzed - - +import org.utbot.framework.plugin.api.UtModel import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider import org.utbot.fuzzing.seeds.Bool -object BoolValueProvider : ValueProvider { +object BoolValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isJsBasic } - override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = + override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = sequence { yield(Seed.Known(Bool.TRUE()) { - JsPrimitiveModel(true).fuzzed { - summary = "%var% = true" - } + JsPrimitiveModel(true) }) yield(Seed.Known(Bool.FALSE()) { - JsPrimitiveModel(false).fuzzed { - summary = "%var% = false" - } + JsPrimitiveModel(false) }) } } diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt index 0913dca3cc..b82f06bdfd 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/NumberValueProvider.kt @@ -8,21 +8,20 @@ import fuzzer.JsFuzzedContext.GE import fuzzer.JsFuzzedContext.GT import fuzzer.JsFuzzedContext.LE import fuzzer.JsFuzzedContext.LT -import fuzzer.JsFuzzedValue import fuzzer.JsMethodDescription -import fuzzer.fuzzed +import org.utbot.framework.plugin.api.UtModel import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider import org.utbot.fuzzing.seeds.DefaultFloatBound import org.utbot.fuzzing.seeds.IEEE754Value -object NumberValueProvider : ValueProvider { +object NumberValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isJsBasic } - override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = + override fun generate(description: JsMethodDescription, type: JsClassId): Sequence> = sequence { description.concreteValues.forEach { (_, v, c) -> if (v is Double) { @@ -33,18 +32,14 @@ object NumberValueProvider : ValueProvider - JsPrimitiveModel(known.toDouble() + balance).fuzzed { - summary = "%var% = ${known.toDouble() + balance}" - } + JsPrimitiveModel(known.toDouble() + balance) }) } } DefaultFloatBound.values().forEach { bound -> // All numbers in JavaScript are like Double in Java/Kotlin yield(Seed.Known(bound(52, 11)) { known -> - JsPrimitiveModel(known.toDouble()).fuzzed { - summary = "%var% = ${known.toDouble()}" - } + JsPrimitiveModel(known.toDouble()) }) } } diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt index e3dbbd1359..9bf3ae29cc 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt @@ -3,19 +3,18 @@ package fuzzer.providers import framework.api.js.JsClassId import framework.api.js.JsConstructorId import framework.api.js.util.isClass -import fuzzer.JsFuzzedValue import fuzzer.JsIdProvider import fuzzer.JsMethodDescription -import fuzzer.fuzzed import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtExecutableCallModel +import org.utbot.framework.plugin.api.UtModel import org.utbot.framework.plugin.api.UtNullModel import org.utbot.fuzzing.Routine import org.utbot.fuzzing.Seed import org.utbot.fuzzing.ValueProvider import org.utbot.fuzzing.utils.hex -class ObjectValueProvider : ValueProvider { +class ObjectValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isClass @@ -32,7 +31,7 @@ class ObjectValueProvider : ValueProvider { + ): Seed.Recursive { return Seed.Recursive( construct = Routine.Create(constructorId.parameters) { values -> val id = JsIdProvider.createId() @@ -43,18 +42,13 @@ class ObjectValueProvider : ValueProvider { +object StringValueProvider : ValueProvider { override fun accept(type: JsClassId): Boolean { return type.isJsBasic @@ -20,7 +19,7 @@ object StringValueProvider : ValueProvider> = sequence { + ): Sequence> = sequence { val constants = description.concreteValues.asSequence() .filter { it.classId == jsStringClassId } val values = constants @@ -28,9 +27,7 @@ object StringValueProvider : ValueProvider yield(Seed.Known(StringValue(value)) { known -> - JsPrimitiveModel(known.value).fuzzed { - summary = "%var% = '${known.value}'" - } + JsPrimitiveModel(known.value) }) } } diff --git a/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt b/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt index d2e7c6440e..0a879df01d 100644 --- a/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt +++ b/utbot-js/src/main/kotlin/service/CoverageServiceProvider.kt @@ -3,7 +3,6 @@ package service import framework.api.js.JsMethodId import framework.api.js.JsPrimitiveModel import framework.api.js.util.isUndefined -import fuzzer.JsFuzzedValue import fuzzer.JsMethodDescription import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtModel @@ -57,7 +56,7 @@ function check_value(value, json) { } fun get( - fuzzedValues: List>, + fuzzedValues: List>, execId: JsMethodId, ): Pair, List> { return when (mode) { @@ -74,7 +73,7 @@ function check_value(value, json) { } private fun runBasicCoverageAnalysis( - fuzzedValues: List>, + fuzzedValues: List>, execId: JsMethodId, ): Pair, List> { val covFunName = instrumentationService.covFunName @@ -98,7 +97,7 @@ function check_value(value, json) { } private fun runFastCoverageAnalysis( - fuzzedValues: List>, + fuzzedValues: List>, execId: JsMethodId, ): Pair, List> { val covFunName = instrumentationService.covFunName @@ -133,7 +132,7 @@ fs.writeFileSync("$resFilePath", JSON.stringify(json)) } private fun makeStringForRunJs( - fuzzedValue: List, + fuzzedValue: List, method: JsMethodId, containingClass: String?, covFunName: String, @@ -165,14 +164,14 @@ fs.writeFileSync("$resFilePath$index.json", JSON.stringify(json$index)) } private fun makeCallFunctionString( - fuzzedValue: List, + fuzzedValue: List, method: JsMethodId, containingClass: String? ): String { val actualParams = description.thisInstance?.let { fuzzedValue.drop(1) } ?: fuzzedValue val initClass = containingClass?.let { if (!method.isStatic) { - description.thisInstance?.let { fuzzedValue[0].model.toCallString() } + description.thisInstance?.let { fuzzedValue[0].toCallString() } ?: "new ${JsTestGenerationSettings.fileUnderTestAliases}.${it}()" } else "${JsTestGenerationSettings.fileUnderTestAliases}.$it" } ?: JsTestGenerationSettings.fileUnderTestAliases @@ -180,7 +179,7 @@ fs.writeFileSync("$resFilePath$index.json", JSON.stringify(json$index)) callString += actualParams.joinToString( prefix = "(", postfix = ")", - ) { value -> value.model.toCallString() } + ) { value -> value.toCallString() } return callString } From 668ee70614caa7e54595426fe0c7f8c09f156d06 Mon Sep 17 00:00:00 2001 From: Vladislav Kasimov Date: Tue, 7 Mar 2023 17:55:56 +0300 Subject: [PATCH 7/7] Remove redundant map call --- utbot-js/src/main/kotlin/api/JsTestGenerator.kt | 4 ++-- .../src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt index 46e8781c56..fa6d76d5ec 100644 --- a/utbot-js/src/main/kotlin/api/JsTestGenerator.kt +++ b/utbot-js/src/main/kotlin/api/JsTestGenerator.kt @@ -265,8 +265,8 @@ class JsTestGenerator( return@runFuzzing JsFeedback(Control.PASS) } else if (!currentlyCoveredStmts.containsAll(covData.additionalCoverage)) { val (thisObject, modelList) = if (!funcNode.parent!!.isClassMembers) { - null to params.map { it } - } else params[0] to params.drop(1).map { it } + null to params + } else params[0] to params.drop(1) val initEnv = EnvironmentModels(thisObject, modelList, mapOf()) emit( diff --git a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt index 9bf3ae29cc..12ea5e6ab6 100644 --- a/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt +++ b/utbot-js/src/main/kotlin/fuzzer/providers/ObjectValueProvider.kt @@ -42,7 +42,8 @@ class ObjectValueProvider : ValueProvider