aboutsummaryrefslogblamecommitdiff
path: root/doc-tool/test/MarkdownTests.scala
blob: 144acbdfba43bc103697b5aa9c3e3ee5d40af3e6 (plain) (tree)














































































































































































































































                                                                                    





                                                             






























































                                                                                                         
 
package dotty.tools
package dottydoc

import org.junit.Test
import org.junit.Assert._

import dotc.core.Contexts.{ Context, ContextBase, FreshContext }
import dotc.core.Comments.{ ContextDoc, ContextDocstrings }
import dottydoc.core.ContextDottydoc

class MarkdownTests extends DottyDocTest {
  override implicit val ctx: FreshContext = {
    // TODO: check if can reuse parent instead of copy-paste
    val base = new ContextBase
    import base.settings._
    val ctx = base.initialCtx.fresh
    ctx.setSetting(ctx.settings.language, List("Scala2"))
    ctx.setSetting(ctx.settings.YkeepComments, true)
    ctx.setSetting(ctx.settings.YnoInline, true)
    // No wiki syntax!
    ctx.setSetting(ctx.settings.wikiSyntax, false)
    ctx.setProperty(ContextDoc, new ContextDottydoc)
    ctx.setSetting(
      ctx.settings.classpath,
      "../library/target/scala-2.11/dotty-library_2.11-0.1-SNAPSHOT.jar"
    )
    base.initialize()(ctx)
    ctx
  }

  @Test def simpleMarkdown = {
    val source =
      """
      |package scala
      |
      |/** *Hello*, world! */
      |trait HelloWorld
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

      assertEquals("<p><em>Hello</em>, world!</p>", traitCmt)
    }
  }

  @Test def outerLink = {
    val source =
      """
      |package scala
      |
      |/** [out](http://www.google.com) */
      |trait HelloWorld
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals("""<p><a href="http://www.google.com">out</a></p>""", traitCmt)
    }
  }

  @Test def relativeLink = {
    val source =
      """
      |package scala
      |
      |/** [None](./None.html) */
      |trait HelloWorld
      |
      |trait None
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals("""<p><a href="./None.html">None</a></p>""", traitCmt)
    }
  }

  @Test def absoluteLink = {
    val source =
      """
      |package scala
      |
      |/** [None](scala.None) */
      |trait HelloWorld
      |
      |trait None
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals("""<p><a href="../scala/None.html">None</a></p>""", traitCmt)
    }
  }

  @Test def handleLists = {
    val source =
      """
      |package scala
      |
      |/** - Item1
      |  * - Item2
      |  * - Item3
      |  */
      |trait HelloWorld
      |
      |trait None
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals(
          """|<ul>
             |<li>Item1</li>
             |<li>Item2</li>
             |<li>Item3</li>
             |</ul>""".stripMargin, traitCmt)
    }
  }

  @Test def handleNestedLists = {
    val source =
      """
      |package scala
      |
      |/** - Item1
      |  *   - Item1a
      |  *   - Item1b
      |  * - Item2
      |  * - Item3
      |  */
      |trait HelloWorld
      |
      |trait None
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals(
          """|<ul>
             |<li>Item1
             |<ul>
             |<li>Item1a</li>
             |<li>Item1b</li>
             |</ul>
             |</li>
             |<li>Item2</li>
             |<li>Item3</li>
             |</ul>""".stripMargin, traitCmt)
    }
  }

  @Test def handleCodeBlock = {
    val source =
      """
      |package scala
      |
      |/** ```scala
      |  * val x = 1 + 5
      |  * ```
      |  */
      |trait HelloWorld
      |
      |trait None
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals(
          """|<pre><code class="language-scala">val x = 1 + 5
             |</code></pre>""".stripMargin, traitCmt)
    }
  }

  @Test def handleCodeBlockJavaDocstring = {
    // the following works, but not when the start of the codeblock is on the
    // first line
    val source =
      """
      |package scala
      |
      |/**
      | *  ```scala
      | *  val x = 1 + 5
      | *  ```
      | */
      |trait HelloWorld
      |
      |trait None
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.body))
        .get
        .trim

        assertEquals(
          """|<pre><code class="language-scala">val x = 1 + 5
             |</code></pre>""".stripMargin, traitCmt)
    }
  }

  @Test def docstringSummary = {
    val source =
      """
      |package scala
      |
      |/** This
      |  * ====
      |  * is a short text [that](http://google.com) should not be more than a
      |  * `few` lines long. This text *should* be shortened somewhere that is
      |  * appropriate for the **ui**. Might be here, or there or somewhere
      |  * else.
      |  */
      |trait HelloWorld
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.short))
        .get
        .trim

      assert(
        traitCmt.endsWith("Might be here...\n</p>"),
        s"""|docstring summary should strip the following docstring so that it ends in "Might be here..."
            |
            |$traitCmt""".stripMargin
      )
    }
  }

  @Test def docstringSummaryWithImage = {
    val source =
      """
      |package scala
      |
      |/** This
      |  * ====
      |  * should quit before ![alt text](https://whatever.com/1.png "Img Text"),
      |  * I shouldn't be visible.
      |  */
      |trait HelloWorld
      """.stripMargin

    checkSource(source) { packages =>
      val traitCmt =
        packages("scala")
        .children.find(_.path.mkString(".") == "scala.HelloWorld")
        .flatMap(_.comment.map(_.short))
        .get
        .trim

      assert(
        !traitCmt.contains("<img") &&
        !traitCmt.contains("I shouldn't be visible."),
        s"""|docstring summary shouldn't contain image, error in `MarkdownShortener.scala`
            |
            |$traitCmt""".stripMargin)
    }

  }
}