DTD for TestNG 1.0

    <!--

    Here is a quick overview of the main parts of this DTD.  For more information,
    refer to the <a href="https://testng.org" >main web site</a>.

    A <b>suite</b> is made of <b>tests</b> and <b>parameters</b>.

    A <b>test</b> is made of three parts:

    <ul>
    <li> <b>parameters</b>, which override the suite parameters
    <li> <b>groups</b>, made of two parts

    <li> <b>classes</b>, defining which classes are going to be part
      of this test run
    </ul>

    In turn, <b>groups</b> are made of two parts:

    <ul>
    <li> Definitions, which allow you to group groups into
      bigger groups
    <li> Runs, which defines the groups that the methods
      must belong to in order to be run during this test
    </ul>

    Cedric Beust & Alexandru Popescu
    @title DTD for TestNG
    @root suite

    -->

    <!-- A suite is the top-level element of a testng.xml file                  -->

    <!ELEMENT suite (listeners|packages|test|parameter|method-selectors|suite-files)* >

    <!-- Attributes: -->
    <!--
    @attr  name        The name of this suite (as it will appear in the reports)
    @attr  junit       Whether to run in JUnit mode.
    @attr  verbose     How verbose the output on the console will be.
                    This setting has no impact on the HTML reports.
    @attr  parallel   Whether TestNG should use different threads
                    to run your tests (might speed up the process)
    @attr  configfailurepolicy  Whether to continue attempting Before/After
                    Class/Methods after they've failed once or just skip remaining.
    @attr  thread-count An integer giving the size of the thread pool to use
                    if you set parallel.
    @attr  annotations  If "javadoc", TestNG will look for
                    JavaDoc annotations in your sources, otherwise it will
                    use JDK5 annotations.
    @attr  time-out     The time to wait in milliseconds before aborting the
                    method (if parallel="methods" ) or the test (parallel="tests")
    @attr  skipfailedinvocationCounts Whether to skip failed invocations.
    @attr  data-provider-thread-count An integer giving the size of the thread pool to use
           for parallel data providers.
    @attr  object-factory A class that implements IObjectFactory that will be used to
           instantiate the test objects.
    -->
    <!ATTLIST suite
        name CDATA #REQUIRED
        junit (true | false) "false"
        verbose CDATA #IMPLIED
        parallel (false | methods | tests | classes) "false"
        configfailurepolicy (skip | continue) "skip"
        thread-count CDATA "5"
        annotations CDATA #IMPLIED
        time-out CDATA #IMPLIED
        skipfailedinvocationCounts (true | false) "false"
        data-provider-thread-count CDATA "10"
        object-factory CDATA #IMPLIED
    >

    <!-- A list of XML files that contain more suite descriptions -->
    <!ELEMENT suite-files (suite-file)* >

    <!ELEMENT suite-file ANY >
    <!ATTLIST suite-file
        path CDATA #REQUIRED
    >

    <!--
    Parameters can be defined at the <suite> or at the <test> level.
    Parameters defined at the <test> level override parameters of the same name in <suite>

    Parameters are used to link Java method parameters to their actual value, defined here.
    -->
    <!ELEMENT parameter ANY>
    <!ATTLIST parameter
        name CDATA #REQUIRED
        value CDATA #REQUIRED >

    <!--
    Method selectors define user classes used to select which methods to run.
    They need to implement <tt>org.testng.IMethodSelector</tt>
    -->
    <!ELEMENT method-selectors (method-selector*) >

    <!ELEMENT method-selector ((selector-class)*|script) >
    <!ELEMENT selector-class ANY>
    <!ATTLIST selector-class
        name CDATA #REQUIRED
      priority CDATA #IMPLIED
    >
    <!ELEMENT script ANY>
    <!ATTLIST script
        language CDATA #REQUIRED
    >

    <!--
    A test contains parameters and classes.  Additionally, you can define additional groups ("groups of groups")
    -->

    <!ELEMENT test (method-selectors?,parameter*,groups?,packages?,classes?) >

    <!--
    @attr  name         The name of this test (as it will appear in the reports)
    @attr  junit        Whether to run in JUnit mode.
    @attr  verbose      How verbose the output on the console will be.
                    This setting has no impact on the HTML reports.
                    Default value: suite level verbose.
    @attr  parallel     Whether TestNG should use different threads
                    to run your tests (might speed up the process)
    @attr  thread-count An integer giving the size of the thread pool to be used if
                    parallel mode is used. Overrides the suite level value.
    @attr  annotations  If "javadoc", TestNG will look for
                    JavaDoc annotations in your sources, otherwise it will
                    use JDK5 annotations.
    @attr  time-out     the time to wait in milliseconds before aborting
                    the method (if parallel="methods" ) or the test (if parallel="tests" )
    @attr  enabled      flag to enable/disable current test. Default value: true
    @attr  skipfailedinvocationCounts Whether to skip failed invocations.
    -->
    <!ATTLIST test
        name CDATA #REQUIRED
        junit (true | false) "false"
        verbose  CDATA #IMPLIED
        parallel  CDATA #IMPLIED
        thread-count CDATA #IMPLIED
        annotations  CDATA #IMPLIED
        time-out CDATA #IMPLIED
        enabled CDATA #IMPLIED
        skipfailedinvocationCounts (true | false) "false"
    >

    <!--
    Defines additional groups ("groups of groups") and also which groups to include in this test run
    -->
    <!ELEMENT groups (define*,run?) >

    <!ELEMENT define (include*)>

    <!ATTLIST define
        name CDATA #REQUIRED>

    <!-- Defines which groups to include in the current group of groups         -->
    <!ELEMENT include ANY>
    <!ATTLIST include
        name CDATA #REQUIRED>

    <!-- Defines which groups to exclude from the current group of groups       -->
    <!ELEMENT exclude ANY>
    <!ATTLIST exclude
        name CDATA #REQUIRED>

    <!-- The subtag of groups used to define which groups should be run         -->
    <!ELEMENT run (include?,exclude?)* >

    <!-- The list of classes to include in this test                            -->
    <!ELEMENT classes (class*) >
    <!ELEMENT class (methods*) >
    <!ATTLIST class
        name CDATA #REQUIRED >

    <!-- The list of packages to include in this test                           -->
    <!ELEMENT packages (package*) >

    <!-- The package description.
         If the package name ends with .* then subpackages are included too.
    -->
    <!ELEMENT package (include?,exclude?)*>
    <!ATTLIST package
        name CDATA #REQUIRED >

    <!-- The list of methods to include/exclude from this test                 -->
    <!ELEMENT methods (include?,exclude?)* >

    <!-- The list of listeners that will be passed to TestNG -->
    <!ELEMENT listeners (listener*) >

    <!ELEMENT listener ANY>
    <!ATTLIST listener
        class-name CDATA #REQUIRED >