# Copyright 2001-2009 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.

# configure the location of XLT 
fs = ${file.separator}
xlt.home.dir = ..${fs}target${fs}xlt-3.3.0-r3088${fs}
xlt.bin.dir = ${xlt.home.dir}${fs}bin
xlt.classes.dir = ${xlt.home.dir}${fs}classes
xlt.lib.dir = ${xlt.home.dir}${fs}lib

# configure basic settings 
test.src.dir = ${basedir}${fs}src
test.classes.dir = ${basedir}${fs}classes
test.config.dir = ${basedir}${fs}config
test.lib.dir = ${basedir}${fs}lib
test.results.dir = ${basedir}${fs}results
test.cases = com${fs}xceptance${fs}xlt${fs}samples${fs}tests${fs}**${fs}T*.java
