import org.scalacheck._ import org.scalacheck.Prop._ import scala.tools.nsc.Global import scala.tools.nsc.doc import scala.tools.nsc.doc.base.comment._ import scala.tools.nsc.doc.model._ import scala.tools.nsc.doc.model.diagram._ class Factory(val g: Global, val s: doc.Settings) extends doc.model.ModelFactory(g, s) { thisFactory: Factory with ModelFactoryImplicitSupport with ModelFactoryTypeSupport with DiagramFactory with CommentFactory with doc.model.TreeFactory with MemberLookup => def strip(c: Comment): Option[Inline] = { c.body match { case Body(List(Paragraph(Chain(List(Summary(inner)))))) => Some(inner) case _ => None } } def getComment(s: String): Comment = parse(s, "", scala.tools.nsc.util.NoPosition, null) def parseComment(s: String): Option[Inline] = strip(getComment(s)) def createBody(s: String) = parse(s, "", scala.tools.nsc.util.NoPosition, null).body } object Test extends Properties("CommentFactory") { val factory = { val settings = new doc.Settings((str: String) => {}) val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings) val g = new Global(settings, reporter) (new Factory(g, settings) with ModelFactoryImplicitSupport with ModelFactoryTypeSupport with DiagramFactory with CommentFactory with doc.model.TreeFactory with MemberLookup) } def parse(src: String, dst: Inline): Boolean = { factory.parseComment(src) match { case Some(inline) => inline == dst case _ => false } } property("parse") = parse( "/** One two three */", Text("One two three") ) property("parse") = parse( "/** One `two` three */", Chain(List(Text("One "), Monospace(Text("two")), Text(" three"))) ) property("parse") = parse( """ /** One two * three */""", Text("One two\nthree") ) property("parse") = parse( """ /** One `two` * three */""", Chain(List(Text("One "), Monospace(Text("two")), Text("\n"), Text("three"))) ) property("parse") = parse( """ /** One `two` * three */""", Chain(List(Text("One "), Monospace(Text("two")), Text("\n"), Text(" three"))) ) property("parse") = parse( """ /** One * `two` three */""", Chain(List(Text("One"), Text("\n"), Monospace(Text("two")), Text(" three"))) ) property("Trac #4361 - ^...^") = parse( """ /** * hello ^world^ */""", Chain(List(Text("hello "), Superscript(Text("world")))) ) property("Trac #4361 - single ^ symbol") = parse( """ /** *
 * hello ^world
 * 
* */""", Chain(List(Text(""), Text("\n"), HtmlTag("
\nhello ^world\n
"))) ) property("Trac #4366 - body") = { val body = factory.createBody( """ /** * foo has been deprecated and will be removed in a future version. Please call bar instead. */ """ ) body == Body(List(Paragraph(Chain(List( Summary(Chain(List(HtmlTag("foo has been deprecated and will be removed in a future version. Please call bar instead."), Text("\n"), Text("")))) ))))) } property("Trac #4366 - summary") = { val body = factory.createBody( """ /** * foo has been deprecated and will be removed in a future version. Please call bar instead. */ """ ) body.summary == Some(Chain(List(HtmlTag("foo has been deprecated and will be removed in a future version. Please call bar instead."), Text("\n"), Text("")))) } property("Trac #4358 - body") = { factory.createBody( """ /** * Implicit conversion that invokes the expect method on the EasyMock companion object (i.e., the * static expect method in Java class org.easymock.EasyMock). */ """ ) match { case Body(List(Paragraph(Chain(List(Summary(Chain(List(Chain(List( Text("Implicit conversion that invokes the "), HtmlTag("expect"), Text(" method on the "), HtmlTag("EasyMock"), Text(" companion object ("), HtmlTag("i.e."), Text(", the\nstatic "), HtmlTag("expect"), Text(" method in Java class "), HtmlTag("org.easymock.EasyMock"), Text(")") )), Text(".")))), Text("\n")))))) => true case other => { println(other) false } } } property("Empty parameter text should be empty") = { // used to fail with // body == Body(List(Paragraph(Chain(List(Summary(Text('\n'))))))) factory.getComment( """ /** * @deprecated */ """).deprecated match { case Some(Body(l)) if l.isEmpty => true case other => println(other) false } } }