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

javac.compilerargs=-Xlint:unchecked
release.external/syntaxref20.zip=docs/syntaxref20.zip
release.external/generated-jstl11-doc-1.1.2.zip=docs/jstl11-doc.zip
release.external/generated-jsf12-tlddoc-1.2-20.zip=docs/jsf12-tlddoc.zip
release.external/generated-struts-tags-1.3.10.zip=docs/struts-tags.zip

javac.source=1.8
requires.nb.javac=true
javadoc.arch=${basedir}/arch.xml

spec.version.base=2.56.0

test.config.validation.includes=\
**/AutoCompletionTest.class,**/CompletionTest.class

test.config.stable.includes=\
**/CssCompletionTest.class,\
**/RefactorActionTest.class,\
**/ReformatingTest.class,\
**/StableSuiteTest.class,\
**/AnnotationsTest.class,\
**/IndentationTest.class,\
**/OpenFileTest.class,\
**/syntax/TokensTest.class,\
**/IndentCasesTest.class,\
**/CommentActionTest.class,\
**/TagAlignmentTest.class,\
**/MemoryTest.class,\
**/PerformanceTest.class,\
**/languages/OpenStandaloneFileTest.class,\
**/languages/OpenProjectFileTest.class

test.config.stableBTD.includes=**/*Test.class
test.config.stableBTD.excludes=\
    org/netbeans/test/languages/*,\
    org/netbeans/test/lib/*,\
    org/netbeans/test/syntax/**/*,\
    org/netbeans/test/web/*,\
    **/ContextJspServletGenTest.class,\
    **/JspCompletionItemTest.class,\
    **/JspIndenterTest.class,\
    **/JspSyntaxParserTest.class,\
    **/SingleJspServletGenTest.class

#100 min
test.timeout=6000000


test-unit-sys-prop.jsp.parser.jars=\
    ${o.apache.tools.ant.module.dir}/ant/lib/ant.jar:\
    ${web.jspparser.dir}/modules/ext/glassfish-jspparser-4.0.jar:\
    ${servletjspapi.dir}/modules/ext/jsp-parser-ext.jar:\
    ${servletjspapi.dir}/modules/ext/servlet3.1-jsp2.3-api.jar:\
    ${o.apache.tools.ant.module.dir}/ant/lib/ant-launcher.jar

test-unit-sys-prop.web.project.jars=\
    ${web.jsf12.dir}/modules/ext/jsf-1_2/commons-beanutils.jar:\
    ${web.jsf12.dir}/modules/ext/jsf-1_2/commons-collections.jar:\
    ${web.jsf12.dir}/modules/ext/jsf-1_2/commons-digester.jar:\
    ${web.jsf12.dir}/modules/ext/jsf-1_2/commons-logging.jar:\
    ${web.jsf12.dir}/modules/ext/jsf-1_2/jsf-impl.jar:\
    ${web.jsf12.dir}/modules/ext/jsf-1_2/jsf-api.jar:\
    ${servletjspapi.dir}/modules/ext/servlet3.1-jsp2.3-api.jar

# Propagate path to test to workaround issue with missing xerces on JDK1.6 in CompletionTest
test-qa-functional-sys-prop.xerces.path=${libs.xerces.dir}/modules/ext/xerces-2.8.0.jar
