##
# 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 conf tests like:
#
# cd xml-xalan/test
# java -classpath xalan.jar;xerces.jar;xml-apis.jar;testxsl.jar blah.StylesheetTestletDriver -load debugconf.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/conf

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

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

# The test results log will be saved in this file
logFile=results-conf/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/conf

#---- 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
