Skip to content

SimY4/coregex

Repository files navigation

coregex

Build Status codecov License

Maven Central Javadocs

A handy utility for generating strings that match given regular expression criteria.

Supported generators

Usage

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.

Functionaljava Quickcheck

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()));
  }
}

Jqwik

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);
  }
}

JUnit Quickcheck

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);
  }
}

Kotest

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
      }
    }
  }
})

scalacheck

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  
  }
}

vavr test

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:

class MyTest {
  @Test
  void myProperty() {
    Property.def("my property")
        .forAll(CoregexArbitrary.of("[a-zA-Z]{3}"))
        .suchThat(str -> 3 == str.length())
        .check();
  }
}

ZIO test

Include the following dependency into your project:

testImplementation "com.github.simy4.coregex:coregex-zio-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)
      }
    }
  )
}

About

A handy utility for generating strings matching specified regular expression criteria.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 6