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

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

package it.unibo.tuprolog.solve.function.testutils

import it.unibo.tuprolog.core.Atom
import it.unibo.tuprolog.core.Struct
import it.unibo.tuprolog.core.Term
import it.unibo.tuprolog.solve.DummyInstances
import it.unibo.tuprolog.solve.ExecutionContext
import it.unibo.tuprolog.solve.Signature
import it.unibo.tuprolog.solve.function.ExpressionEvaluator
import it.unibo.tuprolog.solve.function.LogicFunction
import it.unibo.tuprolog.solve.library.Library
import it.unibo.tuprolog.solve.library.Runtime
import it.unibo.tuprolog.solve.library.toRuntime
import it.unibo.tuprolog.solve.primitive.Solve

/**
 * Utils singleton to help testing [ExpressionEvaluator]
 *
 * @author Enrico
 */
internal object ExpressionEvaluatorUtils {

    /** A context with empty functions map */
    internal val noFunctionsContext = object : ExecutionContext by DummyInstances.executionContext {
        override val libraries: Runtime = Runtime.empty()
    }

    internal val noFunctionRequest = Solve.Request(
        signature = Signature("dummy", 0),
        arguments = emptyList(),
        context = noFunctionsContext
    )

    /** Test data is in the form (input, transforming function, expected output) */
    internal val inputFunctionOutputTriple by lazy {
        listOf>(
            Triple(
                Atom.of("a"),
                LogicFunction { request -> request.replyWith(Atom.of("b")) },
                Atom.of("b")
            ),
            Triple(
                Struct.of("extractAnotherTerm", Atom.of("b")),
                LogicFunction { request -> with(request) { replyWith(Struct.of("resultTerm", arguments.single())) } },
                Struct.of("resultTerm", Atom.of("b"))
            ),
            Triple(
                Struct.of("concat", Atom.of("a"), Atom.of("b")),
                LogicFunction { request ->
                    with(request) {
                        replyWith(
                            Atom.of(
                                arguments.first().toString() + arguments.last().toString()
                            )
                        )
                    }
                },
                Atom.of("ab")
            ),
            Triple(
                Struct.of(
                    "concat",
                    Struct.of("concat", Atom.of("a"), Atom.of("b")),
                    Struct.of("concat", Atom.of("a"), Atom.of("b"))
                ),
                LogicFunction { request ->
                    with(request) {
                        replyWith(
                            Atom.of(
                                arguments.first().toString() + arguments.last().toString()
                            )
                        )
                    }
                },
                Atom.of("abab")
            )
        )
    }

    /** Creates a context with provided signature-function binding */
    private fun createContextWithFunctionBy(signature: Signature, function: LogicFunction): ExecutionContext =
        object : ExecutionContext by DummyInstances.executionContext {
            override val libraries: Runtime = Library.of(
                alias = "test.expression.evaluator",
                functions = mapOf(signature to function)
            ).toRuntime()
        }

    internal fun createRequestWithFunctionBy(
        signature: Signature,
        function: LogicFunction
    ): Solve.Request =
        Solve.Request(
            signature = Signature("dummy", 0),
            arguments = emptyList(),
            context = createContextWithFunctionBy(signature, function)
        )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy