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

# test.eclipse.host denotes the Eclipse installation which is the host for the test run.
# The directory given here is expected to have an eclipse subdirectory.
# The default is to use the same host as the build host but in general this should be changed to
# a separate installation. You can also set this directory to a non existing location and provide
# a zip file (see next property) which will then be extracted. 
# The test host does not have to be a full Java/PDE SDK, the Eclipse platform is fully sufficient. Please ALWAYS USE FORWARD SLASHES.
# @category testGeneral
# @type Directory
test.eclipse.host=${eclipseDir}/..

# If you specify a non existing test.eclipse.host, you can provide a zipped Eclipse installation here,
# e.g. eclipse-platform-3.3.2-win32.zip. You can set the test.eclipse.host to a subdirectory of the 
# buildDirectory if you want to have a fresh installation for every test run, e.g. test.eclipse.host=${buildDirectory}/testhost 
# @category testGeneral
# @type File
test.eclipse.zip=

# The location of the Eclipse extension site. It consists of the built features, 
# the Eclipse test framework and the autotestsuite. The extension site will be 
# added with the standalone update manager to ${test.eclipse.host}.
# @category testGeneral
# @type Directory 
test.eclipseExtensionDirectory=${buildDirectory}/eclipseextension/eclipse

# Enable the autotestsuite trace in order to see which plugins and classes the autotestsuite searches for tests.
# Useful for debugging the filter expressions below. 
# @category testGeneral 
# @type Boolean 
autotestsuite.trace=true

# Decides if the autotestsuite should run headless or not. Running headless means that the workbench does
# not get started and the tests are executed directly instead. Cannot be used for UI tests, therefore.
# @category testGeneral 
# @type Boolean 
autotestsuite.headless=false

# Set the test application which the autoTestApplication runs with the test harness in place. This is useful to 
# test the UI of an RCP application. This property is ignored if the headless mode is turned on.
# @category testGeneral
#autotest.testapplication=org.eclipse.ide.ui.workbench

# Directory where the reports are collected
# @category testHidden
test.result.dir=${buildDirectory}/test-reports

# Specifies the overall report in ${test.result.dir}/xml
# @category testHidden
test.aggregated.report=testReport_${buildLabel}.xml

# Workspace for the tests. Particularly useful is ${test.workspace}/.metadata/.log
# @category testHidden 
test.workspace=${buildDirectory}/test-workspace

# Defaults for autotestsuite
# @category testHidden 
autotestsuite.plugin.inclusions=

# Defaults for autotestsuite
# @category testHidden 
autotestsuite.plugin.exclusions=

# Defaults for autotestsuite
# @category testHidden 
autotestsuite.class.inclusions=

# Defaults for autotestsuite
# @category testHidden 
autotestsuite.class.exclusions=

# Denotes the ant script where the target ui-test is defined. Note that this property is
# only necessary if you want to use the Eclipse test framework to run your test. If you
# run the tests with the autotestsuite (i.e. you use the include/exclude filters below)
# this property is not being used.
# @category testHidden  
test.library.xml=${test.eclipseExtensionDirectory}/plugins/org.eclipse.test_3.1.0/library.xml

# Enablement for code coverage.
# @category testCoverage
# @type Boolean 
pluginbuilder.is.runcoverage=false

# Take a look at http://emma.sourceforge.net/reference/ch02s06s02.html#filtersyntax.ANT for the filter syntax.
# @category testCoverage
pluginbuilder.coverage.exclusionfilter=

# @category testCoverage 
pluginbuilder.coverage.inclusionfilter=

# Place for runtime data.
# @category coverageHidden
emma.coverage.output=${buildDirectory}/coverage.ec
