Skip to content

Commit

Permalink
add test for a wrapper type
Browse files Browse the repository at this point in the history
  • Loading branch information
evanchooly committed Jul 2, 2024
1 parent 0c84085 commit f5cecb6
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 42 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package dev.morphia.critter.parser

import dev.morphia.critter.parser.generators.AddFieldAccessorMethods
import dev.morphia.critter.parser.generators.EntityAccessorGenerator
import dev.morphia.critter.parser.generators.EntityTypeUpdate
import dev.morphia.critter.parser.java.CritterClassLoader
import dev.morphia.critter.parser.java.CritterParser.critterClassLoader
import dev.morphia.critter.sources.DummyEntity
import dev.morphia.critter.sources.KotlinDummyEntity
import ksp.org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.className
import org.bson.codecs.pojo.PropertyAccessor
import org.testng.Assert.assertEquals
import org.testng.Assert.assertTrue
Expand All @@ -19,63 +17,61 @@ class TestAsmGenerator {
}

@Test(dataProvider = "classes")
fun testNestedClass(type: Class<*>) {
fun testPropertyAccessors(type: Class<*>) {
val critterClassLoader = CritterClassLoader(Thread.currentThread().contextClassLoader)
val testFields =
listOf(
listOf("name", String::class.java, "set externally"),
listOf("age", Int::class.java, 100),
listOf("salary", java.lang.Long::class.java, 100_000L),
)
val bytes =
EntityTypeUpdate(type.name)
.update(mapOf("name" to String::class.java, "age" to Int::class.java))
AddFieldAccessorMethods(type.name)
.update(testFields.map { l -> l[0] as String to l[1] as Class<*> }.toMap())
critterClassLoader.register(type.name, bytes)

critterClassLoader.dump("target")

val entity = critterClassLoader.loadClass(type.name).getConstructor().newInstance()

testStringType(type, critterClassLoader, entity)
testPrimitiveType(type, critterClassLoader, entity)
testFields.forEach { field ->
testAccessor(
type,
critterClassLoader,
entity,
field[0] as String,
field[1] as Class<*>,
field[2]
)
}
}

private fun testStringType(
private fun testAccessor(
type: Class<*>,
critterClassLoader: CritterClassLoader,
entity: Any,
fieldName: String,
fieldType: Class<*>,
testValue: Any,
) {
val generator = EntityAccessorGenerator(type, "name", String::class.java)
val generator = EntityAccessorGenerator(type, fieldName, fieldType)
critterClassLoader.register(generator.accessorType.className, generator.dump())

critterClassLoader.dump("target")
if (EARLY) return
val type = generator.accessorType.className
var accessor =
(critterClassLoader.loadClass(type) as Class<PropertyAccessor<String>>)
val accessor =
(critterClassLoader.loadClass(generator.accessorType.className)
as Class<PropertyAccessor<Any>>)
.getConstructor()
.newInstance()

accessor.set(entity, "set externally")
accessor.set(entity, testValue)

assertEquals(accessor.get(entity), "set externally")
assertTrue(entity.toString().contains("set externally"), entity.toString())
}

private fun testPrimitiveType(
type: Class<*>,
critterClassLoader: CritterClassLoader,
entity: Any,
) {
val generator = EntityAccessorGenerator(type, "age", Int::class.java)
critterClassLoader.register(generator.accessorType.className, generator.dump())

critterClassLoader.dump("target")
if (EARLY) return
val type = generator.accessorType.className
var accessor =
(critterClassLoader.loadClass(type) as Class<PropertyAccessor<Int>>)
.getConstructor()
.newInstance()

accessor.set(entity, 100)

assertEquals(accessor.get(entity), 100)
assertTrue(entity.toString().contains("100"), entity.toString())
assertEquals(accessor.get(entity), testValue)
assertTrue(
entity.toString().contains(testValue.toString()),
"Could not find '$testValue` in :${entity}"
)
}

@DataProvider(name = "classes")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import org.objectweb.asm.Opcodes.PUTFIELD
import org.objectweb.asm.Opcodes.RETURN
import org.objectweb.asm.Type

class EntityTypeUpdate(val entity: String) {
class AddFieldAccessorMethods(val entity: String) {
val entityType = Type.getType("L" + entity.replace('.', '/') + ";")

fun update(fields: Map<String, Class<*>>): ByteArray {
Expand All @@ -31,8 +31,6 @@ class EntityTypeUpdate(val entity: String) {
}

writer.visitEnd()
// val out = ClassWriter(0)
// classNode.accept(out)
return writer.toByteArray()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ public class DummyEntity {
private String name = "DummyEntity";

private int age = 21;
private Long salary = 2L;

@Override
public String toString() {
return "DummyEntity{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package dev.morphia.critter.sources
class KotlinDummyEntity {
private var name = "DummyEntity"
private var age = 21
private var salary: Long? = 2L

override fun toString(): String {
return "KotlinDummyEntity(name='$name', age=$age)"
return "KotlinDummyEntity(name='$name', age=$age, salary=$salary)"
}
}

0 comments on commit f5cecb6

Please sign in to comment.