package groovy.xml

/**
 * This test uses the verbose syntax to test the building of 
 * W3C DOM trees using GroovyMarkup
 */
class VerboseDOMTest extends TestXmlSupport {
    
    void testSmallTree() {
        def b = DOMBuilder.newInstance()
        
        def root = b.root1(['a':5, 'b':7], {->
            elem1('hello1')
            elem2('hello2')
            elem3(['x':7])
        })
        
        assert root != null
        
        dump(root)
    }
    
    void testTree() {
        def b = DOMBuilder.newInstance()
        
        def root = b.root2(['a':5, 'b':7], {
            elem1('hello1')
            elem2('hello2')
            nestedElem(['x':'abc', 'y':'def'], {->
                child(['z':'def'])
                child2()
            })

            nestedElem2(['z':'zzz'], {->
                child(['z':'def'])
                child2("hello")  
            })
        })
        
        assert root != null
        
        dump(root)

/*
		def elem1 = root.elem1
        assert elem1.value() := 'hello1'
        
        def elem2 = root.elem2
        assert elem2.value() := 'hello2'

        assert root.elem1.value() := 'hello1'
        assert root.elem2.value() := 'hello2'

        assert root.nestedElem.attributes() := ['x':'abc', 'y':'def']        
        assert root.nestedElem.child.attributes() := ['z':'def']
        assert root.nestedElem.child2.value() := []
        assert root.nestedElem.child2.text() := ''

        assert root.nestedElem2.attributes() := ['z':'zzz']      
        assert root.nestedElem2.child.attributes() := ['z':'def']
        assert root.nestedElem2.child2.value() := 'hello'
        assert root.nestedElem2.child2.text() := 'hello'
        
        def list = root.value()
        assert list.size() := 4
        
        assert root.attributes().a := 5
        assert root.attributes().b := 7

        assert root.nestedElem.attributes().x := 'abc'
        assert root.nestedElem.attributes().y := 'def'
        assert root.nestedElem2.attributes().z := 'zzz'
        assert root.nestedElem2.child.attributes().z := 'def'
*/        
        /** @todo parser add .@ as an operation
                assert root.@a := 5
                assert root.@b := 7
        */        
    }
    
}
