hamkrest

Hamcrest for Kotlin

Subscribe to updates I use hamkrest


Statistics on hamkrest

Number of watchers on Github 184
Number of open issues 14
Average time to close an issue about 1 month
Main language Kotlin
Average time to merge a PR 13 days
Open pull requests 8+
Closed pull requests 2+
Last commit over 1 year ago
Repo Created about 3 years ago
Repo Last Updated 11 months ago
Size 270 KB
Organization / Authornpryce
Latest Release1.4.0.0
Contributors3
Page Updated
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

Subscribe to our mailing list

Evaluating hamkrest for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

HamKrest - Hamcrest for Kotlin

A reimplementation of Hamcrest to take advantage of Kotlin language features.

Kotlin Build Status Maven Central

Note: as of version 1.4.0.0, 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 and and or functions:

    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 assert.that, and, 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 assert object.

hamkrest open issues Ask a question     (View All Issues)
  • about 2 years equalTo() support for kotlin Sequences
  • about 2 years Failing collection type inference
  • over 2 years Can't find IsIterableContainingInAnyOrder matcher
  • over 1 year Function invocation 'assert(...)' expected
  • almost 2 years Terrible error message from `throws` matcher
hamkrest open pull requests (View All Pulls)
  • Upgraded kotlin to 1.0.0-rc-1036
  • Update to Kotlin 1.0.0-rc-1036
  • Upgrade to Kotlin 1.0.0-rc-1036
  • Added 'Show difference' option and ShouldNotMatch
  • added ContainsAllMatcher
  • Added closeTo matcher for float/double
  • Added anyPair matcher for working with maps
  • Make nullOrBlank and nullOrEmpty matchers work on nullable strings
hamkrest list of languages used
hamkrest latest release notes
  • Reflectomagic works with Kotlin 1.1.1 (the kotlin-reflect library must be on the classpath)
  • The message can be passed as a function, so that it can be generated only when a failure occurs
  • The way that values are described in error messages is now customisable.
Other projects in Kotlin