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

net.serenitybdd.screenplay.ensure.KnowableValue.kt Maven / Gradle / Ivy

package net.serenitybdd.screenplay.ensure

import net.serenitybdd.core.pages.WebElementFacade
import net.serenitybdd.screenplay.Actor
import net.serenitybdd.screenplay.Question
import net.serenitybdd.screenplay.questions.EnumValues
import net.serenitybdd.screenplay.targets.Target
import org.openqa.selenium.By
import java.math.BigDecimal
import java.time.LocalDate
import java.time.LocalTime
import java.time.format.DateTimeFormatter


typealias KnowableValue = (Actor) -> A?

class KnowableStringValue(val value : KnowableValue, val description: String) : KnowableValue {
    override fun invoke(actor: Actor) = value(actor).toString()
    override fun toString() = description
}

class KnowableIntValue(val value : KnowableValue, val description: String) : KnowableValue {
    override fun invoke(actor: Actor)= value(actor).toString().toInt()
    override fun toString() = description
}

class KnowableDoubleValue(val value : KnowableValue, val description: String) : KnowableValue {
    override fun invoke(actor: Actor) = value(actor).toString().toDouble()
    override fun toString() = description
}

class KnowableFloatValue(val value : KnowableValue, val description: String) : KnowableValue {
    override fun invoke(actor: Actor) = value(actor).toString().toFloat()
    override fun toString() = description
}

class KnowableBigDecimalValue(val value : KnowableValue, val description: String) : KnowableValue {
    override fun invoke(actor: Actor) = value(actor).toString().toBigDecimal()
    override fun toString() = description
}

class KnowableLocalDateValue(val value : KnowableValue, val description: String, val format: String? = null) : KnowableValue {
    override fun invoke(actor: Actor): LocalDate? {
        val resolvedValue = value(actor)
        return if (resolvedValue is LocalDate) resolvedValue else parsedDateFor(resolvedValue.toString())
    }
    override fun toString() = description

    private fun parsedDateFor(dateValue: String) : LocalDate {
        val formatter = if (format != null) DateTimeFormatter.ofPattern(format) else DateTimeFormatter.ISO_LOCAL_DATE
        return LocalDate.parse(dateValue, formatter)
    }
}

class KnowableLocalTimeValue(val value : KnowableValue, val description: String, val format: String? = null) : KnowableValue {
    override fun invoke(actor: Actor): LocalTime? {
        val resolvedValue = value(actor)
        return if (resolvedValue is LocalTime) resolvedValue else parsedTimeFor(resolvedValue.toString())
    }
    override fun toString() = description

    private fun parsedTimeFor(dateValue: String) : LocalTime {
        val formatter = if (format != null) DateTimeFormatter.ofPattern(format) else DateTimeFormatter.ISO_LOCAL_TIME
        return LocalTime.parse(dateValue, formatter)
    }
}

class KnowableBooleanValue(val value : KnowableValue, val description: String) : KnowableValue {
    override fun invoke(actor: Actor) = value(actor).toString().toBoolean()
    override fun toString() = description
}

class KnownValue(val value: A?, val description: String) : KnowableValue {
    override fun invoke(actor: Actor): A? = value
    override fun toString() = description
}

interface HasSubject {
    fun subject() : String
}

class KnowableAnswer(val question: Question, val description: String) : KnowableValue, HasSubject {
    override fun invoke(actor: Actor): A? = question.answeredBy(actor)
    override fun toString() = description
    override fun subject() = question.subject
}

class KnowableStringAnswer(val question: Question, val description: String) : KnowableValue, HasSubject {
    override fun invoke(actor: Actor): String? = question.answeredBy(actor)
    override fun toString() = description
    override fun subject() = question.subject
}

class KnowableBooleanAnswer(val question: Question, val description: String) : KnowableValue, HasSubject {
    override fun invoke(actor: Actor): Boolean? = question.answeredBy(actor)
    override fun toString() = description
    override fun subject() = question.subject
}

class KnowableComparableAnswer(val question: Question, val description: String) : KnowableValue, HasSubject {
    override fun invoke(actor: Actor): A = question.answeredBy(actor)
    override fun toString() = description
    override fun subject() = question.subject
}

class KnowableCollectionAnswer(val question: Question>, val description: String) : KnowableValue>, HasSubject {

    override fun invoke(actor: Actor): Collection = question.answeredBy(actor)
    override fun toString() = description
    override fun subject() = question.subject
}

class KnowableListAnswer(val question: Question>, val description: String) : KnowableValue>, HasSubject {

    override fun invoke(actor: Actor): List = question.answeredBy(actor)
    override fun toString() = description
    override fun subject() = question.subject
}

class KnowableCollectionTarget(val target: Target, val description: String = pluralFormOf(target.name)) : KnowableValue?> {

    constructor(locator: By) : this(Target.the(locator.toString()).located(locator))

    override fun invoke(actor: Actor): List = target.resolveAllFor(actor)
    override fun toString() = description
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy