Skip to content

Commit 16ce11e

Browse files
authored
Merge pull request #80 from lupuuss/release-2.7.1
Release 2.7.1
2 parents 8d4cc62 + c94c83b commit 16ce11e

File tree

45 files changed

+397
-295
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+397
-295
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ kotlin.code.style=official
33
kotlin.suppressGradlePluginWarnings=IncorrectCompileOnlyDependencyWarning
44
kotlin.native.ignoreDisabledTargets=true
55
org.gradle.jvmargs=-Xmx3g
6-
version=2.7.0
6+
version=2.7.1
77
org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
88
org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true

mokkery-plugin/src/main/kotlin/dev/mokkery/plugin/core/Mokkery.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,12 @@ object Mokkery {
3535
val MokkerySuiteScope by dev_mokkery.klass
3636

3737
val MokkeryCallInterceptor by dev_mokkery_interceptor.klass
38-
val MokkeryInstance by dev_mokkery_internal.klass
39-
val MokkeryMockInstance by dev_mokkery_internal.klass
38+
val MokkeryInstanceScope by dev_mokkery_internal.klass
4039

4140
val CallArgument by dev_mokkery_context.klass
4241
val SuiteName by dev_mokkery_internal_context.klass
4342

4443
val TemplatingScope by dev_mokkery_internal_calls.klass
45-
val MokkeryInstanceLookup by dev_mokkery_internal.klass
4644
val GlobalMokkeryScope by dev_mokkery_internal.klass
4745

4846
fun mockMany(value: Int): ClassResolver {
@@ -58,25 +56,24 @@ object Mokkery {
5856
}
5957

6058
object Function {
61-
val autofillConstructor by dev_mokkery_internal.function
62-
val MokkeryMockInstance by dev_mokkery_internal.function
6359
val internalEvery by dev_mokkery_internal.function
6460
val internalEverySuspend by dev_mokkery_internal.function
6561
val internalVerify by dev_mokkery_internal.function
6662
val internalVerifySuspend by dev_mokkery_internal.function
6763
val callIgnoringClassCastException by dev_mokkery_internal.function
68-
val createMokkeryBlockingCallScope by dev_mokkery_internal.function
69-
val createMokkerySuspendCallScope by dev_mokkery_internal.function
70-
val createMokkeryInstanceContext by dev_mokkery_internal.function
71-
val MokkeryMockInterceptor by dev_mokkery_internal_interceptor.function
7264
val TemplatingScope by dev_mokkery_internal_calls.function
73-
val invokeMockInstantiationCallbacks by dev_mokkery_internal_context.function
7465
val MokkerySuiteScope by dev_mokkery.function
66+
val MokkeryInstanceScope by dev_mokkery_internal.function
67+
val createMokkeryInstanceContext by dev_mokkery_internal.function
68+
val invokeMockInstantiationListener by dev_mokkery_internal_context.function
69+
val autofillConstructor by dev_mokkery_internal.function
70+
val MokkeryMockInterceptor by dev_mokkery_internal_interceptor.function
71+
val createMokkeryBlockingCallScope by dev_mokkery_internal.function
72+
val createMokkerySuspendCallScope by dev_mokkery_internal.function
7573
}
7674

7775
object Property {
7876

79-
val GlobalMokkeryInstanceLookup by dev_mokkery_internal.property
8077
val mockId by dev_mokkery_internal.property
8178
}
8279

mokkery-plugin/src/main/kotlin/dev/mokkery/plugin/transformers/BuildMockClass.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,15 @@ fun TransformerScope.buildMockClass(
7777
mokkeryKind: IrMokkeryKind,
7878
classToMock: IrClass,
7979
): IrClass {
80-
val mokkeryMockInstanceClass = getClass(Mokkery.Class.MokkeryMockInstance)
80+
val instanceScopeClass = getClass(Mokkery.Class.MokkeryInstanceScope)
8181
val mockedClass = pluginContext
8282
.irFactory
8383
.buildClass { name = classToMock.name.createUniqueMockName(mokkeryKind.name) }
8484
mockedClass.copyTypeParametersFrom(classToMock)
8585
val typedClassToMock = classToMock.symbol.typeWithParameters(mockedClass.typeParameters)
8686
mockedClass.superTypes = listOfNotNull(
8787
typedClassToMock,
88-
mokkeryMockInstanceClass.defaultType,
88+
instanceScopeClass.defaultType,
8989
if (classToMock.isInterface) pluginContext.irBuiltIns.anyType else null
9090
)
9191
mockedClass.createParameterDeclarations()
@@ -94,7 +94,7 @@ fun TransformerScope.buildMockClass(
9494
transformer = this,
9595
typeName = classToMock.kotlinFqName.asString(),
9696
mokkeryKind = mokkeryKind,
97-
mokkeryInstanceClass = mokkeryMockInstanceClass,
97+
scopeInstanceClass = instanceScopeClass,
9898
classesToIntercept = listOf(classToMock),
9999
)
100100
val spyDelegateField = mockedClass.getField(Mokkery.Fields.SpyDelegate)
@@ -112,7 +112,7 @@ fun TransformerScope.buildMockClass(
112112

113113
fun TransformerScope.buildManyMockClass(classesToMock: List<IrClass>): IrClass {
114114
val manyMocksMarkerClass = getClass(Mokkery.Class.mockMany(classesToMock.size))
115-
val mokkeryMockInstanceClass = getClass(Mokkery.Class.MokkeryMockInstance)
115+
val mokkeryInstanceClass = getClass(Mokkery.Class.MokkeryInstanceScope)
116116
val mockedClass = pluginContext.irFactory
117117
.buildClass { name = manyMocksMarkerClass.kotlinFqName.createUniqueManyMockName() }
118118
classesToMock.forEach(mockedClass::copyTypeParametersFrom)
@@ -122,13 +122,13 @@ fun TransformerScope.buildManyMockClass(classesToMock: List<IrClass>): IrClass {
122122
val mockedTypes = classesToMock.typeWith(parameterMap)
123123
val manyMocksMarkerType = manyMocksMarkerClass.symbol.typeWith(mockedTypes)
124124
mockedClass.superTypes = mockedTypes + listOfNotNull(
125-
mokkeryMockInstanceClass.defaultType,
125+
mokkeryInstanceClass.defaultType,
126126
if (classesToMock.all(IrClass::isInterface)) pluginContext.irBuiltIns.anyType else null,
127127
manyMocksMarkerType
128128
)
129129
mockedClass.addMockClassConstructor(
130130
transformer = this,
131-
mokkeryInstanceClass = mokkeryMockInstanceClass,
131+
scopeInstanceClass = mokkeryInstanceClass,
132132
mokkeryKind = IrMokkeryKind.Mock,
133133
typeName = mockManyTypeName(manyMocksMarkerClass, classesToMock),
134134
classesToIntercept = classesToMock,
@@ -181,7 +181,7 @@ private fun IrBlockBodyBuilder.mockBody(
181181

182182
private fun IrClass.addMockClassConstructor(
183183
transformer: TransformerScope,
184-
mokkeryInstanceClass: IrClass,
184+
scopeInstanceClass: IrClass,
185185
mokkeryKind: IrMokkeryKind,
186186
typeName: String,
187187
classesToIntercept: List<IrClass>,
@@ -191,9 +191,9 @@ private fun IrClass.addMockClassConstructor(
191191
val mokkeryScopeClass = transformer.getClass(Mokkery.Class.MokkeryScope)
192192
val mockModeClass = transformer.getClass(Mokkery.Class.MockMode)
193193
val mokkeryKindClass = transformer.getClass(Mokkery.Class.MokkeryKind)
194-
val invokeInstantiationCallbacksFun = transformer.getFunction(Mokkery.Function.invokeMockInstantiationCallbacks)
195-
val interceptor = overridePropertyBackingField(context, mokkeryInstanceClass.getProperty("mokkeryInterceptor"))
196-
val contextProperty = overridePropertyBackingField(context, mokkeryInstanceClass.getProperty("mokkeryContext"))
194+
val invokeInstantiationCallbacksFun = transformer.getFunction(Mokkery.Function.invokeMockInstantiationListener)
195+
val interceptor = overridePropertyBackingField(context, scopeInstanceClass.getProperty("mokkeryInterceptor"))
196+
val contextProperty = overridePropertyBackingField(context, scopeInstanceClass.getProperty("mokkeryContext"))
197197
addConstructor {
198198
isPrimary = true
199199
}.apply {
@@ -250,6 +250,7 @@ private fun IrClass.addMockClassConstructor(
250250
}
251251
+irCall(invokeInstantiationCallbacksFun) {
252252
extensionReceiver = irGet(thisReceiver!!)
253+
putValueArgument(0, irGet(thisReceiver!!))
253254
}
254255
+irInvokeIfNotNull(irGet(valueParameters[2]), false, irGet(thisReceiver!!))
255256
}

mokkery-plugin/src/main/kotlin/dev/mokkery/plugin/transformers/BuildMockJsFunction.kt

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import dev.mokkery.plugin.core.TransformerScope
66
import dev.mokkery.plugin.core.declarationIrBuilder
77
import dev.mokkery.plugin.core.getClass
88
import dev.mokkery.plugin.core.getFunction
9-
import dev.mokkery.plugin.core.getProperty
109
import dev.mokkery.plugin.core.mockMode
1110
import dev.mokkery.plugin.ir.defaultTypeErased
1211
import dev.mokkery.plugin.ir.indexIfParameterOrNull
@@ -71,9 +70,9 @@ fun TransformerScope.buildMockJsFunction(
7170
+irReturn(irInterceptCall(transformer, irGet(instanceVar), it, mapTypeToClass, irSpyCall))
7271
}
7372
val lambdaVar = createTmpVariable(lambda)
74-
+irCallRegisterInstance(transformer, irGet(instanceVar), irGet(lambdaVar))
75-
+irCall(transformer.getFunction(Mokkery.Function.invokeMockInstantiationCallbacks)) {
73+
+irCall(transformer.getFunction(Mokkery.Function.invokeMockInstantiationListener)) {
7674
this.extensionReceiver = irGet(instanceVar)
75+
putValueArgument(0, irGet(lambdaVar))
7776
}
7877
val block = expression.valueArguments.getOrNull(1)
7978
if (block != null) {
@@ -106,8 +105,8 @@ private fun IrBuilderWithScope.irCallMokkeryMockInstance(
106105
modeArg: IrExpression,
107106
kind: IrMokkeryKind,
108107
): IrExpression {
109-
val mokkeryMockInstanceFun = transformer.getFunction(Mokkery.Function.MokkeryMockInstance)
110-
return irCall(mokkeryMockInstanceFun) {
108+
val instanceScopeFun = transformer.getFunction(Mokkery.Function.MokkeryInstanceScope)
109+
return irCall(instanceScopeFun) {
111110
putValueArgument(0, parentScope)
112111
putValueArgument(1, modeArg)
113112
putValueArgument(2, irMokkeryKindValue(transformer.getClass(Mokkery.Class.MokkeryKind), kind))
@@ -116,22 +115,6 @@ private fun IrBuilderWithScope.irCallMokkeryMockInstance(
116115
}
117116
}
118117

119-
private fun IrBuilderWithScope.irCallRegisterInstance(
120-
transformer: TransformerScope,
121-
mokkeryInstance: IrExpression,
122-
obj: IrExpression
123-
): IrCall {
124-
val instanceLookupCall = irCall(transformer.getProperty(Mokkery.Property.GlobalMokkeryInstanceLookup).getter!!)
125-
val lookUpClass = transformer.getClass(Mokkery.Class.MokkeryInstanceLookup)
126-
val registerCall = irCall(lookUpClass.getSimpleFunction("register")!!) {
127-
dispatchReceiver = instanceLookupCall
128-
putValueArgument(0, obj)
129-
putValueArgument(1, mokkeryInstance)
130-
}
131-
return registerCall
132-
}
133-
134-
135118
private fun IrBlockBodyBuilder.irLambdaInvokeSpy(
136119
transformer: TransformerScope,
137120
delegateLambda: IrExpression,

mokkery-plugin/src/main/kotlin/dev/mokkery/plugin/transformers/IrInterceptCall.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ fun IrBlockBodyBuilder.irInterceptCall(
8080
irCallSpyLambda: IrExpression? = null
8181
): IrCall {
8282
val interceptorClass = transformer.getClass(Mokkery.Class.MokkeryCallInterceptor).symbol
83-
val mokkeryInstanceClass = transformer.getClass(Mokkery.Class.MokkeryInstance)
83+
val instanceScopeClass = transformer.getClass(Mokkery.Class.MokkeryInstanceScope)
8484
val interceptFun = interceptorClass
8585
.functions
8686
.first { it.owner.name.asString() == "intercept" && it.owner.isSuspend == function.isSuspend }
8787
return irCall(interceptFun) {
88-
dispatchReceiver = mokkeryInstanceClass
88+
dispatchReceiver = instanceScopeClass
8989
.getPropertyGetter("mokkeryInterceptor")!!
9090
.let(::irCall)
9191
.apply { dispatchReceiver = mokkeryInstance }

mokkery-runtime/src/commonMain/kotlin/dev/mokkery/MokkerySuiteScope.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ import dev.mokkery.context.require
55
import dev.mokkery.internal.GlobalMokkeryScope
66
import dev.mokkery.internal.MokkerySuiteScopeNotImplementedException
77
import dev.mokkery.internal.context.MocksRegistry
8+
import dev.mokkery.internal.utils.instances
89

910
/**
1011
* Returns all mocks from this [MokkerySuiteScope].
1112
*/
12-
public val MokkerySuiteScope.mocks: Set<Any>
13-
get() = mokkeryContext.require(MocksRegistry).mocks
13+
public val MokkerySuiteScope.mocks: List<Any>
14+
get() = mokkeryContext
15+
.require(MocksRegistry)
16+
.mocks
17+
.instances
18+
.toList()
1419

1520
/**
1621
* A scope for a test suite that uses Mokkery mocks. It enables automation and strict exhaustiveness checks.
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package dev.mokkery
22

33
import dev.mokkery.internal.GlobalMokkeryScope
4-
import dev.mokkery.internal.ObjectNotMockedException
5-
import dev.mokkery.internal.context.resolveMockInstance
4+
import dev.mokkery.internal.context.resolveScope
65
import dev.mokkery.internal.context.tools
7-
import dev.mokkery.internal.interceptor
6+
import dev.mokkery.internal.mokkeryMockInterceptor
87

98
/**
109
* Removes all answers configured for given [mocks].
1110
*/
1211
public fun resetAnswers(vararg mocks: Any) {
1312
mocks.forEach {
14-
val instance = GlobalMokkeryScope.tools.resolveMockInstance(it) ?: throw ObjectNotMockedException(it)
15-
instance.interceptor.answering.reset()
13+
val instanceScope = GlobalMokkeryScope.tools.resolveScope(it)
14+
instanceScope.mokkeryMockInterceptor.answering.reset()
1615
}
1716
}
1817

@@ -21,7 +20,7 @@ public fun resetAnswers(vararg mocks: Any) {
2120
*/
2221
public fun resetCalls(vararg mocks: Any) {
2322
mocks.forEach {
24-
val instance = GlobalMokkeryScope.tools.resolveMockInstance(it) ?: throw ObjectNotMockedException(it)
25-
instance.interceptor.callTracing.reset()
23+
val instanceScope = GlobalMokkeryScope.tools.resolveScope(it)
24+
instanceScope.mokkeryMockInterceptor.callTracing.reset()
2625
}
2726
}

mokkery-runtime/src/commonMain/kotlin/dev/mokkery/Verify.kt

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
package dev.mokkery
44

5+
import dev.mokkery.context.require
6+
import dev.mokkery.internal.GlobalMokkeryScope
57
import dev.mokkery.internal.context.MocksRegistry
68
import dev.mokkery.internal.MokkeryPluginNotAppliedException
7-
import dev.mokkery.internal.ObjectNotMockedException
89
import dev.mokkery.internal.calls.CallTrace
9-
import dev.mokkery.internal.context.resolveMockInstance
10+
import dev.mokkery.internal.context.resolveScope
1011
import dev.mokkery.internal.context.tools
11-
import dev.mokkery.internal.interceptor
12+
import dev.mokkery.internal.mokkeryMockInterceptor
1213
import dev.mokkery.internal.names.createGroupMockReceiverShortener
1314
import dev.mokkery.internal.render.PointListRenderer
1415
import dev.mokkery.internal.utils.failAssertion
@@ -66,28 +67,32 @@ public fun MokkerySuiteScope.verifySuspend(
6667
* Asserts that all given [mocks] have all their registered calls verified with [verify] or [verifySuspend].
6768
*/
6869
public fun verifyNoMoreCalls(vararg mocks: Any) {
69-
MokkerySuiteScope(MocksRegistry(mocks = mocks.toSet())).verifyNoMoreCalls()
70+
val tools = GlobalMokkeryScope.tools
71+
val instances = mocks.map(tools::resolveScope)
72+
MokkerySuiteScope(MocksRegistry(mocks = instances)).verifyNoMoreCalls()
7073
}
7174

7275
/**
7376
* Asserts that all mocks from given [MokkerySuiteScope] have no unverified calls.
7477
*/
7578
public fun MokkerySuiteScope.verifyNoMoreCalls() {
76-
val tools = this.tools
77-
mocks.forEach { mock ->
78-
val tracing = mock
79-
.let { tools.resolveMockInstance(it) }
80-
?.interceptor
81-
?.callTracing ?: throw ObjectNotMockedException(mock)
82-
if (tracing.unverified.isNotEmpty()) {
83-
failAssertion {
84-
val renderer = PointListRenderer<CallTrace>()
85-
val shortener = tools.createGroupMockReceiverShortener()
86-
shortener.prepare(tracing.unverified, emptyList())
87-
val unverifiedCalls = shortener.shortenTraces(tracing.unverified)
88-
appendLine("Unverified calls for $mock:")
89-
append(renderer.render(unverifiedCalls))
79+
mokkeryContext
80+
.require(MocksRegistry)
81+
.mocks
82+
.scopes
83+
.forEach { mock ->
84+
val tracing = mock
85+
.mokkeryMockInterceptor
86+
.callTracing
87+
if (tracing.unverified.isNotEmpty()) {
88+
failAssertion {
89+
val renderer = PointListRenderer<CallTrace>()
90+
val shortener = tools.createGroupMockReceiverShortener()
91+
shortener.prepare(tracing.unverified, emptyList())
92+
val unverifiedCalls = shortener.shortenTraces(tracing.unverified)
93+
appendLine("Unverified calls for $mock:")
94+
append(renderer.render(unverifiedCalls))
95+
}
9096
}
9197
}
92-
}
9398
}

mokkery-runtime/src/commonMain/kotlin/dev/mokkery/debug/Debug.kt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,26 @@ package dev.mokkery.debug
22

33
import dev.mokkery.answering.Answer
44
import dev.mokkery.internal.GlobalMokkeryScope
5-
import dev.mokkery.internal.MokkeryMockInstance
5+
import dev.mokkery.internal.MokkeryInstanceScope
66
import dev.mokkery.internal.context.currentMockContext
7-
import dev.mokkery.internal.context.resolveMockInstance
7+
import dev.mokkery.internal.context.resolveScopeOrNull
88
import dev.mokkery.internal.context.tools
9-
import dev.mokkery.internal.id
10-
import dev.mokkery.internal.interceptor
119
import dev.mokkery.internal.interceptor.AnsweringInterceptor
1210
import dev.mokkery.internal.interceptor.CallTracingInterceptor
1311
import dev.mokkery.internal.interceptor.MokkeryKind
12+
import dev.mokkery.internal.mockId
13+
import dev.mokkery.internal.mokkeryMockInterceptor
1414

1515
/**
1616
* Returns json-like structure of [obj] details (tracked calls, configured answers etc.).
1717
*/
1818
public fun mokkeryDebugString(obj: Any): String {
19-
return when (val instance = GlobalMokkeryScope.tools.resolveMockInstance(obj)) {
20-
is MokkeryMockInstance -> when (instance.currentMockContext.kind) {
21-
MokkeryKind.Spy -> mokkeryDebugSpy(instance)
22-
MokkeryKind.Mock -> mokkeryDebugMock(instance)
19+
return when (val scope = GlobalMokkeryScope.tools.resolveScopeOrNull(obj)) {
20+
null -> "Not a mock/spy -> $obj"
21+
else -> when (scope.currentMockContext.kind) {
22+
MokkeryKind.Spy -> mokkeryDebugSpy(scope)
23+
MokkeryKind.Mock -> mokkeryDebugMock(scope)
2324
}
24-
else -> "Not a mock/spy -> $obj"
2525
}
2626
}
2727

@@ -32,23 +32,23 @@ public fun printMokkeryDebug(obj: Any) {
3232
println(mokkeryDebugString(obj))
3333
}
3434

35-
private fun mokkeryDebugMock(instance: MokkeryMockInstance): String {
35+
private fun mokkeryDebugMock(instance: MokkeryInstanceScope): String {
3636
return buildHierarchicalString {
3737
section("mock") {
38-
value("id", instance.id)
38+
value("id", instance.mockId)
3939
value("mode", instance.currentMockContext.mode.name)
40-
answersSection(instance.interceptor.answering)
41-
callsSection(instance.interceptor.callTracing)
40+
answersSection(instance.mokkeryMockInterceptor.answering)
41+
callsSection(instance.mokkeryMockInterceptor.callTracing)
4242
}
4343
}
4444
}
4545

46-
private fun mokkeryDebugSpy(instance: MokkeryMockInstance): String {
46+
private fun mokkeryDebugSpy(instance: MokkeryInstanceScope): String {
4747
return buildHierarchicalString {
4848
section("spy") {
49-
value("id", instance.id)
50-
answersSection(instance.interceptor.answering)
51-
callsSection(instance.interceptor.callTracing)
49+
value("id", instance.mockId)
50+
answersSection(instance.mokkeryMockInterceptor.answering)
51+
callsSection(instance.mokkeryMockInterceptor.callTracing)
5252
}
5353
}
5454
}

0 commit comments

Comments
 (0)