Skip to content

Disabled concrete execution for lambda results #989

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,8 @@ class UtLambdaModel(
.singleOrNull { it.name == lambdaName }
?.executableId // synthetic lambda methods should not have overloads, so we always expect there to be only one method with the given name
?: error("More than one method with name $lambdaName found in class: ${declaringClass.canonicalName}")

override fun toString(): String = "Anonymous function $lambdaName implementing functional interface $declaringClass"
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
package org.utbot.examples.lambda

import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import org.utbot.framework.plugin.api.CodegenLanguage
import org.utbot.testcheckers.eq
import org.utbot.tests.infrastructure.CodeGeneration
import org.utbot.tests.infrastructure.DoNotCalculate
import org.utbot.tests.infrastructure.UtValueTestCaseChecker
import org.utbot.tests.infrastructure.isException
import org.utbot.testcheckers.eq

class SimpleLambdaExamplesTest : UtValueTestCaseChecker(testClass = SimpleLambdaExamples::class) {
// TODO failed Kotlin compilation (generics) SAT-1332
class SimpleLambdaExamplesTest : UtValueTestCaseChecker(
testClass = SimpleLambdaExamples::class,
languagePipelines = listOf(
CodeGenerationLanguageLastStage(CodegenLanguage.JAVA),
CodeGenerationLanguageLastStage(CodegenLanguage.KOTLIN, CodeGeneration),
)
) {
@Test
fun testBiFunctionLambdaExample() {
checkWithException(
Expand All @@ -18,14 +27,13 @@ class SimpleLambdaExamplesTest : UtValueTestCaseChecker(testClass = SimpleLambda
}

@Test
@Disabled("TODO 0 executions https://github.com/UnitTestBot/UTBotJava/issues/192")
fun testChoosePredicate() {
check(
SimpleLambdaExamples::choosePredicate,
eq(2),
{ b, r -> b && !r!!.test(null) && r.test(0) },
{ b, r -> !b && r!!.test(null) && !r.test(0) },
// TODO coverage calculation fails https://github.com/UnitTestBot/UTBotJava/issues/192
coverage = DoNotCalculate // coverage could not be calculated since method result is lambda
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.isActive
import kotlinx.coroutines.job
import kotlinx.coroutines.yield
import org.utbot.framework.plugin.api.UtExecutionSuccess
import org.utbot.framework.plugin.api.UtLambdaModel

val logger = KotlinLogging.logger {}
val pathLogger = KotlinLogging.logger(logger.name + ".path")
Expand Down Expand Up @@ -562,6 +564,17 @@ class UtBotSymbolicEngine(
return
}

// Check for lambda result as it cannot be emitted by concrete execution
(symbolicExecutionResult as? UtExecutionSuccess)?.takeIf { it.model is UtLambdaModel }?.run {
logger.debug {
"processResult<${methodUnderTest}>: impossible to create concrete value for lambda result ($model), " +
"emit purely symbolic result $symbolicUtExecution"
}

emit(symbolicUtExecution)
return
}

//It's possible that symbolic and concrete stateAfter/results are diverged.
//So we trust concrete results more.
try {
Expand Down