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

com.wesleyhome.test.jupiter.provider.FloatValueSourceDataProvider.kt Maven / Gradle / Ivy

Go to download

Library to help generate test parameter permutations for parameterized tests in JUnit. This version is an initial attempt to convert to building with Gradle.

There is a newer version: 3.0.0
Show newest version
package com.wesleyhome.test.jupiter.provider

import com.wesleyhome.test.jupiter.annotations.FloatRangeSource
import com.wesleyhome.test.jupiter.annotations.FloatSource
import java.util.concurrent.atomic.AtomicReference

object FloatValueSourceDataProvider : AbstractParameterDataProvider() {

    override fun providesDataFor(testParameter: TestParameter): Boolean {
        return super.providesDataFor(testParameter) && findAnnotation(testParameter) != null
    }

    override fun createParameterOptionsData(testParameter: TestParameter): List {
        return findAnnotation(testParameter)!!.values.toList()
    }

    private fun findAnnotation(testParameter: TestParameter) =
        testParameter.annotations.firstOrNull { it is FloatSource }.let { annotation ->
            if (annotation == null) {
                null
            } else {
                annotation as FloatSource
            }
        }
}

object FloatRangeDataProvider : AbstractParameterDataProvider() {

    override fun providesDataFor(testParameter: TestParameter): Boolean {
        return super.providesDataFor(testParameter) && findAnnotation(testParameter) != null
    }

    override fun createParameterOptionsData(testParameter: TestParameter): List {
        val s = findAnnotation(testParameter)!!
        if (s.increment <= 0) {
            throw IllegalArgumentException("increment must be greater than 0")
        }
        if (s.min >= s.max) {
            throw IllegalArgumentException("min must be less than or equal to max")
        }
        val range = (s.min..s.max step s.increment).toList()
        return if (s.ascending) {
            range
        } else {
            range.reversed()
        }
    }

    private fun findAnnotation(testParameter: TestParameter) =
        testParameter.annotations.firstOrNull { it is FloatRangeSource }.let { annotation ->
            if (annotation == null) {
                null
            } else {
                annotation as FloatRangeSource
            }
        }
}

class FloatProgression(
    private val min: Float,
    private val max: Float,
    private val step: Float
) : Iterable {

    private val range: ClosedFloatingPointRange = min..max
    private val current = AtomicReference(min)

    override fun iterator(): Iterator {
        return object : Iterator {
            override fun hasNext(): Boolean = range.contains(current.get())

            override fun next(): Float {
                return current.getAndUpdate { it + step }
            }
        }
    }
}

infix fun ClosedFloatingPointRange.step(step: Float): FloatProgression {
    return FloatProgression(this.start, this.endInclusive, step)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy