Fantom

 

//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//    7 Nov 08  Brian Frank  Creation
//

**
** DomTest tests the tree model data structures
**
@Js class DomTest : Test
{

//////////////////////////////////////////////////////////////////////////
// Attributes
//////////////////////////////////////////////////////////////////////////

  Void testAttrs()
  {
    x := XElem("foo")
    a := XAttr("a", "aval")
    b := XAttr("b", "bval")
    c := XAttr("c", "cval")

    verifyEq(x.attrs, XAttr[,])
    verifyEq(x.attrs.isRO, true)
    verifyEq(x.attr("a", false), null)
    verifyEq(x.get("a", false), null)
    verifyErr(XErr#) { x.attr("a") }
    verifyErr(XErr#) { x.attr("a", true) }
    verifyErr(XErr#) { x.get("a") }
    verifyErr(XErr#) { x.get("a", true) }

    verifySame(x.add(a), x)
    verifyEq(x.attrs, [a])
    verifyEq(x.attrs.isRO, true)
    verifySame(x.attr("a"), a)
    verifySame(x.attr("a", false), a)
    verifySame(x.attr("a", true), a)
    verifySame(x.get("a"), "aval")
    verifySame(x.get("a", false), "aval")
    verifySame(x.get("a", true), "aval")

    x.add(b).add(c)
    verifyEq(x.attrs, [a, b, c])
    verifyEq(x.attrs.isRO, true)
    verifySame(x.attr("a"), a)
    verifySame(x.attr("b"), b)
    verifySame(x.attr("c"), c)
    verifySame(x["a"], "aval")
    verifySame(x["b"], "bval")
    verifySame(x["c"], "cval")
    verifyEq(x.get("aa", false), null)
    verifyErr(XErr#) { x.attr("aa") }

    acc := XAttr[,]
    x.eachAttr |XAttr q| { acc.add(q) }
    verifyEq(acc, [a, b, c])

    verifySame(x.removeAttrAt(1), b)
    verifyEq(x.attrs, [a, c])
    verifySame(x.removeAttrAt(-1), c)
    verifyEq(x.attrs, [a])
    verifySame(x.removeAttr(a), a)
    verifyEq(x.attrs, XAttr[,])
    verifyEq(x.attrs.isRO, true)
    verifyEq(x.removeAttr(a), null)
    verifySame(x.add(b), x)
    verifyEq(x.attrs, [b])
    verifySame(x.get("a", false), null)
    verifySame(x.get("b", false), "bval")
    verifySame(x.get("c", false), null)
  }

//////////////////////////////////////////////////////////////////////////
// Children
//////////////////////////////////////////////////////////////////////////

  Void testChildren()
  {
    x  := XElem("x")
    a  := XElem("a")
    b  := XElem("b").add(XText("btext"))
    t  := XText("text")
    pi := XPi("pi", "pival")

    verifyEq(x.children, XNode[,])
    verifyEq(x.children.isRO, true)
    verifyEq(x.elems, XElem[,])
    verifyEq(x.elem("foo", false), null)
    verifyErr(XErr#) { x.elem("foo") }
    verifyErr(XErr#) { x.elem("foo", true) }
    verifyEq(x.text, null)

    x.add(pi)
    verifySame(pi.parent, x)
    verifyEq(x.children, XNode[pi])
    verifyEq(x.children.isRO, true)
    verifyEq(x.elems, XElem[,])
    verifyEq(x.text, null)

    x.add(a)
    verifySame(a.parent, x)
    verifyEq(x.children, XNode[pi, a])
    verifyEq(x.children.isRO, true)
    verifyEq(x.elems, [a])
    verifySame(x.elem("a", false), a)
    verifySame(x.elem("a", true), a)
    verifyEq(x.text, null)

    x.add(t)
    verifySame(t.parent, x)
    verifyEq(x.children, XNode[pi, a, t])
    verifyEq(x.elems, [a])
    verifySame(x.elem("a"), a)
    verifySame(x.text, t)

    x.add(b)
    verifySame(b.parent, x)
    verifyEq(x.children, XNode[pi, a, t, b])
    verifyEq(x.elems, [a, b])
    verifySame(x.elem("a"), a)
    verifySame(x.elem("b"), b)
    verifyEq(x.elem("foo", false), null)
    verifyErr(XErr#) { x.elem("foo") }
    verifyErr(XErr#) { x.elem("foo", true) }
    verifySame(x.text, t)

    // each
    acc := XNode[,]
    x.each |XNode n| { acc.add(n) }
    verifyEq(acc, [pi, a, t, b])

    // removeAt
    verifyErr(ArgErr#) { x.add(t) }
    verifySame(x.removeAt(-2), t)
    verifyEq(t.parent, null)

    // re-add
    x.add(t)
    verifyEq(x.children, XNode[pi, a, b, t])

    // remove
    verifySame(x.remove(t), t)
    verifySame(x.remove(pi), pi)
    verifySame(x.remove(pi), null)
    verifySame(x.remove(a), a)
    verifyEq(t.parent, null)
    verifyEq(a.parent, null)
    verifyEq(pi.parent, null)
    verifyEq(x.children, XNode[b])
    verifyEq(x.children.isRO, true)
    verifyEq(x.elems, [b])
  }

//////////////////////////////////////////////////////////////////////////
// Doc
//////////////////////////////////////////////////////////////////////////

  Void testDoc()
  {
    doc := XDoc()
    verifySame(doc.doc, doc)
    verifySame(doc.root.doc, doc)
    verifyEq(doc.root.name, "undefined")
    verifySame(doc.root.parent, doc)

    doc.root = XElem("root")
    {
      XElem("a")
      {
        XElem("b") { XText("text"), },
      },
      XElem("c"),
    }
    verifySame(doc.doc, doc)
    verifySame(doc.root.doc, doc)
    verifySame(doc.root.parent, doc)
    verifySame(doc.root.elem("a").doc, doc)
    verifySame(doc.root.elem("a").elem("b").doc, doc)
    verifySame(doc.root.elem("a").elem("b").text.doc, doc)
    verifyEq(XElem("x").doc, null)
    verifyErr(ArgErr#) { doc.root = doc.root.elem("a") }

    doc.add(XElem("newRoot"))
    verifyEq(doc.root.name, "newRoot")
    verifySame(doc.root.parent, doc)
    verifySame(doc.root.doc, doc)

    piA := XPi("a", "aval")
    piB := XPi("b", "bval")
    verifyEq(doc.pis, XPi[,])
    verifyEq(doc.pis.isRO, true)
    verifyEq(doc.removePi(piA), null)
    doc.add(piA)
    verifyEq(doc.pis, [piA])
    verifyEq(doc.pis.isRO, true)
    doc.add(piB)
    verifyEq(doc.pis, [piA, piB])
    verifyEq(doc.pis.isRO, true)
    verifySame(doc.removePi(piA), piA)
    verifyEq(doc.pis, [piB])
    verifyEq(doc.pis.isRO, true)
  }

//////////////////////////////////////////////////////////////////////////
// Namespaces
//////////////////////////////////////////////////////////////////////////

  Void testNsIdentity()
  {
    nsdef := XNs("", `http://foo/default`)
    nsq   := XNs("q", `http://foo/q`)

    verifyEq(nsdef.isDefault, true)
    verifyEq(nsq.isDefault, false)
    verifyEq(nsdef.prefix, "")
    verifyEq(nsq.prefix, "q")
    verifyEq(nsdef.uri, `http://foo/default`)
    verifyEq(nsdef, XNs("", `http://foo/default`))
    verifyEq(nsdef, XNs("foo", `http://foo/default`))
    verifyNotEq(nsdef, XNs("", `http://foo/diff/`))
  }

  Void testNsElem()
  {
    nsdef := XNs("", `http://foo/default`)
    nsq   := XNs("q", `http://foo/q`)

    u := XElem("u")
    verifyEq(u.name, "u")
    verifyEq(u.qname, "u")
    verifyEq(u.prefix, null)
    verifyEq(u.uri, null)
    verifyEq(u.ns, null)

    x := XElem("root", nsdef)
    verifyEq(x.name, "root")
    verifyEq(x.qname, "root")
    verifyEq(x.prefix, "")
    verifyEq(x.uri, `http://foo/default`)
    verifySame(x.ns, nsdef)

    a := XElem("a", nsq)
    verifyEq(a.name, "a")
    verifyEq(a.qname, "q:a")
    verifyEq(a.prefix, "q")
    verifyEq(a.uri, `http://foo/q`)
    verifySame(a.ns, nsq)
  }

  Void testNsAttr()
  {
    nsdef := XNs("", `http://foo/default`)
    nsq   := XNs("q", `http://foo/q`)

    u := XAttr("u", "uval")
    verifyEq(u.name, "u")
    verifyEq(u.qname, "u")
    verifyEq(u.prefix, null)
    verifyEq(u.uri, null)
    verifyEq(u.ns, null)

    a := XAttr("a", "aval", nsq)
    verifyEq(a.name, "a")
    verifyEq(a.qname, "q:a")
    verifyEq(a.prefix, "q")
    verifyEq(a.uri, `http://foo/q`)
    verifySame(a.ns, nsq)

    // don't allow since no prefix means no ns, not default ns
    verifyErr(ArgErr#) { x := XAttr("def", "defval", nsdef) }
  }

}