aboutsummaryrefslogblamecommitdiff
path: root/doc-tool/test/UsecaseTest.scala
blob: 4eb072b98ff8fe8137c1120010e9d7cbafb301ae (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                           
                    
 
                                        

















                                                     
                                                                  
                                          
 

                                                                          
                                                   









                                                                     
                                   


                                                                           

                                                                                   


       
 

















                                                     
                                                                  











































                                                                                   
                                                                  
























                                                                                   





















                                                     
                                                                



















                                                                   





















                                                     
                                                                











                                                                                  
                           
                                                                                          

                                              
 
                               
                                                                                              

                                              
 
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._
import util.syntax._

class UsecaseTest extends DottyDocTest {
  @Test def simpleUsecase = {
    val source = new SourceFile(
      "DefWithUseCase.scala",
      """
      |package scala
      |
      |trait Test[A] {
      |  /** Definition with a "disturbing" signature
      |   *
      |   *  @usecase def foo: A
      |   */
      |  def foo[B]: A => B
      |}
      """.stripMargin
    )

    checkSources(source :: Nil) { packages =>
      packages("scala") match {
        case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) =>
          val List(foo: Def) = trt.members

          assert(foo.comment.isDefined, "Lost comment in transformations")

          val returnValue = foo.returnValue match {
            case ref: TypeReference => ref.title
            case _ =>
              assert(
                false,
                "Incorrect return value after usecase transformation"
              )
              ""
          }

          assert(
            foo.typeParams.isEmpty,
            "Type parameters were not stripped by usecase"
          )
          assert(returnValue == "A", "Incorrect return type after usecase")

          assert(foo.name == "foo", s"Incorrect name after transform: ${foo.name}")
      }
    }
  }

  @Test def simpleUsecaseAddedArg = {
    val source = new SourceFile(
      "DefWithUseCase.scala",
      """
      |package scala
      |
      |trait Test[A] {
      |  /** Definition with a "disturbing" signature
      |   *
      |   *  @usecase def foo(a: A): A
      |   */
      |  def foo[B]: A => B
      |}
      """.stripMargin
    )

    checkSources(source :: Nil) { packages =>
      packages("scala") match {
        case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) =>
          val List(foo: Def) = trt.members

          val returnValue = foo.returnValue match {
            case ref: TypeReference => ref.title
            case _ =>
              assert(
                false,
                "Incorrect return value after usecase transformation"
              )
              ""
          }

          assert(
            foo.typeParams.isEmpty,
            "Type parameters were not stripped by usecase"
          )
          assert(returnValue == "A", "Incorrect return type after usecase")
          assert(
            foo.paramLists.head.list.head.title == "a",
            "Incorrect parameter to function after usecase transformation"
          )
          assert(foo.name == "foo", s"Incorrect name after transform: ${foo.name}")
      }
    }
  }

  @Test def simpleTparamUsecase = {
    val source = new SourceFile(
      "DefWithUseCase.scala",
      """
      |package scala
      |
      |trait Test[A] {
      |  /** Definition with a "disturbing" signature
      |   *
      |   *  @usecase def foo[C]: A
      |   */
      |  def foo[B]: A => B
      |}
      """.stripMargin
    )

    checkSources(source :: Nil) { packages =>
      packages("scala") match {
        case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) =>
          val List(foo: Def) = trt.members

          val returnValue = foo.returnValue match {
            case ref: TypeReference => ref.title
            case _ =>
              assert(
                false,
                "Incorrect return value after usecase transformation"
              )
              ""
          }

          assert(
            foo.typeParams.nonEmpty,
            "Type parameters were incorrectly stripped by usecase"
          )

          assert(foo.typeParams.head == "C", "Incorrectly switched tparam")
          assert(returnValue == "A", "Incorrect return type after usecase")

          assert(foo.name == "foo", s"Incorrect name after transform: ${foo.name}")
      }
    }
  }

  @Test def expandColl = {
    val source = new SourceFile(
      "ExpandColl.scala",
      """
      |package scala
      |
      |/** The trait $Coll
      | *
      | *  @define Coll Iterable
      | */
      |trait Iterable[A] {
      |  /** Definition with a "disturbing" signature
      |   *
      |   *  @usecase def map[B](f: A => B): $Coll[B]
      |   */
      |  def map[B, M[B]](f: A => B): M[B] = ???
      |}
      """.stripMargin
    )

    checkSources(source :: Nil) { packages =>
      packages("scala") match {
      case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) =>
        val List(map: Def) = trt.members

        val returnValue = map.returnValue match {
          case ref: TypeReference => ref.title
          case _ =>
            assert(
              false,
              "Incorrect return value after usecase transformation"
            )
            ""
        }

        assert(
          returnValue == "Iterable",
          "Incorrect return type after usecase transformation"
        )
      }
    }
  }

  @Test def checkStripping = {
    val source = new SourceFile(
      "CheckStripping.scala",
      """
      |package scala
      |
      |/** The trait $Coll
      | *
      | *  @define Coll Iterable
      | */
      |trait Iterable[A] {
      |  /** Definition with a "disturbing" signature
      |   *
      |   *  @usecase def map[B](f: A => B): $Coll[B]
      |   */
      |  def map[B, M[B]](f: A => B): M[B] = ???
      |}
      """.stripMargin
    )

    checkSources(source :: Nil) { packages =>
      packages("scala") match {
      case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) =>
        val List(map: Def) = trt.members
        assert(map.comment.isDefined, "Lost comment in transformations")

        val docstr = ctx.docbase.docstring(map.symbol).get.raw
        assert(
          !docstr.contains("@usecase"),
          s"Comment should not contain usecase after stripping, but was:\n$docstr"
        )
      }
    }
  }

  @Test def checkIterator =
    checkFiles("../scala-scala/src/library/scala/collection/Iterator.scala" :: Nil) { _ =>
      // success if typer throws no errors! :)
    }

  @Test def checkIterableLike =
    checkFiles("../scala-scala/src/library/scala/collection/IterableLike.scala" :: Nil) { _ =>
      // success if typer throws no errors! :)
    }
}