From 654e5afede4eb54079ddd933ade098770720521a Mon Sep 17 00:00:00 2001 From: Adrian Papari Date: Sat, 18 Nov 2023 11:40:34 +0100 Subject: [PATCH] update tests --- .../kotlin/sift/core/element/FieldNode.kt | 2 +- .../main/kotlin/sift/core/tree/ElementNode.kt | 2 + .../kotlin/sift/core/KnownLimitationsTest.kt | 51 ----------- core/src/test/kotlin/sift/core/dsl/DslTest.kt | 89 ++++++++++++++++--- 4 files changed, 81 insertions(+), 63 deletions(-) diff --git a/core/src/main/kotlin/sift/core/element/FieldNode.kt b/core/src/main/kotlin/sift/core/element/FieldNode.kt index 81284f9..c3bdbc7 100644 --- a/core/src/main/kotlin/sift/core/element/FieldNode.kt +++ b/core/src/main/kotlin/sift/core/element/FieldNode.kt @@ -16,7 +16,7 @@ class FieldNode private constructor( private val kprop: KotlinProperty?, override val annotations: List, internal val signature: FieldSignatureNode? = fn.signature(cn.signature?.formalParameters ?: listOf()), - private val originalCn: ClassNode? = null, // when field is inherited + internal val originalCn: ClassNode? = null, // when field is inherited ) : Element(), Trait.HasType { init { diff --git a/core/src/main/kotlin/sift/core/tree/ElementNode.kt b/core/src/main/kotlin/sift/core/tree/ElementNode.kt index 03050a4..6be4440 100644 --- a/core/src/main/kotlin/sift/core/tree/ElementNode.kt +++ b/core/src/main/kotlin/sift/core/tree/ElementNode.kt @@ -59,9 +59,11 @@ private fun Element.properties(): List { is FieldNode -> listOfNotNull( "synth".takeIf { access and Opcodes.ACC_SYNTHETIC != 0 }, "static".takeIf { access and Opcodes.ACC_STATIC != 0 }, + "inherited".takeIf { originalCn != null }, ) is MethodNode -> listOfNotNull( "abstract".takeIf { isAbstract }, + "inherited".takeIf { originalCn != null }, "static".takeIf { access and Opcodes.ACC_STATIC != 0 }, "synth".takeIf { access and Opcodes.ACC_SYNTHETIC != 0 }, ) diff --git a/core/src/test/kotlin/sift/core/KnownLimitationsTest.kt b/core/src/test/kotlin/sift/core/KnownLimitationsTest.kt index 95948fd..b293fbc 100644 --- a/core/src/test/kotlin/sift/core/KnownLimitationsTest.kt +++ b/core/src/test/kotlin/sift/core/KnownLimitationsTest.kt @@ -1,19 +1,10 @@ package sift.core -import org.assertj.core.api.Assertions import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.objectweb.asm.tree.ClassNode import sift.core.api.* import sift.core.api.debug.debugTraces -import sift.core.api.testdata.set1.Payload -import sift.core.api.testdata.set2.HandlerFn -import sift.core.api.testdata.set2.HandlerOfFns -import sift.core.asm.classNode -import sift.core.dsl.annotatedBy -import sift.core.dsl.classes -import sift.core.entity.Entity import sift.core.entity.EntityService import sift.core.junit.LogActiveTestExtension @@ -25,48 +16,6 @@ class KnownLimitationsTest { debugLog = true } - @Test - fun `correctly identify relations when scanning instantiations`() { - val cns = listOf( - classNode(), - classNode(), - classNode(), - ) - - val handler = Entity.Type("handler") - val data = Entity.Type("data") - - classes { - scope("scan handler") { - methods { - annotatedBy() - entity(handler) - - parameters { - parameter(0) - explodeType { - entity(data) - } - } - -// works; reverse lookup via "backtrack" children -// data.instantiations["sent-by"] = handler - - instantiationsOf(data) { - data["sent-by"] = handler - } - } - } - }.execute(cns) { es -> -// assertThat(es[data].values.first().children["sent-by"]!!.map(Entity::toString)) - Assertions.assertThat(es[data].values.first().children["sent-by"]!!.map(Entity::toString)) - .containsExactlyInAnyOrder( - "Entity(HandlerOfFns::on, type=handler)", - "Entity(HandlerOfFns::boo, type=handler)", - ) - } - } - private fun Action.execute( cns: List, block: (EntityService) -> Unit diff --git a/core/src/test/kotlin/sift/core/dsl/DslTest.kt b/core/src/test/kotlin/sift/core/dsl/DslTest.kt index 632a7c1..af1f9a2 100644 --- a/core/src/test/kotlin/sift/core/dsl/DslTest.kt +++ b/core/src/test/kotlin/sift/core/dsl/DslTest.kt @@ -2021,6 +2021,44 @@ class DslTest { } } + @Test + fun `correctly identify relations when scanning instantiations with invocations-of`() { + val cns = listOf( + classNode(), + classNode(), + classNode(), + ) + + val handler = Entity.Type("handler") + val data = Entity.Type("data") + + classes { + scope("scan handler") { + methods { + annotatedBy() + entity(handler) + + parameters { + parameter(0) + explodeType { + entity(data) + } + } + + instantiationsOf(data) { + data["sent-by"] = handler + } + } + } + }.expecting(cns) { es -> + assertThat((es[data].values.first().children["sent-by"]!!.map(Entity::toString))) + .containsExactlyInAnyOrder( + "Entity(HandlerOfFns::on, type=handler, element-id=1, element-type=MethodNode)", + "Entity(HandlerOfFns::boo, type=handler, element-id=2, element-type=MethodNode)", + ) + } + } + @Test fun `associate controller as parent of endpoints`() { val controller = Entity.Type("controller") @@ -2435,31 +2473,60 @@ class DslTest { ) } - @Test @Disabled("need to resolve generic type of inherited methods") - fun `methods from delegated instances are not duplicated`() { - class Hello : HelloG { - override fun hello(): String = "" + @Test + fun `delegated methods`() { + class Greeting + + class Hello : HelloG { + override fun hello(): Greeting = Greeting() } - class FooBar(hello: Helloer) : HelloG { - override fun hello(): String = "" + class FooBar(hello: Hello) : HelloG by hello + + class FooBarOverrideDelegate(hello: Hello) : HelloG by hello { + override fun hello(): Greeting = TODO("no greeting instantiated") } val cns = listOf( classNode(Hello::class), classNode(HelloG::class), + classNode(Greeting::class), classNode(FooBar::class), + classNode(FooBarOverrideDelegate::class), ) val m = Entity.Type("hello-method") + val greet = Entity.Type("greeting") + + template { + classes { + filter("Greeting") + entity(greet, label("Greeting")) + } + classes { + filter(Regex("\\.FooBar$")) + methods(inherited) { + entity(m, label("\${name}()"), property("name", readName())) + m["instantiates"] = greet.instantiations + } + } + }.expecting(cns, m, """ + ── hello-method + └─ hello() + └─ Greeting + """ + ) template { classes { - filter(Regex("\\.FooBar")) - methods(inherited + abstractMethods) { - entity(m, label("\${name}()"), - property("name", readName()) - ) + filter("Greeting") + entity(greet, label("Greeting")) + } + classes { + filter(Regex("\\.FooBarOverrideDelegate")) + methods(inherited) { + entity(m, label("\${name}()"), property("name", readName())) + m["instantiates"] = greet.instantiations } } }.expecting(cns, m, """