package test.beast.beast2vs1;



import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import test.beast.beast2vs1.trace.Expectation;

/**
 * @author Walter Xie
 */
public class SubstitutionModelTest extends TestFramework {

    private final String[] XML_FILES = new String[]{"testHKY.xml", "testSiteModelAlpha.xml",
            "testMultiSubstModel.xml", "testSRD06CP12_3.xml"};

    @Test
    public void testHKY() throws Exception {
        analyse(0);
    }

    @Test
    public void testSiteModelAlpha() throws Exception {
        analyse(1);
    }

    @Test
    public void testMultiSubstModel() throws Exception {
        analyse(2);
    }

    @Test
    public void testSRD06CP12_3() throws Exception {
        analyse(3);
    }

    @BeforeEach
    protected void setUp() throws Exception {
        super.setUp(XML_FILES);
    }

    @Override
	protected List<Expectation> giveExpectations(int index_XML) throws Exception {
        List<Expectation> expList = new ArrayList<Expectation>();

        // all values below are from BEAST 1.7
        switch (index_XML) {
            case 0: // testHKY.xml
//        BEAST 1 testMCMC.xml
//        <expectation name="likelihood" value="-1815.75"/>
//        <expectation name="treeModel.rootHeight" value="0.0642048"/>
//        <expectation name="hky.kappa" value="32.8941"/>
                addExpIntoList(expList, "treeLikelihood", -1815.766, 0.0202);
                addExpIntoList(expList, "tree.height", 6.42E-02, 6.53E-05);
                addExpIntoList(expList, "hky.kappa", 33.019, 0.1157);
                break;

            case 1: // testSiteModelAlpha.xml
                addExpIntoList(expList, "posterior", -4433.5759, 0.4005);
                addExpIntoList(expList, "tree.height", 10.8255, 0.1264);
                addExpIntoList(expList, "popSize", 10.0706, 0.254);
                addExpIntoList(expList, "hky.kappa", 9.4378, 2.8498E-2);
                addExpIntoList(expList, "siteModel.alpha", 0.1771, 1.256E-3);
                addExpIntoList(expList, "clockRate", 3.9202E-3, 6.6938E-5);
                addExpIntoList(expList, "treeLikelihood", -4369.4205, 9.9579E-2);
                addExpIntoList(expList, "coalescent", -64.1553, 0.4559);
                break;

            case 2: // testMultiSubstModel.xml
                addExpIntoList(expList, "posterior", -6001.92, 8.1888E-2);
                addExpIntoList(expList, "prior", -8.24, 1.1349E-2);
                addExpIntoList(expList, "TreeHeight.firsthalf", 0.2523, 1.2987E-4);
                addExpIntoList(expList, "kappa.firsthalf", 4.8401, 1.184E-2);
                addExpIntoList(expList, "freqParameter.firsthalf.1", 0.289, 6.1115E-4);
                addExpIntoList(expList, "freqParameter.firsthalf.2", 0.3204, 6.8116E-4);
                addExpIntoList(expList, "freqParameter.firsthalf.3", 0.1081, 3.8843E-4);
                addExpIntoList(expList, "freqParameter.firsthalf.4", 0.2825, 5.1796E-4);
                addExpIntoList(expList, "kappa.secondhalf", 5.22, 1.121E-2);
                addExpIntoList(expList, "freqParameter.secondhalf.1", 0.3368, 6.3272E-4);
                addExpIntoList(expList, "freqParameter.secondhalf.2", 0.2646, 4.8458E-4);
                addExpIntoList(expList, "freqParameter.secondhalf.3", 0.1018, 2.8896E-4);
                addExpIntoList(expList, "freqParameter.secondhalf.4", 0.2968, 5.2109E-4);
                addExpIntoList(expList, "likelihood", -5993.68, 8.1194E-2);
                addExpIntoList(expList, "treeLikelihood.firsthalf", -3049.7192, 6.5715E-2);
                addExpIntoList(expList, "treeLikelihood.secondhalf", -2943.9608, 5.2473E-2);
                addExpIntoList(expList, "popSize.firsthalf", 0.5184, 1.8192E-3);
                addExpIntoList(expList, "CoalescentConstant.firsthalf", -3.1965, 8.9084E-3);
                break;

            case 3: // testSRD06CP12_3.xml
                addExpIntoList(expList, "posterior", -1793.4164, 0.2044);
                addExpIntoList(expList, "prior", 0.8416, 0.2033);
                addExpIntoList(expList, "tree.height", 9.8986E-2, 3.709E-4);
                addExpIntoList(expList, "CP12.hky.kappa", 25.0699, 0.2541);
                addExpIntoList(expList, "CP12.frequencies.1", 0.3444, 8.2165E-4);
                addExpIntoList(expList, "CP12.frequencies.2", 0.2447, 6.885E-4);
                addExpIntoList(expList, "CP12.frequencies.3", 0.1444, 5.3526E-4);
                addExpIntoList(expList, "CP12.frequencies.4", 0.2666, 6.174E-4);
                addExpIntoList(expList, "CP3.hky.kappa", 82.9907, 1.9773);
                addExpIntoList(expList, "CP3.frequencies.1", 0.3197, 1.1763E-3);
                addExpIntoList(expList, "CP3.frequencies.2", 0.264, 9.0478E-4);
                addExpIntoList(expList, "CP3.frequencies.3", 0.1675, 8.6506E-4);
                addExpIntoList(expList, "CP3.frequencies.4", 0.2488, 1.059E-3);
                addExpIntoList(expList, "CP12.gammaShape", 6.4322E-2, 4.8796E-3);
                addExpIntoList(expList, "CP3.gammaShape", 8.5652E-2, 6.9946E-3);
                addExpIntoList(expList, "CP12.mutationRate", 0.9437, 1.195E-3);
                addExpIntoList(expList, "CP3.mutationRate", 1.1126, 2.3899E-3);
                addExpIntoList(expList, "likelihood", -1794.258, 9.3476E-2);
                addExpIntoList(expList, "CP12.treeLikelihood", -1181.4538, 6.0608E-2);
                addExpIntoList(expList, "CP3.treeLikelihood", -612.8041, 6.0563E-2);
                addExpIntoList(expList, "popSize", 0.1211, 7.505E-4);
                addExpIntoList(expList, "coalescent", 6.2171, 1.1266E-2);
                break;

            default:
                throw new Exception("No such XML");
        }

        return expList;
    }

} // class ResumeTest