Skip to content

Instantly share code, notes, and snippets.

View sergio-sastre's full-sized avatar
:octocat:
Open sourcing

Sergio Sastre Flórez sergio-sastre

:octocat:
Open sourcing
View GitHub Profile
@sergio-sastre
sergio-sastre / ReverseStringTest.kt
Created July 18, 2021 10:08
Multiplying the quality of your Unit Tests (Part2) with PBT - When PBT is not enough alone
fun String?.reversed() : String? = this //forgot to reverse it?
@Label("Reversing a reversed String returns the original")
@Property
fun reverseStringTest(@ForAll originalString: String?) {
assertTrue(
originalString?.reversed()?.reversed() == originalString
)
}
@sergio-sastre
sergio-sastre / TestPasswordValidatorRightWithSeed.kt
Created July 18, 2021 10:03
Multiplying the quality of your Unit Tests (Part2) with PBT - Jqwik Password Validator Property-Based Test with seed
@Label("If password without upper case chars," +
"the error message contains 'no upper case letters'"
)
@Property(seed = "-7293214509268013126")
fun testPasswordValidatorRight(@ForAll("noUpperCase") password: String?) {
collectPasswordStats(password)
val actualError = passwordValidator.validate(password)
Truth.assertThat(actualError).contains("no upper case letters")
}
@sergio-sastre
sergio-sastre / TestPasswordValidatorRight.kt
Created July 18, 2021 10:02
Multiplying the quality of your Unit Tests (Part2) with PBT - Jqwik Password Validator Property-Based Test
@Label("If password without upper case chars," +
"the error message contains 'no upper case letters'"
)
@Property
fun testPasswordValidatorRight(@ForAll("noUpperCase") password: String?) {
collectPasswordStats(password)
val actualError = passwordValidator.validate(password)
Truth.assertThat(actualError).contains("no upper case letters")
}
@sergio-sastre
sergio-sastre / CollectStatsUpperCase.kt
Created July 18, 2021 09:59
Multiplying the quality of your Unit Tests (Part2) with PBT - Method for collecting Upper Case stats of Jqwik generators
fun statsUpperCase(password: String?){
val withUpperCase = password?.contains("[A-Z]".toRegex())
Statistics
.label("Upper case")
.collect(if (withUpperCase == true) "with upper case" else "without upper case")
}
...
fun collectPasswordStats(password: String?){
statsUpperCase(password)
@sergio-sastre
sergio-sastre / NoUpperCaseGenerator.kt
Created July 18, 2021 09:57
Multiplying the quality of your Unit Tests (Part2) with PBT - NoUpperCase generator
@Provide
fun noUpperCase(): Arbitrary<String> =
Arbitraries.strings().ascii().filter { it.matches("[^A-Z]".toRegex()) }
@sergio-sastre
sergio-sastre / Jqwik.kts
Created July 18, 2021 09:52
Multiplying the quality of your Unit Tests (Part2) with PBT - Jqwik gradle config
android {
...
testOptions {
unitTests.all {
useJUnitPlatform {
//this config supports Jqwik, Junit4 and Junit5
includeEngines 'jqwik', 'junit-jupiter', 'junit-vintage'
}
include '**/*Properties.class'
include '**/*Test.class'
@sergio-sastre
sergio-sastre / BrokenContainsUpperCaseLetterValidator.kt
Created July 18, 2021 09:49
Multiplying the quality of your Unit Tests (Part2) with PBT - BrokenContainsUpperCaseLetterValidator
class ContainsUpperCaseLetterValidator : RequirementValidator {
override val keywordOnError: String? = "no upper case letters"
override fun isValid(password: String?): Boolean =
password?.contains("[a-z]".toRegex()) == true
}
@sergio-sastre
sergio-sastre / JUnit5PasswordValidatorTest.kt
Created July 18, 2021 09:47
Multiplying the quality of your Unit Tests (Part2) with PBT - JUnit5 Password Validator Test
val passwordValidator = PasswordValidator(
ContainsUpperCaseLetterValidator(),
MinCharsValidator(6),
ContainsDigitValidator(),
ContainsLowerCaseLetterValidator(),
NoBlanksValidator()
)
@DisplayName("PasswordValidator for invalid passwords")
@ParameterizedTest(name = "When password is \"{0}\", the error contains \"{1}\"")
@sergio-sastre
sergio-sastre / ContextExtension.kt
Last active March 10, 2022 13:19
Kotlin Extensions similar to context.getText() but accepting arguments like in String.format(). Full explanation in this post: https://sergiosastre.hashnode.dev/styling-dynamic-strings-directly-in-android-xml
import android.content.Context
import android.text.SpannedString
import android.text.TextUtils
import androidx.annotation.PluralsRes
import androidx.annotation.StringRes
import androidx.core.text.HtmlCompat
fun Context.getStyledText(
@StringRes id: Int,
vararg args: Any