Skip to content

Commit 9630444

Browse files
authored
Test Runner is failing in specific scenarios issue fixes (#51)
1 parent cd67f43 commit 9630444

File tree

2 files changed

+361
-21
lines changed

2 files changed

+361
-21
lines changed

src/main/kotlin/com/featurevisor/sdk/Conditions.kt

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ object Conditions {
4242
EQUALS -> attributeValue.value == conditionValue.value
4343
NOT_EQUALS -> attributeValue.value != conditionValue.value
4444
CONTAINS -> attributeValue.value?.contains(conditionValue.value.orEmpty()) ?: false
45-
NOT_CONTAINS -> attributeValue.value?.contains(conditionValue.value.orEmpty())?.not() ?: false
45+
NOT_CONTAINS -> attributeValue.value?.contains(conditionValue.value.orEmpty())?.not() ?: false
4646
STARTS_WITH -> attributeValue.value?.startsWith(conditionValue.value.orEmpty()) ?: false
4747
ENDS_WITH -> attributeValue.value?.endsWith(conditionValue.value.orEmpty()) ?: false
4848
SEMVER_EQUALS -> compareVersions(
@@ -119,6 +119,65 @@ object Conditions {
119119
}
120120
}
121121

122+
attributeValue is AttributeValue.IntValue && conditionValue is ConditionValue.ArrayValue -> {
123+
when (operator) {
124+
IN_ARRAY -> attributeValue.value.toString() in conditionValue.values
125+
NOT_IN_ARRAY -> (attributeValue.value.toString() !in conditionValue.values)
126+
else -> false
127+
}
128+
}
129+
130+
attributeValue is AttributeValue.DoubleValue && conditionValue is ConditionValue.StringValue -> {
131+
when (operator) {
132+
EQUALS -> attributeValue.value.toString() == conditionValue.value
133+
NOT_EQUALS -> attributeValue.value.toString() != conditionValue.value
134+
135+
SEMVER_EQUALS -> compareVersions(
136+
attributeValue.value.toString(),
137+
conditionValue.value.orEmpty(),
138+
) == 0
139+
140+
SEMVER_NOT_EQUALS -> compareVersions(
141+
attributeValue.value.toString(),
142+
conditionValue.value.orEmpty(),
143+
) != 0
144+
145+
SEMVER_GREATER_THAN -> compareVersions(
146+
attributeValue.value.toString(),
147+
conditionValue.value.orEmpty()
148+
) == 1
149+
150+
SEMVER_GREATER_THAN_OR_EQUALS -> compareVersions(
151+
attributeValue.value.toString(),
152+
conditionValue.value.orEmpty()
153+
) >= 0
154+
155+
SEMVER_LESS_THAN -> compareVersions(
156+
attributeValue.value.toString(),
157+
conditionValue.value.orEmpty()
158+
) == -1
159+
160+
SEMVER_LESS_THAN_OR_EQUALS -> compareVersions(
161+
attributeValue.value.toString(),
162+
conditionValue.value.orEmpty()
163+
) <= 0
164+
165+
else -> false
166+
}
167+
}
168+
169+
attributeValue is AttributeValue.StringValue && conditionValue is ConditionValue.IntValue -> {
170+
when (operator) {
171+
EQUALS -> attributeValue.value == conditionValue.value.toString()
172+
NOT_EQUALS -> attributeValue.value != conditionValue.value.toString()
173+
CONTAINS -> attributeValue.value?.contains(conditionValue.value.toString()) ?: false
174+
NOT_CONTAINS -> attributeValue.value?.contains(conditionValue.value.toString())?.not() ?: false
175+
STARTS_WITH -> attributeValue.value?.startsWith(conditionValue.value.toString()) ?: false
176+
ENDS_WITH -> attributeValue.value?.endsWith(conditionValue.value.toString()) ?: false
177+
else -> false
178+
}
179+
}
180+
122181
attributeValue is AttributeValue.DateValue && conditionValue is ConditionValue.DateTimeValue -> {
123182
when (operator) {
124183
EQUALS -> attributeValue.value == conditionValue.value
@@ -143,9 +202,31 @@ object Conditions {
143202

144203
private fun compareVersions(actual: String, condition: String): Int {
145204
return try {
146-
SemVer.parse(actual).compareTo(SemVer.parse(condition))
205+
SemVer.parse(normalizeSemver(actual)).compareTo(SemVer.parse(normalizeSemver(condition)))
147206
} catch (e: Exception) {
148207
0
149208
}
150209
}
210+
211+
private fun normalizeSemver(version: String): String {
212+
val parts = version.split("-", "+")
213+
val mainParts = parts[0].split(".").map { it.toInt().toString() }
214+
var normalizedVersion = mainParts.joinToString(".")
215+
216+
if (version.contains("-")) {
217+
val preRelease = parts[1].split(".").joinToString(".") {
218+
if (it.all { char -> char.isDigit() }) it.toInt().toString()
219+
else it
220+
}
221+
normalizedVersion += "-$preRelease"
222+
}
223+
224+
if (version.contains("+")) {
225+
val buildMetadata = version.split("+")[1]
226+
normalizedVersion += "+$buildMetadata"
227+
}
228+
229+
return normalizedVersion
230+
}
231+
151232
}

0 commit comments

Comments
 (0)