<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:hatatap" 
	   xmlns:xs="http://www.w3.org/2001/XMLSchema"
	   xmlns:test="urn:hatatap"
	   elementFormDefault="qualified"
	   attributeFormDefault="unqualified">

  <xs:group name="instruction">
    <xs:choice>
      <xs:element ref="test:click"/>
      <xs:element ref="test:mouseover"/>
      <xs:element ref="test:send"/>
      <xs:element ref="test:form"/>
      <xs:element ref="test:verify"/>
      <xs:element ref="test:log"/>
      <xs:element ref="test:save"/>
      <xs:element ref="test:wait"/>
      <xs:element ref="test:refresh"/>
      <xs:element ref="test:cookie"/>
      <xs:element ref="test:javascript"/>
      <xs:element ref="test:header"/>
      <xs:any namespace="##any" processContents="lax"/>
    </xs:choice>
  </xs:group>

  <xs:element name="script">
    <xs:complexType>
      <xs:sequence>
	<xs:element ref="test:param" minOccurs="0" maxOccurs="unbounded"/>
	<xs:element ref="test:setup" minOccurs="0" maxOccurs="1"/>
	<xs:group ref="test:instruction" minOccurs="0" maxOccurs="unbounded"/>
	<xs:element ref="test:reset" minOccurs="0" maxOccurs="1"/>
	<xs:element ref="test:cleanup" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="javascript" type="xs:string" use="optional"/><!-- yes | no -->
      <xs:attribute name="threads" type="xs:decimal" use="optional"/>
      <xs:attribute name="iterations" type="xs:decimal" use="optional"/>
      <xs:attribute name="useragent" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="param">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="default" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="form">
    <xs:complexType>
      <xs:sequence>
	<xs:choice minOccurs="0" maxOccurs="unbounded">
	  <xs:element ref="test:input"/>
	  <xs:element ref="test:check"/>
	  <xs:element ref="test:uncheck"/>
	  <xs:element ref="test:toggle"/>
	  <xs:any namespace="##local" processContents="skip"/>
	</xs:choice>
	<xs:element ref="test:submit" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" use="optional"/>
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:attribute name="select" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="input">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:attribute name="file" type="xs:string" use="optional"/>
      <xs:attribute name="content-type" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="submit">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="optional"/>
      <xs:attribute name="value" type="xs:string" use="optional"/>
      <xs:attribute name="ref" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="checkbox">
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:element name="check" type="test:checkbox"/>
  <xs:element name="uncheck" type="test:checkbox"/>
  <xs:element name="toggle" type="test:checkbox"/>

  <!-- verification -->
  <xs:element name="verify">
    <xs:complexType>
      <xs:attribute name="response-code" type="xs:string" use="optional"/>
      <xs:attribute name="content-type" type="xs:string" use="optional"/>
      <xs:attribute name="content-length" type="xs:string" use="optional"/>
      <xs:attribute name="contains" type="xs:string" use="optional"/>
      <xs:attribute name="title" type="xs:string" use="optional"/>
      <xs:attribute name="test" type="xs:string" use="optional"/>
      <xs:attribute name="cookie" type="xs:string" use="optional"/><!-- verify cookie presence -->
      <xs:attribute name="header" type="xs:string" use="optional"/><!-- verify header presence -->
      <xs:attribute name="value" type="xs:string" use="optional"/><!-- verify value (optional with 'cookie' or 'header') -->
      <xs:attribute name="msg" type="xs:string" use="optional"/><!-- error message if assertion fails -->
    </xs:complexType>
  </xs:element>

  <!-- headers and cookies -->
  <xs:element name="header">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="send">
    <xs:complexType>
      <xs:sequence>
	<xs:element ref="test:header" minOccurs="0" maxOccurs="unbounded"/>
	<xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
	<xs:element ref="test:attachment" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="url" type="xs:anyURI" use="required"/>
      <xs:attribute name="method" type="xs:string" use="optional"/>
      <xs:attribute name="content-type" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="attachment">
    <xs:complexType>
      <xs:sequence>
	<xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="location" type="xs:string" use="required"/>
      <xs:attribute name="content-type" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="cookie">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <!-- setup/reset/cleanup -->

  <xs:element name="save">
    <xs:complexType>
      <xs:attribute name="href" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="wait">
    <xs:complexType>
      <xs:attribute name="seconds" type="xs:string" use="optional"/>
      <xs:attribute name="millis" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="log">
    <xs:complexType>
      <xs:attribute name="msg" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="javascript">
    <xs:complexType>
      <xs:attribute name="evaluate" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="refresh">
    <xs:complexType/>
  </xs:element>

  <!-- setup/reset/cleanup -->
  <xs:complexType name="container">
    <xs:group ref="test:instruction" minOccurs="0" maxOccurs="unbounded"/>
  </xs:complexType>

  <xs:element name="setup" type="test:container"/>
  <xs:element name="reset" type="test:container"/>
  <xs:element name="cleanup" type="test:container"/>

  <!-- click and mouseover links -->
  <xs:attributeGroup name="link">
    <xs:attribute name="text" type="xs:string" use="optional"/>
    <xs:attribute name="name" type="xs:string" use="optional"/>
    <xs:attribute name="alt" type="xs:string" use="optional"/>
    <xs:attribute name="ref" type="xs:string" use="optional"/>
    <xs:attribute name="select" type="xs:string" use="optional"/>
  </xs:attributeGroup>

  <xs:element name="click">
    <xs:complexType>
      <xs:attribute name="url" type="xs:anyURI" use="optional"/>
      <xs:attributeGroup ref="test:link"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="mouseover">
    <xs:complexType>
      <xs:attributeGroup ref="test:link"/>
    </xs:complexType>
  </xs:element>

</xs:schema>
