@@ -89,130 +89,6 @@ class JavaFuzzingTest {
8989 assertEquals(probe1, probe2)
9090 }
9191
92- @Test
93- fun `recursive generic types are recognized correctly` () {
94- runBlockingWithContext {
95- val methods = Stubs ::class .java.methods
96- val method = methods.first { it.name == " resolve" && it.returnType == Int ::class .javaPrimitiveType }
97- val typeCache = IdentityHashMap <Type , FuzzedType >()
98- val type = toFuzzerType(method.genericParameterTypes.first(), typeCache)
99- assertEquals(1 , typeCache.size)
100- assertTrue(typeCache.values.all { type == = it })
101- assertEquals(1 , type.generics.size)
102- assertTrue(typeCache.values.all { type.generics[0 ] == = it })
103-
104- try {
105- // If FuzzerType has implemented `equals` and `hashCode` or is data class,
106- // that implements those methods implicitly,
107- // then adding it to hash table throws [StackOverflowError]
108- val set = HashSet <FuzzedType >()
109- set + = type
110- } catch (soe: StackOverflowError ) {
111- fail(" Looks like FuzzerType implements equals and hashCode, " +
112- " which leads unstable behaviour in recursive generics " , soe)
113- }
114- }
115- }
116-
117- @Test
118- fun `can pass types through` () {
119- runBlockingWithContext {
120- val cache = HashMap <Type , FuzzedType >()
121- val methods = Stubs ::class .java.methods
122- val method = methods.first { it.name == " types" }
123- val types = method.genericParameterTypes.map {
124- toFuzzerType(it, cache)
125- }
126- assertEquals(3 , cache.size) { " Cache should contain following types: List<Number>, Number and T[] for $method " }
127- assertTrue(cache.keys.any { t ->
128- t is Class <* > && t == java.lang.Number ::class .java
129- })
130- assertTrue(cache.keys.any { t ->
131- t is ParameterizedType
132- && t.rawType == java.util.List ::class .java
133- && t.actualTypeArguments.size == 1
134- && t.actualTypeArguments.first() == java.lang.Number ::class .java
135- })
136- assertTrue(cache.keys.any { t ->
137- t is GenericArrayType
138- && t.typeName == " T[]"
139- })
140- }
141- }
142-
143- @Test
144- fun `arrays with generics can be resolved` () {
145- runBlockingWithContext {
146- val cache = HashMap <Type , FuzzedType >()
147- val methods = Stubs ::class .java.methods
148- val method = methods.first { it.name == " arrayLength" }
149- method.genericParameterTypes.map {
150- toFuzzerType(it, cache)
151- }
152- assertEquals(4 , cache.size) { " Cache should contain following types: List<Number>, Number and T[] for $method " }
153- assertTrue(cache.keys.any { t ->
154- t is Class <* > && t == java.lang.Number ::class .java
155- })
156- assertTrue(cache.keys.any { t ->
157- t is ParameterizedType
158- && t.rawType == java.util.List ::class .java
159- && t.actualTypeArguments.size == 1
160- && t.actualTypeArguments.first().typeName == " T"
161- })
162- assertTrue(cache.keys.any { t ->
163- t is GenericArrayType
164- && t.typeName == " java.util.List<T>[]"
165- })
166- assertTrue(cache.keys.any { t ->
167- t is GenericArrayType
168- && t.typeName == " java.util.List<T>[][]"
169- })
170- }
171- }
172-
173- @Test
174- fun `run complex type dependency call` () {
175- runBlockingWithContext {
176- val cache = HashMap <Type , FuzzedType >()
177- val methods = Stubs ::class .java.methods
178- val method = methods.first { it.name == " example" }
179- val types = method.genericParameterTypes
180- assertTrue(types.size == 3 && types[0 ].typeName == " A" && types[1 ].typeName == " B" && types[2 ].typeName == " C" ) { " bad input parameters" }
181- method.genericParameterTypes.map {
182- toFuzzerType(it, cache)
183- }
184- assertEquals(4 , cache.size)
185- val typeIterableB = cache[types[0 ].replaceWithUpperBoundUntilNotTypeVariable()]!!
186- val genericOfIterableB = with (typeIterableB) {
187- assertEquals(iterableClassId, classId)
188- assertEquals(1 , generics.size)
189- generics[0 ]
190- }
191- val typeListA = cache[types[1 ].replaceWithUpperBoundUntilNotTypeVariable()]!!
192- val genericOfListA = with (typeListA) {
193- assertEquals(java.util.List ::class .id, classId)
194- assertEquals(1 , generics.size)
195- generics[0 ]
196- }
197- assertEquals(1 , genericOfIterableB.generics.size)
198- assertEquals(1 , genericOfListA.generics.size)
199- assertTrue(genericOfIterableB.generics[0 ] == = typeIterableB) { " Because of recursive types generic of B must depend on B itself" }
200- assertTrue(genericOfListA.generics[0 ] == = typeListA) { " Because of recursive types generic of A must depend on A itself" }
201-
202- val typeListC = cache[types[2 ].replaceWithUpperBoundUntilNotTypeVariable()]!!
203- val genericOfListC = with (typeListC) {
204- assertEquals(java.util.List ::class .id, classId)
205- assertEquals(1 , generics.size)
206- generics[0 ]
207- }
208-
209- assertEquals(1 , genericOfListC.generics.size)
210- assertEquals(iterableClassId, genericOfListC.generics[0 ].classId)
211- assertTrue(genericOfListC.generics[0 ].generics[0 ] == = typeListA) { " Generic of C must lead to type A" }
212-
213- }
214- }
215-
21692 @Test
21793 fun `fuzzing should not generate values of private classes` () {
21894 var exec = 0
@@ -353,16 +229,6 @@ class JavaFuzzingTest {
353229 assertNotEquals(0 , valueProvider.generate) { " Generate is never called for ${valueProvider.name} " }
354230 assertEquals(0 , executions) { " Execution must be never called, because of empty seed supply for ${valueProvider.name} " }
355231 }
356-
357- private fun <T > runBlockingWithContext (block : suspend () -> T ) : T {
358- return withUtContext(UtContext (this ::class .java.classLoader)) {
359- runBlocking {
360- withTimeout(10000 ) {
361- block()
362- }
363- }
364- }
365- }
366232}
367233
368234class MarkerValueProvider <T , R , D : Description <T >>(
0 commit comments