Skip to content

Commit

Permalink
Merge branch 'checketts-2.x' into 2.x
Browse files Browse the repository at this point in the history
  • Loading branch information
nhaarman committed Jul 5, 2019
2 parents b850ab1 + 77bfcdd commit 4779b29
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 0 deletions.
Expand Up @@ -36,6 +36,99 @@ inline fun <reified T : Any> argumentCaptor(): KArgumentCaptor<T> {
return KArgumentCaptor(ArgumentCaptor.forClass(T::class.java), T::class)
}

/**
* Creates 2 [KArgumentCaptor]s for given types.
*/
inline fun <reified A : Any, reified B : Any> argumentCaptor(
a: KClass<A> = A::class,
b: KClass<B> = B::class
): Pair<KArgumentCaptor<A>, KArgumentCaptor<B>> {
return Pair(
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b)
)
}

/**
* Creates 3 [KArgumentCaptor]s for given types.
*/
inline fun <reified A : Any, reified B : Any, reified C : Any> argumentCaptor(
a: KClass<A> = A::class,
b: KClass<B> = B::class,
c: KClass<C> = C::class
): Triple<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>> {
return Triple(
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b),
KArgumentCaptor(ArgumentCaptor.forClass(c.java), c)
)
}

class ArgumentCaptorHolder4<out A, out B, out C, out D>(
val first: A,
val second: B,
val third: C,
val fourth: D
) {

operator fun component1() = first
operator fun component2() = second
operator fun component3() = third
operator fun component4() = fourth
}

class ArgumentCaptorHolder5<out A, out B, out C, out D, out E>(
val first: A,
val second: B,
val third: C,
val fourth: D,
val fifth: E
) {

operator fun component1() = first
operator fun component2() = second
operator fun component3() = third
operator fun component4() = fourth
operator fun component5() = fifth
}


/**
* Creates 4 [KArgumentCaptor]s for given types.
*/
inline fun <reified A : Any, reified B : Any, reified C : Any, reified D : Any> argumentCaptor(
a: KClass<A> = A::class,
b: KClass<B> = B::class,
c: KClass<C> = C::class,
d: KClass<D> = D::class
): ArgumentCaptorHolder4<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>, KArgumentCaptor<D>> {
return ArgumentCaptorHolder4(
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b),
KArgumentCaptor(ArgumentCaptor.forClass(c.java), c),
KArgumentCaptor(ArgumentCaptor.forClass(d.java), d)
)
}

/**
* Creates 4 [KArgumentCaptor]s for given types.
*/
inline fun <reified A : Any, reified B : Any, reified C : Any, reified D : Any, reified E : Any> argumentCaptor(
a: KClass<A> = A::class,
b: KClass<B> = B::class,
c: KClass<C> = C::class,
d: KClass<D> = D::class,
e: KClass<E> = E::class
): ArgumentCaptorHolder5<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>, KArgumentCaptor<D>, KArgumentCaptor<E>> {
return ArgumentCaptorHolder5(
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b),
KArgumentCaptor(ArgumentCaptor.forClass(c.java), c),
KArgumentCaptor(ArgumentCaptor.forClass(d.java), d),
KArgumentCaptor(ArgumentCaptor.forClass(e.java), e)
)
}

/**
* Creates a [KArgumentCaptor] for given type, taking in a lambda to allow fast verification.
*/
Expand Down
76 changes: 76 additions & 0 deletions tests/src/test/kotlin/test/ArgumentCaptorTest.kt
Expand Up @@ -22,6 +22,82 @@ class ArgumentCaptorTest : TestBase() {
expect(captor.lastValue).toBe(5L)
}

@Test
fun argumentCaptor_destructuring2() {
/* Given */
val date: Date = mock()

/* When */
date.time = 5L

/* Then */
val (captor1, captor2) = argumentCaptor<Long, Long>()
verify(date).time = captor1.capture()
verify(date).time = captor2.capture()
expect(captor1.lastValue).toBe(5L)
expect(captor2.lastValue).toBe(5L)
}

@Test
fun argumentCaptor_destructuring3() {
/* Given */
val date: Date = mock()

/* When */
date.time = 5L

/* Then */
val (captor1, captor2, captor3) = argumentCaptor<Long, Long, Long>()
val verifyCaptor: KArgumentCaptor<Long>.() -> Unit = {
verify(date).time = capture()
expect(lastValue).toBe(5L)
}
captor1.apply(verifyCaptor)
captor2.apply(verifyCaptor)
captor3.apply(verifyCaptor)
}

@Test
fun argumentCaptor_destructuring4() {
/* Given */
val date: Date = mock()

/* When */
date.time = 5L

/* Then */
val (captor1, captor2, captor3, captor4) = argumentCaptor<Long, Long, Long, Long>()
val verifyCaptor: KArgumentCaptor<Long>.() -> Unit = {
verify(date).time = capture()
expect(lastValue).toBe(5L)
}
captor1.apply(verifyCaptor)
captor2.apply(verifyCaptor)
captor3.apply(verifyCaptor)
captor4.apply(verifyCaptor)
}

@Test
fun argumentCaptor_destructuring5() {
/* Given */
val date: Date = mock()

/* When */
date.time = 5L

/* Then */
val (captor1, captor2, captor3, captor4, captor5) = argumentCaptor<Long, Long, Long, Long, Long>()
val verifyCaptor: KArgumentCaptor<Long>.() -> Unit = {
verify(date).time = capture()
expect(lastValue).toBe(5L)
}
captor1.apply(verifyCaptor)
captor2.apply(verifyCaptor)
captor3.apply(verifyCaptor)
captor4.apply(verifyCaptor)
captor5.apply(verifyCaptor)
}

@Test
fun argumentCaptor_withNullValue_usingNonNullable() {
/* Given */
Expand Down

0 comments on commit 4779b29

Please sign in to comment.