#!/bin/sh
# autopkgtest check: run the provided build-time tests
# (C) 2020 Pierre Gruet.
# Author: Pierre Gruet <pgt@debian.org>

set -e

SOURCEDIR=$(pwd)
WORKDIR=$(mktemp -d)
trap "rm -rf $WORKDIR" 0 INT QUIT ABRT PIPE TERM
cd $WORKDIR

cp -r $SOURCEDIR/src $WORKDIR
cp -r $SOURCEDIR/examples $WORKDIR
cp -r $SOURCEDIR/templates $WORKDIR
rm -rf src/beast src/org

cat <<EOF > JunitTestSuite.java
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
// We remove tests that require swing or a GPU.
// As in build.xml in source, we do not run tests in beast2vs1.
// Some test files contain no tests, we remove them.
// We remove XMLParserTest.class as it relies on a file that does not exist.
@Suite.SuiteClasses({
    test.beast.app.BeautiSubTemplateTest.class,
    test.beast.app.BeautiTest.class,
    test.beast.app.tools.LogCombinerTest.class,
    test.beast.core.BEASTInterfaceTest.class,
    test.beast.core.InputForAnnotatedConstructorTest.class,
    test.beast.core.InputTest.class,
    test.beast.core.LoggerTest.class,
    test.beast.core.OperatorScheduleTest.class,
    test.beast.core.parameter.BooleanParameterListTest.class,
    test.beast.core.parameter.IntegerParameterListTest.class,
    test.beast.core.parameter.ParameterTest.class,
    test.beast.core.parameter.RealParameterListTest.class,
    test.beast.core.StateNodeInitialiserTest.class,
    test.beast.core.util.SumTest.class,
    test.beast.evolution.alignment.FilteredAlignmentTest.class,
    test.beast.evolution.alignment.UncertainAlignmentTest.class,
    test.beast.evolution.datatype.DataTypeDeEncodeTest.class,
    test.beast.evolution.datatype.IntegerDataTest.class,
    test.beast.evolution.operator.CompoundParameterHelperTest.class,
    test.beast.evolution.operator.DeltaExchangeOperatorTest.class,
    test.beast.evolution.operator.ExchangeOperatorTest.class,
    test.beast.evolution.operator.IntRandomWalkOperatorTest.class,
    test.beast.evolution.operator.ScaleOperatorTest.class,
    test.beast.evolution.operator.UniformIntegerOperatorTest.class,
    test.beast.evolution.operator.WilsonBaldingTest.class,
    test.beast.evolution.speciation.BirthDeathGernhard08ModelTest.class,
    test.beast.evolution.speciation.YuleModelTest.class,
    test.beast.evolution.substmodel.BinaryCovarionModelTest.class,
    test.beast.evolution.substmodel.GeneralSubstitutionModelTest.class,
    test.beast.evolution.substmodel.GTRTest.class,
    test.beast.evolution.substmodel.HKYTest.class,
    test.beast.evolution.tree.coalescent.BayesianSkylineTest.class,
    test.beast.evolution.tree.coalescent.CoalescentTest.class,
    test.beast.evolution.tree.NodeTest.class,
    test.beast.evolution.tree.RandomTreeTest.class,
    test.beast.evolution.tree.TraitSetTest.class,
    test.beast.evolution.tree.TreeAnnotatorTest.class,
    test.beast.evolution.tree.TreeTest.class,
    test.beast.evolution.tree.TreeUtilsTest.class,
    test.beast.integration.DocumentationTest.class,
    test.beast.integration.InputTypeTest.class,
    test.beast.integration.XMLElementNameTest.class,
    test.beast.integration.XMLProducerTest.class,
    test.beast.math.distributions.GammaTest.class,
    test.beast.math.distributions.InvGammaTest.class,
    test.beast.math.distributions.LaplaceDistributionTest.class,
    test.beast.math.distributions.LogNormalDistributionModelTest.class,
    test.beast.math.distributions.MRCAPriorTest.class,
    test.beast.math.distributions.NormalDistributionTest.class,
    test.beast.statistic.RPNCalculatorTest.class,
    test.beast.util.ClusterTreeTest.class,
    test.beast.util.NexusParserTest.class,
    test.beast.util.RandomizerTest.class,
    test.beast.util.TreeParserTest.class,
    test.beast.util.XMLTest.class
})

public class JunitTestSuite {   
}  	
EOF

cat <<EOF > LaunchTests.java
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class LaunchTests {
    public static void main(String[] args) {
        Result result = JUnitCore.runClasses(JunitTestSuite.class);
        
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
        
        if (result.getFailureCount() > 0)
            System.exit(1);
    }
}
EOF

export CLASSPATH=".:src/:/usr/share/java/beagle.jar:/usr/share/java/jam.jar:/usr/share/beast2-mcmc/beast.jar:/usr/share/java/antlr4-runtime.jar:/usr/share/java/junit4.jar:/usr/share/java/fest-util.jar"

javac $(find src/test/ -name "*.java" -a ! -wholename "*app/beauti*") JunitTestSuite.java LaunchTests.java
java LaunchTests
