A handy utility for generating strings that match given regular expression criteria.
- functionaljava-quickcheck
- hedgehog
- jetCheck
- Jqwik
- JUnit Quickcheck
- Kotest
- scalacheck
- vavr-test
- zio-test
You can use this library directly by compiling an instance of coregex from any given regular expression pattern:
var pattern = Pattern.compile("[a-zA-Z]{3}"); var coregex = Coregex.from(pattern);
Having an instance of coregex, you can ask it to generate a string matching original regular expression. At any given time this should be true:
var seed = ThreadLocalRandom.current().nextLong(); assert pattern.matcher(coregex.generate(seed)).matches();
Given the library is primarily intended to be used in property based testing, it comes with a set of integrations for popular property based testing frameworks.
Include the following dependency into your project:
testImplementation "com.github.simy4.coregex:coregex-functionaljava-quickcheck"Use the provided CoregexArbirary class to generate a string that would match the regular expression predicate:
@RunWith(PropertyTestRunner.class) public class MyTest { private static final Pattern PATTERN = Pattern.compile("[a-zA-Z]{3}"); public Property myProperty() { return property(CoregexArbitrary.gen(PATTERN), CoregexArbitrary.shrink(PATTERN), str -> prop(3 == str.length())); } }
Include the following dependency into your project:
libraryDependencies ++= Seq("com.github.simy4.coregex" %% "coregex-hedgehog" % Test)
Use the provided CoregexGen class to generate a string that would match the regular expression predicate:
object MySpec extends Properties { def tests: List[Test] = List( property("my property", myProperty), ) def myProperty: Property = for { str <- CoregexGen.fromRegex("[a-zA-Z]{3}".r).forAll } yield Result.assert(str.length ==== 3) }
Include the following dependency into your project:
testImplementation "com.github.simy4.coregex:coregex-jetCheck"Use the provided CoregexGenerator class to generate a string that would match the regular expression predicate:
PropertyChecker.forAll(CoregexGenerator.of("[a-zA-Z]{3}"), str -> 3 == str.length());
Include the following dependency into your project:
testImplementation "com.github.simy4.coregex:coregex-jqwik"Use the provided Regex annotation to generate a string that would match the regular expression predicate:
class MyTest { @Property void myProperty(@ForAll @Regex("[a-zA-Z]{3}") String str) { assertThat(str).hasLength(3); } }
Include the following dependency into your project:
testImplementation "com.github.simy4.coregex:coregex-junit-quickcheck"Use the provided Regex annotation to generate a string that would match the regular expression predicate:
@RunWith(JUnitQuickcheck.class) public class MyTest { @Property public void myProperty(@Regex("[a-zA-Z]{3}") String str) { assertThat(str).hasLength(3); } }
Include the following dependency into your project:
testImplementation "com.github.simy4.coregex:coregex-kotest"Use the provided CoregexArbirary class to generate a string that would match the regular expression predicate:
class MyTest : DescribeSpec({ describe("my property") { it("should hold") { checkAll(CoregexArbitrary.of("[a-zA-Z]{3}")) { str -> str.length shouldBe 3 } } } })
Include the following dependency into your project:
libraryDependencies ++= Seq("com.github.simy4.coregex" %% "coregex-scalacheck" % Test)
Use the provided CoregexInstances trait to constrain string arbitraries:
object MySpecification extends Properties("MySpecification") with CoregexInstances { property("my property") = forAll { (str: StringMatching["[a-zA-Z]{3}"]) => 3 == str.length } }
Include the following dependency into your project:
testImplementation "com.github.simy4.coregex:coregex-vavr-test"Use the provided CoregexArbirary class to generate a string that would match the regular expression predicate:
Property.def("my property") .forAll(CoregexArbitrary.of("[a-zA-Z]{3}")) .suchThat(str -> 3 == str.length()) .check();
Include the following dependency into your project:
libraryDependencies ++= Seq("com.github.simy4.coregex" %% "coregex-zio-test" % Test)
Use the provided CoregexGen class to generate a string that would match the regular expression predicate:
object MySpec extends ZIOSpecDefault { def spec = suite("my spec")( test("my property") { check(CoregexGen.from(Pattern.compile("[a-zA-Z]{3}"))) { str => assertTrue(str.length == 3) } } ) }