<?xml version="1.0" encoding="UTF-8"?>
<!--
 * Copyright 2001-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->

<!-- FileName: results.dtd -->
<!-- Creator: shane_curcuru@lotus.com -->
<!-- Description: Sample DTD for results currently produced with XMLFileLogger. -->
<!-- Note this DTD is not meant to limit what we can put into 
     results files, it just expresses what content most of the 
     current Xalan tests report out currently. 
     This DTD is currently just provided to show the intended 
     structure of results files. -->

<!-- ======================================================== -->
<!--  Common attributes, expressed as entities -->

<!-- The result of a fileresult, caseresult, or checkresult, i.e. 
     if the test item passed, failed, etc. 
     Constants match org.apache.qetest.Logger.PASS, FAIL, etc. -->
<!ENTITY % result.attr
          "result  (Pass | Fail | Incp | Ambg | Errr)  #REQUIRED"
>

<!-- Description or comment of the element -->
<!ENTITY % desc.attr
          "desc  CDATA  #REQUIRED" 
>

<!-- loggingLevel of the element -->
<!ENTITY % level.attr
          "level  CDATA  #REQUIRED" 
>

<!-- Time reported of the element: currently the exact format 
     may change, so I'm only declaring it as CDATA -->
<!ENTITY % time.attr
          "time  CDATA  #REQUIRED" 
>


<!-- ======================================================== -->
<!-- Conceptually structural elements -->

<!-- The top-level element: a resultsfile, which encapsulates a 
     whole results document.  Note that this is different for 
     results created by the XSLTestHarness. 
     Also note that I've allowed message, statistic, arbtrary, 
     statistic and hashtable elements to appear at most levels, 
     although by practice they should only appear in testfile 
     or testcase elements. -->
<!ELEMENT  resultsfile  (testfile+ | message* | arbitrary* | statistic* | hashtable* ) >
<!ATTLIST  resultsfile
           logFile  CDATA  #REQUIRED 
>

<!-- A testfile, which is the whole set of results for a single 
     test file's execution.  From this level and below, the dtd 
     is the same for individual tests and tests run in the harness. -->
<!ELEMENT  testfile  (testcase+ | message* | arbitrary* | statistic* | hashtable* | fileresult?) >
<!ATTLIST  testfile
           %desc.attr;
           %time.attr;
           filename  CDATA  #REQUIRED 
>

<!-- A single testcase, which may not be nested. -->
<!ELEMENT  testcase  (message* | arbitrary* | statistic* | hashtable* | checkresult* | fileref* | caseresult?) >
<!ATTLIST  testcase
           %desc.attr; 
>

<!-- ======================================================== -->
<!-- Individual or smaller elements -->

<!-- Hashtables and their items; cf. logHashtable() -->
<!ELEMENT  hashtable  (hashitem*) >
<!ATTLIST  hashtable
           %desc.attr;
           %level.attr;
>

<!ELEMENT  hashitem  (#PCDATA) >
<!ATTLIST  hashitem
           key  CDATA  #REQUIRED 
>

<!-- Normal messages; cf. logMsg() -->
<!ELEMENT  message  (#PCDATA) >
<!ATTLIST  message
           %level.attr; 
>

<!-- Arbitrary messages; cf. logArbitraryMsg(), explicity put into CDATA -->
<!ELEMENT  arbitrary  (#PCDATA) >
<!ATTLIST  arbitrary
           %level.attr; 
>

<!-- Statistic messages; cf. logStatistic() -->
<!ELEMENT  statistic  (longval, doubleval) >
<!ATTLIST  statistic
           %desc.attr;
           %level.attr;
>
<!ELEMENT  longval  (#PCDATA) >
<!ELEMENT  doubleval (#PCDATA) >

<!-- Note fileref is not defined in XMLFileLogger, it comes 
     from ConformanceTests calling logElement() in a specific way.
     Although logElement allows you to output nearly any sort
     of single element, there aren't any other uses of it in 
     existing test cases.  Feel free to suggest other ideas!  -->
<!ELEMENT  fileref  (#PCDATA) >
<!-- Note that the idref attribute in fileref is *not* a 'legal' 
     XML idref since they are not guaranteed to be unique (at least 
     not by the framework) nor to refer to anything. -->
<!ATTLIST  fileref
           idref  CDATA  #IMPLIED  
           outputName  CDATA  #IMPLIED
           inputName  CDATA  #IMPLIED
           xmlName  CDATA  #IMPLIED
           goldName  CDATA  #IMPLIED
>

<!-- Test point results; cf. various check() methods -->
<!ELEMENT  checkresult  EMPTY >
<!-- Note the id attribute of checkresult is *not* a 'legal' 
     XML id since they are not guaranteed to be unique. -->
<!ATTLIST  checkresult
           %desc.attr; 
           %result.attr;
           id  CDATA  #IMPLIED 
> 

<!-- Rolled-up results of a testfile; cf. testFileClose() -->
<!ELEMENT  fileresult  EMPTY >
<!ATTLIST  fileresult
           %desc.attr; 
           %result.attr;
           %time.attr;
> 

<!-- Rolled-up results of a testcase; cf. testCaseClose() -->
<!ELEMENT  caseresult  EMPTY >
<!ATTLIST  caseresult
           %desc.attr; 
           %result.attr;
> 

<!-- End of file ============================================ -->