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

commonMain.ch.tutteli.atrium.specs.integration.IterableToContainInAnyOrderOnlyValuesExpectationsSpec.kt Maven / Gradle / Ivy

package ch.tutteli.atrium.specs.integration

import ch.tutteli.atrium.api.fluent.en_GB.*
import ch.tutteli.atrium.api.verbs.internal.expect
import ch.tutteli.atrium.creating.Expect
import ch.tutteli.atrium.logic.creating.iterablelike.contains.reporting.InAnyOrderOnlyReportingOptions
import ch.tutteli.atrium.specs.*

abstract class IterableToContainInAnyOrderOnlyValuesExpectationsSpec(
    toContainInAnyOrderOnlyValues: Fun3, Double, Array, InAnyOrderOnlyReportingOptions.() -> Unit>,
    toContainInAnyOrderOnlyNullableValues: Fun3, Double?, Array, InAnyOrderOnlyReportingOptions.() -> Unit>,
    describePrefix: String = "[Atrium] "
) : IterableToContainSpecBase({

    include(object : SubjectLessSpec>(
        describePrefix,
        toContainInAnyOrderOnlyValues.forSubjectLess(2.5, arrayOf(), emptyInAnyOrderOnlyReportOptions)

    ) {})
    include(object : SubjectLessSpec>(
        describePrefix,
        toContainInAnyOrderOnlyNullableValues.forSubjectLess(2.5, arrayOf(), emptyInAnyOrderOnlyReportOptions)
    ) {})

    nonNullableCases(
        describePrefix,
        toContainInAnyOrderOnlyValues,
        toContainInAnyOrderOnlyNullableValues
    ) { toContainValuesFunArr ->

        fun Expect>.toContainFun(
            t: Double,
            vararg tX: Double,
            report: InAnyOrderOnlyReportingOptions.() -> Unit = emptyInAnyOrderOnlyReportOptions
        ) = toContainValuesFunArr(t, tX.toTypedArray(), report)

        context("empty collection") {
            it("1.0 throws AssertionError") {
                expect {
                    expect(fluentEmpty()).toContainFun(1.0)
                }.toThrow {
                    message {
                        // TODO 1.3.0 we should be able to switch to the following, i.e. the elements should define an own level
//                        toContain(
//                            "$g$toContainInAnyOrderOnly :",
//                            "$x$anElementWhichEquals : 1.0"
//                        )
                        toContainRegex(
                            "\\Q$g\\E$toContainInAnyOrderOnly :",
                            "\\Q$x\\E$anElementWhichEquals\\s+: 1.0"
                        )
                        notToContain(additionalElements)
                        toContainSize(0, 1)
                    }
                }
            }
            it("1.0 and 4.0 throws AssertionError") {
                expect {
                    expect(fluentEmpty()).toContainFun(1.0, 4.0)
                }.toThrow {
                    message {
//                        toContain.exactly(1).values(
//                            "$g$toContainInAnyOrderOnly :",
//                            "$x$anElementWhichEquals : 1.0",
//                            "$x$anElementWhichEquals : 4.0"
//                        )
                        toContain.exactly(1).regex(
                            "\\Q$g\\E$toContainInAnyOrderOnly :",
                            "\\Q$x\\E$anElementWhichEquals\\s+: 1.0",
                            "\\Q$x\\E$anElementWhichEquals\\s+: 4.0"
                        )
                        notToContain(additionalElements)
                        toContainSize(0, 2)
                    }
                }
            }
        }

        context("iterable ${oneToFour().toList()}") {

            context("happy cases") {
                listOf(
                    arrayOf(1.0, 2.0, 3.0, 4.0, 4.0),
                    arrayOf(1.0, 3.0, 2.0, 4.0, 4.0),
                    arrayOf(3.0, 4.0, 2.0, 1.0, 4.0),
                    arrayOf(2.0, 4.0, 4.0, 1.0, 3.0),
                    arrayOf(2.0, 4.0, 1.0, 4.0, 3.0),
                    arrayOf(4.0, 4.0, 3.0, 2.0, 1.0)
                ).forEach {
                    it(it.joinToString()) {
                        expect(oneToFour()).toContainFun(it.first(), *it.drop(1).toDoubleArray())
                    }
                }
            }

            context("error cases (throws AssertionError)") {

                context("additional entries") {
                    it("1.0, 2.0, 3.0, 4.0 -- 4.0 was missing") {
                        expect {
                            expect(oneToFour()).toContainFun(1.0, 2.0, 3.0, 4.0)
                        }.toThrow {
                            message {
                                toContain.exactly(1).values(
                                    "$g$toContainInAnyOrderOnly :",
                                    "$bb$additionalElements :",
                                    "${listBulletPoint}4.0"
                                )
                                toContain.exactly(1).regex(
                                    //TODO 1.3.0 should be just $anElementWhichEquals :
                                    "$s$anElementWhichEquals\\s+: 1.0",
                                    "$s$anElementWhichEquals\\s+: 2.0",
                                    "$s$anElementWhichEquals\\s+: 3.0",
                                    "$s$anElementWhichEquals\\s+: 4.0",
                                )
                                toContainSize(5, 4)
                            }
                        }
                    }

                    it("1.0, 4.0 -- 2.0, 3.0 and 4.0 was missing") {
                        expect {
                            expect(oneToFour()).toContainFun(1.0, 4.0)
                        }.toThrow {
                            message {
                                toContain.exactly(1).values(
                                    "$g$toContainInAnyOrderOnly :",
                                    "$bb$additionalElements :",
                                    "${listBulletPoint}2.0",
                                    "${listBulletPoint}3.0",
                                    "${listBulletPoint}4.0"
                                )
                                toContain.exactly(1).regex(
                                    "$s$anElementWhichEquals\\s+: 1.0",
                                    "$s$anElementWhichEquals\\s+: 4.0",
                                )
                                toContainSize(5, 2)
                            }
                        }
                    }
                }

                context("mismatches") {
                    it("1.0, 2.0, 3.0, 4.0, 5.0") {
                        expect {
                            expect(oneToFour()).toContainFun(1.0, 2.0, 3.0, 4.0, 5.0)
                        }.toThrow {
                            message {
                                toContain.exactly(1).values(
                                    "$g$toContainInAnyOrderOnly :",
                                    "$bb$mismatches :",
                                    "${listBulletPoint}4.0"
                                )
                                toContain.exactly(1).regex(
                                    "$s $anElementWhichEquals\\s+: 1.0",
                                    "$s $anElementWhichEquals\\s+: 2.0",
                                    "$s $anElementWhichEquals\\s+: 3.0",
                                    "$x$anElementWhichEquals\\s+: 5.0",
                                )
                                notToContain(sizeDescr)
                            }
                        }
                    }
                }

                context("mismatches and additional entries") {
                    it("1.0, 3.0, 5.0 -- 5.0 is wrong and 2.0, 4.0 and 4.0 are missing") {
                        expect {
                            expect(oneToFour()).toContainFun(1.0, 3.0, 5.0)
                        }.toThrow {
                            message {
                                toContain.exactly(1).values(
                                    "$g$toContainInAnyOrderOnly :",
                                    "$indentG$bb$mismatchesAdditionalElements :",
                                    "$indentG$indentBb${listBulletPoint}2.0"
                                )
                                toContain.exactly(1).regex(
                                    "$s $anElementWhichEquals\\s+: 1.0",
                                    "$s $anElementWhichEquals\\s+: 3.0",
                                    "$x$anElementWhichEquals\\s+: 5.0",
                                )
                                toContain.exactly(2).value("$indentG$indentBb${listBulletPoint}4.0")
                                toContainSize(5, 3)
                            }
                        }
                    }
                }

                context("too many matcher") {
                    it("1.0, 2.0, 3.0, 4.0, 4.0, 5.0 -- 5.0 was too much") {
                        expect {
                            expect(oneToFour()).toContainFun(1.0, 2.0, 3.0, 4.0, 4.0, 5.0)
                        }.toThrow {
                            message {
                                toContain.exactly(1).values(
                                    "$g$toContainInAnyOrderOnly :",
                                )
                                toContain.exactly(1).regex(
                                    "$s $anElementWhichEquals\\s+: 1.0",
                                    "$s $anElementWhichEquals\\s+: 2.0",
                                    "$s $anElementWhichEquals\\s+: 3.0",
                                    "$x$anElementWhichEquals\\s+: 5.0"
                                )
                                toContain.exactly(2).regex("$s $anElementWhichEquals\\s+: 4.0")
                                toContainSize(5, 6)
                                notToContain(additionalElements, mismatches, mismatchesAdditionalElements)
                            }
                        }
                    }
                }
            }
        }

        context("report options") {
            context("iterable ${oneToFour().toList()}") {
                it("shows only failing with report option `showOnlyFailing`") {
                    expect {
                        expect(oneToFour()).toContainFun(2.0, report = { showOnlyFailing() })
                    }.toThrow {
                        message {
                            toContainSize(5, 1)
                            toContain.exactly(1).values(
                                "$g$toContainInAnyOrderOnly :",
                                "$bb$additionalElements :",
                                "${listBulletPoint}1.0",
                                "${listBulletPoint}3.0"
                            )
                            toContain.exactly(2).value("${listBulletPoint}4.0")
                            notToContain.regex("$anElementWhichEquals\\s+: 2.0")

                        }
                    }
                }
                it("shows only failing with report option `showOnlyFailingIfMoreExpectedElementsThan(3)` because there are 5") {
                    expect {
                        expect(oneToFour()).toContainFun(
                            1.0,
                            2.0,
                            3.0,
                            4.0,
                            4.0,
                            5.0,
                            report = { showOnlyFailingIfMoreExpectedElementsThan(3) })
                    }.toThrow {
                        message {
                            toContainSize(5, 6)
                            toContain.exactly(1).regex("$x$anElementWhichEquals\\s+: 5.0")
                            notToContain.regex(
                                "$anElementWhichEquals\\s+: 1.0",
                                "$anElementWhichEquals\\s+: 2.0",
                                "$anElementWhichEquals\\s+: 3.0",
                                "$anElementWhichEquals\\s+: 4.0"
                            )
                            notToContain(additionalElements, mismatches, mismatchesAdditionalElements)
                        }
                    }
                }

            }

            context("iterable $oneToEleven") {
                it("shows only failing per default as there are more than 10 expected elements") {
                    expect {
                        expect(oneToEleven).toContainFun(
                            1.0,
                            2.0,
                            3.0,
                            4.0,
                            -1.0,
                            6.0,
                            7.0,
                            -2.0,
                            9.0,
                            10.0,
                            11.0
                        )
                    }.toThrow {
                        message {
                            toContain.exactly(1).regex(
                                "$x$anElementWhichEquals\\s+: -1.0",
                                "$x$anElementWhichEquals\\s+: -2.0",
                                "$bb$mismatches :",
                                "${listBulletPoint}5.0",
                                "${listBulletPoint}8.0"
                            )
                            notToContain.regex(
                                "$anElementWhichEquals\\s+: 1.0",
                                "$anElementWhichEquals\\s+: 2.0",
                                "$anElementWhichEquals\\s+: 3.0",
                                "$anElementWhichEquals\\s+: 4.0",
                                "$anElementWhichEquals\\s+: 6.0",
                                "$anElementWhichEquals\\s+: 7.0",
                                "$anElementWhichEquals\\s+: 9.0",
                                "$anElementWhichEquals\\s+: 10.0",
                                "$anElementWhichEquals\\s+: 11.0",

                                additionalElements, mismatchesAdditionalElements
                            )
                        }
                    }
                }
                it("shows all with report option `showAlwaysSummary`") {
                    expect {
                        expect(oneToEleven).toContainFun(
                            1.0,
                            2.0,
                            3.0,
                            4.0,
                            -1.0,
                            6.0,
                            7.0,
                            -2.0,
                            9.0,
                            10.0,
                            11.0,
                            report = { showAlwaysSummary() }
                        )
                    }.toThrow {
                        message {
                            toContain.exactly(1).regex(
                                "$s $anElementWhichEquals\\s+: 1.0",
                                "$s $anElementWhichEquals\\s+: 2.0",
                                "$s $anElementWhichEquals\\s+: 3.0",
                                "$s $anElementWhichEquals\\s+: 4.0",
                                "$x$anElementWhichEquals\\s+: -1.0",
                                "$s $anElementWhichEquals\\s+: 6.0",
                                "$s $anElementWhichEquals\\s+: 7.0",
                                "$x$anElementWhichEquals\\s+: -2.0",
                                "$s $anElementWhichEquals\\s+: 9.0",
                                "$s $anElementWhichEquals\\s+: 10.0",
                                "$s $anElementWhichEquals\\s+: 11.0",
                                "$bb$mismatches :",
                                "${listBulletPoint}5.0",
                                "${listBulletPoint}8.0"
                            )
                            notToContain(additionalElements, mismatchesAdditionalElements)
                        }
                    }
                }
            }
        }
    }


    nullableCases(describePrefix) {


        fun Expect>.toContainFun(
            t: Double?,
            vararg tX: Double?,
            report: InAnyOrderOnlyReportingOptions.() -> Unit = emptyInAnyOrderOnlyReportOptions
        ) = toContainInAnyOrderOnlyNullableValues(this, t, tX, report)


        describeFun(toContainInAnyOrderOnlyValues) {

            val null1null3 = { sequenceOf(null, 1.0, null, 3.0).constrainOnce().asIterable() }

            context("iterable ${null1null3().toList()}") {
                context("happy cases (do not throw)") {
                    it("null, 1.0, null, 3.0") {
                        expect(null1null3()).toContainFun(null, 1.0, null, 3.0)
                    }
                    it("1.0, null, null, 3.0") {
                        expect(null1null3()).toContainFun(1.0, null, null, 3.0)
                    }
                    it("1.0, null, 3.0, null") {
                        expect(null1null3()).toContainFun(1.0, null, 3.0, null)
                    }
                    it("1.0, 3.0, null, null") {
                        expect(null1null3()).toContainFun(1.0, 3.0, null, null)
                    }
                }

                context("failing cases") {
                    it("null, 1.0, 3.0 -- null was missing") {
                        expect {
                            expect(null1null3()).toContainFun(null, 1.0, 3.0)
                        }.toThrow {
                            message {
                                toContain.exactly(1).regex(
                                    "$g$toContainInAnyOrderOnly :",
                                    "$s$anElementWhichEquals\\s+: null",
                                    "$s$anElementWhichEquals\\s+: 1.0",
                                    "$s$anElementWhichEquals\\s+: 3.0",
                                    "$bb$additionalElements :",
                                    "${listBulletPoint}null"
                                )
                                toContainSize(4, 3)
                            }
                        }
                    }
                }
            }
        }
    }
})




© 2015 - 2025 Weber Informatics LLC | Privacy Policy