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

commonTest.it.unibo.tuprolog.solve.exception.LogicErrorTest.kt Maven / Gradle / Ivy

package it.unibo.tuprolog.solve.exception

import it.unibo.tuprolog.solve.ExecutionContext
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.aCause
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.aContext
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.aDifferentContext
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.aMessage
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.aType
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.assertEqualPrologErrorData
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.assertErrorStructCorrect
import it.unibo.tuprolog.solve.exception.testutils.LogicErrorUtils.someExtraData
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull

/**
 * Test class for [LogicError]
 *
 * @author Enrico
 */
internal class LogicErrorTest {

    /** A non specific LogicError instance */
    private val underTestPrologError = object : LogicError(aMessage, aCause, aContext, aType, someExtraData) {
        override fun updateContext(newContext: ExecutionContext, index: Int): LogicError =
            of(this.message, this.cause, this.contexts.setItem(index, newContext), this.type, this.extraData)

        override fun updateLastContext(newContext: ExecutionContext): LogicError =
            updateContext(newContext, contexts.lastIndex)

        override fun pushContext(newContext: ExecutionContext): LogicError =
            of(this.message, this.cause, this.contexts.addLast(newContext), this.type, this.extraData)
    }

    /** Specific prolog error instances */
    private val logicErrorTypeToInstanceMap = LogicErrorUtils.recognizedSubTypes.map { (typeParam, _) ->
        typeParam to LogicError.of(aMessage, aCause, aContext, typeParam, someExtraData)
    }

    @Test
    fun holdsInsertedData() {
        assertEqualPrologErrorData(aMessage, aCause, aContext, aType, someExtraData, underTestPrologError)
    }

    @Test
    fun defaultsAreNull() {
        val toBeTested = object : LogicError(context = aContext, type = aType) {
            override fun updateContext(newContext: ExecutionContext, index: Int): LogicError =
                of(this.message, this.cause, this.contexts.setItem(index, newContext), this.type, this.extraData)

            override fun updateLastContext(newContext: ExecutionContext): LogicError =
                updateContext(newContext, contexts.lastIndex)

            override fun pushContext(newContext: ExecutionContext): LogicError =
                of(this.message, this.cause, this.contexts.addLast(newContext), this.type, this.extraData)
        }
        assertNull(toBeTested.message)
        assertNull(toBeTested.cause)
        assertNull(toBeTested.extraData)
    }

    @Test
    fun constructorInsertsMessageIfOnlyCauseSpecified() {
        val logicError = object : LogicError(aCause, aContext, aType, someExtraData) {
            override fun updateContext(newContext: ExecutionContext, index: Int): LogicError =
                of(this.message, this.cause, this.contexts.setItem(index, newContext), this.type, this.extraData)

            override fun updateLastContext(newContext: ExecutionContext): LogicError =
                updateContext(newContext, contexts.lastIndex)

            override fun pushContext(newContext: ExecutionContext): LogicError =
                of(this.message, this.cause, this.contexts.addLast(newContext), this.type, this.extraData)
        }

        assertEquals(aCause.toString(), logicError.message)
    }

    @Test
    fun errorIsComputedCorrectly() {
        assertErrorStructCorrect(underTestPrologError)
        assertErrorStructCorrect(
            object : LogicError(context = aContext, type = aType) {
                override fun updateContext(newContext: ExecutionContext, index: Int): LogicError =
                    of(this.message, this.cause, this.contexts.setItem(index, newContext), this.type, this.extraData)

                override fun updateLastContext(newContext: ExecutionContext): LogicError =
                    updateContext(newContext, contexts.lastIndex)

                override fun pushContext(newContext: ExecutionContext): LogicError =
                    of(this.message, this.cause, this.contexts.addLast(newContext), this.type, this.extraData)
            }
        )
    }

    @Test
    fun updateContextReturnsExceptionWithSameContentsButUpdatedContext() {
        val allPrologErrorInstances = logicErrorTypeToInstanceMap + (aType to underTestPrologError)

        allPrologErrorInstances.forEach { (type, prologError) ->
            val toBeTested = prologError.updateContext(aDifferentContext)

            assertEqualPrologErrorData(aMessage, aCause, aDifferentContext, type, someExtraData, toBeTested)
        }
    }

    @Test
    fun ofCreatesCorrectSubInstanceIfDetected() {
        LogicErrorUtils.recognizedSubTypes.forEach { (typeParam, expectedType) ->
            val actualError = LogicError.of(context = aContext, type = typeParam)
            assertEquals(expectedType, actualError::class)
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy