package dotty.tools
package dottydoc
import org.junit.Test
import org.junit.Assert._
import dotc.util.SourceFile
import model._
import model.internal._
import model.references._
class Constructors extends DottyDocTest {
@Test def singleClassConstructor = {
val source = new SourceFile (
"Class.scala",
"""
|package scala
|
|class Class(val str: String)
""".stripMargin
)
checkSources(source :: Nil) { packages =>
packages("scala") match {
case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) =>
cls.constructors.headOption match {
case Some(ParamListImpl(NamedReference("str", _, false, false) :: Nil, false) :: Nil) =>
// success!
case _ => assert(false, s"Incorrect constructor found: ${cls.constructors}")
}
}
}
}
@Test def constructorPlusImplicitArgList = {
val source = new SourceFile (
"Class.scala",
"""
|package scala
|
|class Class(val str1: String)(implicit str2: String)
""".stripMargin
)
checkSources(source :: Nil) { packages =>
packages("scala") match {
case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) =>
cls.constructors match {
case (
ParamListImpl(NamedReference("str1", _, false, false) :: Nil, false) ::
ParamListImpl(NamedReference("str2", _, false, false) :: Nil, true) :: Nil
) :: Nil =>
// success!
case _ => assert(false, s"Incorrect constructor found: ${cls.constructors}")
}
}
}
}
@Test def multipleArgumentListsForConstructor = {
val source = new SourceFile (
"Class.scala",
"""
|package scala
|
|class Class(val str1: String)(val str2: String)(implicit str3: String)
""".stripMargin
)
checkSources(source :: Nil) { packages =>
packages("scala") match {
case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) =>
cls.constructors match {
case (
ParamListImpl(NamedReference("str1", _, false, false) :: Nil, false) ::
ParamListImpl(NamedReference("str2", _, false, false) :: Nil, false) ::
ParamListImpl(NamedReference("str3", _, false, false) :: Nil, true) :: Nil
) :: Nil =>
// success!
case _ => assert(false, s"Incorrect constructor found: ${cls.constructors}")
}
}
}
}
@Test def multipleConstructors = {
val source = new SourceFile (
"Class.scala",
"""
|package scala
|
|class Class(val main: String) {
| def this(alt1: Int) =
| this("String")
|
| def this(alt2: List[String]) =
| this(alt2.head)
|}
""".stripMargin
)
checkSources(source :: Nil) { packages =>
packages("scala") match {
case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) =>
cls.constructors match {
case (
ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil
) :: (
ParamListImpl(NamedReference("alt1", _, false, false) :: Nil, false) :: Nil
) :: (
ParamListImpl(NamedReference("alt2", _, false, false) :: Nil, false) :: Nil
) :: Nil =>
// success!
case _ =>
assert(
false,
s"""Incorrect constructor found:\n${cls.constructors.mkString("\n")}"""
)
}
}
}
}
@Test def multipleConstructorsCC = {
val source = new SourceFile (
"Class.scala",
"""
|package scala
|
|case class Class(val main: String) {
| def this(alt1: Int) =
| this("String")
|
| def this(alt2: List[String]) =
| this(alt2.head)
|}
""".stripMargin
)
checkSources(source :: Nil) { packages =>
packages("scala") match {
case PackageImpl(_, _, _, List(cls: CaseClass, obj: Object), _, _, _, _) =>
cls.constructors match {
case (
ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil
) :: (
ParamListImpl(NamedReference("alt1", _, false, false) :: Nil, false) :: Nil
) :: (
ParamListImpl(NamedReference("alt2", _, false, false) :: Nil, false) :: Nil
) :: Nil =>
// success!
case _ =>
println(obj.members.map(x => x.kind + " " + x.name))
assert(
false,
s"""Incorrect constructor found:\n${cls.constructors.mkString("\n")}"""
)
}
}
}
}
@Test def traitParameters = {
val source = new SourceFile (
"Trait.scala",
"""
|package scala
|
|trait Trait(val main: String)
""".stripMargin
)
checkSources(source :: Nil) { packages =>
packages("scala") match {
case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) =>
trt.traitParams match {
case ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil =>
case _ =>
assert(
false,
s"""Incorrect constructor found:\n${trt.traitParams.mkString("\n")}"""
)
}
}
}
}
}