phodal/chapi

View on GitHub
chapi-ast-scala/src/test/kotlin/chapi/ast/scalaast/ScalaFullIdentListenerTest.kt

Summary

Maintainability
B
4 hrs
Test Coverage
package chapi.ast.scalaast

import chapi.domain.core.DataStructType
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals

internal class ScalaFullIdentListenerTest {
    private val helloworld: String = """
object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, world!")
  }
}      
"""

    @Test
    internal fun shouldIdentObjectName() {
        val container = ScalaAnalyser().analysis(helloworld, "hello.scala")
        assertEquals(container.DataStructures.size, 1)
        assertEquals(container.DataStructures[0].NodeName, "HelloWorld")
        assertEquals(container.DataStructures[0].Type, DataStructType.OBJECT)
    }

    @Test
    internal fun shouldIdentClassName() {
        val code = """
class Outer(i : IntValue) {
  def foo(x : Inner.type) = x.getI
}
"""

        val container = ScalaAnalyser().analysis(code, "hello.scala")
        assertEquals(container.DataStructures.size, 1)
        assertEquals(container.DataStructures[0].NodeName, "Outer")
        assertEquals(container.DataStructures[0].Type, DataStructType.CLASS)
    }

    @Test
    internal fun shouldIdentClassParameters() {
        val code = """
class Outer(i : IntValue) {
  def foo(x : Inner.type) = x.getI
}
"""

        val container = ScalaAnalyser().analysis(code, "hello.scala")
        assertEquals(container.DataStructures.size, 1)
        assertEquals(container.DataStructures[0].Parameters.size, 1)
        assertEquals(container.DataStructures[0].Parameters[0].TypeType, "IntValue")
        assertEquals(container.DataStructures[0].Parameters[0].TypeValue, "i")
    }

    @Test
    internal fun shouldIdentOutClassInnerObjectName() {
        val code = """
class Outer(i : IntValue) {
  object Inner {
    def getI : IntValue = i
  }
  def foo(x : Inner.type) = x.getI
}
"""

        val container = ScalaAnalyser().analysis(code, "hello.scala")
        assertEquals(container.DataStructures.size, 1)
        assertEquals(container.DataStructures[0].InnerStructures.size, 1)
        assertEquals(container.DataStructures[0].InnerStructures[0].Type, DataStructType.OBJECT)
        assertEquals(container.DataStructures[0].InnerStructures[0].NodeName, "Inner")
    }

    @Test
    internal fun shouldIdentExtendClassName() {
        val code = """
class CapComer(val transformation: SparktacusTransformation) extends TransformationTrait{

}
        """
        val container = ScalaAnalyser().analysis(code, "hello.scala")
        assertEquals(container.DataStructures[0].NodeName, "CapComer")
        assertEquals(container.DataStructures[0].Extend, "TransformationTrait")
    }

    @Test
    internal fun shouldIdentTraitName() {
        val code = """
trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}

class IntIterator(to: IntValue) extends Iterator[IntValue] {
  private var current = 0
  override def hasNext: Boolean = current < to   
}
"""

        val container = ScalaAnalyser().analysis(code, "hello.scala")
        assertEquals(container.DataStructures[0].NodeName, "Iterator")
        assertEquals(container.DataStructures[0].Type, DataStructType.TRAIT)
    }

    @Test
    internal fun shouldIdentMultipleTraitName() {
        val code = """
abstract class Animal {
  def speak
}

trait WaggingTail {
  def startTail
  def stopTail
}

trait FourLeggedAnimal {
  def walk
  def run
}

class Dog extends Animal with WaggingTail with FourLeggedAnimal {
  // implementation code here ...
}
"""

    }

    @Test
    internal fun shouldIdentInstantiateObject() {
        val code = """
 class VanillaDonut(name: String) extends Donut(name) {
   override def printName: Unit = println(name)
 }
 object VanillaDonut {
   def apply(name: String): Donut = {
     new VanillaDonut(name)
   }
}
"""
    }

    @Test
    internal fun shouldIdentifyPackageName() {
        val code = """
package  xxx.yy.zz.aa.bb.commons.transformation

import chapi
"""

        val container = ScalaAnalyser().analysis(code, "hello.scala")
        assertEquals(container.PackageName, "xxx.yy.zz.aa.bb.commons.transformation")
    }
}