Skip to content

Commit

Permalink
mockk#510 | Convert List to Map for SignatureMatchers.
Browse files Browse the repository at this point in the history
  • Loading branch information
kukulam committed Oct 27, 2020
1 parent 893192d commit 787263a
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 45 deletions.
Expand Up @@ -19,7 +19,7 @@ class ChainedCallDetector(safeToString: SafeToString) {
fun detect(
callRounds: List<CallRound>,
callN: Int,
matchersList: SignatureMatchersList
matchersMap: SignatureMatchersMap
) {
val callInAllRounds = callRounds.map { it.calls[callN] }
val zeroCall = callInAllRounds[0]
Expand Down Expand Up @@ -51,7 +51,7 @@ class ChainedCallDetector(safeToString: SafeToString) {

log.trace { "Signature for $nArgument argument of ${zeroCall.method.toStr()}: $signature" }

val matcherBySignature = matchersList.remove(signature)
val matcherBySignature = matchersMap.remove(signature)

return buildMatcher(
nArgument == 0,
Expand Down Expand Up @@ -84,7 +84,7 @@ class ChainedCallDetector(safeToString: SafeToString) {

log.trace { "Signature for $nArgument/$nVarArg argument of ${zeroCall.method.toStr()}: $signature" }

val matcherBySignature = matchersList.remove(signature)
val matcherBySignature = matchersMap.remove(signature)
varArgMatchers.add(
buildMatcher(
nArgument == 0 && nVarArg == 0,
Expand Down
Expand Up @@ -45,7 +45,7 @@ class SignatureMatcherDetector(
}
}

val matchersList = SignatureMatchersList()
val matchersMap = SignatureMatchersMap()
val allCompositeMatchers = mutableListOf<List<CompositeMatcher<*>>>()

fun gatherMatchers() {
Expand All @@ -59,10 +59,10 @@ class SignatureMatcherDetector(
})
}

matchersList.add(signature, matcher)
matchersMap.add(signature, matcher)
}

log.trace { "Matcher list: $matchersList" }
log.trace { "Matcher list: $matchersMap" }
}

@Suppress("UNCHECKED_CAST")
Expand All @@ -77,7 +77,7 @@ class SignatureMatcherDetector(

log.trace { "Signature for $nOp operand of $matcher composite matcher: $signature" }

matchersList.remove(signature)
matchersMap.remove(signature)
?: ChainedCallDetector.eqOrNullMatcher(matcher.operandValues[nOp])
} as List<Matcher<Any?>>?
}
Expand All @@ -90,13 +90,13 @@ class SignatureMatcherDetector(

repeat(nCalls) { callN ->
val detector = chainedCallDetectorFactory()
detector.detect(callRounds, callN, matchersList)
detector.detect(callRounds, callN, matchersMap)
calls.add(detector.call)
}

processCompositeMatchers()
if (matchersList.isNotEmpty()) {
throw MockKException("Failed matching mocking signature for\n${callRounds[0].calls.joinToString("\n")}\nleft matchers: $matchersList")
if (matchersMap.isNotEmpty()) {
throw MockKException("Failed matching mocking signature for\n${callRounds[0].calls.joinToString("\n")}\nleft matchers: $matchersMap")
}
}
}
Expand Down

This file was deleted.

@@ -0,0 +1,31 @@
package io.mockk.impl.recording

import io.mockk.Matcher

class SignatureMatchersMap {
private var matchers = mutableMapOf<List<Any?>, List<Matcher<*>>>()

fun add(signature: List<Any?>, matcher: Matcher<*>) {
val signatureMatchers = matchers[signature] ?: emptyList()
matchers[signature] = signatureMatchers.plus(matcher)
}

fun remove(signature: List<Any?>): Matcher<*>? {
val signatureMatchers = (matchers[signature] ?: emptyList()).toMutableList()
val removedMatcher = if (signatureMatchers.size > 0) signatureMatchers.removeAt(0) else null

if (signatureMatchers.isEmpty()) {
matchers.remove(signature) }
else {
matchers[signature] = signatureMatchers.toList()
}

return removedMatcher
}

fun isNotEmpty() = matchers.isNotEmpty()

override fun toString(): String {
return matchers.flatMap { it.value }.toString()
}
}
Expand Up @@ -30,16 +30,16 @@ class ChainedCallDetectorTest {
every { call1.method.varArgsArg } returns -1
every { call2.method.varArgsArg } returns -1

detector.detect(listOf(callRound1, callRound2), 0, SignatureMatchersList())
detector.detect(listOf(callRound1, callRound2), 0, SignatureMatchersMap())

assertEquals("abc", detector.call.matcher.method.name)
}

@Test
fun givenTwoCallsRoundsWithOneCallOneArgWhenDetectCallsHappenThenOneCallWithArgIsReturned() {
val matchersList = SignatureMatchersList()
val matchersMap = SignatureMatchersMap()

matchersList.add(listOf(signedMatcher1.signature, signedMatcher2.signature), signedMatcher1.matcher)
matchersMap.add(listOf(signedMatcher1.signature, signedMatcher2.signature), signedMatcher1.matcher)

every { callRound1.calls } returns listOf(call1)
every { callRound2.calls } returns listOf(call2)
Expand All @@ -56,7 +56,7 @@ class ChainedCallDetectorTest {
every { call1.method.varArgsArg } returns -1
every { call2.method.varArgsArg } returns -1

detector.detect(listOf(callRound1, callRound2), 0, matchersList)
detector.detect(listOf(callRound1, callRound2), 0, matchersMap)

assertEquals("abc", detector.call.matcher.method.name)
assertEquals(listOf<Matcher<*>>(EqMatcher(5)), detector.call.matcher.args)
Expand Down
Expand Up @@ -8,12 +8,12 @@ import kotlin.test.assertFalse
import kotlin.test.assertNull
import kotlin.test.assertTrue

class SignatureMatchersListTest {
class SignatureMatchersMapTest {

@Test
fun shouldAddMatcherForSignature() {
// given
val map = SignatureMatchersList()
val map = SignatureMatchersMap()
val signedMatcher = mockk<SignedMatcher>(relaxed = true)
val signature = listOf(signedMatcher.signature)
val matcher = signedMatcher.matcher
Expand All @@ -29,7 +29,7 @@ class SignatureMatchersListTest {
@Test
fun shouldNotContainAnyMatchers() {
// given
val map = SignatureMatchersList()
val map = SignatureMatchersMap()

// when && then
assertFalse { map.isNotEmpty() }
Expand All @@ -38,7 +38,7 @@ class SignatureMatchersListTest {
@Test
fun shouldNotRemoveFromEmptyList() {
// given
val map = SignatureMatchersList()
val map = SignatureMatchersMap()
val signedMatcher = mockk<SignedMatcher>(relaxed = true)
val signature = listOf(signedMatcher.signature)

Expand All @@ -53,7 +53,7 @@ class SignatureMatchersListTest {
@Test
fun shouldRemoveFromList() {
// given
val map = SignatureMatchersList()
val map = SignatureMatchersMap()
val signedMatcher1 = mockk<SignedMatcher>(relaxed = true)
val signedMatcher2 = mockk<SignedMatcher>(relaxed = true)
val signature1 = listOf(signedMatcher1.signature)
Expand All @@ -76,7 +76,7 @@ class SignatureMatchersListTest {
@Test
fun shouldPrintListCorrectly() {
// given
val list = SignatureMatchersList()
val list = SignatureMatchersMap()
val signedMatcher = mockk<SignedMatcher>(relaxed = true)
val signature = listOf(signedMatcher.signature)
val matcher = AllAnyMatcher<Any>()
Expand All @@ -89,6 +89,6 @@ class SignatureMatchersListTest {
val matchersAsString = list.toString()

// then
assertEquals(matchersAsString, expectedMatchersListAsString)
assertEquals(expectedMatchersListAsString, matchersAsString)
}
}

0 comments on commit 787263a

Please sign in to comment.