//
// Copyright (c) 2007, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 23 Jun 14 Matthew Giannini Creation
//
**
** PathTest
**
@Js
class PathTest : Test
{
Void testPara()
{
verifyPath("", [,], [,])
verifyPath("a", [0], [DocNodeId.para])
verifyPath("a b c\nd e f", [0], [DocNodeId.para])
verifyPath("a\n\nb",[1], [DocNodeId.para])
verifyPath("NOTE: that's right", [0], [DocNodeId.para])
}
Void testHeading()
{
verifyPath("H1\n####", [0], [DocNodeId.heading])
verifyPath("H2\n****", [0], [DocNodeId.heading])
verifyPath("H3\n====", [0], [DocNodeId.heading])
verifyPath("H4\n----", [0], [DocNodeId.heading])
verifyPath("para text\n\nH4\n----", [1], [DocNodeId.heading])
}
Void testCode()
{
verifyPath("para text\n\nThis is a 'code' example.", [1,1], [DocNodeId.para, DocNodeId.code])
}
Void testLinks()
{
verifyPath("`link`", [0,0], [DocNodeId.para, DocNodeId.link])
verifyPath("text [fantom]`http://fantom.org` text", [0,1], [DocNodeId.para, DocNodeId.link])
}
Void testImages()
{
verifyPath("![cool image]`cool.png`", [0,0], [DocNodeId.para, DocNodeId.image])
verifyPath("An image: ![cool image]`cool.png`. Neat.", [0,1], [DocNodeId.para, DocNodeId.image])
}
Void testEmphasis()
{
verifyPath("*x*", [0,0], [DocNodeId.para, DocNodeId.emphasis])
verifyPath("foo *emph* bar", [0,1], [DocNodeId.para, DocNodeId.emphasis])
verifyPath("**strong**", [0,0], [DocNodeId.para, DocNodeId.strong])
verifyPath("foo **strong** bar", [0,1], [DocNodeId.para, DocNodeId.strong])
verifyPath("a *emp\n**emp-strong**\nemp*!", [0,1], [DocNodeId.para, DocNodeId.emphasis])
verifyPath("a *emp\n**emp-strong**\nemp*!", [0,1,1], [DocNodeId.para, DocNodeId.emphasis, DocNodeId.strong])
verifyPath("**`link`**", [0,0,0], [DocNodeId.para, DocNodeId.strong, DocNodeId.link])
}
Void testPre()
{
verifyPath(" a+b", [0], [DocNodeId.pre])
verifyPath("Code:\n\n a+b", [1], [DocNodeId.pre])
verifyPath(
" class A
{
Int x() { return 3 }
}
class B : A { }
", [0], [DocNodeId.pre])
verifyPath(
"pre>
- a
- b
<pre
", [0], [DocNodeId.pre])
}
Void testBlockQuotes()
{
verifyPath("> a", [0,0], [DocNodeId.blockQuote, DocNodeId.para])
verifyPath("> a\n> b c\n> d", [0,0], [DocNodeId.blockQuote, DocNodeId.para])
// NOTE: consecutive block quotes get merged
verifyPath("> b1\n> b1\n\n> b2\n> b2", [0,1], [DocNodeId.blockQuote, DocNodeId.para])
verifyPath("> b1\n> b1\n\nPara\n\n> b2\n> b2", [2,0], [DocNodeId.blockQuote, DocNodeId.para])
}
Doc verifyPath(Str str, Int[] childIndices, DocNodeId[] expected)
{
doc := parse(str)
// NOTE: as a convenience we don't require DocNodeId.doc as first element expected list
expected = [DocNodeId.doc].addAll(expected)
DocElem target := doc
childIndices.each |idx, i| {
target = (DocElem)target.children[idx]
verifyEq(target.path.map |n->DocNodeId| { n.id }, expected[0..i+1])
}
return doc
}
Void testPositions()
{
doc := parse("foo")
// root position
verifyNull(doc.pos)
verifyFalse(doc.isFirst)
verifyFalse(doc.isLast)
// only child
para := (DocElem)doc.children[0]
verifySame(para.id, DocNodeId.para)
verifyEq(0, para.pos)
verify(para.isFirst)
verify(para.isLast)
// middle child
doc = parse("foo\n\nbar\n\nbaz")
para = doc.children[1]
verifySame(para.id, DocNodeId.para)
verifyEq(1, para.pos)
verifyFalse(para.isFirst)
verifyFalse(para.isLast)
}
Void testInsert()
{
// insert with text merge
doc := parse("foo\n\nbar\n\nbaz")
DocElem para := doc.children[1]
verifyEq("bar", para.children.first->str)
para.insert(0, DocText("foo"))
verifyEq("foobar", para.children.first->str)
para.insert(para.children.size, DocText("baz"))
verifyEq("foobarbaz", para.children.first->str)
// insert with blockquote merge
doc = parse("> a")
verifyEq(1, doc.children.size)
bq := doc.children.first as BlockQuote
verifyEq(1, bq.children.size)
para = bq.children.first
verify(para is Para)
p1 := Para().add(DocText("foo"))
bq = BlockQuote().add(p1)
doc.insert(0, bq)
verifyEq(1, doc.children.size)
verifyEq(2, bq.children.size)
verifySame(p1, bq.children.first)
verifySame(para, bq.children.last)
p2 := Para().add(DocText("baz"))
bq2 := BlockQuote().add(p2)
doc.insert(doc.children.size, bq2)
verifyEq(1, doc.children.size)
verifyEq(3, bq.children.size)
verifySame(p1, bq.children.first)
verifySame(para, bq.children[1])
verifySame(p2, bq.children.last)
p3 := Para().add(DocText("INNER"))
bq.insert(1, p3)
verifyEq(4, bq.children.size)
verifySame(p1, bq.children.first)
verifySame(p3, bq.children[1])
verifySame(para, bq.children[2])
verifySame(p2, bq.children.last)
}
Doc parse(Str str)
{
return FandocParser { silent = true }.parse("Test", str.in)
}
}