From 5a011f98e1a92200662491df7ba268a245ffa7b1 Mon Sep 17 00:00:00 2001 From: Yogesh Ananda Nikam Date: Wed, 10 Jul 2024 16:36:29 +0530 Subject: [PATCH] Enable generation of double value when isDoubleFormat is true and min and max are set not --- .../in/specmatic/core/pattern/NumberPattern.kt | 16 ++++++++++------ .../specmatic/core/pattern/NumberPatternTest.kt | 15 +++++++++++---- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/core/src/main/kotlin/in/specmatic/core/pattern/NumberPattern.kt b/core/src/main/kotlin/in/specmatic/core/pattern/NumberPattern.kt index b74c9ac78..976c15f3b 100644 --- a/core/src/main/kotlin/in/specmatic/core/pattern/NumberPattern.kt +++ b/core/src/main/kotlin/in/specmatic/core/pattern/NumberPattern.kt @@ -19,7 +19,7 @@ data class NumberPattern( val maximum: BigDecimal = HIGHEST_DECIMAL, val exclusiveMaximum: Boolean = false, override val example: String? = null, - val isDoubleFormat: Boolean = true + val isDoubleFormat: Boolean = false ) : Pattern, ScalarType, HasDefaultExample { companion object { @@ -79,11 +79,15 @@ data class NumberPattern( override fun generate(resolver: Resolver): Value { if (minAndMaxValuesNotSet()) { - val length = - if(minLength > 3) minLength - else if(maxLength < 3) maxLength - else 3 - return resolver.resolveExample(example, this) ?: NumberValue(randomNumber(length)) + val exampleValue = resolver.resolveExample(example, this) + if (exampleValue != null) return exampleValue + val length = when { + minLength > 3 -> minLength + maxLength < 3 -> maxLength + else -> 3 + } + if (isDoubleFormat) return NumberValue(randomNumber(length).toDouble()) + return NumberValue(randomNumber(length)) } val min = if (minimum == LOWEST_DECIMAL) { diff --git a/core/src/test/kotlin/in/specmatic/core/pattern/NumberPatternTest.kt b/core/src/test/kotlin/in/specmatic/core/pattern/NumberPatternTest.kt index 484272f76..89a2399c4 100644 --- a/core/src/test/kotlin/in/specmatic/core/pattern/NumberPatternTest.kt +++ b/core/src/test/kotlin/in/specmatic/core/pattern/NumberPatternTest.kt @@ -123,7 +123,14 @@ internal class NumberPatternTest { @Test fun `should generate 1 digit long random number when min and max length are not specified`() { - assertThat(NumberPattern().generate(Resolver()).toStringLiteral().length).isEqualTo(3) + assertThat(NumberPattern(isDoubleFormat = false).generate(Resolver()).toStringLiteral().length).isEqualTo(3) + } + + @Test + fun `should generate a random double number when min and max length are not specified`() { + val numberValue = NumberPattern(isDoubleFormat = true).generate(Resolver()) as NumberValue + + assertThat((numberValue.number is Double)).isTrue() } @Test @@ -190,7 +197,7 @@ internal class NumberPatternTest { @Test fun `should generate a number greater than minimum and maximum when are set and exclusive keywords are both true`() { - val generatedValues = (0..5).map { NumberPattern(minimum = BigDecimal(5.0), exclusiveMinimum = true, maximum = BigDecimal(10.0), exclusiveMaximum = true).generate(Resolver()) } + val generatedValues = (0..5).map { NumberPattern(minimum = BigDecimal(5.0), exclusiveMinimum = true, maximum = BigDecimal(10.0), exclusiveMaximum = true, isDoubleFormat = true).generate(Resolver()) } assertThat(generatedValues).allSatisfy { it as NumberValue assertThat(it.number.toDouble()).isGreaterThan(5.0) @@ -288,7 +295,7 @@ internal class NumberPatternTest { @Tag(GENERATION) fun `negative values generated should include a value greater than minimum and maximum keyword values`() { val result = - NumberPattern(minimum = BigDecimal(10.0), maximum = BigDecimal(20.0)).negativeBasedOn(Row(), Resolver()) + NumberPattern(minimum = BigDecimal(10.0), maximum = BigDecimal(20.0), isDoubleFormat = true).negativeBasedOn(Row(), Resolver()) .map { it.value }.toList() assertThat(result).containsExactlyInAnyOrder( @@ -302,7 +309,7 @@ internal class NumberPatternTest { @Test fun `NumberPattern with no constraints must generate a 3 digit number to ensure that Spring Boot is not able to convert it into an enum`() { - val number = NumberPattern().generate(Resolver()).toStringLiteral() + val number = NumberPattern(isDoubleFormat = false).generate(Resolver()).toStringLiteral() assertThat(number).hasSize(3) } } \ No newline at end of file