##
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
##
# Default settings for running test automation; used ONLY 
# when manually running or debugging a single API test like:
#
# cd xml-xalan/test
# java -classpath xalan.jar;xerces.jar;xml-apis.jar;testxsl.jar org.blah.TestName -load debugapi.properties
#
# Note for debugging environments: if you're not in xml-xalan/test, 
# be sure to adjust various paths appropriately
#


#---- Choose locations: where to find files, where to log to ----
# inputDir is where root of test xml/xsl files are
inputDir=tests/api

# goldDir is where the 'gold' or reference files to check against live
goldDir=tests/api-gold

# outDir is where we put the actual output files
outputDir=results-api

# The test results log will be saved in this file
logFile=results-api/results.xml


#---- Choose output: How much/what kinds of info should we log ----
# Choose output: How much logging info is saved into our logFile
#   Between 0 (very little) and 99 (lots)
loggingLevel=99

# Choose output: How much logging info is dumped to the console
ConsoleLogger.loggingLevel=40


#---- Below only used with conf/perf/contrib tests  ----
# you'll probably need to adjust inputDir, etc. to point 
# to tests/conf, etc. instead of tests/api

#---- Choose XSLT processor and test algorithim ----
# A Testlet class defines the actual algorithim used to 
#   test each stylesheet found; several different testlets available
testlet=org.apache.qetest.xsl.StylesheetTestlet

# TransformWrapper flavors supported: trax|trax.dom|trax.sax|other...
flavor=trax

#---- Choose tests via filters (either/or...) ----
# Set category to run only the single named directory in inputDir
#category=axes

#---- Choose tests via a specific list (...either/or) ----
# Set fileList to specify a list of files yourself
#   Using a fileList means filtering above is not done
#fileList=listOfFiles.txt

# Specify files to be skipped, and not tested at all
#excludes=lre01.xsl;lre02.xsl

# End of File
