All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonTest.it.unibo.tuprolog.solve.testutils.SolveUtils.kt Maven / Gradle / Ivy

package it.unibo.tuprolog.solve.testutils

import it.unibo.tuprolog.core.Atom
import it.unibo.tuprolog.core.Fact
import it.unibo.tuprolog.core.Substitution
import it.unibo.tuprolog.core.Term
import it.unibo.tuprolog.core.Truth
import it.unibo.tuprolog.solve.DummyInstances
import it.unibo.tuprolog.solve.ExecutionContext
import it.unibo.tuprolog.solve.Signature
import it.unibo.tuprolog.solve.Solution
import it.unibo.tuprolog.solve.TimeDuration
import it.unibo.tuprolog.solve.TimeInstant
import it.unibo.tuprolog.solve.exception.ResolutionException
import it.unibo.tuprolog.solve.library.Library
import it.unibo.tuprolog.solve.library.Runtime
import it.unibo.tuprolog.solve.primitive.Solve
import it.unibo.tuprolog.solve.sideffects.SideEffect
import it.unibo.tuprolog.solve.sideffects.SideEffectManager
import it.unibo.tuprolog.theory.Theory
import kotlin.test.assertNotEquals
import kotlin.collections.List as KtList

/**
 * Utils singleton to help testing [Solve]
 *
 * @author Enrico
 */
internal object SolveUtils {

    internal val someLibraries = Runtime.empty()
    internal val someFlags = emptyMap()
    internal val aStaticKB = Theory.empty()
    internal val aDynamicKB = Theory.empty()

    // Request parameters
    internal val aSignature = Signature("ciao", 2)
    internal val anArgumentList = listOf(Atom.of("a"), Truth.TRUE)
    internal val anExecutionContext = DummyInstances.executionContext
    internal const val aRequestIssuingInstant = 0L
    internal const val anExecutionMaxDuration = 300L

    internal val aVarargSignature = Signature("ciao", 2, true)
    internal val varargArgumentList = anArgumentList + Truth.TRUE

    internal val differentLibraries by lazy {
        Runtime.of(Library.of(alias = "test")).also { assertNotEquals(it, someLibraries) }
    }
    internal val differentFlags by lazy {
        mapOf(Truth.TRUE.value to Truth.FAIL).also { assertNotEquals(it, someFlags) }
    }
    internal val differentStaticKB by lazy {
        Theory.indexedOf(Fact.of(Truth.TRUE)).also { assertNotEquals(it, aStaticKB) }
    }
    internal val differentDynamicKB by lazy {
        Theory.indexedOf(Fact.of(Truth.TRUE)).also { assertNotEquals(it, aDynamicKB) }
    }

    internal val solutionSubstitution = Substitution.of("A", Truth.TRUE)
    internal val solutionException = ResolutionException(context = DummyInstances.executionContext)

    // Response parameters
    internal val aSolution = Solution.no(Truth.FAIL)
    internal val aSideEffectManager = object : SideEffectManager {
        override fun cut() = throw NotImplementedError()
    }
    internal val someSideEffects = listOf(SideEffect.ResetDynamicKb())

    /** The success response to default values request */
    internal val defaultRequestSuccessResponse by lazy {
        Solve.Response(
            Solution.yes(aSignature, anArgumentList, solutionSubstitution),
            aSideEffectManager,
            SideEffect.ResetRuntime(differentLibraries),
            SideEffect.ResetFlags(differentFlags),
            SideEffect.ResetStaticKb(differentStaticKB),
            SideEffect.ResetDynamicKb(differentDynamicKB)
        )
    }

    /** The failed response to default values request */
    internal val defaultRequestFailedResponse by lazy {
        Solve.Response(
            Solution.no(aSignature, anArgumentList),
            aSideEffectManager,
            SideEffect.ResetRuntime(differentLibraries),
            SideEffect.ResetFlags(differentFlags),
            SideEffect.ResetStaticKb(differentStaticKB),
            SideEffect.ResetDynamicKb(differentDynamicKB)
        )
    }

    /** The halt response to default values request */
    internal val defaultRequestHaltedResponse by lazy {
        Solve.Response(
            Solution.halt(aSignature, anArgumentList, solutionException),
            aSideEffectManager,
            SideEffect.ResetRuntime(differentLibraries),
            SideEffect.ResetFlags(differentFlags),
            SideEffect.ResetStaticKb(differentStaticKB),
            SideEffect.ResetDynamicKb(differentDynamicKB)
        )
    }

    /** The various responses to default request */
    internal val defaultRequestResponses by lazy {
        listOf(defaultRequestSuccessResponse, defaultRequestFailedResponse, defaultRequestHaltedResponse)
    }

    /** Utility function to create a request with some default values */
    internal fun createRequest(
        signature: Signature = aSignature,
        arguments: KtList = anArgumentList,
        executionContext: ExecutionContext = anExecutionContext,
        requestIssuingInstant: TimeInstant = aRequestIssuingInstant,
        executionMaxDuration: TimeDuration = anExecutionMaxDuration
    ) = Solve.Request(signature, arguments, executionContext, requestIssuingInstant, executionMaxDuration)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy