|Number of watchers on Github||184|
|Number of open issues||14|
|Average time to close an issue||about 1 month|
|Average time to merge a PR||13 days|
|Open pull requests||8+|
|Closed pull requests||2+|
|Last commit||over 1 year ago|
|Repo Created||over 3 years ago|
|Repo Last Updated||about 1 year ago|
|Organization / Author||npryce|
|Do you use hamkrest? Leave a review!|
|View open issues (14)|
|View hamkrest activity|
|View on github|
|Fresh, new opensource launches 🚀🚀🚀|
Trendy new open source projects in your inbox! View examples
A reimplementation of Hamcrest to take advantage of Kotlin language features.
Note: as of version 184.108.40.206, you must add kotlin-reflect to the classpath to use HamKrest's reflective features.
Compared to Java:
Kotlin's type system means that developers don't have to worry about getting the variance of generic signatures right. Variance is defined on the abstract Matcher type and Kotlin makes sure composition and subtyping work together the way you expect.
Syntactic sugar. You can negate a matcher with the ! operator and compose matchers with infix
import com.natpryce.hamkrest.assertion.assert ... assert.that("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
Easier to extend. You can convert named unary predicates into matchers.
val isBlank = Matcher(String::isBlank) assert.that(input, isBlank)
As a shortcut, you can pass named functions to the
or and many other functions that take a matcher.
``` kotlin assert.that(input, String::isBlank) ```
You can also convert a named binary predicate and the second argument to a matcher for first argument, which works well for extension methods.
``` kotlin fun String.hasLength(n: Int): Boolean = this.length == n val isTheRightLength = Matcher(String::hasLength, 8) assert.that(secretCode, isTheRightLength) ```
You can use function and property references to match features of a value:
val isLongEnough = has(String::length, greaterThan(8)) assert.that(password, isLongEnough)
All of these shortcuts produce good, human-readable diagnostics.
You can customise how diagnostics are generated by creating a project-specific
messagecan be passed as a function, so that it can be generated only when a failure occurs