package groovy.xml

/**
 * Test the building of namespaced XML using GroovyMarkup
 */
class NamespaceNodeTest extends TestXmlSupport {

    void testTree_FAILS() {if (notYetImplemented()) return
        def builder = NodeBuilder.newInstance()
        def xmlns = new NamespaceBuilder(builder)

        def xsd = xmlns.namespace('http://www.w3.org/2001/XMLSchema', 'xsd')

        def root = xsd.schema(xmlns: ['foo': 'http://someOtherNamespace']) {
            annotation {
                documentation("Purchase order schema for Example.com.")
                //documentation(xmlns=[xml.lang:'en']) ["Purchase order schema for Example.com."]
            }
            element(name: 'purchaseOrder', type: 'PurchaseOrderType')
            element(name: 'comment', type: 'xsd:string')
            complexType(name: 'PurchaseOrderType') {
                sequence {
                    element(name: 'shipTo', type: 'USAddress')
                    element(name: 'billTo', type: 'USAddress')
                    element(minOccurs: '0', ref: 'comment')
                    element(name: 'items', type: 'Items')
                }
                attribute(name: 'orderDate', type: 'xsd:date')
            }
            complexType(name: 'USAddress') {
                sequence {
                    element(name: 'name', type: 'xsd:string')
                    element(name: 'street', type: 'xsd:string')
                    element(name: 'city', type: 'xsd:string')
                    element(name: 'state', type: 'xsd:string')
                    element(name: 'zip', type: 'xsd:decimal')
                }
                attribute(fixed: 'US', name: 'country', type: 'xsd:NMTOKEN')
            }
            complexType(name: 'Items') {
                sequence {
                    element(maxOccurs: 'unbounded', minOccurs: '0', name: 'item') {
                        complexType {
                            sequence {
                                element(name: 'productName', type: 'xsd:string')
                                element(name: 'quantity') {
                                    simpleType {
                                        restriction(base: 'xsd:positiveInteger') {
                                            maxExclusive(value: '100')
                                        }
                                    }
                                }
                                element(name: 'USPrice', type: 'xsd:decimal')
                                element(minOccurs: '0', ref: 'comment')
                                element(minOccurs: '0', name: 'shipDate', type: 'xsd:date')
                            }
                            attribute(name: 'partNum', type: 'SKU', use: 'required')
                        }
                    }
                }
            }
            /* Stock Keeping Unit, a code for identifying products */
            simpleType(name: 'SKU') {
                restriction(base: 'xsd:string') {
                    pattern(value: '\\d{3}-[A-Z]{2}')
                }
            }
        }
        assert root != null

        assertGPaths(root)
    }

    void assertGPaths(Node root) {
        Namespace xsd = new Namespace('http://www.w3.org/2001/XMLSchema', 'xsd')

        def children = root.children()
        println "has children $children"

        def name = root.name()
        println "name is of type ${name.getClass()} with value $name"

        root.children().each {println "has a child with name ${it.name()} and content $it"}

        def foo = xsd.annotation
        println "qname is $foo"
        println "qname url is $foo.namespaceURI"
        println "qname prefix is $foo.prefix"
        println "qname localPart is $foo.localPart"

        def a = root[xsd.annotation]
        println "Found results $a"

        def e = root[xsd.annotation][xsd.documentation]

        String text = e.text()
        println "Found element: $e with text: $text"
        assert text == "Purchase order schema for Example.com."
    }
}