Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add tests for ReflectionUtil.kt
  • Loading branch information
sergeypospelov committed Jul 11, 2022
commit 7e2bc71bbdf8efeb1ac97ab3805126c4c41d9e03
3 changes: 3 additions & 0 deletions utbot-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ apply from: "${parent.projectDir}/gradle/include/jvm-project.gradle"
dependencies {
implementation group: 'io.github.microutils', name: 'kotlin-logging', version: kotlin_logging_version
implementation group: 'net.java.dev.jna', name: 'jna-platform', version: '5.5.0'

testImplementation project(':utbot-sample')
testImplementation group: 'junit', name: 'junit', version: junit4_version
}

shadowJar {
Expand Down
2 changes: 2 additions & 0 deletions utbot-core/src/main/kotlin/org/utbot/common/ReflectionUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ object Reflection {

inline fun <R> AccessibleObject.withAccessibility(block: () -> R): R {
val prevAccessibility = isAccessible
isAccessible = true

try {
return block()
} finally {
Expand Down
117 changes: 117 additions & 0 deletions utbot-core/src/test/kotlin/org/utbot/common/ReflectionUtilTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package org.utbot.common

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Test
import org.utbot.examples.reflection.ClassWithDifferentModifiers
import org.utbot.examples.reflection.ClassWithDifferentModifiers.Wrapper

class ReflectionUtilTest {
private val testedClass = ClassWithDifferentModifiers::class.java

@Test
fun testPackagePrivateInvoke() {
val method = testedClass.declaredMethods.first { it.name == "packagePrivateMethod"}
val instance = ClassWithDifferentModifiers()

method.apply {
withAccessibility {
assertEquals(1, invoke(instance))
}
}
}

@Test
fun testPrivateInvoke() {
val method = testedClass.declaredMethods.first { it.name == "privateMethod"}
val instance = ClassWithDifferentModifiers()

method.apply {
withAccessibility {
assertEquals(1, invoke(instance))
}
}

}

@Test
fun testPrivateFieldSetting() {
val field = testedClass.declaredFields.first { it.name == "privateField" }
val instance = ClassWithDifferentModifiers()

field.apply {
withAccessibility {
set(instance, 0)
}
}
}

@Test
fun testPrivateFieldGetting() {
val field = testedClass.declaredFields.first { it.name == "privateField" }
val instance = ClassWithDifferentModifiers()

field.apply {
withAccessibility {
assertEquals(0, get(instance))
}
}

}

@Test
fun testPrivateFieldGettingAfterSetting() {
val field = testedClass.declaredFields.first { it.name == "privateField" }
val instance = ClassWithDifferentModifiers()


field.apply {
withAccessibility {
set(instance, 1)
}

withAccessibility {
assertEquals(1, get(instance))
}
}
}

@Test
fun testPrivateStaticFinalFieldSetting() {
val field = testedClass.declaredFields.first { it.name == "privateStaticFinalField" }

field.apply {
withAccessibility {
set(null, Wrapper(2))
}
}
}

@Test
fun testPrivateStaticFinalFieldGetting() {
val field = testedClass.declaredFields.first { it.name == "privateStaticFinalField" }

field.apply {
withAccessibility {
val value = get(null) as? Wrapper
assertNotNull(value)
}
}
}

@Test
fun testPrivateStaticFinalFieldGettingAfterSetting() {
val field = testedClass.declaredFields.first { it.name == "privateStaticFinalField" }

field.apply {
withAccessibility {
set(null, Wrapper(3))
}

withAccessibility {
val value = (get(null) as? Wrapper)?.x
assertEquals(3, value)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.utbot.examples.reflection;

public class ClassWithDifferentModifiers {
@SuppressWarnings({"All"})
private int privateField;

private static final Wrapper privateStaticFinalField = new Wrapper(1);

public ClassWithDifferentModifiers() {
privateField = 0;
}

int packagePrivateMethod() {
return 1;
}

private int privateMethod() {
return 1;
}

public static class Wrapper {
public int x;
public Wrapper(int x) {
this.x = x;
}
}
}