assertk icon indicating copy to clipboard operation
assertk copied to clipboard

Add transformers `Map<K,V>.havingKeys()` and `Map<K,V>.havingValues()`

Open HaydenMeloche opened this issue 1 year ago • 4 comments

This adds some transformers allowing you to utilize Collection asserts on parts of a map.

Example for keys:

assertThat(mapOf("key" to "value")).havingKeys().containsOnly("key")

Example for values:

assertThat(mapOf("key" to "value")).havingValues().containsOnly("value")

Given that there is already a Map<K,V>.isNotEmpty() I thought it made sense to have these transformers throw an error if their corresponding parts have no values.

fixes #527

HaydenMeloche avatar Nov 15 '24 02:11 HaydenMeloche

I thought it made sense to have these transformers throw an error if their corresponding parts have no values.

Do any other "having"-style functions also perform an implicit assertion?

Really my only criticism of this approach is that there's something pure in the "having" suite of functions being purely transformational in contrast to actual validation functions. There's nothing strictly wrong with doing assertThat(map).havingKeys().isEmpty(), after all, even if it's a bit redundant.

JakeWharton avatar Nov 15 '24 05:11 JakeWharton

I did find some examples, such as key on a map (which should become havingKey if #522 moves forward). So retaining the implicit assertion here seems fine 👍 .

JakeWharton avatar Nov 15 '24 15:11 JakeWharton

@JakeWharton I admittedly was on the fence here (and I'm definitely open to removing the assertion). Map<K,V>.key() was ultimately the reason I decided to leave in the assertion

HaydenMeloche avatar Nov 15 '24 15:11 HaydenMeloche

This seems analogous to #546 (function names in that PR notwithstanding).

jzbrooks avatar Dec 14 '24 15:12 jzbrooks