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

spec.version.base=1.101.0

javac.source=1.8

nbroot=../..
jbrowse.external=${nbroot}/retouche
#cp.extra=${jbrowse.external}/Jsr199/dist/Jsr199.jar:\
#${jbrowse.external}/JavaSearch/dist/JavaSearch.jar
test.unit.cp.extra=${nb_all}/retouche/jbrowse/build/test/unit/classes:\
    ${java.editor.dir}/modules/org-netbeans-modules-java-editor.jar:\
    ${editor.dir}/modules/org-netbeans-modules-editor.jar:\

test.unit.run.cp.extra=\
    ${editor.lib.dir}/modules/org-netbeans-modules-editor-lib.jar:\
    ${editor.codetemplates.dir}/modules/org-netbeans-modules-editor-codetemplates.jar:\
    ${java.editor.lib.dir}/modules/org-netbeans-modules-java-editor-lib.jar:\
    ${editor.util.dir}/modules/org-netbeans-modules-editor-util.jar:\
    ${editor.mimelookup.dir}/modules/org-netbeans-modules-editor-mimelookup.jar:\
    ${editor.settings.dir}/modules/org-netbeans-modules-editor-settings.jar:\
    ${editor.settings.storage.dir}/modules/org-netbeans-modules-editor-settings-storage.jar:\
    ${masterfs.dir}/modules/org-netbeans-modules-masterfs.jar:\
    ${defaults.dir}/modules/org-netbeans-modules-defaults.jar:\
    ${o.openidex.util.dir}/modules/org-openidex-util.jar:\
    ${projectui.dir}/modules/org-netbeans-modules-projectui.jar:\
    ${jackpot/engine.dir}/modules/org-netbeans-jackpot.jar:\
    ${openide.windows.dir}/modules/org-openide-windows.jar:\
    ${openide.dialogs.dir}/modules/org-openide-dialogs.jar:\
    ${openide.awt.dir}/modules/org-openide-awt.jar:\
    ${openide.options.dir}/modules/org-openide-options.jar:\
    ${retouche/javacimpl.dir}/modules/ext/javac-impl.jar:\
    ${o.n.core.dir}/core/core.jar:\
    ${o.n.core.dir}/lib/boot.jar:\
    ${classfile.dir}/modules/org-netbeans-modules-classfile.jar:\
    ${contrib/editorhints/editorhighlights.dir}/modules/org-netbeans-modules-editor-highlights.jar
#    ${libs.xerces.dir}/modules/ext/xerces-2.6.2.jar:\
#    ${libs.xerces.dir}/modules/ext/xml-commons-dom-ranges-1.0.b2.jar:\


#    ${nb_all}/editor/build/test/unit/classes:\

# requires nb.javac for compiling of tests on Mac
requires.nb.javac=true

test.config.jet-main.excludes=**/jackpot/*Test.class
test.config.stableBTD.includes=\
    org/netbeans/modules/java/hints/AnnotationAsSuperInterfaceTest.class,\
    org/netbeans/modules/java/hints/OverridableMethodCallInConstructorTest.class,\
    org/netbeans/modules/java/hints/errors/CreateClass183980Test.class,\
    org/netbeans/modules/java/hints/finalize/FinalizeDeclaredTest.class,\
    org/netbeans/modules/java/hints/infrastructure/CreatorBasedLazyFixListTest.class,\
    org/netbeans/modules/java/hints/infrastructure/LazyHintComputationTest.class,\
    org/netbeans/modules/java/hints/jackpot/code/*Test.class,\
    org/netbeans/modules/java/hints/jackpot/impl/batch/ProgressHandleWrapperTest.class

test.config.commit.includes=\
    org/netbeans/modules/java/hints/errors/CreateMethodTest.class,\
    org/netbeans/modules/java/hints/bugs/CollectionRemoveTest.class

test.runner=junit

test-unit-sys-prop.hints-tools.jar.location=${tools.jar}

test.config.batch1.includes=\
    **/*Test.class
test.config.batch1.excludes=\
    **/errors/*Test.class,\
    **/jdk/*Test.class

test.config.batch2.includes=\
    **/errors/*Test.class,\
    **/jdk/*Test.class

#XXX: remove the vanilla javac excludes!
#ExtraCatchTest - requires fix in javac
#ConvertToDiamondBulkHintTest - warnings from javac missing
#ConvertToLambdaTest, AnnotationProcessorsTest - needs fixes to JackpotJavacParser
#ConvertToPatternInstanceOfTest - will be fixed separately
vanilla-javac.excludes=\
    **/AnnotationProcessorsTest.class,\
    **/ExtraCatchTest.class,\
    **/ConvertToDiamondBulkHintTest.class,\
    **/ConvertToLambdaTest.class,\
    **/ConvertToPatternInstanceOfTest.class

test.config.batch1-vanilla-javac.includes=\
    **/*Test.class
test.config.batch1-vanilla-javac.excludes=\
    **/bugs/*Test.class,\
    **/errors/*Test.class,\
    **/jdk/*Test.class,\
    ${vanilla-javac.excludes}

test.config.batch2-vanilla-javac.includes=\
    **/bugs/*Test.class,\
    **/errors/*Test.class,\
    **/jdk/*Test.class

test.config.batch2-vanilla-javac.excludes=\
    ${vanilla-javac.excludes}

test.jms.flags=\
 --add-opens=java.base/java.net=ALL-UNNAMED \
 --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED \
 --add-opens=java.desktop/javax.swing.text=ALL-UNNAMED \
 --add-opens=java.desktop/sun.awt=ALL-UNNAMED
