1
+ package org.utbot.framework.plugin.api
2
+
3
+ import org.junit.jupiter.api.Assertions.*
4
+ import org.junit.jupiter.api.Test
5
+ import org.utbot.framework.plugin.api.util.UtContext
6
+ import org.utbot.framework.plugin.api.util.doubleWrapperClassId
7
+ import org.utbot.framework.plugin.api.util.id
8
+ import org.utbot.framework.plugin.api.util.voidClassId
9
+ import org.utbot.framework.plugin.api.util.withUtContext
10
+ import org.utbot.fuzzer.FuzzedMethodDescription
11
+ import org.utbot.fuzzer.objects.create
12
+ import org.utbot.fuzzer.objects.replaceToMock
13
+ import org.utbot.fuzzer.objects.toFuzzerMockable
14
+ import org.utbot.fuzzer.providers.ObjectModelProvider
15
+
16
+ class MockOfObjectModelProviderTest {
17
+
18
+ class Some {
19
+ @Suppress(" unused" )
20
+ var another: Some ? = null
21
+ }
22
+
23
+ @Test
24
+ fun `no mock is generated by default` () = withContext {
25
+ val description = FuzzedMethodDescription (" test" , voidClassId, listOf (Some ::class .id))
26
+ val provider = ObjectModelProvider (TestIdentityPreservingIdGenerator )
27
+ val results = provider.generate(description).map { it.value.model }.map {
28
+ replaceToMock(it) { m -> description.shouldMock(m) }
29
+ }.toList()
30
+ assertEquals(2 , results.size)
31
+ results.forEach { model ->
32
+ assertInstanceOf(UtAssembleModel ::class .java, model)
33
+ }
34
+ assertEquals(0 , (results[0 ] as UtAssembleModel ).modificationsChain.size)
35
+ assertEquals(1 , (results[1 ] as UtAssembleModel ).modificationsChain.size)
36
+ }
37
+
38
+ @Test
39
+ fun `mock is generated` () = withContext {
40
+ val description = FuzzedMethodDescription (" test" , voidClassId, listOf (Some ::class .id)).apply {
41
+ shouldMock = { true }
42
+ }
43
+ val provider = ObjectModelProvider (TestIdentityPreservingIdGenerator )
44
+ val results = provider.generate(description).map { it.value.model }.map {
45
+ replaceToMock(it) { m -> description.shouldMock(m) }
46
+ }.toList()
47
+ assertEquals(2 , results.size)
48
+ results.forEach { model ->
49
+ assertInstanceOf(UtCompositeModel ::class .java, model)
50
+ assertTrue((model as UtCompositeModel ).isMock)
51
+ }
52
+ }
53
+
54
+ @Test
55
+ fun `mock is generated for several recursion level` () = withContext {
56
+ val description = FuzzedMethodDescription (" test" , voidClassId, listOf (Some ::class .id)).apply {
57
+ shouldMock = { true }
58
+ }
59
+ val provider = ObjectModelProvider (TestIdentityPreservingIdGenerator , recursionDepthLeft = 2 )
60
+ val results = provider.generate(description).map { it.value.model }.map {
61
+ replaceToMock(it) { m -> description.shouldMock(m) }
62
+ }.toList()
63
+ assertEquals(2 , results.size)
64
+ results.forEach { model ->
65
+ assertInstanceOf(UtCompositeModel ::class .java, model)
66
+ assertTrue((model as UtCompositeModel ).isMock)
67
+ }
68
+ val modelWithFieldChanger = results[1 ] as UtCompositeModel
69
+ assertEquals(1 , modelWithFieldChanger.mocks.size)
70
+ val entry = modelWithFieldChanger.mocks.entries.single()
71
+ assertEquals(" getAnother" , entry.key.name)
72
+ assertEquals(Some ::class .id, entry.key.returnType)
73
+ assertEquals(1 , entry.value.size)
74
+ assertInstanceOf(UtCompositeModel ::class .java, entry.value.single())
75
+ }
76
+
77
+ @Test
78
+ fun `check field replaced with concrete values` () {
79
+ val customModel = Any ::class .id.create {
80
+ using empty constructor
81
+ call instance field(" some" ) with UtNullModel (Nothing ::class .id)
82
+ }
83
+ val replacedModel = replaceToMock(customModel) { true }
84
+ assertInstanceOf(UtCompositeModel ::class .java, replacedModel)
85
+ replacedModel as UtCompositeModel
86
+ assertEquals(0 , replacedModel.mocks.size)
87
+ val fields = replacedModel.fields
88
+ assertEquals(1 , fields.size)
89
+ val entry = fields.entries.single()
90
+ assertEquals(" some" , entry.key.name)
91
+ assertEquals(UtNullModel (Nothing ::class .id), entry.value)
92
+ }
93
+
94
+ @Test
95
+ fun `check method replaced with mock values` () {
96
+ val customModel = Any ::class .id.create {
97
+ using empty constructor
98
+ call instance method(" some" ).toFuzzerMockable {
99
+ yield (MethodId (classId, " another" , doubleWrapperClassId, emptyList()) to listOf (UtPrimitiveModel (2.0 )))
100
+ } with values(UtNullModel (Nothing ::class .id))
101
+ }
102
+ val replacedModel = replaceToMock(customModel) { true }
103
+ assertInstanceOf(UtCompositeModel ::class .java, replacedModel)
104
+ replacedModel as UtCompositeModel
105
+ assertEquals(0 , replacedModel.fields.size)
106
+ val mocks = replacedModel.mocks
107
+ assertEquals(1 , replacedModel.mocks.size)
108
+ val (executableId, models) = mocks.entries.single()
109
+ assertEquals(" another" , executableId.name)
110
+ assertEquals(doubleWrapperClassId, executableId.returnType)
111
+ assertEquals(0 , executableId.parameters.size)
112
+ assertEquals(1 , models.size)
113
+ assertInstanceOf(UtPrimitiveModel ::class .java, models.single())
114
+ assertEquals(2.0 , (models.single() as UtPrimitiveModel ).value)
115
+ }
116
+
117
+ private fun <T > withContext (block : () -> T ) {
118
+ withUtContext(UtContext (this ::class .java.classLoader)) {
119
+ block()
120
+ }
121
+ }
122
+
123
+ }
0 commit comments